'************************************************* ******************************
'*** Testprogramm für POLLIN Dreh-Encoder PANASONIC EVEQDBRL416B ***
'*** Best.Nr. 240 313 ***
'************************************************* ******************************
'*** Author: Screwdriver ***
'*** Datum: 29.08.2009 ***
'************************************************* ******************************
'*** Algorithmus: Statemaschine mit 3 Zuständen ***
'************************************************* ******************************
'************************************************* ******************************
'*** Konfiguration ***
'************************************************* ******************************
'AVR
$regfile = "Attiny2313.dat"
$crystal = 8000000
'System-Timer für periodische Encoder-Abfrage
Config Timer0 = Timer , Prescale = 64
On Timer0 Isr_timer0
Enable Timer0
Const Timer0_reload = 131 'Wert für 1ms
'Drehencoder
Config Portd.1 = Input : Set Portd.1 : Ph_a Alias Pind.1 'Encoder Signal A
Config Portd.0 = Input : Set Portd.0 : Ph_b Alias Pind.0 'Encoder Signal B
'************************************************* ******************************
'*** Variablen ***
'************************************************* ******************************
'Variablen
Dim Rotary0 As Byte 'Aktueller Rasterwert (A,B)
Dim Rotary1 As Byte 'Übergangswert (A,B) zwischen Rastungen
Dim Rotary2 As Byte 'Letzter Rasterwert (A,B)
Dim Rotary As Byte 'Zahlenwert des Encoders
Dim Rotary_last As Byte 'Letzter Encoder-Wert (nur für Demo)
Config Timer1 = Timer , Prescale = 8
On timer1 Isrtimer1
Const Timer1_reload = 44703 'Vorgabe für 48Steps/sec
Enable Timer1
'************************************************* ******************************
'*** HAUPTPROGRAMM ***
'************************************************* ******************************
Enable Interrupts
Do
If Rotary_last <> Rotary Then 'Encoder gedreht?
Rotary_last = Rotary 'Neue Stellung merken
Print Rotary 'und Encoder-Wert ausgeben
Und Wie Übergebe Ich Diesen Wert An Den Timer1 Damit Der Entsprechend Schneller / Langsamer ZähltPrint
End If
Hier muss doch bestimmt noch was hin ins Hauptprogramm
Loop
'************************************************* ******************************
'*** ISR_TIMER0 ***
'*** Periodische Auswertung des Dreh-Encoders ***
'************************************************* ******************************
Isr_ext = Isr_timer0:
Timer0 = Timer0_reload
Shift Rotary0 , Left , 1 'Schieberegister für Entprellung (A,B)
Rotary0.4 = Ph_a 'Phase A lesen -> Bit 4
Rotary0.0 = Ph_b 'Phase B lesen -> Bit 0
If Rotary0 <> Rotary2 Then 'Neues Signalpaar (A,B) ?
Select Case Rotary0
Case &B0000_0000 'Aktuell (A,B)= (0,0)
Select Case Rotary1
Case &B1111_0000 'Übergang war (A,B)= (1,0), also
Incr Rotary 'Encoder-Wert erhöhen
Case &B0000_1111 'Übergang (A,B)= (0,1), also
Decr Rotary 'Encoder-Wert verringern
End Select
Rotary2 = &B0000_0000 'Aktuelles (A,B) in vorheriges (A,B)
Case &B0000_1111 'Übergang (A,B)= (0,1) zwischen Rastungen
Rotary1 = &B0000_1111 'erkennen und in abspeichern
Case &B1111_0000 'Übergang (A,B)= (1,0) zwischen Rastungen
Rotary1 = &B1111_0000 'erkennen und abspeichern
Case &B1111_1111 'Aktuell (A,B)= (1,1)
Select Case Rotary1
Case &B0000_1111 'Übergang war (A,B)= (0,1), also
Incr Rotary 'Encoder-Wert erhöhen
Case &B1111_0000 'Übergang war (A,B)= (1,0), also
Decr Rotary 'Encoder-Wert verringern
End Select
Rotary2 = &B1111_1111 'Aktuelles (A,B) in vorheriges (A,B)
End Select
End If
Isr_timer1:
Timer1 = Timer1_reload
'
Und Was Soll Hier Stehen für den Takt?
Return
Lesezeichen