Setze Frequenz und Optimierung im AVR Studio auf die gezeigten werte (14745600 bzw. -O0)
void delay1s(int count){ // ~0,09s unsigned int i,j; for(i=0;i<count;i++){ for(j=0;j<65530;j++){asm volatile ("nop");}} } //call delay1s(10); // ~0,9 sec.
Folgendes Beispiel ist von Optimierung unbeeinflusst
// Delay in Millisekunden // Delay entsteht durch timer 0 // Max delay 4500 ms // Praezision 3% void aeg(unsigned int t) { // Begrenzung der maximalen delay time if (t > 4500) t = 4500; // Prescaler 1024 TCCR1B = _BV(CS12) | _BV(CS10); // Timer set up TCNT1 = 0xFFFF - (unsigned int)((unsigned long)t * (unsigned long)144 / (unsigned long)10); // Endlosschleife bis Timer-Bit gesetzt while ((TIFR & _BV(TOV1)) == 0) { asm volatile ("nop"); } // clearing interrupt bit (=1) TIFR |= _BV(TOV1); }
Das Problem ist der max. Wert den die delay Funktion akzeptiert. Max delay: 262.14 ms / F_CPU in MHz. Das folgende Beispiel erlaubt den Einsatz viel größerer Werte.
void delay_ms(uint16_t ms) // Setzen der delay-Dauer { while (ms) // Schleife bis der Wert gleich Null ist { _delay_ms(1); // 1ms delay ms--; // verkleinern des Wertes um 1 } }