Forum: Mikrocontroller und Digitale Elektronik Capture Mode Interrupt mit PIC18F46k80


von Fabian F. (freysn)


Angehängte Dateien:

Lesenswert?

Versuche gerade verzweifelt den Capture Modus eines PIC18F46K80 im 
MPLAPX in Betrieb zu nehmen. Unten sehr ihr den Code dazu.
Der Timer kann mittels Interrupt einen Pin toggeln lassen. Daraus 
schliesse ich, dass ich diesen richtig aufgesetzt habe. Doch mit dem 
Capture Modus passt was noch nicht. Im Anhang seht ihr den Auszug aus 
dem Datenblatt.
Hoffe jemand kann mir helfen. Vielen Dank im Voraus!

//TIMER
//////////////////////////////////////////////////////////////////////// 
///
// Beschreibung:    Initialisiert timer 3
// Parameter:       -
// Rückgabewert:    -
//////////////////////////////////////////////////////////////////////// 
///
void init_timer_3(void)
{
    T3CON = 0b00111111; // Timer 3 Control Register
            //00        Fosc / 4
            //--11      Prescaler 1/8
            //----1     Osc Enable
            //-----1    Don't care
            //------1   16-Bit Buffer
            //-------1  Enables Timer3

    T3GCON= 0b00000000; //Timer 3 Gate Control Register
            //0         Gate function disabled
            //-0000000  Don't care because G.f. disabled

    OSCCON2=0b01010010; //Osc Controll Register 2
            //0         Read as "0"
            //-0        System clk comes not from SOSC
            //--0       Read as "0"
            //---1      Dont case because no SOSC
            //----1     Osc running, even if no other sources reguesting 
it
            //-----0    Read as "0"
            //------1   MF-INTOSC is stable(DOnt care)
            //-------0  MF-INTOCS is unused -> HF INTOSC

    PIE2bits.TMR3IE=1;  //Enables Interrupt Timer 3
    ei();               //Enables Global Interrupts
}

//////////////////////////////////////////////////////////////////////// 
///
// Beschreibung:    Initialisiert Capture Mode
//////////////////////////////////////////////////////////////////////// 
///
void init_capture(void)
{
    PIE4bits.CCP3IE=0;  //Verhindert Falschen Interrupt beim 
konfigurieren
    PIR4bits.CCP3IF=0;  //Verhindert Falschen Interrupt beim 
konfigurieren

    io_DAC1=IN;         //Setzt Pin als Input

    CCP3CON =   0b00000101; //Controll Register
                //00        Read as "00"
                //--00      Unused for capture mode
                //----0101  Mode Select -> Steig. Flanke

    CCPTMRS |=  0b00000100; //Timer Select Register
                //-----1    //Capture auf TMR3

    PIE4bits.CCP3IE=1;  //Enables CCP3 Interrupt
    PIR4bits.CCP3IF=1;
}

//////////////////////////////////////////////////////////////////////// 
///
// Beschreibung:    Interrupt Subroutine von Timer 3 / CCP3
//////////////////////////////////////////////////////////////////////// 
/////
void interrupt isr_timer_3_overflow(void)
{
    // OVERFLOW TIMER 3
    //Wenn Interrupt Enable und Flag gesetzt...
    if(PIE2bits.TMR3IE && PIR2bits.TMR3IF)
    {
        //onbrd_H0^=0x01;//For testing
        PIR2bits.TMR3IF=0; // Int Flag zurücksetzen
    }

    //FLANKE AN CCP3
    //Wenn Interrupt Enable und Flag gesetzt...
    if(PIE4bits.CCP3IE && PIR4bits.CCP3IF)
    {
        onbrd_H0^=0x01;  // LED toggeln für Test
        PIR4bits.CCP3IF=0; // Int Flag zurücksetzen
    }
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.