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.
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
jak dla mnie to po prostu rewelacja
)
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" :
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.