Uruchomienie 3 enkoderów

Rodzina procesorów bogatszych w wiele nowych rozwiązań i dlatego warto po nie sięgnąć.
Awatar użytkownika
Karlos128@nos
Posty: 54
Rejestracja: 18 sie 2015, 13:32

Uruchomienie 3 enkoderów

Post autor: Karlos128@nos » 28 sty 2021, 14:11

Witam.
Panowie potrzebuję 3 encoderów obsługiwanych przez xmega256a3u.
I sprawa ma się tak, uruchomiłem jeden - przykład zaczerpnięty z tego działu no i działa wyśmienicie,
ale potrzebuję jeszcze dwa encodery i najlepiej na jednym porcie.D
Jest coś tam wspomniane o indeksie, ale jak to ugryźć?
Poniżej mój kawałek kodu do rozbudowy o kolejne dwa enkodery, bardzo proszę o pomoc w tej sprawie.
  1. '*******************************************************************************
  2. 'Programm for Display ILI9325C SPI 240x320 Pixel
  3. '*******************************************************************************
  4. $regfile = "xm256a3udef.dat"
  5. $crystal = 32000000
  6. $hwstack = 512
  7. $swstack = 512
  8. $framesize = 512
  9. $lib "xmega.lib" : $external _xmegafix_clear : $external _xmegafix_rol_r1014
  10. Config Osc = Enabled , 32mhzosc = Enabled , 32khzosc = Enabled
  11. Bitwait Osc_status.1 , Set                                  'Check if 32MHz Oscillator is ready
  12. Bitwait Osc_status.2 , Set                                  'Check if internal 32.768 KHz Oscillator is ready
  13. Osc_dfllctrl = &B00000000                                   'The internal 32.768 KHz Oscillator is used for calibration
  14. Set Dfllrc32m_ctrl.0                                        'Enable DFLL and autocalibration
  15. Osc_pllctrl = &B10_0_01000                                  ' 32MHz clock Source and Multiplication factor = 16
  16. Set Osc_ctrl.4                                              ' PLL enable
  17. Bitwait Osc_status.4 , Set                                  'Check if PLL is ready
  18. Config Sysclock = Pll , Prescalea = 1 , Prescalebc = 1_2    ' configure the systemclock ---> use PLL
  19. Waitms 2
  20. Config Priority = Static , Vector = Application , Lo = Enabled , Med = Enabled , Hi = Enabled
  21. Rem ******************************** CPU NORMAL 32MHz ******************************
  22. 'Config Clock = Soft , Rtc = 1khz_int32khz_ulp , Gosub = Sectic
  23. '$noramclear
  24. Rem ******************************** USTAWIENIA PINÓW ENCODERÓW ********************
  25. Config Pind.5 = Input                                       ' przycisk impulsatora
  26. Config Pind.6 = Input                                       ' przycisk impulsatora
  27. Config Pind.7 = Input                                       ' przycisk impulsatora
  28.  
  29. Config Pind.1 = Input                                       'enkoder 1B
  30. Config Pind.0 = Input                                       'enkoder 1A
  31. Config Pind.3 = Input                                       ' enkoder 2B
  32. Config Pind.2 = Input                                       ' enkoder 2A
  33. Config Pind.5 = Input                                       ' enkoder 3B
  34. Config Pind.4 = Input                                       ' enkoder 3A
  35.  
  36. Config Xpin = Portd.1 , Outpull = Pullup , Sense = Low_level       'enable Pull up and reaction on low level
  37. Config Xpin = Portd.0 , Outpull = Pullup , Sense = Low_level
  38. Config Event_system = Dummy , Mux0 = Portd.0 , Qd0 = Enabled , Digflt0 = 4
  39.  
  40.  
  41. Config Tcd0 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec
  42. Rem ************************* Liczniki 16bitowe *******************************
  43. Config Tcc0 = Normal , Prescale = 1024
  44. Tcc0_per = 31250                                            '32MHz/1024 = 31250 --> One Second Tick
  45. On Tcc0_ovf Tc0_isr                                         'Nosave
  46. Enable Tcc0_ovf , Lo
  47.  
  48. Rem Timer E0 16Bit
  49. Config Tce1 = Normal , Prescale = 1024
  50. Tce1_per = 31250                                            '32MHz/1024 = 31250 --> One Second Tick
  51. On Tce1_ovf Sekundnik                                       'Setup overflow interrupt of Timer/Counter E1 and name ISR
  52. Enable Tce1_ovf , Lo
  53.  
  54. Config Eeprom = Mapped
  55. Enable Interrupts
