Forum: Mikrocontroller und Digitale Elektronik Anfänger: Timer und nochmal Timer...


von Leo L. (leolez)


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:)

von Hannes L. (hannes)


Lesenswert?

Nunja, du könntest z.B. mal schaun, wie es andere machen. Dann versuchen
zu verstehen und dann Bescheid wissen. Fast alle Programme hier nutzen
mindestens einen Timer:
http://www.hanneslux.de/avr/index.html

...

von Leo L. (leolez)


Lesenswert?

Oh, vergessen: Ich habe fast keine Ahnung von Assembler, also wären
Beispiele in C sehr vorteilhaft:)

von Hannes L. (hannes)


Lesenswert?

Die Beschreibung der Timer-Register und deren Bits in den Datenblätter
der AVRs gilt nicht nur für Assembler, sondern auch für C. Beispiele
kann ich dir leider keine geben, denn von C habe ich fast keine
Ahnung.

...

von Leo L. (leolez)


Lesenswert?

Könnten Sie mir vll kurz erklären wie man auf die gewünschte Frequenz
kommt? Also das mit prescaler und Vorladewert? Das Schwierige für mich
ist die krumme Frequenz des Quarzes, die eine genaue Berechnung
erschwert..

von thkais (Gast)


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.

von johnny.m (Gast)


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.

von thkais (Gast)


Lesenswert?

Oops - jup, war noch früh am Morgen g

von Leo L. (leolez)


Lesenswert?

ok, danke! ich versuche mal das zu verstehen:)

von Marian (Gast)


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?

von inoffizieller WM-Rahul (Gast)


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.

von Marian (Gast)


Lesenswert?

Oh, hast recht :) Da hab ich mich wohl leicht vertan:(.

von Kalle Pohl (Gast)


Lesenswert?

so wie ich das verstanden habe, muss man den takt direkt von oszilator
nehmen. beim 8051 war ein maschinentakt fosz/12, das entfällt hier oder
sehe ich das falsch?

so long
kalle

von Hannes L. (hannes)


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...

von Kalle Pohl (Gast)


Lesenswert?

ich weiss, ich weiss. wollte nur sichergehen ob ich mich da nicht
verlesen habe. danke....


so long
kalle

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.