die Sprung- und Prüfbefehle innerhalb der Schleife "verbrauchen" aber auch noch einige Taktzyklen, so dass diese Rechnung nicht funktionieren wird. In Assembler geht das Ganze recht einfach mit "nop"-Befehlen, und weil man da die Befehle genau kennt kann man die Anzahl der zusätzlichen Takte für Sprünge etc. leicht berechnen. Ich habe also mal eine C-Routine mit Inline-Assemblercode geschrieben. Du musst als Parameter nur angeben, wie oft 50µs gewartet werden soll (für 10MHz ausgelegt, für 16 MHz ersetze ldi r16,125 durch ldi r16,200).
Beispiel: 1ms Wartezeit=20*50µs => wait(20);
Code:
void wait(unsigned int multiplier50us) {
unsigned int i;
for(i=0;i<multiplier50us;i++) {
asm volatile(
"ldi r16, 125" "\n\t"
"L_%=:dec r16" "\n\t" //1
"tst r16" "\n\t" //1
"brne L_%=" "\n\t" //2
:::"r16");
}
}
Das Schöne an dem Wert 50µs ist, dass man Zeiten bis 3,2 Sekunden (65535*50µs) in hoher Auflösung bekommen kann.
mfG
cht
Lesezeichen