Pikczu
Posty: 389
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Uruchomienie 3 enkoderów

Post autor: Pikczu » 28 sty 2021, 23:03

Index to nic innego jak dodatkowy pin który możesz ale nie musisz używać.
Minęło już 4 lata jak się tego uczyłem więc sam muszę przeczytać PDF-a kilak razy żeby sobie przypomnieć o co chodzi.
Czytasz to:
viewtopic.php?f=18&t=66
Ciągasz i otwierasz PDF XMEGA AU MANUAL i zaczynasz od strony 75
Jeśli z angielskiego jesteś noga google translate tłumaczy wręcz idealnie.
Sprzętowo masz trzy kanały CH0CTRL,CH2CTRL, i CH4CTRL.
CH0CTRL masz już gotowy.
Reszta jest podobna tylko ma innego muxa i inny źródło z event systemu:
  1. '---------------------------Enkoder 1------------------------------
  2. Config Pina.0 = Input                                       'enkoder_1 A
  3. Config Pina.1 = Input                                       'enkoder_1 B
  4. Config Pina.2 = Input                                       'enkoder_1 index
  5. Config Xpin = Porta.0 , Outpull = Pullup , Sense = Low_level
  6. Config Xpin = Porta.1 , Outpull = Pullup , Sense = Low_level
  7. Config Xpin = Porta.2 , Outpull = Pullup , Sense = Low_level
  8. '--------------------------------------------------------------------------------------
  9. '---------------------------Enkoder 2-------------------------------
  10. Config Pina.3 = Input                                       'enkoder_2 A
  11. Config Pina.4 = Input                                       'enkoder_2 B
  12. Config Pina.5 = Input                                       'enkoder_2 Index
  13. Config Xpin = Porta.3 , Outpull = Pullup , Sense = Low_level
  14. Config Xpin = Porta.4 , Outpull = Pullup , Sense = Low_level
  15. Config Xpin = Porta.5 , Outpull = Pullup , Sense = Low_level
  16. '-----------------------------------------------------------------------------------
  17. '-------------------------Enkoder 3 -------------------------------
  18. Config Pinb.0 = Input                                       'enkoder_3 A
  19. Config Pinb.1 = Input                                       'enkoder_3 B
  20. Config Pinb.2 = Input                                       'enkoder_3  index
  21. Config Xpin = Portb.0 , Outpull = Pullup , Sense = Low_level
  22. Config Xpin = Portb.1 , Outpull = Pullup , Sense = Low_level
  23. Config Xpin = Portb.2 , Outpull = Pullup , Sense = Low_level
  24. '**********************************Event system config**************************
  25. '************************************Enkoder_1********************************
  26. Config Event_system = Dummy , Mux0 = Porta.0 , Qd0 = Enabled , Qdi0 = Enabled , Qdirm0 = 2 , Digflt0 = 8
  27. Config Tce0 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec
  28. '**********************************Enkoder_2 ************************************
  29. Config Event_system = Dummy , Mux2 = Porta.3 , Qd2 = Enabled , Qdi2 = Enabled , Qdirm2 = 2 , Digflt2 = 8
  30. Config Tcd0 = Normal , Prescale = E2 , Event_source = E2 , Event_action = Qdec
  31. '**********************************Enkoder_3 ********************************
  32. Config Event_system = Dummy , Mux4 = Portb.0 , Qd4 = Enabled , Qdi4 = Enabled , Qdirm4 = 2 , Digflt4 = 8
  33. Config Tcd1 = Normal , Prescale = E4 , Event_source = E4 , Event_action = Qdec
  34.  
Timery zmień żeby nie kolidowały z obecnymi i tyle ma działać.
jeszcze jedno, możesz usunąć wszystko co jest linii nr 9 to były pierwsze patche do xmegi i już są poprawione.
$lib "xmega.lib" : $external _xmegafix_clear : $external _xmegafix_rol_r1014

