www.mikrocontroller.net

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


Autor: Leo Lezner (leolez)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: Leo Lezner (leolez)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: Leo Lezner (leolez)
Datum:

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

Autor: thkais (Gast)
Datum:

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

Autor: johnny.m (Gast)
Datum:

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

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oops - jup, war noch früh am Morgen g

Autor: Leo Lezner (leolez)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, danke! ich versuche mal das zu verstehen:)

Autor: Marian (Gast)
Datum:

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

Autor: inoffizieller WM-Rahul (Gast)
Datum:

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

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, hast recht :) Da hab ich mich wohl leicht vertan:(.

Autor: Kalle Pohl (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

Autor: Kalle Pohl (Gast)
Datum:

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


so long
kalle

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.