Zitat Zitat von luma
Zitat Zitat von PicNick
Mehrbytige Felder in der ISR zählen und im non-ISR mode vergleichen ist so eine Sache.
Beim Asuro geht das genau so!
Eben nicht. Ein Vergleich auf 16-Bit-Wert ist mindestebns 2 Befehle lang. Auch beim Asuro. Wenn zwischen diesen beiden Befehlen ein Interrupt auftaucht, der den zu testenden Wert verändert, hast du ein Problem. Zwar nur seeeehr selten, aber du hast es. Hier sogar recht wahrscheinlich, weil du ausser nop und vergleichen nix machst. Das gilt ebenso für das Setzen solcher Werte.

inline void sleep_millisec(uint16_t milliseconds)
{
// tmpCountTimer0 wird in der ISR oben inkrementiert
tmpCountTimer0 = 0;
while(tmpCountTimer0 < milliseconds)
asm volatile ("nop"); // Nichts tun
Code:
   while (1) {
      uint16_t tmp;
      cli();
      tmp = tmpCountTimer0;
      sei();
      if (tmp < milliseconds)
         return;
   }
Oder du machst es über ein Flag wie von PicNick vorgeschlagen.