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

Jak obsłużyć enkoder w Bascom bez przerwań przy szybkim obrocie?

robiw 11 Lip 2007 10:06 6155 7
REKLAMA
  • #1 4070872
    robiw
    Poziom 26  
    Posty: 2030
    Pomógł: 25
    Ocena: 133
    Witam.
    Temat ogólnie znany ale próbowałem pisać różne procedury, przeszukiwałem Elektrodę i niestety nie znalazłem dobrej obsługi enkodera bez używania systemu przerwań (nie pozwala mi na to konstrukcja programu, gdyż innym przerwaniem obsługuję RS'a dla którego bardzo ważne są timingi). Poniżej zamieszczam najbardziej optymalną procedurę (z sieci), która działa dobrze gdy wolno kręci się ośką enkodera ale już przy szybszym tempie, wskazania oscylują wokół ostatniej wartości (jeden w górę, jeden w dół itd.) - procedura "reaguje na zbocze sygnału". Dodatkowo, aby zapobiec drganiom styków między sygnałowe wyprowadzenia enkodera a +5V dałem rezystor 1K a między te wyprowadzenia a masę dałem kondensator 100nF. Nadal nic nie pomaga. MOŻE MACIE JAKIEŚ SPRAWDZONE PROCEDURY OBSŁUGI - bardzo proszę o pomoc i z góry dziękuję... robiw

    
    Dim Datas As Byte
    Dim Current_clk As Bit
    Dim Last_clk As Bit
    
    Current_clk = P3.0
    Last_clk = P3.0
    
    Do
    
     Set P3.0
     Current_clk = P3.0
    
     If Last_clk = 1 Then
      If Current_clk = 0 Then
       Set P3.1
       If P3.1 <> 0 Then Incr Datas
       If P3.1 <> 1 Then Decr Datas
      End If
     End If
     Last_clk = Current_clk
    
     'Tutaj jakieś instrukcje programu
    loop
    
  • REKLAMA
  • #2 4070909
    Dr_DEAD
    Poziom 28  
    Posty: 829
    Pomógł: 126
    Ocena: 3
    robiw napisał:

    ...
    niestety nie znalazłem dobrej obsługi enkodera bez używania systemu przerwań (nie pozwala mi na to konstrukcja programu, gdyż innym przerwaniem obsługuję RS'a dla którego bardzo ważne są timingi)

    Bo dobra procedura enkodera musi być na przerwaniach. Spróbuj pogodzić jedne przerwania z drugimi, np. skracając czas obsługi przerwania do minimum, lub zezwalając na obsługę przerwań od RS'a w przerwaniu od enkodera.

    Dodano po 3 [minuty]:

    robiw napisał:

    Dodatkowo, aby zapobiec drganiom styków między sygnałowe wyprowadzenia enkodera a +5V dałem rezystor 1K a między te wyprowadzenia a masę dałem kondensator 100nF. Nadal nic nie pomaga.

    Przepraszam za głupie pytanie ale: Czy w enkoderze są jakieś styki?
  • REKLAMA
  • REKLAMA
  • #4 4077830
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 123
    Nawet nie napisałeś jaki to procesor...

    Ten RS musi być obsługiwany programowo? Może wykorzystaj sprzętowy, a wtedy przerwania nie będą przeszkadzać.
  • #5 4078001
    robiw
    Poziom 26  
    Posty: 2030
    Pomógł: 25
    Ocena: 133
    Tak nie mogę, gdyż, tak naprawdę (nie napisałem) obsługa impulsatora zaszyta jest w procedurze a procedura używana w kilku miejscach programu, gdyż za pomocą impulsatora zmieniam ponad 20 parametrów. Chyba jednak użyję przerwania Int0, które to będę blokował w obsłudze przerwania Serial (jest ważniejsze). Ciekaw jestem tylko czy przerwanie od Seriala, które ma priorytet nie będzie mi wywalać przerwania Int0 (impulsatora) lub co gorsza nie zawiesi procka... robiw
  • #6 4078003
    K_o_n_r_a_d
    Poziom 23  
    Posty: 318
    Pomógł: 86
    Ocena: 9
    Podczas szybkiego kręcenia wartości oscylują wokół ostatniej dlatego, że reszta kodu wykonywana równolegle do obsługi impulsatora zbyt długo trwa. Spróbuj jakoś zwiększyć częstotliwość sprawdzania impulsatora. Może masz jakąś część kodu, który nie musi się wykonywać w każdym cyklu pętli głównej itp.

    W ostateczności, jesli nie będzie to przeszkadzało reszcie programu możesz zrobić coś takiego:
    Dim Datas As Byte 
    Dim Current_clk As Bit 
    Dim Last_clk As Bit 
    
    Current_clk = P3.0 
    Last_clk = P3.0 
    
    Do 
       gosub sprawdz_impulsator
     'CZĘŚĆ RESZTY PROGRAMU
       gosub sprawdz_impulsator
     'CZĘŚĆ RESZTY PROGRAMU
    loop
    
    sprawdz_impulsator:
     Set P3.0 
     Current_clk = P3.0 
     If Last_clk = 1 Then 
      If Current_clk = 0 Then 
       Set P3.1 
       If P3.1 <> 0 Then Incr Datas 
       If P3.1 <> 1 Then Decr Datas 
      End If 
     End If 
     Last_clk = Current_clk
    return
    

    Po każdej części programu, która zajmuje "sporo czasu" powtórzyć obsługę impulsatora.
    -------
    PS.
    Trochę narozrabiałem, bo napisałem wiadomość z nieswojego konta (przez przypadek) a póżniej usunąłem, aby napisać ze swojego konta :/ i robiw zdążył odpowiedzieć na tamtą poprzednią zanim zmieniłem :)
  • REKLAMA
  • #7 4078142
    robiw
    Poziom 26  
    Posty: 2030
    Pomógł: 25
    Ocena: 133
    McRancor napisał:
    Nawet nie napisałeś jaki to procesor...

    Ten RS musi być obsługiwany programowo? Może wykorzystaj sprzętowy, a wtedy przerwania nie będą przeszkadzać.


    procek 89C4051 a przerwanie rs'a obsługuje dane przesyłane przez midi z baud 31250 b/sec więc programowo to wolałbym nie, zwłaszcza, że procek ma co robić... robiw
  • #8 4083550
    robiw
    Poziom 26  
    Posty: 2030
    Pomógł: 25
    Ocena: 133
    Witam... i temat zamykam :-)

    Zastosowałem jednak obsługę enkodera na przerwaniu Int1. Jedno z wyprowadzeń podpiąłem pod Int1, przerwania ustawiłem na wyzwalane opadającym zboczem a w samym przerwaniu sprawdzam co jest na drugiej "nodze" enkodera i zmniejszam lub zwiększam wybraną daną a którą wiem po indeksie zmienianym w petli głównej do loop. W przerwaniu od MIDI blokuję przerwanie Int1. Działa bez zarzutu, bardzo precyzyjnie i to jest optymalne rozwiązanie...pozdrawiam.. dziękuję... robiw

