Hallo zusammen,
ich bin echt am verzweifeln.
Folgendes Problem.
Ich will in der TimerInterruptrutine einen Vergleich durchführen.
Abhängig von dem Vergleich will ich in eine jeweils andere Schleife
springen. Das Problem hierbei ist, dass wenn ich das Programm so wie es
ist laufen lasse die LEDs an PortB blinken, so wie ich es mir vorstelle.
Wenn ich jetzt jedoch in der Schleife a1 unten den Befehl reti mit rjmp
a1 ersetze, bleibt mir der Timer hängen und springt nicht mehr in
Schleife a2. Anderst herum genau das gleiche, wenn ich in Schleife a2
reti mit rjmp a2 ersetze bleibt mir das Programm auch hängen.
Ich weiß, dass das Programm so keinen Sinn macht und man die Sache
einfacher realisieren könnte. Es ist lediglich ein Auszug aus einem
Programm um mein Problem zu spezialisieren.
Das Programm(ich hoffe ich habe es ausreichend kommentiert):
.include "tn2313def.inc"
.def temp = r16
.org 0x0000
rjmp main ; Reset Handler
.org OVF0addr
rjmp timer0_overflow ; Timer Overflow Handler
main:
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, 0xFF ; Port B auf Ausgang
out DDRB, temp
ldi temp, 0b00000101 ; Timerinterrupt--> Teiler 1024
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
ldi r19, 0b00000001
add r18, r19 ;Register r18 + 1
cpi r18, 0b00000001 ; Vergleiche r18 mit 1
breq a1 ; gehe zu a1, wenn gleich
cpi r18, 0b00000010 ; Vergleiche r18 mit 2
breq a2 ; gehe zu a2, wenn gleich
a1:
ldi r16, 0b00000111
out PortB, r16 ; r16 an PortB ausgeben
reti
a2:
ldi r16, 0b11000000 ; r16 an PortB ausgeben
out PortB, r16
ldi r18, 0b00000000 ;r18 auf 0 zurücksetzen
reti