www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Kleines Proggramm mit Teimer


Autor: P. Imhof (pimi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin Neuling und möchte in C ATmega8 Kontroller programmieren.
Mit und - oder Verknüpfungen und einfachen Delay-funktionen hat bis 
jetzt geklappt.
Für nächste Aufgabe benötige ich Timer oder, leider finde ich kein genug 
ausführlichen Beispiel mit Erklärung.
Wäre jemand so nett, der mir kurzes Programm mit Erklärung schreibt.
In kurze folgendes Algorithmus:
•  Timer 1 fängt an zu zählen.
•  In der zeit werden ankommende Signale an B1 gezählt.
•  Nach der T1 – Zeit wird der Signallzähller gestoppt, ausgewertet und 
entsprechende Ausgang C5gesetzt bzw. rückgesetzt.

Danke im voraus!

Im Anhang mein Quellcode mit fehlenden Befehlen:
Ich hoffe die Logik in Ordnung!

Autor: Ralf Schwarz (spacedog) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Sinusgeek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In kurze folgendes Algorithmus:
•  Timer 1 fängt an zu zählen.
•  In der zeit werden ankommende Signale an B1 gezählt.
•  Nach der T1 – Zeit wird der Signallzähller gestoppt, ausgewertet und
entsprechende Ausgang C5gesetzt bzw. rückgesetzt.

Hmm, Du versuchst, den dritten Schritt vor dem ersten zu machen... ;-)

Dafür bräuchtest Du nämlich zwei Timer/Counter.

Nimm das Datenblatt und schau Dir mal an, was so ein Timer/Counter so 
kann.

Ein Timer/Counter ist vor allem erstmal ein Zähler. Dabei interessiert 
zuerst, was der Zähler zählen kan. Das kann der Prozessortakt sein 
(direkt oder über Vorteiler), aber auch ein externes Ereignis an Pin T0 
oder T1 (eben die Timer-Eingänge).

Dann interessiert, was der Timer neben der Zählerei so alles anrichten 
kann oder soll. Dazu gibt es verschiedene Interrupts, die auf 
verschiedene Ereignisse am Timer/Counter reagieren können, die 
Ereignisse sind Überlauf oder Erreichen eines Vergleichswertes, aber 
auch ein Pegelwechsel am ICP-Eingang. Daneben gibt es noch die 
Hardware-Pinwackelei, mit der ein Timer ohne Zutun der CPU im 
Hintergrund Impulse erzeugen kann (PWM, Frequenzen). Diese wirst Du für 
Deine Anwendung nicht brauchen.

Für Deine Anwendung ginge Folgendes:

Ein Timer wird (über seine TCCRxx-Register) so eingestellt, dass er 
außen anliegende Impulse zählt. Er soll (erstmal) keinen Interrupt 
auslösen, er soll nur zählen.

Ein anderer Timer wird (über seine TCCRxx-Register) so eingestellt, dass 
er über einen geeigneten Vorteiler den Controllertakt zählt und in einem 
festen Zeitraster (Deiner Torzeit) den Compare-Interrupt auslöst. Dazu 
sind die entsprechenden Schalter-Bits gemäß Erklärung im Datenblatt in 
die TCCRxx-Register des Timers zu manipulieren, der gewünschte 
Timer-Interrupt im Steuerregister TIMSK freizuschalten und das globale 
Interrupt-Flag zu setzen (ASM-Befehl SEI).

In der ISR des Torzeit-Timers liest Du den Zähltimer aus, sicherst das 
Ergebnis für spätere Ausgabe/Anzeige und setzt den Zähltimer auf 0. 
Zusätzlich kannst Du noch einen Merker setzen, an dem die Mainloop 
erkennt, dass ein neuer Wert vorliegt, den sie auf geeignete Weise (LCD, 
UART) ausgeben/anzeigen muss.

In einer späteren Version kannst Du mit dem Überlauf des Zähltimers eine 
Fehlererkennung (zu viele Impulse pro Torzeit) einbauen, aber das wäre 
dann der übernächste Schritt.

Bringe also erstmal einen Timer zum Erzeugen regelmäßiger Interrupts in 
vordefiniertem Zeitraster (Berechnung von Vorteiler und Compare-Wert), 
sowie zum Zählen von externen mpulsen. Mit der verwendeten 
Programmiersprache hat das nix zu tun, es geht lediglich um das 
Verstehen des Datenblattes und um das Manipulieren der Steuerbits in den 
zuständigen Steuerregistern.

~

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.