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);
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.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"); } }
mfG
cht







Zitieren

Lesezeichen