Klar, brauch ja dann zweimal den Befehl lpm
Ich denke gelban:
adiw ZL, 1
wird falsch sein , damit landest Du "dazwischen" und jetzt kommt alles durcheinander,
verstehst Du wie ich das meine ?
Zwischen was genau? Zwischen einem LOW und einem HIGH-Byte?
Nehmen wir mal dein Bsp:
10,20,30,40
10 und 20 sind jeweils mein LOW- und HIGH Byte meiner langen Zeit und 30 40 die meiner kurzen Zeit, ok?
Wenn grün an ist, dann zeigt der Zeiger doch auf 20, oder? Wenn er nun die Interruptroutine aufruft und auf gelb springen will, muss er doch nur 1 addieren, damit Z auf 30 zeigt. Dann lpm - einlesen und nochmal adiw ZL, 1 und wieder lpm - einlesen.
Also ich denk das das adiw ZL, 1 bei gelban: richtig ist. Kannst mich ja noch vom Gegenteil überzeugen 
Hab auch beides getestet. Problem ist: Rot bleibt richtig an, dann macht er rot und gelb an und das bleibt nochmal genauso lange an, obwohl er da schon die kurze Zeit nehmen müsste. Ich kann addieren oder subtrahieren oder umstellen wie ich will, kommt nie die richtige Zeit dabei raus...komisch...
So hab ich das nun:
Code:
zeitum:
push tmp ;tmp auf Stack sichern
in tmp, SREG
push tmp ;SREG auf Stack sichern
cpi statusAmpel, 0b00000010 ;Ist rot an?
breq rotgelban ;JA -> gelb dazuschalten
cpi statusAmpel, 0b00000110 ;Ist rot UND gelb an?
breq gruenan ;JA -> grün anmachen
cpi statusAmpel, 0b00001000 ;Ist grün an?
breq gelban ;JA -> gelb anmachen
;Wenn alle drei Rechnungen != 0 ergeben, dann ist gelb an
rotan:
sbiw ZL, 3
ldi statusAmpel, 0b00000010 ;rot an
rjmp ende
rotgelban:
adiw ZL, 2
ldi statusAmpel, 0b00000110 ;rot und gelb an
rjmp ende
gruenan:
sbiw ZL, 3
ldi statusAmpel, 0b00001000 ;grün an
rjmp ende
gelban:
adiw ZL, 1
ldi statusAmpel, 0b00000100 ;gelb an
ende:
;TIMER1 wird neu geladen
lpm ;Wert aus der dw in r0 schreiben
mov tmp, lpm_reg
out TCNT1L, tmp
adiw ZL, 1
lpm ;Wert aus der dw in r0 schreiben
mov tmp, lpm_reg
out TCNT1H, tmp
out PORTB, statusAmpel ;Ampel richtig umschalten
pop tmp ;SREG vom Stack holen
out SREG, tmp
pop tmp ;tmp vom Stack holen
reti ;spring dahin zurück, wo du hergekommen bist
timerwerte:
.dw 65536-7200, 65536-1800
Lesezeichen