Forum: Mikrocontroller und Digitale Elektronik Zeitmessung mit TMR0


von Seto (Gast)


Lesenswert?

Hallo Leute,

ich versuche an meinem PICLF1509 die Zeit eines Flankenwechsels zu 
messen. Ich nutze den RA2 Pin als externen interrupt und lege dort ein 
Signal mit 2 Hz an. Um das Signal zu messen nutze ich die TMR0 ISR. Der 
TMR0 interrupt wird jede ms ausgelöst und zählt einen counter hoch. 
Bekomme ich einen Flanken wechsel wird der counter ausgelesen. Eine LED 
soll nur eingeschaltet werden, wenn eine bestimmtes Zeitintervall 
eingehalten wird. Hier mal ein Code auschnitt
1
void interrupt INTERRUPT_InterruptManager (void)
2
{
3
    // interrupt handler
4
5
    // external interrupt enabled   // external interrupt Flag
6
    if(INTCONbits.INTE == 1 && INTCONbits.INTF == 1)
7
    {
8
        INT_ISR();
9
}
10
    else if(INTCONbits.TMR0IE == 1 && INTCONbits.TMR0IF == 1)
11
    {
12
        TMR0_ISR();
13
}
14
}
1
void TMR0_ISR(void)
2
{
3
    
4
    // Clear the TMR0 interrupt flag
5
    INTCONbits.TMR0IF = 0;
6
7
    TMR0 = timer0ReloadVal;
8
    
9
    TMR0_Overflow++;
10
}
1
void INT_ISR(void)
2
{
3
    EXT_INT_InterruptFlagClear();
4
    
5
    if(!TMR0_Init) {
6
        // start counting from 0
7
        TMR0_Reload();
8
        // reset TMR0
9
        TMR0_Overflow=0;  // counts up every ms
10
        // Change edge trigger
11
        INT_Trigger();
12
        // Initialisation complete
13
        TMR0_Init = 1;
14
    }
15
    else {
16
        // Change edge trigger
17
        INT_Trigger();
18
        // Callback function gets called everytime this ISR executes
19
        INT_CallBack(); 
20
21
    }
22
      
23
}
1
void INT_CallBack(void)
2
{
3
    if(TMR0_Overflow>230) {
4
        LATC^=1;    // Turns LED on/off
5
    }
6
    // reset TMR0
7
    TMR0_Overflow=0;
8
    // start counting from 0
9
    TMR0_Reload();
10
}

Das komische ist, dass wenn ich bei der if Abfrage in der INT_CallBack 
Funktion Werte abfrage, die kleiner als 229 sind, die LED mit einer 
Frequenz von 2 Hz und darüber mit einer Frequenz von 1 Hz blinkt. Das 
ergibt aber irgendwie keinen Sinn, weil danach ja der TMR0 resetted wird 
und von vorne Zählt. Es müsste doch so sein, dass die LED entweder mit 2 
Hz blinkt oder sie die ganze Zeit aus wäre. Kann sich jemand erklären 
warum das so ist?!

Grüße
Seto

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.