Siemka!
Mam tego typu problem do rozwiązania:
Do kontrolera ATmega8 mam podpięty impulsator(encoder) z przełącznikiem w ośce:
http://www.semiconductors.com.pl/web/pliki/EC12E.pdf
podpięty jest tak:
encoder: ATmega8:
A PORTD.6
B PORTD.5
E PORTD.4
C,D do masy
porty kontrolera podciągnięte są do zasilania przez wewnętrzny pull-up. Oprócz tego każde z wyprowadzeń (A,B,E) encodera podłączone są poprzez diodę 1N4148, katody diod na encoder (A,B,E) natomiast anody wspólnie podłączone do portu INT1 kontrolera który też jest podciągnięty do zasilania.
Napisałem taki program obsługi:
Niby działa ok, bo rozróżniany jest kierunek kręcenia pokrętłem i zaliczane impulsy, ale chyba mam problem z drganiami styków bo często wkradają się błędy w postaci że jest realizowana akcja na wciśnięcie przycisku w ośce encodera, pomimo iż tylko kręcę gałką, no i to zliczanie też jakoś tak dziwnie działa i nie wiem jak sobie poradzić z tym problemem.
Jeżeli ktoś mógłby doradzić mi jakieś rozwiązanie, ewentualnie prześledzić kod, może jest błędny, lub może sugestie co do algorytmu obsługi tego encodera to bardzo bym był wdzięczny za pomoc
Z góry dziękuję i pozdrawiam ELECTIX
Mam tego typu problem do rozwiązania:
Do kontrolera ATmega8 mam podpięty impulsator(encoder) z przełącznikiem w ośce:
http://www.semiconductors.com.pl/web/pliki/EC12E.pdf
podpięty jest tak:
encoder: ATmega8:
A PORTD.6
B PORTD.5
E PORTD.4
C,D do masy
porty kontrolera podciągnięte są do zasilania przez wewnętrzny pull-up. Oprócz tego każde z wyprowadzeń (A,B,E) encodera podłączone są poprzez diodę 1N4148, katody diod na encoder (A,B,E) natomiast anody wspólnie podłączone do portu INT1 kontrolera który też jest podciągnięty do zasilania.
Napisałem taki program obsługi:
$regfile = "m8def.dat"
$crystal = 16000000
$lib "i2c_twi.lbx"
$baud = 9600
'Config Com1 = , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8
Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32
Deflcdchar 1 , 1 , 1 , 5 , 9 , 31 , 8 , 4 , 32
Config Serialin = Normal
Config Serialout = Normal
Config Scl = Portc.5
Config Sda = Portc.4
Config Twi = 100000
I2cinit
Config 1wire = Portc.3
Config Portb.3 = Output 'LCD Backlight
Portb.3 = 0
Config Portd.2 = Input 'int0
Portd.2 = 1
Config Portd.3 = Input 'int1
Portd.3 = 1
Config Portd.4 = Input 'enc E enter
Portd.4 = 1
Config Portd.6 = Input 'enc A
Portd.6 = 1
Config Portd.5 = Input 'enc B
Portd.5 = 1
Config Portc.0 = Output 'write 24C256
Portc.0 = 1
Config Portc.1 = Output 'led
Portc.1 = 1
Config Portc.2 = Output 'buzzer
Portc.2 = 0
'Config Int0 = Rising
'On Int0 Clk
Config Int1 = Falling
On Int1 Enc
Config Timer2 = Pwm , Prescale = 1 , Pwm = On , Compare Pwm = Clear Down
Dim I As Byte
Dim Enc(2) As Byte
Dim Enf As Byte
Dim Con As Byte
Enable Interrupts
Enable Int1
Con = 128
Ocr2 = Con
Enf = 0
Cls
Cursor Off
Do
Bitwait Enf.0 , Set
Reset Enf
If Enf = &B00000010 Then
Reset Enf.1
Ocr2 = Con
Cls
Locate 1 , 1
Lcd Chr(1) ; Con
Elseif Enf = &B00000100 Then
Decr Con
Cls
Lcd Chr(127) ; Con
Elseif Enf = &B00001000 Then
Incr Con
Cls
Lcd Chr(126) ; Con
End If
Loop
End
Enc:
Enc(1) = Pind And &B01110000
Waitms 5
Enc(2) = Pind And &B01110000
If Enc(1) = Enc(2) Then
Enc(2) = Enc(2) Or &B10001111
Enc(2) = Not Enc(2)
End If
If Enc(2) <> &B00000000 Then
Enf = Enc(2)
Shift Enf , Right , 3
Incr Enf
End If
Return
Niby działa ok, bo rozróżniany jest kierunek kręcenia pokrętłem i zaliczane impulsy, ale chyba mam problem z drganiami styków bo często wkradają się błędy w postaci że jest realizowana akcja na wciśnięcie przycisku w ośce encodera, pomimo iż tylko kręcę gałką, no i to zliczanie też jakoś tak dziwnie działa i nie wiem jak sobie poradzić z tym problemem.
Jeżeli ktoś mógłby doradzić mi jakieś rozwiązanie, ewentualnie prześledzić kod, może jest błędny, lub może sugestie co do algorytmu obsługi tego encodera to bardzo bym był wdzięczny za pomoc
Z góry dziękuję i pozdrawiam ELECTIX