So was in der Richtung?
Bei 4MHz gehen ca 16 Sekunden.Code:#include <avr/io.h> // CPU-Frequenz #define F_CPU 4000000 // Anzahl Millisekunden zum warten #define MSEK 2500 #define OCR1A_VAL F_CPU / 1024 * MSEK / 1000 #if (OCR1A_VAL > 0xffff) || (OCR1A_VAL <= 0) #error Schlechte Werte für F_CPU / MSEK / PRESCALE #endif void wait() { // Timer1 anhalten TCCR1B = 0; // Setzt TOP für Mode=4 OCR1A = (unsigned short) ((unsigned long) OCR1A_VAL); TCNT1 = 0; // OCF1A-Flag löschen TIFR = _BV(OCF1A); // Timer1 starten, Mode=4 // TOP=OCR1A, Prescale=1024 TCCR1A = 0; TCCR1B = _BV(WGM12) |_BV(CS12) | _BV(CS10); // Warten auf OCF1A-Flag while (!(TIFR & _BV (OCF1A))) ; }
Die Wartezeit wird nur dann exakt eingehalten, wenn
X = F_CPU / 1024 * MSEK / 1000
eine ganze Zahle ist.
Ansonsten gibt es eine Abweichung von
([X]-X)/X vom gewünschten Wert, bei obigen Werten von -0.0064% bzw -160µs.







Zitieren

Lesezeichen