(→Timer Beispiel:) |
(→Timer im 1 Sekunden Takt) |
||
Zeile 72: | Zeile 72: | ||
Wenn man jetzt z.B. will, dass eine Variable nur alle Sekunden um 1 hochgezählt wird, muss man den Prescaler anpassen und auch noch die Zählweite vom Timer anpassen. | Wenn man jetzt z.B. will, dass eine Variable nur alle Sekunden um 1 hochgezählt wird, muss man den Prescaler anpassen und auch noch die Zählweite vom Timer anpassen. | ||
− | Die Zählweite vom Timer kann man nur insovern verändern, dass man ihn nicht von Null weg zählen lässt, sondern von einem höheren Wert weg. | + | Die Zählweite vom Timer kann man nur insovern verändern, dass man ihn nicht von Null weg zählen lässt, sondern von einem höheren Wert weg.(der Überlauf ist immer gleich) |
+ | |||
+ | Da der Timer0 aber mit 8-Bit jetzt zu kurz zählt (0-256) und wir mit einem grossen Prescaler auch nicht auf 1 Sekunde hinkommen, nehmen wir dazu den Timer1. | ||
+ | |||
+ | Der Timer1 ist ein 16-Bit Timer und kann von 0-65536 zählen. | ||
==Autor== | ==Autor== |
Version vom 16. Januar 2006, 10:00 Uhr
Inhaltsverzeichnis
Bascom Timer (Mega8 und andere)
Zweck
Timer sind selbständige Zähler im Prozessor. Man braucht sie dort, wo zeitkritische und genaue Aufgaben gefordert sind.
Struktur:
Config TimerXXX = Timer, Prescale= XX ‘Konfiguriere TimerXXX Enable TimerXXX ‘schalte den TimerXXX ein On TimerXXX SprungXXX ‘verzweige bei TimerXXX überlauf zu SprungXXX Enable Interrupts ‘generell Interrupts zulassen Do ....Hauptprogramm ‘Hauptprogramm Loop End SprungXXX: ‘Unterprogramm von TimerXXX ....Ausführung ‘arbeitet hier etwas ab und springt mit Return Return ‚ wieder zurück, zum Hauptprogramm
Zuerst muss man den zu verwendeten Timer mit „Config“, konfigurieren.
Dazu definiert man ihn als Timer (mann könnte auch einen Counter daraus machen).
Dazu muss man noch den Prescaler definieren. Prescaler ist der Teiler, der die Quarzfequenz reduziert und diese dann zum Timer schickt.
(Sonst würde der Timer immer mit der voller Frequenz vom Quarz zählen und das würde manchmal dann zu schnell sein.)
Dann mit „Enable“ den bestimmten Timer einschalten. Mit „On“ das Unterprogramm (ISR) definieren, an die der Timer springen soll, wenn dieser überläuft. (ISR= Interrupt Service Routine) Dann das generelle Einschalten von Interrupts.
Jeder Zähler hat eine bestimmte, maximale Zählweite. Zählt er über diese, fängt er wieder bei Null an zu zählen (Überlauf). Wie weit ein Zähler zählen kann, ergibt sich aus seiner Struktur. Es gibt da 8-Bit Timer (Timer0 und Timer2, beim Mega8)und 16-Bit Timer (Timer1 beim Mega8). 8-Bit Timer zählen bis 256, 16-Bit Timer bis 65536.
Bei einem Überlauf, unterbricht der Timer das Hauptprogramm und springt in die ISR. Die ISR wird abgearbeitet und mit Return wird wieder an die Stelle zurückgesprungen, wo vorher das Hauptprogramm unterbrochen wurde.
Man soll darauf achten, dass in der ISR immer nur kurze Anweisungen abgearbeitet werden und der Hauptteil dann im Hauptprogramm bearbeitet wird. Sonst kann es sein, dass man den Prozessor damit blockiert.
Timer Beispiel:
Config Timer0 = Timer, Prescale= 8 ‘Konfiguriere Timer0 Enable Timer0 ‘schalte den Timer0 ein On Timer0 Isr_von_Timer0 ‘verzweige bei Timer0 überlauf zu Isr_von_Timer0 Enable Interrupts Do ....Hauptprogramm Loop End Isr_von_Timer0: ‘ISR von Timer0 .....Programm-Code Return
Timer0 ist nun so eingestellt, dass die Frequenz vom Quarz durch 8 geteilt wird. Diese Frequenz kommt nun zum Timer0 und der zählt nun mit dieser Frequenz bis 256. Ab 256 läuft er über, fängt wieder bei Null an zu zählen, und verzweigt dabei in die ISR. Mit Return springt die ISR dann wieder zum Hauptprogramm zurück. In der ISR könnte man z.B. eine Variable hochzählen. Diese würde dann bei einem 8Mhz Quarz, ca. 3906mal in der Sekunde um 1 hochgezählt. ( (8000000Hz/8) /256=3906.26Hz)
Timer im 1 Sekunden Takt
Wenn man jetzt z.B. will, dass eine Variable nur alle Sekunden um 1 hochgezählt wird, muss man den Prescaler anpassen und auch noch die Zählweite vom Timer anpassen. Die Zählweite vom Timer kann man nur insovern verändern, dass man ihn nicht von Null weg zählen lässt, sondern von einem höheren Wert weg.(der Überlauf ist immer gleich)
Da der Timer0 aber mit 8-Bit jetzt zu kurz zählt (0-256) und wir mit einem grossen Prescaler auch nicht auf 1 Sekunde hinkommen, nehmen wir dazu den Timer1.
Der Timer1 ist ein 16-Bit Timer und kann von 0-65536 zählen.
Autor
Siehe auch
An diesem Artikel arbeitet gerade Mitglied Roberto.
Am besten momentan noch keine gravierenden Ergänzungen / Änderungen vornehmen. Dieser Hinweis verschwindet wenn der Autor soweit ist. Sollte dieser Hinweis länger als drei Tage auf einer Seite sein, bitte beim Autor Roberto per PM / Mail oder Forum nachfragen ob er vergessen wurde. |