Hallo Peter,
ich hab das mit dem Debugger mal getestet. Wenn ich das Makro so wie es
sein sollte einbinde, springt mein F11 über das Makro drüber,ohne es
sichtbar zu durchlaufen.
Erst als ich die Makrodirektiven raus geworfen habe, so dass der
Makroinhalt quasi wie normaler Programmcode durchlaufen wurde, hat das
geklappt.
Dadurch, durch Ingos Hinweis auf implizite Doppelregister und Andis
Hinweis auf die Anzahl der benötigten Takte ist mir einiges klarer
geworden.
Aber noch nicht so 100%ig.
Ich vesuche es noch mal mit meinen eigenen Worten zu erklären, so dass
Ihr mir letzte Denkfehler noch erklären könnt. (Wenn Ihr noch Nerv dazu
habt:
.macro mdelay ; Klar
ldi r24, low( @0 - 7 ) ; Lädt den unteren Teil des 16Bit-
; Parameters ins Register r24
ldi r25, high( @0 - 7 ) ; Lädt den oberen Teil des
; übergebenen 16-Bit Param in r25
sbiw r24, 3
; Zieht vom Doppereg r24/25 (Wort) die drei ab und falls dabei
; der Wert 0 erreicht oder unterschritten wird, wird irgendein
; Bit im Statusregister gesetzt. (Wo erfährt man welches Bit das
;ist?) Die drei wohl deshalb, weil dieser Schleifendurchlauf 3
; Takte benötigt
brcc pc - 1
; Dieser Befehl springt, einen Programmschritt zurück, falls das
; Carrybit cleared (also Null?) ist. Dabei wird dieses Carrybit
; wahrscheinlich automatisch wieder gesetzt.
; Daraus kann ich schliessen, dass der vorhergehende Befehl das
; Carrybit beeinflusst.
cpi r24, 0xFE
; Vergleicht r24 mit der Zahl 2Dezimalzahl 254 (Warum 254?)
; Dabei wird wohl das Carrybit gesetzt, je nachdem wie der
; Vergleich ausgeht. (Aber wann wird es gesetzt oder cleared?)
brcs pc + 3
;Springt aus dem Programm heraus, sofern das Carrybit gesetzt ist
;Anderenfalls wird das Programm in der nächsten Zeile fortgesetzt
nop
; einen Takt nichts tun.
; Ist wohl ein Korrekturtakt, damit das Programm wirklich punktgenau
; so lange delayed, wie man als Parameter übergibt.
brne pc + 1
; Springt zur nächsten Zeile wenn das Z-Bit gesetzt ist.
; (Und wenn nicht? Was macht es dann ? Es geht zum nächsten Befehl
; was ja genau das gleiche bedeutet. Warum also dieser Befehl?
.endmacro
Danke noch mal für die Antworten. Ich hoffe, dass ich noch mehr
Fragen stellen darf. Eure armen Nerven ;-)
Viele Grüsse
Karl