Forum: Mikrocontroller und Digitale Elektronik Timerinterrupt


von Marcel M. (anfaenger02)


Lesenswert?

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.

von Spess53 (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Marcel M. (anfaenger02)


Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

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.

von Spess53 (Gast)


Lesenswert?

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

von Marcel M. (anfaenger02)


Lesenswert?

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?

von Spess53 (Gast)


Lesenswert?

Hi

>Liegt das vielleicht an der Studio Version?

Wahrscheinlich. Im 4er Studio funktioniert es, wie gesagt, problemlos.

MfG Spess

von Marcel M. (anfaenger02)


Lesenswert?

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
Noch kein Account? Hier anmelden.