Forum: Mikrocontroller und Digitale Elektronik AVR-Tutorial: Timer - Overflow Handler Befehl wird nicht angesprungen


von Thomas L. (tomsky)


Lesenswert?

Hallo,

habe gerade das AVR-Tutorial: Timer mit Atmel Studio 6 ausprobiert.

Ich kann beim Simulieren im I/O-View beobachten(mit F11) wie der TCNT0 
hochzählt. Wenn er überläuft, springt das Programm jedoch nicht auf 
timer0_overflow sondern bleibt in der Zeile "loop: rjmp loop". Dabei 
hatte ich erwartet das der Cursor in die Zeile "out PORTB, leds" 
springt.

Wenn ich das richtig verstanden habe sollte doch eigentlich beim 
überlauf die Z-Flag gesetzt werden, oder? An den SREG-Flags ändert sich 
nämlich auch nichts, bei überlauf von TCNT0.

Für Hinweise wie ich mich dem Problem nähern kann wäre ich dankbar. Bin 
leider noch nicht so Fit mit Assembler und uControllern.


Hier nochmal der Code:
1
.include "m8def.inc"
2
 
3
.def temp = r16
4
.def leds = r17
5
 
6
.org 0x0000
7
        rjmp    main                  ; Reset Handler
8
.org OVF0addr
9
        rjmp    timer0_overflow       ; Timer Overflow Handler
10
 
11
main:
12
        ; Stackpointer initialisieren
13
        ldi     temp, HIGH(RAMEND)
14
        out     SPH, temp
15
        ldi     temp, LOW(RAMEND)     
16
        out     SPL, temp
17
 
18
        ldi     temp, 0xFF            ; Port B auf Ausgang
19
        out     DDRB, temp
20
 
21
        ldi     leds, 0xFF
22
 
23
        ldi     temp, (1<<CS00)       ; CS00 setzen: Teiler 1
24
        out     TCCR0, temp
25
 
26
        ldi     temp, (1<<TOIE0)      ; TOIE0: Interrupt bei Timer Overflow
27
        out     TIMSK, temp
28
 
29
        sei
30
 
31
loop:   rjmp    loop
32
 
33
timer0_overflow:                      ; Timer 0 Overflow Handler
34
        out     PORTB, leds
35
        com     leds
36
        reti

von Stefan E. (sternst)


Lesenswert?

Thomas L. schrieb:
> Ich kann beim Simulieren im I/O-View beobachten(mit F11) wie der TCNT0
> hochzählt. Wenn er überläuft, springt das Programm jedoch nicht auf
> timer0_overflow sondern bleibt in der Zeile "loop: rjmp loop".

Debug -> Options and Settings -> Debugger -> Atmel Debugger
-> Mask interrupts while stepping

Thomas L. schrieb:
> Wenn ich das richtig verstanden habe sollte doch eigentlich beim
> überlauf die Z-Flag gesetzt werden, oder?

Nein.

von Thomas L. (tomsky)


Angehängte Dateien:

Lesenswert?

Danke für die Antwort.

Leider fehlt dieser Menüeintrag bei mir. Ich nutze Atmel Studio 
6(Version: 6.2.1153)

von spess53 (Gast)


Lesenswert?

Hi

> Ich kann beim Simulieren im I/O-View beobachten(mit F11) wie der TCNT0
> hochzählt. Wenn er überläuft, springt das Programm jedoch nicht auf
> timer0_overflow sondern bleibt in der Zeile "loop: rjmp loop".

Dann setze doch mal einen Breakpoint in den Interrupt.

MfG Spess

von chris (Gast)


Lesenswert?

Debug -> Options and Settings -> Tools -> Mask interrupts while stepping

von Thomas L. (tomsky)


Lesenswert?

Hy und danke für die Antworten.

Chris hat die Lösung gebracht. Scheint so als hätte sich der Menüeintrag 
mit der Softwareversion verschoben.

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.