www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Ungenauer CTC mode?


Autor: emax (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: emax (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: emax (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.