Podsumowanie tematu

✨ Dyskusja dotyczy problemu obsługi enkodera inkrementalnego w Bascom bez użycia przerwań, zwłaszcza przy szybkim obrocie wałka, gdzie standardowa procedura reagująca na zbocze sygnału powoduje oscylacje wartości. Próby eliminacji drgań styków poprzez zastosowanie rezystora 1kΩ i kondensatora 100nF nie przyniosły poprawy. Zalecane jest jednak stosowanie przerwań do obsługi enkodera, ponieważ procedura bez przerwań wymaga bardzo szybkiego i częstego sprawdzania sygnału, co jest trudne do pogodzenia z innymi czasowo krytycznymi zadaniami, takimi jak obsługa transmisji RS (MIDI) z baudrate 31250 bps. Proponowano skrócenie czasu obsługi przerwań lub zezwolenie na przerwania z RS w przerwaniu enkodera. Ostatecznie skutecznym rozwiązaniem okazało się wykorzystanie przerwania zewnętrznego Int1 do obsługi jednego z sygnałów enkodera, z blokowaniem tego przerwania podczas obsługi przerwania MIDI, co zapewniło precyzyjną i stabilną obsługę enkodera bez zakłóceń i zawieszeń procesora.
Wygenerowane przez model językowy.
REKLAMA