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
Lesezeichen