Die Verwendung des dritten Registers ist eine Ressourcenverschwendung. Zu Anfang denkt man sich: "Ich hab doch 32 davon (R0..31)". Dann stellt man fest, man kann nur mit den oberen 16 alle Assemblerbefehle nutzen und eigentlich gehen davon auch noch die obersten 6 Register noch einmal ab, weil nur damit die 16-Bit-Adressierungen über X, Y und Z möglich sind.
Was bleibt, sind magere 10 Registerchen zur vollen Verwendung.
Zum Abschluss und zum Gedanken anregen:
Wenn es Dir gelingt, eine 1Mikrosekunde-Warteschleife zu verfassen
Wait1u:
//Einsprung 3 Takte über rcall
nop //10*1
nop
nop
nop
nop
nop
nop
nop
nop
nop
ret //Rücksprung 3 Takte
//16 Takte
Dann kannst Du doch auch eine Routine über 100 Mikrosekunden verfassen, in der Du die Wait1u-Routine wiederverwendest:
Wait100u:
//3 Takte Einsprung über rcall
push r16 //1
ldi r16, 84 //1
Wait100u_Loop:
rcall Wait1u //16 Takte
dec r16 //1
brne Wait100u_Loop //2
Wait100u_End:
pop r16 //1
ret //3
//19*84 + 9 = 1605
Dann kannst Du auch nach der gleichen Form eine Wait1m schreiben
Wait1m:
//3 Takte Einsprung über rcall
push r16 //1
ldi r16, 10 //1
Wait1m_Loop:
rcall Wait100u //1605 Takte
dec r16 //1
brne Wait1m_Loop //2
Wait1m_End:
pop r16 //1
ret //3
//1608*10 + 9 = 16089 Takte
Und ganz zum Schluss
Wait5m:
//3 Takte Einsprung über rcall
push r16 //1
ldi r16, 5 //1
Wait5m_Loop:
rcall Wait1m //16089 Takte
dec r16 //1
brne Wait5m_Loop //2
Wait5m_End:
pop r16 //1
ret //3
//16089*5 + 9 = 80454 Takte
Diese Routinen (ich hab's jetzt hier im Editor geschrieben, mag noch irgendwo ein Fehlerchen drin sein) sind erweiterbar (Du kannst Dich damit bis in den Stundenbereich hochkaskadieren), anpassbar (Du musst nur die unterste Funktion an die Frequenz anpassen) und einfach wartbar (die Wartefunktionen haben immer die gleiche Form).
Aber das Wichtigste: das einzige verwendete Register r16 ist in jedem Fall save, weil es in jeder Aufrufebene gepusht und gepoppt wird. Du kannst es also vor dem Aufruf einer der o.g. Wartefunktionen mit einem Wert beschreiben und nach dem Aufruf immer noch sicher sein, dass in r16 noch das steht, was Du dort hineingeschrieben hast.
Lesezeichen