Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

ATmega8, encoder, Bascom-nie działa dobrze, co tu poprawić?

Electix 08 Mar 2007 17:54 5333 6
  • #1
    Electix
    Level 21  
    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:
    Code:

    $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 :)
  • #2
    sylwunia35
    Level 18  
    WITAM
    Zobacz w EP 4/2005 jest wszystko czego potrzebujesz.
  • #3
    Electix
    Level 21  
    hehe :) gdybym tylko miał dostęp do tego numeru... Sprawdzę w bibliotece n uczelni :) ale to dopiero po weekendzie, pogrzebię w necie może wynajdę, tymczasem nadal czekam na jakieś podpowiedzi :)
  • #4
    sylwunia35
    Level 18  
    Wieczorem dam skana jak znajde chwile czasu.
  • #5
    seba_x
    Level 31  
    w bascomie jest gotowa instrukcja "encoder" , czy nie byłoby ci łatwiej jej użyć ? , ja w swoim projekcie co 2,2 ms wchodzę do podprogramu z obsługą encodera i nie mam żadnych problemów z drganiem styków
  • #6
    sylwunia35
    Level 18  
    No właśnie w EP jest tak:
    stan_enk=Enkoder(pind.1,pind.2,Lewo,Prawo,0)

    Lewo:
    .......
    Return

    Prawo:
    ........
    Return
  • #7
    Electix
    Level 21  
    Chodzi o to że na samym początku próbowałem procedurki "encoder" i to w ogóle mi nie działało. Ściągnę nowszą wersję BASCOM może to coś zmieni, pokombinuję też z sygnałami , z połączeniami, może tam coś nie gra. Szkoda mi trochę czasu kontrolera na cykliczne sparwdzanie encodera, dlatego między innymi sprzęgnąłem go z przerwaniem. Na pewno da się to jakoś ogarnąć :) W każdym razie tematu jeszcze nie zamykam, a jak coś mi wyjdzie to pochwalę się wynikami... :)

    Pozdrawiam wszystkich!!!!