Forum: Mikrocontroller und Digitale Elektronik Kleines Proggramm mit Teimer


von P. I. (pimi)


Angehängte Dateien:

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!

von Ralf S. (spacedog) Benutzerseite


Lesenswert?


von Sinusgeek (Gast)


Lesenswert?

1
In kurze folgendes Algorithmus:
2
•  Timer 1 fängt an zu zählen.
3
•  In der zeit werden ankommende Signale an B1 gezählt.
4
•  Nach der T1 – Zeit wird der Signallzähller gestoppt, ausgewertet und
5
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.

~

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.