Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 mar 2024, o 12:14


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 21 ] 
Autor Wiadomość
 Tytuł: Enkoder - menu
PostNapisane: 13 lip 2017, o 15:59 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Witam
Zabrałem się z tworzenie menu, które chciałbym obsługiwać za pomocą enkodera, proszę o podpowiedź, w pętli głównej wyświetlam 4 pozycje menu, za pomocą enkodera zaznaczam sobie jedną z nich.
Kod:
void enkoderek(void) {
   buzer();
   if (enco_dir == ENC_RIGHT) licznik++;
   if (enco_dir == ENC_LEFT)  licznik--;

   //licznik = get_encoder();
   if (licznik>3) licznik = 3;
   if (licznik<0) licznik = 0;

}

Przyciskiem enkodera wchodzę do wybranej pozycji menu (pętli) i tu za pomocą enkodera chciałbym zmienić wartość jakiejś zmiennej X która ma już jakąś wartość początkową dajmy na to 10, jak to zrobić za pomocą funkcji void enkoderek(void)?

------------------------ [ Dodano po: 32 minutach ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lip 2017, o 16:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Po wejściu do wybranej pozycji menu w zasadzie powinna być już aktywna edycja czyli w momencie wejścia przechwytujesz sobie modyfikowana zmienną do dodatkowej zmiennej połączonej z enkoderem, a przy wyjściu z opcji przypisujesz z powrotem do zmiennej właściwej. Nie zagłębiem się w program obsługi enkodera, który tu użyłeś, ale w moich programach upraszcza to wiele rzeczy.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lip 2017, o 17:03 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Zrobiłem tak jak podpowiedziałeś, dałem zmiennej y na początku jakąś wartość
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


ale jak wykonuje się ta pętla to nie działa mi zarejestrowana funkcja zwiększająca zmienną licznik.


W pętli trzeba odpalić zdarzenie :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lip 2017, o 17:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2016
Posty: 248
Lokalizacja: Norwegia
Pomógł: 16

Jeżeli używasz biblioteki Mirka, to ja robię w swoich urządzeniach tak:

1. Rejestruje swoją funkcję dla switcha
2. Rejestruję swoją funkcję dla encodera

rejestruję zmienną menuflag = ta zmienna incrementuje za każdym przyciśnięciem switcha i w ten sposób zmieniam poziom menu.
na przykład
0 = menu główne
1 = menu poziom 1
2 = menu poziom 2
itd....

Własna funkcja encodera jest zawsze wspólna dla całego drzewa menu (menu 0, menu 1, menu2...), i zmienia wartości w zależności od flagi Menuflag.

w ten sposób w pętli głównej programu wywołuję tylko te dwie funkcje które uprzednio zarejestrowałem. Encodir zmienia mi wartości menu w komórce która jest właśnie oflagowana menuflag.

Nie mam pod ręką teraz moich rozwiązań, wrócę do domu to mogę wkleić jakiś przykład..

_________________
SP2LUB - LA1BUA



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lip 2017, o 17:56 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Chętnie poznam Twój sposób, najlepiej jakiś prosty abym rozkminił.

Zrobiłem coś takiego:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


W funkcji menu0 zarejestrowałem nowe funkcje do obsługi enkodera, a jak z niej wychodzę to rejestruję pierwotne. To pewnie zazłożony sposób, ale nic lepszego nie wymyśliłem, dlatego chętnie zapoznam się z innymi rozwiązaniami.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lip 2017, o 08:43 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Utworzyłem menu, wchodząc do menu wchodzę do pętli, wychodząc z menu wracam do pętli głównej programu, a jak utworzyć menu aby nie wychodzić z głównej pętli programu? Jeżeli w pętli głównej znajdują się jakieś ważne procesy sterujące to wchodząc do menu, sterowanie z pętli głównej powinno się odbywać jakby w "tle" i nie powinno być zaburzane przez obsługę menu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lip 2017, o 09:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Ja to u siebie nazywam zmienną "tryb" i gdy jest równa zero to jestem na ekranie głównym, wartość jeden to menu, kolejne wartości - wszystko zależy jak rozbudowany jest program i może to być np. kolejne menu (np. serwisowe) lub specjalną faza wykonywanego programu. Wybór trybu i wejście do nieco jest za pomocą zwykłego warunku if. To co ma się stale wykonywać jest poza warunkiem i wykonuje się niezależnie od jakiegokolwiek trybu. Istotnym jest, że cały program ma się wykonywać nieblokująco z maksymalną prędkością, bo w przeciwnym wypadku może to nie działać dobrze.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lip 2017, o 09:32 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Właśnie się zastanawiam czy nie wykorzystać funkcji SWICH. A jeszcze chciałbym to obsłużyć enkoderem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lip 2017, o 09:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Teoretycznie można, ale ja akurat switch wykorzystuje w samym menu. Dla dwóch, trzech warunków trybu to raczej nie ma sensu.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lip 2017, o 12:00 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

SylwekK napisał(a):
Teoretycznie można, ale ja akurat switch wykorzystuje w samym menu. Dla dwóch, trzech warunków trybu to raczej nie ma sensu.


Masz jakiś prosty przykładowy kod, jak Ty to robisz.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lip 2017, o 12:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Przykładowa struktura programu może wyglądać np. tak:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Przypominam, że najlepiej będzie to działać jeśli program będzie tak napisany aby w żadnym miejscu nie blokował i nie opóźniał. U mnie nawet obsługa wyświetlacza wywoływana jest cyklicznie i wykonuje się przy jednym obiegu zaledwie kilkanaście niezbędnych mikrosekund, a nie milisekund choć w tym wypadku nie jest to wymóg, a po prostu lubię jak się pętla szybko wykonuje :).
Wszelkie opcje w menu obsługiwane są również w locie, a wspomagam się tylko znacznikami (flagami) i timerami programowymi do omijania niepotrzebnych w danym momencie fragmentów programu.


