Chciałbym was zapytać o poradę/sugestie no jakieś naprowadzenie jak poradzić sobie pewnie z banalnym problemem związanym z obsługą "menu" wygenerowanego
za pomocą programu MkMenuGen i przeportowaną na mikrokontroler STM32.
Samo "menu" przeportowałem i uruchomiłem na STM32 bez większych problemów i jeżeli chodzi np. o jego obsługę za pomocą klawiszy to działa to bezbłędnie.
Czyli włączanie menu, tzw. chodzenie po nim góra dół, wyjście itd.
![Obrazek](https://obrazkiforum.atnel.pl/thumb/1356/4801f7cfd8f0531b7def955556dab864.jpg)
![Obrazek](https://obrazkiforum.atnel.pl/thumb/1356/1af9c8c2d2459ed06f057e481b242bf0.jpg)
Problem pojawia się natomiast kiedy chcę się poruszać po "menu" za pomocą enkodera. Sam przycisk enkodera jak on sam jak najbardziej działa i zlicza góra/dół w momencie jego pokręcania,
jednakże kursor leci momentalnie na sam dół do "exit" bądź na 1-wszą pozycję "menu" co jest jak najbardziej zrozumiałe bo wiadomo program wykonuje się w pętli i pamięta ostatnie położenie enkodera.
To zjawisko oczywiście nie występuje na mikrokontrolerze AVR gdzie używam biblioteki do obsługi enkodera napisanej zgodnie z poradnikiem Mirka, w której to występuje flaga powodująca wywołanie przerwania od enkodera tylko wówczas kiedy nim pokręcamy.
Także podobną funkcjonalność zapewne musiałbym osiągnąć na mikrokotrolerze STM32 jeśli chciałbym korzystać z "menu" generowanego przez MkMenuGen (przy okazji powiem że rewelacyjnego, duże słowa uznania za kod jaki Mirek napisał jak i sam program do jego generowania
![Szczęśliwy :)](https://forum.atnel.pl/images/smilies/icon_e_smile.gif)
jak dla mnie to po prostu rewelacja
![Bardzo szczęśliwy :D](https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif)
)
Program piszę z wykorzystaniem bibliotek HAL i programu CubeMX.
Enkoder na STM32 obsługuje w sposób sprzętowy wykorzystując do obsługi przerwanie od Timer`a w trybie "Encoder Mode" :
![Obrazek](https://obrazkiforum.atnel.pl/thumb/1356/c3f6140f41437256c0121dd283da7719.jpg)
![Obrazek](https://obrazkiforum.atnel.pl/thumb/1356/2d430224929bd23f1c085a069e6be22b.jpg)
By nie przytaczać całego obszernego programu przedstawienie obsługę samego enkodera
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Jak widać w powyższym kodzie powołuje sobie zmienne do odczytu stanu enkodera pochodzącego z przerwania od Timer`a, a potem to przeliczam dzieląc przez 4 by mieć zakres od 0-100.
Ten sposób wykorzystuje sobie zwykle do tworzony własnych "menu" wykorzystujących
"switch/case" no i to działa bez większych problemów.
No ale wiadomo nie da się zrobić w ten sposób i tak prosto takiego wielopoziomowego fajnego menu z propertisami jak to generowane przez program Mirka
Samo uruchomienie pracy enkodera w przerwaniu następuje za pomocą funkcji
"HAL_TIM_Encoder_Start_IT(&htim3, TIM_CHANNEL_ALL);" i działa to cały czas w tle.
Zmienna "dir" określa kierunek zliczania Timera góra lub dół za pomocą makra
"__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3);"Cały proces przeliczania Timera mogę oczywiście sobie zatrzymać korzystając z funkcji
"HAL_TIM_Encoder_Stop_IT(&htim3, TIM_CHANNEL_ALL);"Jestem też wstanie wpisać do rejestru Timera wartość od której ma on przeliczać
"TIM3->ARR = 4;"Piszę o tych dodatkowych funkcjach i makrach które znam by pokazać jakie są możliwości, ponieważ myślę iż ten mój problem niekoniecznie może rozwiązać osoba obeznana z zagadnieniami biblioteki HAL i STM32 sądzę iż każdy kto jest biegły w pisaniu w języku C.
Ja oczywiście robiłem już różne "kombinacje", z kodem z dodatkowymi taimerami, zmiennymi itp, by to okiełznać ale póki co mi się to nie udało.
Albo może ktoś już też przeportował tą bibliotekę z MkMenuGen na STM32 i ma sposób na obsługę jego za pomocą enkodera? Może wystarczy inaczej go skonfigurować?
A może rozwiązanie jest banalne jakaś prostą fajną funkcją napisaną w C?
No tak jak pisałem we wstępie chodzi mi oto by osiągnąć taki efekt jak na AVR, iż pokręca się w lewo lub prawo i zmieniamy wartość menu góra/dół o 1.