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



Teraz jest 19 kwi 2024, o 11:14


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 24 sie 2018, o 13:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 gru 2014
Posty: 88
Pomógł: 2

Witam,
od kilku dni analizuje kod dotyczący GB 8.LCDhd44780 + projekt wielozadaniowy i jestem pod dużym wrażeniem takiego sposobu sterowania zawartością wyświetlacza LCD świetne rozwiązanie.
Nie zajmuję się zawodowo pisaniem kodu i pewnie dlatego tak mnie to rozwiązanie zachwyciło, mam na myśli to, że nie będąc profesjonalistą nie spotkałem się z innymi rozwiązaniami i stad trudno mi oceniać ale to co zobaczyłem jest eleganckie.

Po to by lepiej opanować materiał wykonywałem przeróbki kodu by osiągnąć różne założenia, głównie kręciłem się wokół ON/OFF warstw przy użyciu pilota oraz zmiany kolejności/widoczności warstw :
W pewnym momencie chciałem za pomocą klawisza z pilota wykonać ON/OFF warstwy ir_mon_layer (monitor kodów hex pilota) No trochę to trwało nim dokładnie zrozumiałem w jaki sposób działa f.ir_mon_auto_hide, po n-tym czytaniu byłem pewny, że nie ma potrzeby wprowadzania zmian do kodu.
Mirek tak napisał kod, że po załadowaniu oryginału warstwa ir_mon_layer znikinie po 2s automatycznie o ile użytkownik nie będzie naciskał klawiszy.

Tymczasem po załadowaniu oryginalnego kodu obserwuję nieco inny efekt, naciskam dowolny klawisz pilota na wyświetlaczu LCD pojawia się kod klawisz, po 2s warstwa ir_mon_layer znika a po kolejnej 1s pojawia się ponownie i już nie znika. Oczywiście naciśnięcie kolejnego klawisza wywołuje identyczny scenariusz.
Sami spróbujcie załadować kod z GB L19_HD44780_LCD.

Super sprawa ja się ucieszyłem nareszcie mogłem sprawdzić czy tylko czytałem GB czy czytałem ze zrozumieniem.
To co poniżej opisuję to moja interpretacja może być błędna, w końcu najwięcej uczymy się właśnie na błędach.

Zabrałem się do szukania przyczyny, po długich poszukiwaniach ustaliłem, że przyczyną ponownego (po 1s) włączenia warstwy ir_mon_layer jest jakaś nieprawidłowość w funkcji (f.) ir_mon_auto_hide.

Lepiej przyjrzałem się f.ir_mon_auto_hide jak w szczegółach ona działa ?, nie opisuje wszystkiego bo to jest w książce skupiłem się na f.ir_mon_auto_hide i jej otoczeniu, ważne są warunki startowe omawianej funkcji.

Wcześniej f. nadrzędna f.show_ir_mon ustaliła warunki startowe dla f.ir_mon_auto_hide:
1. przypisała callbacka ir_mon_layer.EVENT = ir_mon_auto_hide; od tej pory zdarzenie BARREL_EVENT(1) będzie z rozdzielczością co 100ms wywoływało f. ir_mon_auto_hide
2. ustawiono wartość ir_mon_layer.visible=2;

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


Opis działania f.ir_mon_auto_hide:

1.wywołania f.ir_mon_auto_hide są inicjowane przesz zdarzenie BARREL_EVENT(1), przy pierwszym wywołaniu f.ir_mon_auto_hide wyrażenie w ifA TRUE, wartość wyrażenia ifB FALSE gdyż zmienna ir_mon_layer.visible=2, następuje postdekrementacja zmiennej ir_mon_layer.visible

2.kilkanascie kolejnych wywołań f.callback ir_mon_auto_hide inicjowanych przez zdarzenie BARREL_EVENT(1) dla warstwy r_mon_layer nie wywoła żadnych zmian gdyż wartość wyrażenia ifA FALSE, musi upłynąć 1s by zmienna/timer s1_cnt zmieniła wartość

3.po upływie 1s i kolejnym wywołaniu f.ir_mon_auto_hide ifA TRUE wartosc wyrazenia ifB FALSE gdyż zmienna r_mon_layer.visible=1,kolejna postdekrementacja zmiennej ir_mon_layer.visible

4.po kolejnej 1s ifA TRUE wartość wyrażenia ifB TRUE (visible=0)
- wykonana zostanie instrukcja ir_mon_layer.EVENT = NULL; która wyzeruje wsk.na naszą f.callback ir_mon_auto_hide od tego momentu zdarzenie BARREL_EVENT(1)
nie będzie wywoływało f.ir_mon_auto_hide
- nastepuje kolejna dekrementacja zmiennej ir_mon_layer.visible , zmienna ma wartość ? no tego nie rozumiem nie powinna mieć wartości -1 bo jest typu uint8_t,
pomimo tego dopisuję instrukcję ir_mon_layer.visible=0; i od teraz wszystko działa tak jak trzeba.

Po dodaniu instrukcji do f.ir_mon_auto_hide ir_mon_layer.visible=0; warstwa ir_mon_layer znika po 2s i już się nie pojawia, oczywiście kolejne naciśniecie
klawisza włącza warstwę i widzimy wartość kodu klawisza i po kolejnych 2 s znika.
Jednak dlaczego ten problem ma miejsce skoro zmienna ir_mon_layer.visible jest typu uint8_t ?
Nicht Gut.!!

Proszę o info co o tym myślicie, może zbłądziłem i leże jak ta biedna fretka w agreście ?

Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2018, o 14:20 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27224
Lokalizacja: Szczecin
Pomógł: 1041

fobos napisał(a):
- nastepuje kolejna dekrementacja zmiennej ir_mon_layer.visible , zmienna ma wartość ? no tego nie rozumiem nie powinna mieć wartości -1 bo jest typu uint8_t,

Ciężko mi tak z marszu wrócić do szczegółów tego kodu i też nie traktowałby go jako jakiegoś gotowego sposobu a raczej tylko jako wskazówkę - jakimi sposobami można osiągać pewne ciekawe efekty podczas programowania procków.


zapis

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


oznacza, że warunek sprawdza za każdym razem czy zmienna ma już wartość ZERO

powinno chyba być tak, spróbuj:



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



tak na marginesie to cieszę się, że choć niewielu ale jednak jest troszkę czytelników którzy zagłębiają się w ten kod ... bo jego analiza pozwala później dużo lepiej planować wiele innych swoich algorytmów, widać tu pewne ciekawe mam nadzieję, techniki programowania

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2018, o 18:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 gru 2014
Posty: 88
Pomógł: 2

Mirek b.dziękuję za info.

Ależ Twoje książki są żywe, no jesteś chyba jedynym autorem, który wykorzystując współczesne środki komunikacji utrzymuje prawie online kontakt z czytelnikiem, no super sprawa i świetny pomysł.

Sprawdzę twoje sugestie i się odezwę.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2018, o 21:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 gru 2014
Posty: 88
Pomógł: 2

Wprowadziłem proponowane zmiany do kodu oraz sprawdziłem w zestawie uruchomieniowym, po korekcie f.ir_mon_auto_hide monitor kodów (warstwa ir_mon_layer) jest widoczna 2s na LCD i automatycznie znika.

Ostatecznie f. ir_mon_auto_hide ma postać :

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




Pozdrawiam i dziękuję za dodatkowe wyjaśnienia.



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: 4 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 8 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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO