erstellt 10.11.2011 |
Timer |
|
Der Timer ist wohl einer der
wichtigsten und damit auch der am meist verwendete Baustein innerhalb
eines Mikroprozessor darum sollte man sich auf jeden Fall sehr intensiv mit diesem Baustein befassen. Die Möglichkeiten die sich einen mit diesem Baustein bietet sind sehr komplex und auch individuell. |
Was
wird
beim
Atmega oder
besser allgemein gesagt beim Mikroprozessor eigentlich als Timer
bezeichnet ?
Timer
sind
selbständige Zähler im Prozessor, man braucht sie dort,
wo Zeitkritische und genaue Aufgaben gefordert sind.Programme laufen ja Sequentiell ab , also werden Befehl für Befehl meist nacheinander abgearbeitet oft in einer Schleife die wenn das Programm am Ende angekommen ist, wieder von vorne anfängt . Der Ablauf dieser Schleifen würde ja mit zunehmender Anzahl der Befehle eine längere Zeit benötigen, und so je nach Aufgabe unregelmäßig sein so das man präzise Zeitinformationen damit nicht bewerkstelligen kann. Mann denke z.B an einer Uhr die möglicherweise auch genau läuft , wenn aber einige Befehle zur Programmschleife hinzukommen würden , würde die Uhr immer etwas langsamer laufen. Also befinden sich in den Mikroprozessoren Timer die unabhängig vom übrigen Programm parallel ihren Dienst verrichten. Im Atmega 8 und auch im Atmega 32 befinden sich gleich je 3 Timer . Diese Timer sind unterschiedlich in ihrer Art und Auflösung . Alle Timer besitzen einen Internen 10 Bit Prescaler (Vorteiler) , mit dem die Takt-Frequenz in bestimmten Stufen und zwar meist durch den Faktor 1,8,64,256 oder 1024 herunter geteilt werden kann . |
Timer
sind also nichts weiter als Zähler die anfangend von Null an
hochzählen bis der Zähler seinen Höchstwert erreicht
hat. Dieser Höchstwert ist abhängig von der Menge der sogenannten Bits, die stellvertreten für die Anzahl der Speicherstellen stehen. Also bei ein Bit ( Ein Bit kann aus 0 oder 1 bestehen also zwei Werte) , könnte der Zähler bis zwei zählen. Bei zwei Bit bis 4 usw. Die Timer im Atmega sind unterschiedlich und können in der Regel einen 8 oder 16 Bit Wert verarbeiten, also bis 256 oder 65536 zählen. Bei jedem Überschreiten des Höchstwertes hat man die Möglichkeit einen sogenannten Interrupt auszulösen, also den Timer anzuweisen in ein Unterprogramm zu springen und dieses abzuarbeiten. |
Das wäre
der Normalfall, die Timer haben aber noch andere Fähigkeiten
so können sie z.B auch zwei Werte vergleichen, oder auch aufwärts zählen bis zu einem bestimmten Wert und dann wieder rückwärts zählen usw. Die Art (Mode ) wie der Timer zählen soll kann man zum einen als Bascom Befehl eingeben oder es gibt auch die Möglichkeit als Bitwert im sogenannten TimerControlRegister diese Einstellungen vorzunehmen . Wie man die Daten nun eingibt muss man selbst entscheiden, beide Methoden haben so ihre Vorteile oder auch ihre Tücken, aber das kann man später noch entscheiden , wichtig ist es davon gehört zu haben, das es diese Möglichkeiten gibt. Damit nun beispielsweise bei einer Taktfrequenz von 1 MHz der Timer nicht so schnell überläuft , haben die Timer sogenannte "Prescaler" , das sind Vorteiler die den Systemtakt, durch festgelegt Werte teilen und so den Timer in bestimmten Schritten langsamer laufen lassen. Und dann gibt es noch die Einstellung "Compare Output Mode "in denen die Funktion der Ausgangspin's festgelegt werden. Und es gibt noch die Möglichkeit außer den Systemtakt auch einen Externen Takt als Taktquelle zu benutzen , in diesem Fall wird dann der Externe Takt an Anschluss Tx angelegt, wobei das X für den jeweiligen Timer steht z.B. Timer 0 , Timer 1, Timer 2. |
Bascom
Befehlssatz für Timer |
|
Also
hier sind alle aufgelisteten Bascom Instruktionen die Im Bezug zum
Timer stehen das Zeichen X steht immer für den jeweiligen
verwendeten Timer also 0.1 oder 2 |
|
Befehl |
Beschreibung |
Config TimerX=Counter |
Benutze Timer X als
Zähler |
Config TimerX= Timer | Benutze Timer X als Timer |
Edge=Falling |
Zähle bei fallender
Flanke nur wenn Timer als Counter arbeitet |
Noice Cancel=1 |
Störunterdrückung
einschalten ( Das Signal wird dreimal hintereinander Abgetastet und
wird nur als Signal erkannt wenn es immer identisch war. |
Capture Edge=Rising |
|
Enable Timer X | startet Timer X |
On TimerX Timer_null | Bei einem Überlauf von TimerX , soll in die entsprechende Unterroutine Timer_null gesprungen werden. |
Timer Möglichkeiten im Vergleich |
Atmega
8 |
Atmega
16 |
Atmega
32 |
|||||||
Eigenschaften |
Timer0 |
Timer1 |
Timer2 |
Timer0 |
Timer1 |
Timer2 |
|||
Anzahl der Bits |
8 |
16 |
8 |
8 |
16 |
8 |
8 |
16 |
8 |
Zählen von externen
Taktflanken |
T0 ( PB0 ) |
T1 ( PB1 ) |
Nein |
Ja |
|||||
CTC möglich |
Ja |
Ja |
Ja |
||||||
Frequenzgenerator |
Ja |
Ja |
Ja |
||||||
PWM |
Ja |
Ja |
Ja |
Ja |
Ja |
||||
PWM mit variabler Periode |
Nein |
Ja |
Nein |
||||||
zusätzliches
unabhängiges Vergleichsregister |
Nein |
Ja |
Nein |
||||||
Input Capture Unit |
Nein |
Ja |
Nein |
||||||
Erlaubt 32Khz Uhrenquarz
als Taktquelle |
Ja |
Nein |
Nein |
Ja |
|||||
Prescaler 10 Bit |
Ja |
Ja |
Ja |
8-64-256-1024 |
8-64-256-1024 |
32-64-128-256-1024 |
Ja |
Ja |
Ja |
Timer1 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"Timer 1" ist
ein
16
Bit
Timer
mit
den
gleichen
Funktionen
wie "Timer0" kann
aber nicht wie "Timer 0" bis 255 sondern bis 65535 zählen. Darüber hinaus verfügt er über ein zusätzliches unabhängiges Vergleichsregister. Des weiteren beherrscht der Timer1 PWM (Pulsweitenmodulation). Er besitzt eine Input Capture Unit um externe Ereignisse zu zählen oder um auf sie zu reagieren. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
In
"Timer 1" ist das Timer Control Register nicht 8 Bit breit wie beim "Timer
0" sondern 16 Bit breit, diese 16 Bit sind aber aufgeteilt in 2 mal 8
Pseudo Bits und heißen dann TCCR1A und TCCR1B . Im Register TCNTx wird der aktueller Registerwert gespeichert. Und dann gibt es noch das Vergleichsregister OCR1AH+OCR1AL und OCR1BH+OCR1BL (Output Compare Register A und B). In Bascom greift man auf diese beiden Register mit Hilfe der 16 Bit Pseudoregister ( COMPARE1A und COMPARE1B) zu. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
WGM10,WGM11,WGM12,WGM13 Waveform Generation Mode (WGM) Im TCCRx Register gibt es einige Bits, die WGMxx heißen. Damit kann man die PWM-Modi und den CTC-Modus steuern. Für die PWM Modi gilt: Die Funktionen können am Pin OCx ausgegeben werden. Dafür muss das entsprechende Bit COMxx gesetzt sein. Der Pin muss als Output konfiguriert sein (PullUps). |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Um den WGM Modus überschaubarer zu halten , hier eine Tabelle indem TCCR1A und TCCR1B zusammengefasst nur die Werte für WGM 10 bis WGM 13 enthalten | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Timer
0
(Atmega 8 + Atmega 32) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Timer 0 ist ein 8 Bit Timer und kann deshalb von 0 bis 255 zählen Um Timer 0 einzustellen bedienen wir uns der sogenannten Register, das sind Speicherplätze in denen wir die Art und Funktionen der Timer konfigurieren können . Beim Timer 0 gibt es das sogenannte TimerControlRegister TCCR0 das wiederum aus 8 Bit besteht mit denen wir die Konfiguration vornehmen können |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Beispiel mit Timer0 beim Atmega 32 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Achtung: Timer0 funktioniert nicht wenn Analogeingänge genutzt werden, weil dann Timer für die Analogeingänge benutzt wird. |
Timer 2 |
||||||||||||||||||||||||||||||
ist ein 8
Bit Timer ( 0-255 ), der alle
Funktionen des Timer0 besitzt,
außer dem Zählen von Taktflanken. Dafür verfügt er
über die Möglichkeit einen 32Khz Uhrenquarz als Taktquelle
für den Timer zu nutzen. Damit wird ein asynchroner Timer
möglich, der unabhängig vom Takt ist. Dieser ist mindestens 4
mal langsamer und ermöglicht so auch das Messen weitaus
längerer Zeitabstände. |
||||||||||||||||||||||||||||||
Ausgabe Pin für Timer 2 = OC2 | ||||||||||||||||||||||||||||||
Ausgabe
Pin für Timer 2 = OC2 |
||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
Beispiel mit Timer 2 am Atmega 32 |
||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
Die
Berechnung des Comparewert geht folgendermaßen |
||
Compare1A=
Osszilatorfrequenz / Prescaler/Gewünschte Frequenz / 2 |
||
Bascom Instruktionen
oder Register Anweisungen |
Timer
können mit Bascom Instruktionen konfiguriert werden oder
über
direkte Register-Anweisungen beim 16 Bit Timer1 im Atmega 32
haben wir
zwei Pseudoregister in denen die Konfiguration vorgenommen werden kann
eigentlich ist es nur 1Register mit 16 Bit was aber in zwei
Pseudoregister a 8 Bit aufgeteilt wurde. Einmal das Register TCCR1A und das Register TCCR1B wobei die Register folgende Bedeutung haben: |
Die
Möglichkeit die Timer über den
Weg der Register einzustellen und zu konfigurieren bietet einige
Vorteile gegenüber der Eingabe in Bascom Befehle. Zum einen ist die Eingabe in weniger Zeilen zu programmieren , und das Compilieren geht schneller auch wird weniger Platz im Flash beansprucht, und nicht zuletzt , das die Register eine Menge von Möglichkeiten bietet die alle auch im Datenblatt beschrieben sind. z.B. kann man folgenden Befehl eingeben um die Interrups Global freizugeben: Enable Interrups oder über das Register folgendes : SREG.7=1 beides hat die gleiche Bedeutung und beides führt zum Ziel. |
Mögliche
Timer
Konfigurationsmöglichkeiten |
|
Achtung
Timer Instruktionen müssen alle in einer Zeile geschrieben werden,
wobei jede der Anweisung durch ein Komma voneinander gernnt wird. |
|
Config Timer1 = Counter ( Timer,
PWM ) |
Timer
als
Zähler
oder
Timer |
Edfge=Rising (Falling) |
Externes
Signal bei fallender
Flanke erkennen |
Prescaler= 1 (8,64,256,1024) |
Vorteiler
einstellen |
Noise Cancel=1 (0) |
Bei
1
muss
externes
Siganl
innerhalb
einer
gewissen
Zeit
drei mal hintereinader
unverändert bleiben um als Signal erkannt zu werden. |
Capture Edge = Rising ( Falling) |
|
Clear Timer = 1 (0) |
|
Compare A=Clear Set Toggle
Disconnect |
|
Compare B=Clear Set Toggle Disconnect | |
PWM=8 (9,10) |
Auflösung
in
8,9
oder
10
Bit
|
Compare A PWM = Clear Up ;
Clear Down, Disconnect |
|
Compare B PWM = Clear Up ; Clear Down, Disconnect | |
Stop Timer 0 oder Start Timer 0 | Timer
0
anhalten
oder
Timer
0
starten
|
Beispiel Timer 0 |
||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
Timer0 beim Atmega 32 |
||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
Timer als Counter | ||||||||||||||||||||||||||||||||||||
Timer0 beim Atmega 8 benutzt man auch als
Counter, wenn zum Beispiel externe Ereignisse gezählt werden sollen, in
diesem Fall hat der Prescaler ( Vorteiler) keine Funktion. Bei der Erfassung externer Impulse für den Counter kann man nur bestimmte Eingänge des Atmega's nutzen, nämlich den Eingang mit der Bezeichnung T0 für Timer 0 oder T1 ( nicht beim Atmega 8) für Timer 1 . Beim Atmega 8 ist der Eingang T0 für Timer Null gleich mit Pin PD4. Bei der Konfiguration als externer Zähler gibt es die Möglichkeit die externen Impuls mit der ansteigender oder abfallender Flanke zu zählen .Beim Counter wird das eigentliche Programm zeitlich nicht vom Counter beinflusst. |
||||||||||||||||||||||||||||||||||||
Die zu erfassende
Frequenz beim Eingang T0 ist abhängig der eingesetzter
Taktfrequenz des Atmega's und beträgt etwa 40% des Systemtaktes |
||||||||||||||||||||||||||||||||||||
Um den Timer voreinzustellen ,
also den Comparewert einzugeben kann man Timerx gleich 65363
eingeben oder auch den Befehl Load benutzen, damit rechnet der
Compiler selber die Vorgabe Werte aus. Also z.B. Load
TimerX,200 |
||||||||||||||||||||||||||||||||||||
Hier einige Beispiele für die Verwendung von Timer |
||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
Und so berechnen wir beim Timer 1 den Startwert, wenn wir eine gewünschte Frequenz haben wollen. Als angenommen die Ausgabe Frequenz soll 4500 Hz sein, dann rechnen wir folgendermaßen: Startwert= 65536 - ( Aktueller Controllerfrequenz/ Vorteiler/gewünschte Frequenz) Startwert = 65536 -( 1 Mhz / 1/4500) Startwert = 65536- 222 Startwert= 65313 |
||||||||||||||||||||||||||||||||||||
50 Hz mit Timer 1 (Atmega 8) |
||||||||||||||||||||||||||||||||||||
' 50 Hz $regfile "m8def.dat" ' Definiert den Atmega als Atmega8 $crystal = 16000000 'Gibt die Quarzfrequenz an in Herz $hwstack = 32 'Default use 32 Hardware reservierte Speicher $swstack = 10 'Default Software resvierung Speicher Config Lcd = 16 * 2 ' Display Bezeichnung Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , Rs = Portc.5 , E = Portc.4 ' Konfiguration fürs Display '------------------------------ I/O ---------------------------------------------------------------------- Ddrd.0 = 1 Ddrb.2 = 1 Ddrb.0 = 1 ' Led rot '-------------------------------------- Variable -------------------------------------------------------- '-------------------------------------- Timer 1 -------------------------------------------------------- On Timer1 Routine_timer_1 ' Routine die bei Überlauf angesprungen wird Tccr1a = &B00000000 Tccr1b = &B00000101 'Takt durch 1024 teilen Timsk = &B00000100 ' Interrupt für Timerüberlauf von Timer1 einschalten Timer1 = 65378 ' Timer Vorgabewert um auf 1 Sekunde zu kommen Sreg.7 = 1 ' Interrupt Global freischalten Do Waitms 500 ' Anfang Programmschleife Toggle Portd.0 Waitms 500 Loop '--------------------------------- Timer 1 Routine -------------------------------------------------- Routine_timer_1: Timer1 = 65378 Toggle Portb.2 Return |
||||||||||||||||||||||||||||||||||||
Timer1 Vorgabe wird wie folgt berechnet: |
||||||||||||||||||||||||||||||||||||
65536-((Cotrollerfrequenz / Vorteiler/gewünschte Frequenz) /2) |
||||||||||||||||||||||||||||||||||||
65536 - (( 16 000 000 : 1024 : 50) : 2 |
||||||||||||||||||||||||||||||||||||
= 65378 |
||||||||||||||||||||||||||||||||||||
Aktualisiert 17.04.2021 |
||||||||||||||||||||||||||||||||||||
Copyright by Ms 2009 |