Achso,
ich hab halt das Problem, dass mein Programm nach dem "reti" Befehl im Unterprogramm "rechts" wieder zum Programmstart zurückspring,
also nach "0x0000" und nicht da weiter macht wo es beim IRQ aufgehört hat,
sprich in der loop-Schleife.
Und da dachte ich, dass dem Programm beim zurückspringen die Rücksprungadresse fehlt, weil der Stack nicht initialisiert ist.
An was kann das noch liegen dass mein Programm nach dem "reti" Befehl immer wieder von vorne beginnt?
Hier ist mal mein Programm:
Code:
include "tn12def.inc"
.def temp = r16
.def temp2 = r17
.def k = r18
.def i = r19
.org 0x0000
rjmp main
.org OVF0addr
rjmp sprungziel
main:
ldi temp, 0b00000110 ;Portb.1 u. 2 als Eingang /
out DDRB, temp ;Portb.1 u. 3-5 als Ausgang
ldi temp, 0b00000000 ;Portb initialisieren
out PORTB, temp
ldi temp, 0b00000000 ;Timer0 Stop
out TCCR0, temp
ldi temp, 0b00000010 ;Timeroverflow Interrupt Ein
out TIMSK, temp
ldi i,0 ;Register auf 0 setzen
sei
loop:
in temp2, PINB ;Taster betätigt?
cpi temp2, 0b00001000
breq rechts
rjmp loop
sprungziel: ;sprungziel ermitteln
cpi i, 3
breq ende
cpi k, 1
breq rechts1
cpi k, 2
breq rechts2
rechts:
ldi temp, 0b00000001 ;Timer 0 Start
out TCCR0, temp
ldi k, 1
reti
rechts1:
ldi temp, 0b00000100 ;Blinker Ein
out PORTB, temp
ldi k,2
reti
rechts2:
ldi temp, 0b00000000 ;Blinker Aus
out PORTB, temp
ldi k,1
inc i
reti
ende:
ldi temp, 0b00000000 ;Timer0 Aus (Ende Blinkzyklus)
out TCCR0, temp
rjmp loop
Das Programm ist dazu da, um den Blinker beim Auto dreimal aufleuchten zu lassen, wenn man den Blinkhebel antippt.
Wäre euch dankbar wenn ihr mir weiterhelfen köntet!
Lesezeichen