Pikczu
Awatar użytkownika
Karlos128@nos
Posty: 54
Rejestracja: 18 sie 2015, 13:32

Re: Uruchomienie 3 enkoderów

Post autor: Karlos128@nos » 29 sty 2021, 14:46

Ok, ta konfiguracja jest oki.
Jest jeszcze kwestia inkrementacji i z uwagi na to że po każdym skoku encodera licznik zwiększa się o 4 lub zmniejsza o 4, a mi zależy aby był skok co 1.
Próbuję różnych chwytów, ale wszystko idzie nie tak jak potrzebuję.
Ostatnia moja próba jest taka i by było dobrze gdyby nie to że jak kręcę bardzo wolno to inkrementacja w koder1 idzie dobrze, ale jak ciut za szybko to
zatrzymuje się i nic się nie dzieje. Na każdy przeskok impulsatora zeruję zmienne TCD0 oraz Encoder1 żeby startował od zera.
  1.       If Tcd0_cnt <> Encoder1 Then
  2.          Encoder1 = Tcd0_cnt
  3.  
  4.          Select Case Encoder1
  5.             Case 2 To 5 :
  6.                Incr Koder1
  7.                Encoder1 = 0 : Tcd0_cnt = 0
  8.  
  9.             Case 65532 :
  10.                Decr Koder1
  11.                Encoder1 = 0 : Tcd0_cnt = 0
  12.          End Select
  13.  
  14.          Waitms 2
  15.          En1_txt = Str(koder1)
  16.          Restore Font10x16
  17.          Lcd_text "Koder1=" + En1_txt + " " , 10 , 180 , White , Red
  18.       End If
Co robię nie tak? Dodam że na wszystkich atmegach z tym problemu nie mam, a na tych xmegach już tak.
Pikczu
Posty: 389
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Uruchomienie 3 enkoderów

Post autor: Pikczu » 29 sty 2021, 21:43

Wystarczy podzielić przez 4
  1. Enkder_1_tmp =Tcd0_cnt/4
  2. If Enkder_1_tmp <> Encoder1 Then
  3.          Encoder1 = Enkder_1_tmp
  4.  
  5. end if    


Co do drugiego problemu dodaj pullup 10K i 100nF do masy albo podobne.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Uruchomienie 3 enkoderów

Post autor: Jacek » 29 sty 2021, 22:42

Witam - a możesz napisać jaki dokładnie masz enkoder - u mnie nie ma problemu jaki opisujesz z kręceniem wolno - szybko.
pozdrawiam Jacek.
Pikczu
Posty: 389
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Uruchomienie 3 enkoderów

Post autor: Pikczu » 29 sty 2021, 23:15

Karlos128@nos pisze:
29 sty 2021, 14:46
Na każdy przeskok impulsatora zeruję zmienne TCD0 oraz Encoder1 żeby startował od zera.
Nie wnikam każdy ma jakiegoś bzika.
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Uruchomienie 3 enkoderów

Post autor: niveasoft » 30 sty 2021, 2:55

No @Pikczu ma trochę racji.
Jak będziesz miał enkoder który generuje 10K na pełen obrót a silnik krokowy ma za tym nadążać to robi się to tak, że enkoder się zlicza a silnikiem się goni króliczka...czyli..bezwładność silnika/całego napędu się przezwycięża tym że się go rozpędza i hamuje.
Każdy robot się rozpędza i hamuje, żeby nadążyć :D Ale nie da rady ruszyć z kopyta jak enkoder.
Przez to nie kasuje się tego co jest do zrobienia. No chyba że to bardzo wolne.
Dopiero zrobiony krok powinien się odjąć od tego co jest do zrobienia.
Awatar użytkownika
Karlos128@nos
Posty: 54
Rejestracja: 18 sie 2015, 13:32

Re: Uruchomienie 3 enkoderów

Post autor: Karlos128@nos » 30 sty 2021, 16:53

Troche zeszlo aż się uporałem z upakowaniem tych przeróżnych płytek do obudowy i wykorzystując te skromne a jakże wyśmienite:
  1. Encoder1 = Tcd0_cnt / 4
