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

Bascom: Przykłady obsługi enkodera AS5600 - poszukiwanie programów i porad

nouki 11 Kwi 2023 14:25 807 7
REKLAMA
  • #1 20534553
    nouki
    Poziom 25  
    Witam.

    Szukam jakiś przykładów obsługi w/w enkodera pod Bascomem.
    Jeśli ktoś posiada jakieś programy proszę o wstawienie.

    Wiem zaraz się zacznie że jestem leń i że ten język to ....
    Niestety nie znalazłem niczego szukając a po przesiadce na C nic sensownego nie mogę sklecić :).

    Pozdrawiam i Dzięki.
  • REKLAMA
  • #2 20534724
    miszcz310
    Poziom 24  
    Zobacz coś takiego:

    
    $regfile = "m328pdef.dat" 'definicja mikrokontrolera
    $crystal = 16000000 'częstotliwość taktowania mikrokontrolera
    $baud = 9600 'szybkość transmisji szeregowej
    $hwstack = 40 'rozmiar stosu sprzętowego
    $swstack = 40 'rozmiar stosu programowego
    $framesize = 40 'rozmiar ramki stosu
    
    'Inicjalizacja portów wejściowych i wyjściowych
    Config Lcd = 16 * 2 'definicja wyświetlacza LCD 16x2
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
    Config Encoder = Enabled , Encoder0 = Portd.2 , Encoder1 = Portd.3 'definicja enkodera AS5600
    
    'Zmienne globalne
    Dim Counter As Byte 'licznik do przechowywania stanu enkodera AS5600
    Dim Last_counter As Byte 'ostatni stan enkodera AS5600
    
    'Sekcja inicjalizacyjna
    Enable Interrupts 'włączenie obsługi przerwań
    Counter = 0 'zerowanie licznika
    
    'Liczba impulsów enkodera
    Const Encoder_Resolution = 1024 'dla enkodera AS5600
    
    'Main loop programu
    Do
       If Last_counter <> Counter Then 'jeśli enkoder się przesunął
          Lcdout $FE , 1 'czyść ekran wyświetlacza
          Lcdout "Counter: " ; Counter 'wyświetl stan enkodera
          Last_counter = Counter 'zapisz aktualny stan enkodera
       End If
       Waitms 50 'opóźnienie dla odświeżenia wyświetlacza
    Loop
    
    'Obsługa przerwań od enkodera
    On Encoder0 Encoder_isr
    On Encoder1 Encoder_isr
    
    Sub Encoder_isr()
       Dim Delta As Integer 'wartość zmiany stanu enkodera
       Delta = Encoder - Last_counter 'obliczenie zmiany stanu enkodera
       If Delta > 0 Then 'przód
          Counter = (Counter + Delta) Mod Encoder_Resolution
       ElseIf Delta < 0 Then 'tył
          Counter = (Counter + Encoder_Resolution + Delta) Mod Encoder_Resolution
       End If
       Last_counter = Encoder 'zapisz aktualny stan enkodera
    End Sub
    
  • REKLAMA
  • #3 20534856
    bart-projects
    Poziom 29  
    Kolego @miszcz310 tu nie wykorzystuje się przerwań bo to enkoder magnetyczny z interfejsem I2C który dodatkowo ma tylko wyjście PWM lub DAC. Czyta się go przez odpytywanie co jakiś czas.
    BTW "Config Encoder = Enabled" to chyba tylko bot mógł napisać ahahahaha :D

    Trzeba sobie ustawić Timer i odpytywać. Enkoder ma 14bit więc najprosciej jest chyba zadeklarowac sobie 16bit Word a na niego założyć przez Overlay dwubajtową tablicę. Czytasz sobie dwa bajty RAW i zakładasz na to maskę &B0011_1111_1111_1111 lub inaczej &H20 i masz wynik. Jak wynik się różni od poprzedniego to sobie chyba poradzisz.

    To najprostsze rozwiazanie. Są tam rejestry które mozna konfigurować.

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Mogłem się tu gdzieś machnąć bo ten pseudokod pisałem tu w edytorze Elektrody.
    Wszystko można uprościć używając funkcji I2creceive()
    Można też ustawić układ by nie trzeba było ustawiać pointera i czytać albo wszystkie dostępne bajty w kółko albo tylko te potrzebne. No możliwości jest więcej.
    Może później znajdę więcej czasu. Trochę jestem zarobiony ;)
  • REKLAMA
  • #4 20535140
    miszcz310
    Poziom 24  
    bart-projects napisał:
    Config Encoder = Enabled" to chyba tylko bot mógł napisać ahahahaha


    No bo to bot napisał. Dzięki temu odpowiedziałeś pewnie (⁠◍⁠•⁠ᴗ⁠•⁠◍⁠)
  • #5 20535516
    nouki
    Poziom 25  
    Wykrywa mi go pod adresem &H6C . Co bym nie czarował to wynik jest zawsze taki sam czyli 0.
    Dla sprawdzenia wgrałem kod w C i działa.
  • REKLAMA
  • #8 20535679
    bart-projects
    Poziom 29  
    Adres się zgadza. &H6C podzielone przez dwa to &H36 ;) Możesz sprawdzić wbudowanym w Windows kalkulatorem programisty.
    W nocie podają adres nie uwzgledniając bitu RW. Bascom od razu przesuwa adres w lewo o jeden bit żeby zrobić miejsce na bit RW. Przesunięcie w lewo oznacza jednocześnie mnożenie przez dwa.
    Adres do zapisu &H6C a adres do odczytu &H6D.

    W swoich kodach, żeby było jaśniej to piszę teraz tak:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
REKLAMA