Hallo, fange gerade mit der Microcontrollerprogrammierung an und möchte einen Timerrinterrupt auslösen. Ich arbeite gerade das AVR Tutorial durch und habe folgenden Code übernommen: .include "m8def.inc" .def temp = r16 .def leds = r17 .org 0x0000 rjmp main ; Reset Handler .org OVF0addr rjmp timer0_overflow ; Timer Overflow Handler main: ; Stackpointer initialisieren ldi temp, HIGH(RAMEND) out SPH, temp ldi temp, LOW(RAMEND) out SPL, temp ldi temp, 0xFF ; Port B auf Ausgang out DDRB, temp ldi leds, 0xFF ldi temp, (1<<CS00) ; CS00 setzen: Teiler 1 out TCCR0, temp ldi temp, (1<<TOIE0) ; TOIE0: Interrupt bei Timer Overflow out TIMSK, temp sei loop: rjmp loop timer0_overflow: ; Timer 0 Overflow Handler out PORTB, leds com leds reti Das Programm kann ich jetzt Schrittweise durchtippen und sehen wie die einzelnen Bits in den Registern gesetzt werden. Allerdings springt das Programm nie in den Timerinterrupt. Ein Timeroverflow wird erreicht und TOV0 Flag wird auch gesetzt. Trotzdem wird die Routine nicht ausgeführt. Wo liegt der Fehler? Ich benutze AVR Studio 6.0. Habe ein Assemblerprojekt angelegt und als Device einen Atmega8 ausgewählt. Schon mal im vorraus vielen Dank für eure Hilfe.
Hi >Ein Timeroverflow wird erreicht und >TOV0 Flag wird auch gesetzt. Trotzdem wird die Routine nicht ausgeführt. Im AVR Studio 4.19 funktioniert dein Programm. MfG Spess
Marcel Münse schrieb: > Programm nie in den Timerinterrupt. Ein Timeroverflow wird erreicht und > TOV0 Flag wird auch gesetzt. Trotzdem wird die Routine nicht ausgeführt. > Wo liegt der Fehler? Hast du dir einen Breakpoint an den Anfang der Interrupt Routine gesetzt? Wenn der Interrupt den normalen Programmablauf unterbricht, siehst du das sonst im Debugger nicht.
Wenn ich einen Breakpoint setze, springt das Programm trotzdem nicht in die Interruptroutine. Denke die wird auch nicht ausgeführt, weil sich die zustände von PortB beim durchtippen nicht ändern.
Marcel Münse schrieb: > Das Programm kann ich jetzt Schrittweise durchtippen und sehen wie die > einzelnen Bits in den Registern gesetzt werden. Achte auf das I-Flag in SREG. Ein "Feature" des Studios6 ist es nämlich, dass bei Single-Stepping das sei nicht funktioniert.
Hi >Wenn ich einen Breakpoint setze, springt das Programm trotzdem nicht in >die Interruptroutine. Denke die wird auch nicht ausgeführt, weil sich >die zustände von PortB beim durchtippen nicht ändern. Das Durchtippen dauert etwas. Es braucht 259 Takte, bis er in die Interrptroutine springt. 'loop: rjmp loop' braucht 2 Takte. Schon mal Breakpoint in der Interruptroutine und F5 probiert. >Ein "Feature" des Studios6 ist es nämlich, >dass bei Single-Stepping das sei nicht funktioniert. Das 6er Studio ist für Assembler eh oversized. MfG Spess
Hallo, also das I-FLAG im Statusregister wird nicht gesetzt. Habe versucht beim debuggen das I-FLAG im Status Register von Hand zu setzen, wird dann auch blau hinterlegt. Mein Programm bleibt aber immer in der Endlosschleife hängen und führt beim Timerüberlauf die Interruptroutine nicht aus, d.h. die Ausgänge an PortB werden nicht invertiert. Liegt das vielleicht an der Studio Version?
Hi
>Liegt das vielleicht an der Studio Version?
Wahrscheinlich. Im 4er Studio funktioniert es, wie gesagt, problemlos.
MfG Spess
Habe jetzt das Studio 4 installiert und da funktioniert es ohne Probleme. Danke für eure Hilfe.
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.