Hio. Ich hab noch ein paar Fragen zu den Timern. Wieso les ich im AVR-GCC Tutorial, dass ein 8-Bit Timer eine Auflösung von 256 hat? Der Timer kann doch bis maximal 255 hoch zählen. Was ist mit den 16-Bit Timern?

Dann hab ich noch dieses kleine Programm. Das schläft zwar, aber immer zwei Sekunden, obwohl es nur eine Sekunde schlafen sollte…

Code:
// Variable which is used for Timer0
volatile uint8_t countTimer2;

// ISR for handling the Timer/Counter2 Compare Match interrupt
SIGNAL(SIG_OUTPUT_COMPARE2)
{
   countTimer2++;
}
…
// Initializes the timer Timer2 (Prescaler=64 | CTC)
TCCR2  = (1<<CS22) | (1<<WGM21);
OCR2   = 115;
TIMSK |= (1<<OCIE2);
…
/**
 * Sleeps the given time. For t=1 the function Sleeps 1 ms.
 */
inline void rncontrol_sleep(uint8_t t)
{
	// countTimer2 wird in der ISR oben inkrementiert
	countTimer2 = 0;
	while (countTimer2 < t);
}


/**
 * Sleeps the given milliseconds. 
 */
inline void rncontrol_sleep_millisec(uint16_t msec)
{
	uint16_t i;
	for(i=0; i<msec; i++) {
		rncontrol_sleep(1);
	}
}
...
rncontrol_sleep_millisec(2000);
Wenn ich diesen Umweg hier mach, dann funktioniert’s aber:

Code:
// Initializes the timer Timer2 (Prescaler=1 | CTC)
TCCR2  = (1<<CS20) | (1<<WGM21);
OCR2   = 73;
TIMSK |= (1<<OCIE2);
…
/**
 * Sleeps the given time. For t=100 the function Sleeps 1 ms.
 */
inline void rncontrol_sleep(uint8_t t)
{
	// countTimer2 wird in der ISR oben inkrementiert
	countTimer2 = 0;
	while (countTimer2 < t)
		asm volatile("nop");
}


/**
 * Sleeps the given milliseconds. 
 */
inline void rncontrol_sleep_millisec(uint16_t msec)
{
	uint16_t i;
	for(i=0; i<msec; i++) {
		rncontrol_sleep(100);
	}
}
...
rncontrol_sleep_millisec(2000);
Gruß
Lutz