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

[ATmega16][Bascom] Problem z encoderem.

mr.box 05 Cze 2008 16:53 2779 4
REKLAMA
  • #1 5216348
    mr.box
    Poziom 15  
    Witam.
    Tak jak pisałem powyżej w temacie. Problem jest z encoderem, tego typu, iż w jedną stronę ( dodatnią, gdy dodaje głośności ) działa "znośnie" dobrze, lecz w drugą, gdy kręcę ( szybko ) normalnie, dodaje 2 kroki, i odejmuje jeden, a kiedy powoli kręcę, to odejmuje cały czas, czyli działa normalnie. Jest to strasznie denerwujące. Właśnie wymieniłem encoder na kolejny ( myślałem, że to encoder się zepsuł), ale jednak to nie to.
    Teraz krótko o programie:
    instrukcja obsługująca encoder to
    Enk = Encoder(pina.6 , Pina.7 , Glosniej , Ciszej , 0)  


    dalej podprogramy od encodera:
    Glosniej:
    Cls : Locate 1 , 1 : Lcd "  glosnosc"
       Incr Glosnosc
       Wysglosnosc = Glosnosc
       Wysglosnosc = Wysglosnosc * 125
    Locate 2 , 2
    Lcd "  -" ; Wysglosnosc ; "       "
    Wysglosnosc = Wysglosnosc \ 100
    Locate 2 , 1
    Lcd "  -" ; Wysglosnosc ; "."
    Locate 2 , 11
    Lcd "dB   "
       If Glosnosc > 63 Then Glosnosc = 63
       Gosub Wyslijtda
    Return
    
    
    Ciszej:
    Cls : Locate 1 , 1 : Lcd "  glosnosc"
       Decr Glosnosc
       Wysglosnosc = Glosnosc
       Wysglosnosc = Wysglosnosc * 125
    Locate 2 , 2
    Lcd "  -" ; Wysglosnosc ; "       "
    Wysglosnosc = Wysglosnosc \ 100
    Locate 2 , 1
    Lcd "  -" ; Wysglosnosc ; "."
    Locate 2 , 11
    Lcd "dB   "
       If Glosnosc > 63 Then Glosnosc = 63
       Gosub Wyslijtda
       Return
    


    Probowałem, już wielu możliwości, z nim, i nic....Może ktoś miał podobny przypadek?? bardzo proszę o pomoc.
    Z góry dziękuję.
  • REKLAMA
  • #2 5216764
    spektra
    Poziom 18  
    Witaj.

    Czy ustawiłeś dobrze kierunek poru, w szczególności linie podpiete do enkodera?
  • REKLAMA
  • #3 5216849
    ZbeeGin
    Poziom 39  
    Niestety. Czasami instrukcja ENCODER wariuje - albo nawet nie działa wcale.
    Nie udało mi się ustalić przyczyny takiego stanu. Prawdopodobnie chodzi o ilość kroków takiego enkodera i sposób w jaki ustalane są stany w stanie spoczynku tegoż enkodera - jak zaskoczy. Być może potrzebny jest enkoder, który podczas jednego skoku przechodzi cały cykl by powrócić do stanu obydwu styków zwartych.

    spektra napisał:
    Czy ustawiłeś dobrze kierunek poru, w szczególności linie podpiete do enkodera?

    Kolega przecież odczytuje bezpośrednio stan końcówek portu. Stąd w instrukcji ENCODER podał PIN a nie PORT. Zatem kierunek nie ma tutaj znaczenia. Zawsze można w ten sposób realny stan końcówki portu odczytać. Niezależnie od ustawień w DDR.
  • REKLAMA
  • #4 5217075
    mr.box
    Poziom 15  
    A jaką instrukcją, bądź kawałkiem kodu mógłbym zastąpić tą instrukcję ( encoder ), czy mógł by mi ktoś napisać, opisać taki kawałek programu, wiem, że jakoś się go robiło na instrukcji "If...Then", a nawet spotkałem się na obsłudze encodera, na Timerach...
    Mógł by mi ktoś pomóc....
  • #5 5220579
    pier
    Poziom 24  
    Proszę bardzo, masz tu program który obsługuje impulsator.

    
    Cha Alias Pind.2
    Chb Alias Pind.5
    Config Cha = Input                                          'wej.kanał A encodera INT0 procesora
    Config Chb = Input                                          'wej.kanał B encodera
    Config Pind.4 = Output                                      'wyjście +
    Config Pind.3 = Output                                      'wyjście -
    Config Pind.6 = Output                                      'sygnalizator impulsów LED
    Config Int0 = Falling
    Const Debouncetime = 1
    
    On Int0 Getencoder
    Enable Interrupts
    Enable Int0
    
    
    
    Getencoder:
    Waitus Debouncetime
    If Cha = 0 Then
    If Chb = 0 Then Set Portd.4 Else Set Portd.3
    End If
    Reset Portb.0
    Waitms 1
    Set Portd.6
    Reset Portd.3
    Reset Portd.4
    Return
    End
    
REKLAMA