"QUOTE=Rolf.H;24828]...Was mir logisch wiederspricht, ist das ich die .equ fuenfsecunden=19 verwenden soll.
Das Blockschema zeigt doch unterschiedliche Konstanten.
Zu Beginn temp1=>69, dann <69, dann <46, dann <23 (evtl. für Konst. 23 gedacht)...[/QUOTE]
Ja, die Schemata sind noch von den 23 ausgegangen, insofern...
...für 19 würde es dann so aussehen.
temp1=>57, <57, <38, <19...
Die anderen Zahlen sind ja das 2 bzw 3fache der 19 (23) - deswegen der Vorschlag, das als Assembler-Konstante zu vereinbaren, und dem Präprozessor das ausrechnen der vielfachen zu überlassen - dann kan man hinterher am einfachsten dran drehen...
...Die Entscheidung zu Beginn habe ich versucht, aber es gelingt nicht...
?
...So wie ich lese, befinden sich die Bits 0-5 im Status-Register zu Beginn, also Reset auf LOW.
Also zurück gesetzt. In der ISR wird temp1 dekr. In der loop-Schleife vergleiche ich mit
cpi temp1 mit >57 (doch nicht fuenfsecunden, oder?)
Ist der Vergleich da, werden jetzt die Bits 0-5 vom Status-Register gesetzt.
brsh wacht auf das Status-Register, und bei gesetzten Bits von SREG (hier schwimme ich schon)!
Im Buch steht "brsh...Verzweigung bei C=0 unsigned größer / gleich"
mh... das soll nun einer verstehen!
Dann müßte ich doch bei Carry=0 weiter zur nächsten Entscheidung springen,
und PB0-PB2 nicht setzen, dies erst dann, wenn Carry=1.
D.h. temp1 ist zu Null dekrementiert worden....
Ohje - hier kommt mehreres zusammen...
also, das ">57" steht für "mehr als 15 sekunden" (>(3*19)). Der Countdown arbeitet ja immer wieder 4 Abschnitte ab: (4*5s..3*5s), (3*5s..2*5s), (2*5s..1*5s), (1*5s..0+5s) klar? Die 5s stecken in der Konstante (19 bzw 23) und wo die Vielfachen stecken, sollte auch klar sein. Wenn der Countdown 0 erreicht, wird er in der ISR mit (4*5s) neu geladen. Sind damit die Vergleichskonstanten klar?
Zu den Vergleichen: "Du" schreibst selbst nicht im SREG irgendwelche Werte um! Das überläßt Du den Vergleichen.
CPI temp1, 57 macht folgendes: Der Controller berechnet (intern und binär) temp1-57. Das Ergebnis wird nirgendwo hingeschrieben, aber einige Bits im SREG werden manipuliert. für uns ist das Carry (C-flag) interessant. Das wird nämlich genau dann gesetzt, wenn 57>temp1. Für temp1>=57 ist das Carry 0 (cleared).
BRSH - Branch if Same or Higher - springe bei "größer/gleich" (binär, ohne Vorzeichen) hat den Opcode: 1111_01kk_kkkk_k000.
BRCC - Branch if Carry Cleared - springe bei Carry=0 hat den Opcode: 1111_01kk_kkkk_k000. fällt Dir was auf?
Wenn das Carry=0 ist, also der Countdown >=57, könntest Du mit BRCC/BRSH irgendwohin springen, wo die Beinchen "angeschaltet" werden.
Sinniger ist es, nach dem Vergleich+Sprungbefehl den "Beinchen-setz-code" anzuordnen, und ggf mit BRCS/BRLO zu überspringen (wenn temp1<57, also "temp1 lower 57" bzw das Carry durch CPI gesetzt wurde (
Carry
Set).
Noch ein Kommentar zu Variante3:
Die 3 "temp1<K" Vergleiche müssen andersrum angeordnet werden, da sonst bereits der erste Vergleich dei anderen beiden "miterschlägt", und diese nie abgefragt werden.