Table of Contents

Delays

Einfacher Delay

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.

Delay mit timer

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);
}

Delay mithilfe der util/delay.h header Datei

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
	}
}