Hallo alle! Ich hab' da ein Problem, bei dem ich nicht weiter komme. Ich betreibe einen At90s8535 mit Timer2 im CTC-Mode, und versuche eine 500µS Zeitbasis bereitzustellen, und zwar GENAU 500µS. Hier meine Timerinitialisierung, die Clock ist 8MHZ: void InitTimer(void) { // Clear timer on compare match TCCR2 = (1<<CTC2); // PollFreq = 500 µSec = 2000Hz = 8MHz/(32*125) TCCR2 |= (1<<CS21)|(1<<CS20); // presacler -> 32 -> CS21 and CS20 OCR2 = 125; // Set Output Compare Value to 125 TIFR = 1<<OCF2; // Clr OCF2, Clr pending interrupts TIMSK= 1<<OCIE2; // Enable T2 Outp Comp Match Interrupt DDRB= 0xFF; // Set Port B as output } Mein Timer müsste auf diese Art nach 500µSec einen Interrupt erzeugen. Wenn ich aber im AVRStudio4 meinen Break auf den Interruptvektor 3 setze, dann habe ich Interrupts wechselnd nach 4033 Programmzyklen und nach 4031 Programmzyklen. Da sind gut 503 bzw. 504 µSec. Wenn es am Overhead zum Call des Interrupts liegt, dann frage ich mich, wie ich dafür sorgen kann, dass dieser Overhead für das nächste Intervall berücksichtigt wird? Immerhin ist das eine Ungenauigkeit von völlig indiskutablen 0,6-0,8 Prozent. Es gäbe natürlich die Möglichkeit, einen Reload-Timer zu nehmen, den könnte ich unter Berücksichtung der Differenz neu laden, und gut wärs. Aber es müsste doch auch im CTC Mode gehen? Wer weiss Rat? emax.
Und nochwas vergessen: gint es ein Register/ein SFR, aus dem man den aktuellen Stand des Timers auslesen kann? So wie z.B. TCNT? Danke für Hilfe emax.
Tja, ich habs gefunden. Es muss OCR2 = 124; heissen. So ein Mist aber auch. Denn eigentlich heisst die Formel freq = Clock/(Prescaler*OutputCompareValue) und wenn ich da 124 nehme, kommt da 8000000/(32*124) = 2016 Hz, und das wärean dann eigentlich 496 µSec. Enrtweder ist das irgendwie nicht so sauber dokumentiert, oder aber ich hab da was übersehen. e.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.