logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

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

Electix 08 Mar 2007 17:54 5630 6
REKLAMA
  • #1 3657369
    Electix
    Poziom 21  
    Posty: 462
    Pomógł: 46
    Ocena: 6
    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:
    
    $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 :)
  • REKLAMA
  • #2 3660876
    sylwunia35
    Poziom 18  
    Posty: 331
    Pomógł: 16
    Ocena: 146
    WITAM
    Zobacz w EP 4/2005 jest wszystko czego potrzebujesz.
  • REKLAMA
  • #3 3662033
    Electix
    Poziom 21  
    Posty: 462
    Pomógł: 46
    Ocena: 6
    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 :)
  • REKLAMA
  • #4 3662309
    sylwunia35
    Poziom 18  
    Posty: 331
    Pomógł: 16
    Ocena: 146
    Wieczorem dam skana jak znajde chwile czasu.
  • REKLAMA
  • #5 3662354
    seba_x
    Poziom 31  
    Posty: 2071
    Pomógł: 29
    Ocena: 112
    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 3664479
    sylwunia35
    Poziom 18  
    Posty: 331
    Pomógł: 16
    Ocena: 146
    No właśnie w EP jest tak:
    stan_enk=Enkoder(pind.1,pind.2,Lewo,Prawo,0)

    Lewo:
    .......
    Return

    Prawo:
    ........
    Return
  • #7 3665368
    Electix
    Poziom 21  
    Posty: 462
    Pomógł: 46
    Ocena: 6
    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!!!!

Podsumowanie tematu

✨ Problem dotyczy poprawnej obsługi impulsatora (enkodera) z przełącznikiem osiowym EC12E podłączonego do mikrokontrolera ATmega8, programowanego w Bascom. Sygnały A, B, E enkodera są podłączone do portów PORTD.6, PORTD.5, PORTD.4 z wewnętrznym podciąganiem oraz przez diody 1N4148 do przerwania INT1. Autor zgłasza problemy z działaniem własnej implementacji, próbował użyć wbudowanej procedury "encoder" w Bascom, która jednak początkowo nie działała. W dyskusji zasugerowano skorzystanie z artykułu w Elektronice Praktycznej 4/2005, gdzie znajduje się gotowy przykład obsługi enkodera, oraz użycie cyklicznego wywoływania podprogramu co 2,2 ms, co eliminuje drgania styków. Autor planuje aktualizację Bascom i dalsze testy, rozważa też wykorzystanie przerwania do obsługi enkodera zamiast cyklicznego sprawdzania.
Wygenerowane przez model językowy.
REKLAMA