So was in der Richtung?
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)))
;
}
Bei 4MHz gehen ca 16 Sekunden.
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.
Lesezeichen