Hallo @all, ich arbeite mich gerade in die AtMEGA16 Familie von Atmel rein und habe mit meinem Code Probleme. Der uC geht immer wieder zur ersten Anweisung (ganz an den Anfang) zurück das schaut nach einem RESET für mich aus und ich weiß nicht warum. Ich arbeite mit AVR Studio. Das Programm soll ledigleich im der ISR den Zustand von PINA_1 ändern. Kann mir jemand sagen was ich falsch mache? Der Quellcode lautet: #include <avr/io.h> #include <avr/interrupt.h> int n = 0; int main (void){ sei(); DDRA = 0xff; PORTA = 0x00; DDRB = 0xff; PORTB = 0x00; DDRC = 0xff; PORTC = 0x00; DDRD = 0b11111011; PORTD = 0b01000000; TCCR1B = 0b00000001; TIMSK = 0b00001000; TIFR = 0b00001000; OCR1A = 0x5F; //////////////////////////////////////////////////////////////////////// / //////////////////////////////////////////////////////////////////////// / while (1) { PORTA = 0x00; } } ///////////////////// end main //////////// ///////////// ISR(TIMER1_COMPA_vect) ///////// ISR(TIMER1_COMPA_vect) { PORTA = 0b00000001; while (n<10) { n++; } n=0; } ///////////// end ISR(TIMER1_COMPA_vect) //////
>Kann mir jemand sagen was ich falsch mache?
TIMSK = 0b00001000;
Das ist falsch. Benutze nicht die binäre Schreibeweise.
So sind Fehler vorprogrammiert. Nimm:
TIMSK = (1<<OCIE1A);
Du solltest die Interrupts erst nach den Initialisierungen der Ports und des Timers aktivieren.
Hallo, was soll der arme AVR auch machen, wenn Du den Timerinterrupt für Compare B freigibst und eine ISR für COMPA schreibst... Es liest sich merklich einfacher, wenn man statt TIMSK = 0b00001000; TIMSK = (1<<OCIE1B); schreibst. Dann sieht man auch den Fehler sofort. PS: su spät... ;-) Gruß aus Berlin Michael
@ holger (Gast) Vielen Dank Du hast mir sehr geholfen. Das war tatsächlich der Fehler.
Mit welchen Mitteln stellst du fest, dass sich der Controller reseted? In der ISR weist du PORTA einen neuen Wert zu, welcher nach dem Verlassen der ISR sofort von der Main wieder auf 0 gesetzt wird.
ich habe vor der while (1) { } schleife einen Breakpoint gesetzt. Dieser darf bei korrektem Ablauf nur ein einziges mal auftreten. Der Trat jedoch immer wieder auf. Daher habe ich einen RESET vermutet.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.