Sprzęt działa tak jak powinno, dzieki....Tylko z tego trzeciego zrezygnowałem bo zabrakło pinów, w późnieszym czasie może dołożę MCP23017.
Tak na marginesie zastanawiam się czy jest możliwość zaprzęgnięcia 10 enkoderów zamiast potencjometrów do korektora graficznego,
wykorzystał bym mini atmega2560 i przesyłał dane do głównego cpu po magistrali I2c.
Główny XMEGA256 to master, a drugi to atmega2560 jako sleawe-enkodery+INT. Pojawia się pytanie jak przesyłać pomiędzy nimi te dane?
Jest mowa o jakiejś bibli i2c_sleawe komercyjna, a nie komercyjnie była by taka możliwość?
Pikczu
Posty: 389
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Uruchomienie 3 enkoderów

Post autor: Pikczu » 31 sty 2021, 13:14

Karlos128@nos pisze:
30 sty 2021, 16:53
Tak na marginesie zastanawiam się czy jest możliwość zaprzęgnięcia 10 enkoderów zamiast potencjometrów do korektora graficznego,
wykorzystał bym mini atmega2560 i przesyłał dane do głównego cpu po magistrali I2c.
Główny XMEGA256 to master, a drugi to atmega2560 jako sleawe-enkodery+INT. Pojawia się pytanie jak przesyłać pomiędzy nimi te dane?
Jest mowa o jakiejś bibli i2c_sleawe komercyjna, a nie komercyjnie była by taka możliwość?

Można to zrobić na wiele sposobów.
1. zastosować dedykowany układ LS7366R https://lsicsi.com/datasheets/LS7366R.pdf
LS7366R.png
Wtedy podłączysz sobie wszytkie przez magistrale SPI.

2. Zastosować kilka małych Attiny i zrobić I2C Slave albo SPI slave.
Trzeba klepać kod do obsługi i komunikacji- moim zdaniem szkoda czasu.
Dodatkowo zabawa z dwoma różnymi zasilaniami jedno na 5V dla attiny czy atmega i 3.3v dla xmegi, trzeba by dołożyć konwerter poziomów itp.

3. Zastosować enkodery magnetyczne z wyjściem SPI (kod jest na forum) i połączyć kaskadowo.
Ale wymaga dłubania z mechanika, ośka magnes później ustawienie odpowiedniej szczeliny - szkoda czasu

4. Użyć kolejnej xmegi tylko do enkoderów i zrobić komunikację po SPI lub UART - banał ale przerost formy nad treścią.

Moim zdaniem najmniej roboty z LS7366R wystarczy skrobnąć bibliotekę na SPI która będzie dużo szybsza niż I2C i prostsza w napisaniu.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Uruchomienie 3 enkoderów

Post autor: niveasoft » 01 lut 2021, 12:13

Z tą częścią LS7366R nie jest tak różowo nawet na Ali. Może jest coś podobnego, ale bardziej przystępne.

W takim korektorze to chyba nigdy nie kręcą się więcej niż dwa enkodery na raz chyba, że jakiś wirtuoz potrafi też kręcić stopami mhihihi :D
Zwykła atmega nowszego typu (spokojnie pośmiga na 3V3) która ma więcej nóg niż 20 wejść na enkodery z PCINT do tego interfejs SPI i robisz Slave SPI z wyjściem INT czyli robisz sobie taki dedykowany scalaczek z procesora. Poruszenie którymś z enkoderów i wystawiasz stan niski na wyjściu INT a Xmega to sobie wczytuje jakąś daną typu Dword i analizuje 20 z 32 bitów.
Coś jak MCP tylko za jednym zamachem.
BTW te MCP z literką S są też na SPI....a wiadomo, że zgłaszają przerwanie jak zmiana stanu na którymś z pinów. W sumie to taki korektor nie ma chyba dużych wymagań.

Można chyba w drugą stronę, ustawić jedno SPI w Xmega na Slave. Mega od enkoderów wysyła trzy bajty a Xmega odbiera w przerwaniu od SPI. Jak widzi że ostatnie trzy bity to 0 to jest ostatni bajt i synchro....Poprzednie bajty przesuwasz szybko w lewo i wciągasz do Dword.

Można też wysłać jeden bajt i na 4 bitach zakodować który enkoder się poruszył. Zostają kolejne cztery bity :D Robisz And dla numeru enkodera i szybkie Select Case. Robisz And dla dwóch bitów stanu i wszystko wiesz.
ODPOWIEDZ