2016-07-11 9 views
0

Also im Grunde versuche ich ein ISR (Interrupt-Unterprogramm), um einfach ein Licht an, aber die ISR scheint nicht zu laufen. Ich habe mir das Datenblatt des Mikrocontrollers angesehen, um zu sehen, ob ich etwas falsch mache, aber ich konnte nichts finden.ISR für Timer Compare Match läuft nicht

Heres mein Code.

#include <asf.h> 

int main (void) { 
    DDRD = 0b10000000; 

    cli();        // turn off global interrupts 
    //Timer 
    TCCR2A |=_BV(WGM21);    //CTC mode 
    TCCR2B |=_BV(CS22)|_BV(CS21);  //clk pre-scale 1/256 
    OCR2A = 0x7d;      //125clk cycles = 2ms 
    TIMSK2 |=_BV(OCIE2A);    //enable interrupt on compare matchA 
    TIFR2 |= _BV(OCF2A);    //clear flag 
    TCNT2 = 0x00;      // reset counter 
    sei();        // enable global interrupts 
} 

ISR(TIMER2_COMPA_vect) { 
    PORTD = 0b10000000; 
} 
+1

Löschen Sie das Interrupt-Flag in Ihrem ISR? –

+0

funktioniert es, wenn Sie es mit Unterbrechungen abfragen (nicht den Interrupt, sondern alles andere, Löschen der Flags usw.)? –

Antwort

4

Sie sollten eine Endlosschleife am Ende Ihrer main() Funktion:

#include <asf.h> 

int main (void) { 
    DDRD = 0b10000000; 

    cli();        // turn off global interrupts 
    //Timer 
    TCCR2A |=_BV(WGM21);    //CTC mode 
    TCCR2B |=_BV(CS22)|_BV(CS21);  //clk pre-scale 1/256 
    OCR2A = 0x7d;      //125clk cycles = 2ms 
    TIMSK2 |=_BV(OCIE2A);    //enable interrupt on compare matchA 
    TIFR2 |= _BV(OCF2A);    //clear flag 
    TCNT2 = 0x00;      // reset counter 
    sei();        // enable global interrupts 
    while(1); 
} 

ISR(TIMER2_COMPA_vect) { 
    PORTD = 0b10000000; 
} 

Ohne Endlosschleife AVR einen undefinierten Zustand erreicht!

+0

Vielen Dank, das war das Problem, es funktioniert jetzt. –

+0

_Ohne Endlosschleife erreicht Ihr AVR einen undefinierten Zustand! _ - das ist nicht wahr. Der Zustand ist ziemlich genau definiert: Interrupts sind deaktiviert und Endlosschleife wird ausgeführt. –