Zunächst mal folgendes: Auch wenn der Code so erzeigt wird, wie es sein soll, gibt es keine Garantie dafür, daß dies immer so ist!
elelay ist ja keine Funktion, sindern ein Makro, und so könnte zB b im Frame der Funktion angelegt werden, wenn die Funktion, die das Makro verwendet, komplex ist.
Zudem ist es sehr ungünstig, /3 und %3 zu berechnen, weil das teuer ist. wesentlich besser wäre hier die Verwendung einer Schleife, die 4 Zyklen braucht!
Das erste ist asm ist gerade die Warteschleife _delay_loop_2 (uint16_t) aus <util/delay.h>Code:#define NOP asm volatile ("nop") #define edelay3 (taktschritte) \ do { \ uint16_t a = taktschritte / 4; \ uint8_t b = taktschritte % 4; \ \ asm volatile( \ "0:" "\t" \ "sbiw %0, 1" "\n\t" \ "brne 0b" "\n\t" \ : "=w" (a) \ : "0" (a) \ ); \ \ if (b > 0) NOP; \ if (b > 1) NOP; \ if (b > 2) NOP; \ } while(0)
BTW: Anstatt rumzuwarten wäre für Ultraschall nicht besser ein Timer + PWM angebracht, falls frei?
Lesezeichen