Forum: Mikrocontroller und Digitale Elektronik Ungenauer CTC mode?


von emax (Gast)


Lesenswert?

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.

von emax (Gast)


Lesenswert?

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.

von emax (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.