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!
Programm, Timer Soll das ein Frequenzzähler werden? http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Die_Timer.2FCounter_des_AVR http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.