Klar, brauch ja dann zweimal den Befehl lpm![]()
Zwischen was genau? Zwischen einem LOW und einem HIGH-Byte?Ich denke gelban:
adiw ZL, 1
wird falsch sein , damit landest Du "dazwischen" und jetzt kommt alles durcheinander,
verstehst Du wie ich das meine ?
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







Zitieren

Lesezeichen