Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Enkoder z mikrokontrolerem ATtiny - jak przeprogramować

mzuber 18 Sep 2023 12:17 234 16
  • #1
    mzuber
    Level 13  

    Znalazłem w sieci kod do enkodera z mikrokontrolerem ATtiny. Kod w załącznikach.
    Potrzebuję, aby po podaniu napięcia na układ mikrokontrolera programowo wygenerował 3 mechaniczne przekręcenia w prawo enkodera.
    Jak zmodyfikować program?
  • #2
    miszcz310
    Level 23  
    Hmmm. Ogólnie to ten kod jest takiej sobie jakości. Poza tym to jest kod do czytania enkodera, a Ty chcesz generować.
    Pytania:
    1. Jaki enkoder chcesz generować (kwadraturowy? Jakiś kod Graya?)
    2. 3 mechaniczne przekręcenia, to znaczy 3 pełne obroty? (jeżeli tak, to musisz wiedzieć ile impulsów jest na obrót), 3 kliknięcia?
  • #3
    mzuber
    Level 13  
    miszcz310 wrote:
    ...to jest kod do czytania enkodera, a Ty chcesz generować.

    Wszystko się zgadza.
    miszcz310 wrote:

    1. Jaki enkoder chcesz generować (kwadraturowy? Jakiś kod Graya?)

    Taki jak enkoder głośności w radyjku Renault 281156412R. Nie mam jeszcze schematu.[/quote]
    miszcz310 wrote:

    2. 3 mechaniczne przekręcenia, to znaczy 3 pełne obroty? (jeżeli tak, to musisz wiedzieć ile impulsów jest na obrót), 3 kliknięcia?

    3 kliknięcia - jedno kliknięcie enkodera w radyjku Renault 281156412R podnosi dzwięk o 1.

    Ogólnie chcę nadpisać kod w mikrokontrolerze w enkoderze radyjka Renault 281156412R. Po podaniu napięcia na układ mikrokontrolera ma on programowo wygenerować 3 mechaniczne przekręcenia w prawo enkodera i zwiększyć programowo poziom dźwięku o 3, a dalej enkoder ma działać bez zmian czyli mikrokontroler ma czytać. Nie potrafię ogarnąć tych wszystkich modułów w radyjku więc pomyślałem że to ciekawe rozwiązanie problemu.
  • #4
    miszcz310
    Level 23  
    mzuber wrote:
    miszcz310 wrote:

    Taki jak enkoder głośności w radyjku Renault 281156412R. Nie mam jeszcze schematu.
    [/quote]
    Aha, jak nie wiesz jaki tam jest to nic nie można zrobić. Najwyżej możesz otworzyć radio i zobaczyć sam, sprawdzić.

    mzuber wrote:
    Ogólnie chcę nadpisać kod w mikrokontrolerze w enkoderze radyjka Renault 281156412R. Po podaniu napięcia na układ mikrokontrolera ma on programowo wygenerować 3 mechaniczne przekręcenia w prawo enkodera i zwiększyć programowo poziom dźwięku o 3, a dalej enkoder ma działać bez zmian czyli mikrokontroler ma czytać. Nie potrafię ogarnąć tych wszystkich modułów w radyjku więc pomyślałem że to ciekawe rozwiązanie problemu.


    Czyli to ma działać przy uruchomieniu samochodu? To radio nie zapamiętuje ustawień? Ogólnie to jak dla mnie trochę przerost formy nad treścią. Czy nie ma jakiś pilotów do tego radia? Wtedy można by zrobić taki pilot który podgłaśnia przy uruchamianiu samochodu. Poza tym Zrobienie takiego man-in-the-middle, może być trudniejsze niż się na początku wydaje, a atiny nie jest też demonem prędkości, a nie ma sprzętowego licznika do obsługi enkoderów.
  • #5
    mzuber
    Level 13  
    miszcz310 wrote:
    ...To radio nie zapamiętuje ustawień?...

    Niestety nie.

    miszcz310 wrote:
    ...jak nie wiesz jaki tam jest to nic nie można zrobić...

    Myślę że opcje są dwie
    1. siedzi tam enkoder z przyciskiem - zał.1. Wiec wlutowuję ATtiny i programowo po włączeniu zasilania podaję 3 impulsy.
    2. siedzi tam enkoder z przyciskiem i ATtiny - zał. 2. Więc wgrywam program z przerwaniami i programowo po włączeniu zasilania podaję 3 impulsy.

    miszcz310 wrote:
    ...dla mnie trochę przerost formy nad treścią...

    Dla mnie też, ale mnie strasznie wku ta sytuacja i nie mam za bardzo innego pomysłu, więc przerost formy uzasadniony.
    Można podobno jeszcze przełożyć pamięć z innego radyjka lub grzebać w oprogramowaniu modułów radia.

    miszcz310 wrote:

    Czy nie ma jakiś pilotów do tego radia?

    Sprawdzę. To też niezła zabawa i bez programowania się nie obejdzie.
  • #6
    gps79
    Level 33  
    Wymyśl jeszcze coś, aby Twój ATtiny nie zakłócał się wzajemnie z oryginalnym enkoderem, oraz pomyśl, dlaczego 4 impulsy będą lepsze od 3. Postudiuj, jak działa enkoder, co jest właściwie przekazywane do mikrokontrolera, gdy wykonasz obrót o 1 impuls i dowiedz się, jaki typ enkodera siedzi w Twoim radiu (to właściwie na samym początku).
  • #7
    miszcz310
    Level 23  
    mzuber wrote:
    miszcz310 wrote:

    Sprawdzę. To też niezła zabawa i bez programowania się nie obejdzie.

    No, niby tak, ale robienie man-in-the-middle z attiny i enkodera jest moim zdaniem strasznym wyzwaniem hardwarowym. Zazwyczaj piloty są w jakimś standardzie, który jest udokumentowany i wbrew pozorom jest to ładniejsze rozwiązanie, gdyż jak padnie radio i chciałbyś wymienić, to nie ma żadnego problemu z przerabianiem.

    gps79 wrote:
    Wymyśl jeszcze coś, aby Twój ATtiny nie zakłócał się wzajemnie z oryginalnym enkoderem

    Ja zrozumiałem, że nie ma połączenia pomiędzy enkoderem a radiem, tylko wszystko jest przez attiny. Wtedy nie będzie problemu, o którym mówisz.

    A te załączniki z obrazkami tych enkoderów to z lewej strony jest to co chcesz? Jakbyś mógł je jakoś opisać co się dzieje.

    Edit: Jakbyś mógł zmienić procek z attiny na np. STM32C011x4/x6 (chyba najmniejszy stm32 z linii "po taniości") to tam masz sprzętową obsługę enkoderów kwadraturowych i ładnie, albo w przerwaniu byś to sobie zrobił, albo może jakoś chytrze przez DMA dałoby się to zrobić (raczej na pewno przez dma da radę bo robisz tablicę ze stanami pinów i jak wykryjesz nowy impuls od enkodera to wystawiasz nową wartość na port z tablicy a tablica chodzi w trybie circular). Można w sumie zrobic też jakieś cuda (niepotrzebne) jak np. zwiększanie rozdzielczości tego enkodera (wyślij jeden impuls po tym jak dostaniesz jeden), nie wiem po co, ale być może ma to jakiś sens...
    Edit2: No chyba tak się nie da z dma bo trzeba wykrywać kierunek jakoś.
  • #8
    gps79
    Level 33  
    miszcz310 wrote:
    Ja zrozumiałem, że nie ma połączenia pomiędzy enkoderem a radiem
    ja zrozumiałem, że autor chce "wstrzyknąć" impulsy w linie sygnałowe enkodera. Może nie doczytałem, albo autor mógłby dopisać, jaki ma zamysł.
  • #9
    tmf
    Moderator of Microcontroller designs
    miszcz310 wrote:
    Poza tym Zrobienie takiego man-in-the-middle, może być trudniejsze niż się na początku wydaje, a atiny nie jest też demonem prędkości, a nie ma sprzętowego licznika do obsługi enkoderów.

    Co ty opowiadasz... Mamy enkoder, który generuje max kilka impulsów na sekundę i to ma być problem?
    miszcz310 wrote:
    No, niby tak, ale robienie man-in-the-middle z attiny i enkodera jest moim zdaniem strasznym wyzwaniem hardwarowym.

    A na czym wg ciebie to wyzwanie miałoby polegać? Łączysz enkoder z pinami MCU, po przetworzeniu na inne piny wystawiasz to co odczytałeś z enkodera. Parę linii kodu...
    miszcz310 wrote:
    Jakbyś mógł zmienić procek z attiny na np. STM32C011x4/x6 (chyba najmniejszy stm32 z linii "po taniości") to tam masz sprzętową obsługę enkoderów kwadraturowych i ładnie, albo w przerwaniu byś to sobie zrobił, albo może jakoś chytrze przez DMA dałoby się to zrobić (raczej na pewno przez dma da radę bo robisz tablicę ze stanami pinów i jak wykryjesz nowy impuls od enkodera to wystawiasz nową wartość na port z tablicy a tablica chodzi w trybie circular). Można w sumie zrobic też jakieś cuda (niepotrzebne) jak np. zwiększanie rozdzielczości tego enkodera (wyślij jeden impuls po tym jak dostaniesz jeden), nie wiem po co, ale być może ma to jakiś sens...

    Nie, to nie ma żadnego sensu. Jeśli jest sprzętowa obsługa enkodera to robi się to na timerze, a nie na DMA. Czemu miałoby to służyć?
    Ogólnie problem jest dosyć prosty. Jak pisałem - autor powinien połączyć wyjścia A i B enkodera pod IO MCU. Nawet nie trzeba dekodować kodu enkodera, bo to co się odczyta z IO należy przekazać po prostu na kolejne dwa piny IO, które się włączy tam gdzie oryginalnie był enkoder. W czasie normalnej pracy procek ma po prostu przekazywać to co odczytał na swoje wyjścia. Jedynie przy detekcji POR ma wstrzyknąć 3 impulsy, co nie jest żadnym problemem - można taką sekwencję wygenerować przy pomocy paru delay + machanie pinem IO.
  • #10
    miszcz310
    Level 23  
    tmf wrote:
    miszcz310 wrote:

    Co ty opowiadasz... Mamy enkoder, który generuje max kilka impulsów na sekundę i to ma być problem?

    No właśnie zależy od enkodera. Dlatego zapytałem się w pierwszym moim poście. Ja kiedyś trafiłem na taki enkoder z jakiejś wieży albo wzmacniacza, że miał bardzo dużo impulsów na obrót. To miało chyba symulować 'analogowosc'. Jak zrobiłem odczytując stan portu (notabene na atmedze chyba 8), to jak się szybciej przekręciło to się gubił procek I nie działało to dobrze.

    tmf wrote:
    A na czym wg ciebie to wyzwanie miałoby polegać? Łączysz enkoder z pinami MCU, po przetworzeniu na inne piny wystawiasz to co odczytałeś z enkodera. Parę linii kodu...

    No dla mnie i dla ciebie to nie problem. Jednak jak ktoś wstawia jakiś losowy kod do obsługi enkodera to może już być jakieś zagadnienie dla takiej osoby. I to będzie działać przy założeniu że tam enkoder ma dostatecznie mało impulsów na obrót, bo inaczej będzie z tym problem j.w. .
    tmf wrote:
    Nie, to nie ma żadnego sensu. Jeśli jest sprzętowa obsługa enkodera to robi się to na timerze, a nie na DMA. Czemu miałoby to służyć?
    Ogólnie problem jest dosyć prosty. Jak pisałem - autor powinien połączyć wyjścia A i B enkodera pod IO MCU. Nawet nie trzeba dekodować kodu enkodera, bo to co się odczyta z IO należy przekazać po prostu na kolejne dwa piny IO, które się włączy tam gdzie oryginalnie był enkoder. W czasie normalnej pracy procek ma po prostu przekazywać to co odczytał na swoje wyjścia. Jedynie przy detekcji POR ma wstrzyknąć 3 impulsy, co nie jest żadnym problemem - można taką sekwencję wygenerować przy pomocy paru delay + machanie pinem IO.

    No tak jak napisałem w edit2 to był słaby pomysł. Aczkolwiek można by to zrobić z DMA żeby dać rejestr wejściowy jednego portu i DMA kierować na wyjściowy drugiego. Piny musiałyby być o tych samych numerach i nie da się używać tych portów, ale powinno działać. Ten nieudany pomysł zakładał użycie timera w roli obsługi enkodera i DMA miało wysyłać kolejne sekwencje. Problemem jednak jest tutaj zmiana kierunku dlatego tak jak napisałem, jest to zły pomysł. Zaletą licznika do obsługi jest to że on nie gubi szybkich impulsów.
  • #11
    tmf
    Moderator of Microcontroller designs
    miszcz310 wrote:
    No właśnie zależy od enkodera. Dlatego zapytałem się w pierwszym moim poście. Ja kiedyś trafiłem na taki enkoder z jakiejś wieży albo wzmacniacza, że miał bardzo dużo impulsów na obrót. To miało chyba symulować 'analogowosc'. Jak zrobiłem odczytując stan portu (notabene na atmedze chyba 8), to jak się szybciej przekręciło to się gubił procek I nie działało to dobrze.

    Na obrót enkodery generują sporo impulsów, ale takie mechaniczne do sterowania to do kilkuset max. Czyli zakładając, że ktoś kręci jak szalony to wyjdzie max 1000-2000 impulsów/s. Kod musiałby być fatalnie napisany, żeby tego nie obsłużyć, co jest oczywiście możliwe...
    Gdybyśmy mówili o dziesiątkach-setkach kHz, to można by użyć do forwardowania impulsów np. event system, dostępny na nowszych AVR i ARM SAM, na innych ARMach są podobne funkcjonalności.
  • #12
    miszcz310
    Level 23  
    tmf wrote:
    Na obrót enkodery generują sporo impulsów, ale takie mechaniczne do sterowania to do kilkuset maks. Czyli zakładając, że ktoś kręci jak szalony, to wyjdzie maks. 1000-2000 impulsów/s. Kod musiałby być fatalnie napisany, żeby tego nie obsłużyć, co jest oczywiście możliwe...
    Gdybyśmy mówili o dziesiątkach-setkach kHz, to można by użyć do forwardowania impulsów np. event system, dostępny na nowszych AVR i ARM SAM, na innych ARMach są podobne funkcjonalności.


    Ach, no właśnie zależy od enkodera i jak szybko ktoś jest w stanie nim zakręcić. Do tego dochodzi jak szybko jest taktowany procesor i czy robi coś innego niż tylko liczy impulsy. W tamtym przypadku było dużo innej funkcjonalności i wydawało mi się dokładnie tak jak tobie, że dołożenie czegoś tak 'wolnego' jak enkoder to żadne wyzwanie.
    Teraz sobie uświadomiłem, że jest jeszcze bit banging w armach, więc można połączyć przez 4 kanały DMA i poprzez bit banging. Problem mógłby być jak wymuszać transfer, ale można by po prostu robić to na jakimś timerze.
    Anyway, jako że jest to forum i w pewnym sensie zabawa to nie widzę problemu w proponowaniu takich rozwiązań. Takie rozwiązanie miałoby też pewne zalety. Taki STM pewnie zuzywalby dużo mniej prądu, można by lepsze osiągi wyciągnąć, kod byłby wbrew pozorom prostszy, można debugować, cena prawie taka sama. Jakże procek by się nudził to może starczyło by pinów na zrobienie obsługi pilota i mamy sterowanie głośnością z pilota na kierownicy (oczywiście diy), opcja mute jednym klikiem, etc.
  • #13
    gps79
    Level 33  
    Jeśli Attiny ma działać jako proxy pomiędzy enkoderem, a radiem, to zrobiłbym to na przerwaniach. Tak, jak TMF pisał, to parę linijek kodu.
    Code: c
    Log in, to see the code

    Najkrótszy czas pomiędzy dwoma obsłużonymi przerwaniami zmiany wartości pinu to 93 cykle zegarowe (może nawet szybciej, jakby to zrobić inline), co przy zegarze 1MHz daje transferowanie ponad 10 000 zmian wartości enkodera na sekundę. Spokojnie można by puścić ATtiny z niższą prędkością.
  • #14
    mzuber
    Level 13  
    gps79 wrote:
    ja zrozumiałem, że autor chce "wstrzyknąć" impulsy w linie sygnałowe enkodera. Może nie doczytałem, albo autor mógłby dopisać, jaki ma zamysł.

    Dokładnie tak.
    Radyjko nie zapamiętuje poziomu głośności przy wyłączaniu i standardowo ustawia na 15 (bardzo cicho) przy ponownym włączeniu.

    Mój zamysł:
    Po włączeniu radyjka wstrzykuje programowo impulsy poprzez ATtiny w linie sygnałowe enkodera i tyle.
    Z poziomu dźwięku 15 ATtiny po włączeniu radyjka i otrzymaniu zasilania programowo robi 18 i jest super.
    Reszta mnie nie interesuje bo załatwia to już firmowa elektronika radyjka.

    tmf wrote:

    Nawet nie trzeba dekodować kodu enkodera, bo to co się odczyta z IO należy przekazać po prostu na kolejne dwa piny IO, które się włączy tam gdzie oryginalnie był enkoder. W czasie normalnej pracy procek ma po prostu przekazywać to co odczytał na swoje wyjścia. Jedynie przy detekcji POR ma wstrzyknąć 3 impulsy, co nie jest żadnym problemem - można taką sekwencję wygenerować przy pomocy paru delay + machanie pinem IO.


    Właśnie tak. Uruchamiam radyjko, ATtiny dostaje zasilanie, wstrzykuje 3 impulsy w linie wyjściową enkodera i pozamiatane. Nawet nie chciałem przekazywania robić, tylko równolegle podpiąć w linię enkodera. Chyba że tam już firmowo przy enkoderze siedzi ATtiny13, to wtedy go przeprogramować na wstrzyknięcie 3 impulsów i obsługę enkodera.

    gps79 wrote:

    Wymyśl jeszcze coś, aby Twój ATtiny nie zakłócał się wzajemnie z oryginalnym enkoderem, oraz pomyśl, dlaczego 4 impulsy będą lepsze od 3. Postudiuj, jak działa enkoder, co jest właściwie przekazywane do mikrokontrolera, gdy wykonasz obrót o 1 impuls i dowiedz się, jaki typ enkodera siedzi w Twoim radiu


    Dobry pomysł, poczytam trochę lektury.
    Może też na weekend dobiorę się do tego radyjka to wiele się wyjaśni. Tylko obawiam się o to że nie mam PIN'u odblokowującego i będzie nowy problem - "ucegle" to radyjko.
  • #16
    tmf
    Moderator of Microcontroller designs
    mzuber wrote:
    Enkoder który jest w radyjku ma 16 pozycji na obrót.

    Nie ma znaczenia, kol. @gps79 właściwie był tak uprzejmy, że dał ci praktycznie gotowy kod.
    mzuber wrote:
    Nawet nie chciałem przekazywania robić, tylko równolegle podpiąć w linię enkodera.

    Tak się za bardzo nie da. Dostałeś rozwiązanie + kod do modyfikacji i jeśli się upierasz przy takiej funkcjonalności to właściwie na ma o czym dyskutować, trzeba się brać do pracy :)
  • #17
    gps79
    Level 33  
    Autorze, proponowałem zapoznanie się ze sposobem działania enkoderów, ale widzę, że praktyk z Ciebie i masz chęć do zajrzenia do tego radia.
    Gdybyś jednak zaznajomił się ze sposobem działania enkoderów dowiedziałbyś się, że to, co chcesz zrobić jest na 99% niemożliwe w formie, jaką zaproponowałeś. Na 100% będziesz wiedział dopiero, jak zobaczysz/pomierzysz enkoder w Twoim radiu.

    Większość enkoderów w trakcie ruchu w danym kierunku generuje taki oto sygnał na dwóch liniach (A i B):
    Enkoder z mikrokontrolerem ATtiny - jak przeprogramować
    Linie te zwykle na stałe podpięte są pod stan wysoki (np. +5V) poprzez rezystor pull-up, a enkoder zwiera w pewnym momencie daną linię do masy wytwarzając na niej stan niski.
    Enkoder z mikrokontrolerem ATtiny - jak przeprogramować
    Oznacza to, że gdy linia znajduje się w stanie niskim (jest zwarta do masy), to w żaden sposób nie będziesz w stanie wymusić na niej stanu wysokiego.
    Z czterech możliwych kombinacji stanów linii A i B (niski+niski, niski+wysoki, wysoki+niski, wysoki+wysoki)
    Enkoder z mikrokontrolerem ATtiny - jak przeprogramować
    tylko jeden stan (wysoki+wysoki) pozwala na wstrzyknięcie dodatkowych impulsów, bo ze stanu wysokiego możesz zrobić stan niski (poprzez zwarcie linii do masy), ale ze stanu niskiego nie jesteś w stanie zrobić stanu wysokiego.
    Dlatego jedyną opcją jest odłączenie enkodera od linii A i B i wstawienie pomiędzy A i B, a enkoder mikrokontrolera z odpowiednim oprogramowaniem, co domyślnie założyli koledzy wyżej.
    Temat do przemyślenia.