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