Zeitmessung mit TMR0

Gast #5288564
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.