Autor postu otrzymał pochwałę

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lip 2017, o 20:09 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Jeżeli obsługuję to przyciskami to nie ma problemu, ale jakoś nie mogę tego obsłużyć enkoderem, chodzi mi o to aby w różnych pozycjach menu za pomocą enkodera zmieniać różne parametry programu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lip 2017, o 21:11 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

W pętli głównej mam warunki
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

za pomocą przycisku enkodera zwiększam sobie zmienną poz_menu, teraz chcę napisać funkcje do obsługi enkodera - obrót enkodera,
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

chcę aby w zależności od zmiennej poz_menu obracając enkoderem zmieniać zmienna godziny lub minuty, jednak coś mi to nie działa.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lip 2017, o 10:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1146
Lokalizacja: Kraków
Pomógł: 93

A może w funkcji enkoderek zmieniaj wartość jakiejś zmiennej dodatkowej. A w funkcji main(), w zależności od wartości poz_menu, zwiększasz lub zmniejszasz odpowiednią zmienną.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lip 2017, o 11:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Zrób sobie dodatkową funkcję, która będzie podczas edycji permanentnie wywoływana, w której będziesz czytał przyrost enkodera i w zależności od niej modyfikował zmienną. Funkcja powinna uwzględniać minimalną i maksymalną wartość modyfikowanej zmiennej aby nie wylecieć z zakresu jaki sobie wymyśliłeś.

------------------------ [ Dodano po: 42 minutach ]

Przykład jak to robię u siebie:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


bit pierwszy flagi "edit" togluję przyciskiem enkodera na początku obsługi menu. Pomyśl jak zbudować u siebie funkcję "modyfikuj". Nie zagłębiałem się w Mirka obsługę enkodera to też nie wiem jak tam "wyjście" danych jest zrealizowane.
xiw to z kolei zmienna pomocnicza INT 16-bitowa. Dzięki temu mam załatwioną konwersję typów (różne zmienne modyfikuję) i łatwiejszą obsługę samej funkcji. Funkcja już sama zadba aby nie przekroczyć krytycznych parametrów i modyfikuje zmienną z zadanym mnożnikiem co w moim przypadku jest bardzo istotne.


Autor postu otrzymał pochwałę

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lip 2017, o 21:56 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Marhef napisał(a):
A może w funkcji enkoderek zmieniaj wartość jakiejś zmiennej dodatkowej. A w funkcji main(), w zależności od wartości poz_menu, zwiększasz lub zmniejszasz odpowiednią zmienną.

Dzięki tak właśnie zrobiłem i zadziałało.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lip 2017, o 06:56 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

SylwekK napisał(a):
Zrób sobie dodatkową funkcję, która będzie podczas edycji permanentnie wywoływana, w której będziesz czytał przyrost enkodera i w zależności od niej modyfikował zmienną. Funkcja powinna uwzględniać minimalną i maksymalną wartość modyfikowanej zmiennej aby nie wylecieć z zakresu jaki sobie wymyśliłeś.

------------------------ [ Dodano po: 42 minutach ]

Przykład jak to robię u siebie:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


bit pierwszy flagi "edit" togluję przyciskiem enkodera na początku obsługi menu. Pomyśl jak zbudować u siebie funkcję "modyfikuj". Nie zagłębiałem się w Mirka obsługę enkodera to też nie wiem jak tam "wyjście" danych jest zrealizowane.
xiw to z kolei zmienna pomocnicza INT 16-bitowa. Dzięki temu mam załatwioną konwersję typów (różne zmienne modyfikuję) i łatwiejszą obsługę samej funkcji. Funkcja już sama zadba aby nie przekroczyć krytycznych parametrów i modyfikuje zmienną z zadanym mnożnikiem co w moim przypadku jest bardzo istotne.


Pomysł z napisaniem funkcji "modyfikuj" bardzo fajny bardzo poprawia czytelność kodu, mam 2 pytanka:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

- dlaczego przed xiw jest & ?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

- nie wystarczy w warunku sam edit ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lip 2017, o 07:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Co do pierwszego pytania to chodzi o przekazanie adresu zmiennej (w tym miejscu namawiam do zaopatrzenia się w BB gdzie wszystko jest ładnie opisane) natomiast edit oczywiście może być samodzielny o ile nie wykorzystujesz go jeszcze w innych celach... Ja wykorzystuje, bo mam różne typy edycji w różnych miejscach :)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lip 2017, o 07:46 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Oczywiście mam BB, tylko dlaczego do funkcji przekazujemy zmienną poprzez jej adres a nie bezpośredni przez jej nazwę?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lip 2017, o 08:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Szczerze mówiąc to już nie pamiętam, bo dość dawno to pisałem, a bez tego znaczka coś nie działało po mojej myśli :)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lip 2017, o 08:23 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Jak czytam BB to czaję wskaźniki, Mirek to wyłożył łopatologicznie ale dzięki temu bardzo zrozumiale, jeżeli chodzi o to aby je zastosować to już gorzej jeszcze nie czuję do końca. Dzięki za pomoc poeksperymentuje z tym kodem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 21 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO