Zitat Zitat von oderlachs Beitrag anzeigen
Ganz habe ich das mit den Timern noch nicht geschnallt, die Art und Weise schon verstanden nur nicht wie ich da zum konkreten Ergebis einer bestimmten Zeit komme, also die Konfiguration der Timerwerte, Vorteiler bei bestimmter FQu. (3.686400Hz oder 16.000000Hz zBsp).
Eigentlich ist das gar nicht so schwer:
  • Du hast deinen Systemtakt mit X Mhz (F_CPU).
  • Würdest du damit direkt deinen Zähler betreiben, würde der irrsinnig schnell laufen. Die messbare Zeit wäre also sehr kurz. Daher teilt man den Systemtakt bei Bedarf noch (Prescaler).
  • Dein Zähler zählt mit einer bestimmten Frequenz F_CPU/Prescaler. Je nach Timer kann der Zähler maximal 2^8 (256), 2^10 (1024) oder 2^16 (65536) verschiedene Zustände annehmen.
  • Relevant für dich ist das Auftreten des Interrupts. Der wird bei erreichen eines bestimmten Wertes (konfigurierbar über sogenannte Output Compare Units oder fest bei Zählerüberlauf)
  • Implizit stellt der Zähler nur ein weiterer Taktteiler dar, er teilt die Zählerfrequenz durch die Anzahl der Schritte bis zum Überlauf.
  • Damit ergibt sich die Überlauffrequenz F_Out = F_CPU / Prescaler / Zählschritte
  • Umgekehrt musst du also, wenn du eine bestimmte Frequenz (und damit Zeitintervalle, da f=1/T) generieren möchtest, die Parameter passend wählen. In der Regel sucht man sich dabei ausgehend von F_CPU den kleinsten Prescaler für den das Zählerregister für die Wunschfrequenz noch ausreichend ist.
  • Diese Bedingung lässt sich formulieren als Prescaler >= F_CPU/Max_Zählschritte/F_Out


Beispiel: F_CPU = 1Mhz. Wunschfrequenz F_Out 2kHz (0,5ms Periodendauer). Timer: 8-Bit.
Prescaler >= 1Mhz/2^8/2kHz = 1,95
Zur Verfügung steht beim Mega8 damit zum Beispiel der Prescaler F_CPU/8

Zählschritte = 1Mhz/8/2kHz = 62,5 (obere Formel umgestellt)
Probe: F_Out = 1Mhz/8/62 = 2016Hz

Achtung: Der TOP-Wert der im CTC-Modus gesetzt wird, ist Zählschritte-1, da von 0 bis TOP gezählt wird!

mfG,
Markus