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…
Wenn ich diesen Umweg hier mach, dann funktioniert’s aber: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);
Gruß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);
Lutz







Zitieren

Lesezeichen