Anfänger: Timer und nochmal Timer...

OP #360099
Lesenswert?

Hi Leute!
Ich bin noch so eine AVR-Anfänger und brauche dringend Hilfe, weil
alleine ich nicht mehr klarkomme:)
Also, ich möchte eine Pinabfrage jede (n-te) Mikrosekunde machen, und
dafür den Timer verwenden.. Und das ist das Problem was ich habe, denn
mir fehlen die nötigen Kentnisse.
Ich wäre sehr dankbar für einen Vorschlag/einen Tipp und noch mehr für
einen Link auf eine vernünftige Erklärung wie man die Timer benutzt:)

Ahja, ich habe einen Mega16 und Quarz=14,7456 Mhz und wenig Ahnung von
Mikrocontrollern:)
Gast #360104
Lesenswert?

Alles reine Mathematik...

Wir haben: 14745600 Hz Quarz, gewünschte Timer-Frequenz (z.B. bei 10µs)
wäre 1/0.00001 = 100000 Hz.

Also müssen 14745600/100000 = 147,456 Takte verstreichen, bis ein
Timer-Interrupt ausgelöst wird. Das passt in einen 8-Bit Timer, aber da
der Endwert 255 nicht erreicht wird, müsste man mit einem Output-Capture
arbeiten. Prescaler = 1.

Oder man lässt den Timer bis zum Overflow durchlaufen, dann bekommt man
alle 256 Takte einen Interrupt, also müssen wir andersrum rechnen:
1 Takt = 1/14745600 s = 0,06781 µs oder 256 Takte = 17,36 µs.

Wichtig ist, dass man sich auf eine Einheit einigt, also nicht MHz/KHz
oder s / µs durcheinanderwerfen.
Gast #360105
Lesenswert?

@thkais:
Du meinst 'Output Compare'...

@leo:
Eigentlich ne ganz einfache Kiste: Du hast einen Takt, den Dein Quarz
Dir liefert. Das ist der Grundtakt für alles, was der Controller macht.
Diesen Takt kannst Du herunterteilen, indem Du ihn als Eingangssignal
für einen Timer benutzt. Ein Timer ist nichts anderes als ein digitaler
Zähler, der auf eine Flanke des Eingagssignals seinen Zählwert um eins
erhöht. Wenn er eben durch einen Takt mit konstanter Frequenz gespeist
wird, dann zählt er Zeittakte und arbeitet als Timer. Der Prescaler
(dt. Vorteiler) ist auch nichts anderes als ein Timer, bei dem Du nur
auf bestimmte Bits zugreifen kannst. Wenn Du jetzt im Prescaler ein
Teilerverhältnis einstellst und z.B. in das Compare-Register des Timers
einen bestimmten Wert hineinschreibst, dann bekommst Du ein
Compare-Ereignis (auf das Du z.B. einen Interrupt auslösen lassen
kannst, in dessen Handler Du Deine Eingänge abfragst), wenn das
Timer-Zählregister TCNTx den Compare-Wert erreicht. Die Zeit vom
Starten des Timers bis zum Compare-Ereignis errechnet sich aus dem
Kehrwert der Grundfrequenz vom Quarz (also deren Periodendauer)
multipliziert mit dem Produkt aus allen nachgeschalteten
Teilerfaktoren.

Besipiel:
Wenn Du mit 14,7456 MHz taktest und einen Prescaler von 8 einstellst
und in das Compare-Register 100 hineinschreibst, dann bekommst Du alle
8*100 Grundtakte ein Compare-Ereignis, das wäre dann im Beispiel ein
Takt von 14,7456 MHz/800 = 18432 Hz, also alle 54,253 µs einen
Interrupt, wenn Du ihn denn aktiviert hast. Wenn Du den Timer im
CTC-Modus betreibst, wird er automatisch bei Auftreten des
Compare-Ereignisses zurückgesetzt und Du brauchst Dich nicht um das
Nachladen zu kümmern. Dann hättest Du ohne weiteren Eingriff alle
54,253 µs einen Interrupt. Das nur als Beispiel, damit es Dir klar
wird, wie man so was berechnet.
Gast #360108
Lesenswert?

@johnny.m:
Ich will hier jetzt nicht klugscheißen aber mich verwundern deine
54,253µs. Meinst du nicht eigentlich 54,253ms?
Nur mal so ein Beispiel von mir: Bei einer Frequenz von 7372800Hz und
einem Prescaler von 64 und im Compare Register eine 115 drinsteht kommt
man auf einen Takt von 1001,739Hz also ein Interrupt alle 0,99826 ms.
Ist doch richtig oder?
Nun noch ein anderes Beispiel was ich hier im Forum gefunden habe und
nicht ganz verstehe:
OCR0  = 19;             // 20MHz  1024  195,315) = 1000 Hz
TCCR0 = ( (1<<WGM01) | (0<<WGM00)
          | (0<<COM01) | (0<<COM00)
          | (1<<CS02)  | (0<<CS01)  | (1<<CS00) );
Hier wird ein Prescaler von 1024 eingestellt und die Frequenz beträgt
20 MHz. Wenn ich nun 19 ins OCR0 schreibe erzeuge ich eine Takt alle
0,0009728 s. Ist doch auch richtig oder? Nun meine Frage: Wieso steht
in der Rechnung 195,315? Wo wird das benötigt?
Gast #360109
Lesenswert?

>Meinst du nicht eigentlich 54,253ms?
Nö!
1/18432Hz = 54,253µs?  (54,253 * 10^-6s)

>0,99826 ms
richtig!

>Wieso steht in der Rechnung 195,315?

da hat sich jemand vertippt, oder den Kommentar nicht verändert als er
von 100Hz zu 1kHz übergegangen ist.
#360112
Lesenswert?

Die AVRs arbeiten direkt mit dem Oszillatortakt. 1 Oszillatortakt
entspricht einem Arbeitstakt. Viele Instruktionen brauchen nur einen
Takt zur Ausführung. Der Timer kann direkt den Oszillatortakt zählen.

All diese Informationen kannst Du aber auch im Datenblatt des
entsprechenden AVRs nachlesen.

Bit- & Bytebruch...
...HanneS...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren