C Timer berechnung CTC

Janiiix3

Aktives Mitglied
28. Sep. 2013
1.333
10
38
Hannover
Sprachen
  1. ANSI C
  2. C#
Hallo Leutz,

kann mir jemand von euch mal diese Formel erklären ?

Code:
    OCR1A   = ((F_CPU / 64 / 1000 ) - 1 );

Ich möchte jetzt gerne einen TIMER auf 10ms. Basis laufen lassen... Was muss ich anpassen?
 
Hallo Leutz,

kann mir jemand von euch mal diese Formel erklären ?

Code:
    OCR1A   = ((F_CPU / 64 / 1000 ) - 1 );

Ich möchte jetzt gerne einen TIMER auf 10ms. Basis laufen lassen... Was muss ich anpassen?


Ich hoffe ich habe es durchblickt...


Code:
                /* (Arbeitsfrequenz / Prescaler / Hz) - 1 */
    OCR0     = ((F_CPU / 1024 / 100 ) - 1 );         // for ~ 10 ms. CTC
 
Wo haste die denn her?

Im CTC läuft der Timer eigentlich im Normalmodus (single slope), nur daß er eben nicht beim 256sten (8bit) oder 1024sten (10bit) oder 65536sten increment auf 0 überläuft (und ggf 'n Interrupt anfordert), sondern bei einem frei wählbaren Wert innerhalb der Reichweite.
Dieser Wert wird in einem Register vorgegeben, je nach konkret gewähltem CTC-Mode. Je nach Controller und Timer kann das das Output Compare Register A oder das Input Capture Register sein, bei einigen Controllern gibt es sogar ein, nur dafür vorgesehenes Register (meist Output Compare Register C) - Auskunft gibt das Datenblatt.

Du scheinst OCRnA zu nehmen. Also mußt Du auch den entsprechenden Waveform Generation Mode einstellen. Der Timer läuft dann einen Timer Takt nach dem Match auf 0 über (und generiert dabei ggf den IRQ)

Jetzt willst Du also, daß der Timer so alle 10ms überläuft - 100Hz.
F_CPU wird wohl der, irgendwo im Code festgelegte (angebliche) effektive Controllertakt sein. Der Timer kann (je nach Controller und Timer) an unterschiedliche Taktquellen gekoppelt werden - an den Systemtakt, einen seperaten Oszillator (zB Uhrenquarz), 'ne interne PLL, einen Clock-Eingang,...
Ist der Systemtakt oder die PLL gewählt, wird dieser Takt bevor er auf dem Timer landet heruntergeteilt (durch diskrete Werte). Das ist der (Timer) Prescaler.
Deine Formel scheint auf die Ankopplung an den Systemtakt (über einen Prescaler) ausgerichtet zu sein:
Der Timer ist also mit F_CPU/Prescaler getaktet und läuft bis (OCRnA+1). Das heißt, der Timer hat eine Überlauffrequenz von (F_CPU/Prescaler)/(OCRnA+1). Du willst, daß diese Frequenz 100Hz beträgt, also:
100Hz=(F_CPU/Prescaler)/(OCRnA+1)
Der Rest ist Mathe Klasse 5: mit dem Nenner multiplizieren, und durch 100Hz teilen ergibt:
OCRnA+1=(F_CPU/Prescaler)/100Hz
Und jetzt noch auf beiden Seiten 1 abgezogen:
OCRnA=((F_CPU/Prescaler)/100Hz)-1

War das jetzt verständlich genug erklärt? Deine Formel berechnet OCR1A für einen Prescaler von 64 und 'ne geforderte Frequenz von einem Kilohertz (also 1ms).
Edit: Bist ja inzwischen selbst drauf gekommen:yu:
 
Mal wieder sehr gut erklärt! Vielen dank für deine Antwort!
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)