Hallo Knut!
Klingt schon mal nicht schlecht.
Allerdings überlassen wir das (rauf und runter) Zählen lieber unserer Variablen.
Wir benötigen also einen Timer, der als Timer arbeitet..... und nicht als Zähler.
Damit wäre also die Angabe:
schon mal die bessere Wahl!
Jetzt müssen wir nur noch dafür sorgen, dass auch etwas passiert..... denn sonst haben wir nur einen Timer zugewiesen.
Da der Timer0 nur 8bit breit ist, kann er also nur von 0 bis 255 zählen. Danach fängt er wieder von vorne an.
Genau das wäre doch ein guter Ansatz.
Jedesmal wenn der Timer bei 255 angekommen ist und wieder bei 0 anfängt (also technisch gesehen "überläuft"), soll er ein Signal geben...... also ein Interrupt erzeugen.
Dies kannst du in BASCOM so einstellen:
Das "On" besagt nun, dass bei einem Überlauf von Timer0 die ISR (InterruptServiceRoutine) ISR_timer0 aufgerufen werden soll.
Nun müssen wir aber erst mal schauen, wie oft dies passieren soll.
Da der Timer mit dem Systemtakt läuft, können wir ihn nur durch "Teilung" des Systemtaktes in der Geschwindigkeit beeinflussen.
Dafür gibt es den "Prescaler".... Vorteiler.
Der Prescaler kann mit 1, 8, 64, 256 und 1024 eingestellt werden. Das ist alles! Mehr geht nicht!
Nun müssen wir mal etwas rechnen.....
Wenn ich also 8MHz Systemtakt habe und einen z.B. einen Prescale von 64 verwende dann:
8.000.000 Hz / 64 = 125.000 Hz
125.000 Hz entspricht => 1 / 125.000 Hz = 8 µsec / bit
Timer0 hat aber 256bit..... also: 256 x 8µsec = 2,048 ms !
Wenn wir also den Timer0 mit einem Prescale von 64 betreiben, läuft der Timer0 alle 2,048ms über und erzeugt einen Interrupt.
Aus den eben erfahrenen Daten bekommt unser Programm also nun folgende Anweisungen:
Code:
'Timer0 zur Überwachung des Drehencoders-------------------
Config Timer0 = Timer , Prescale = 64 'Overflow nach 2,048ms
On Timer0 Drehencoder 'Drehencoder abfragen
Um das ganze Einstellen der Timer-Register im AVR musst du dich selber nicht kümmern.... dies erledigt BASCOM für dich.
Du musst lediglich den Timer noch "einschalten" und generell (also global) alle Interrupts erlauben.
Das machst du mit:
Code:
Enable Timer0 'Timer0 aktiv
Enable Interrupts 'Interrupts einschalten
Damit ist die Anweisung für den Timer nun komplett und kann ins Programm eingetragen werden:
CodeBox bascom
'Timer0 zur Überwachung des Drehencoders-------------------
Config Timer0 = Timer , Prescale = 64 'Overflow nach 2,048ms
On Timer0 Drehencoder 'Drehencoder abfragen
Enable Timer0 'Timer0 aktiv
Enable Interrupts 'Interrupts einschalten
Jetzt musst du nur noch die Subrotuine "Drehencoder" erstellen, die alle 2ms vom Timer aus aufgerufen wird.
In der Subroutine wird nun der Drehencoder abgefragt mit:
Code:
'Drehencoderüberwachung per Timer0
Drehencoder:
De = Encoder(pind.2 , Pind.3 , Rauf , Runter , 0)
Return
Das war es dann schon.
Von nun an wir dein Drehencoder automatisch überwacht und du kannst dich um andere Dinge im Programm kümmern.
Kannst dein Programm ja mal umbauen....
Ich muss zwischenzeitlich dann auch mal weg.
Grüße,
Cassio