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



Teraz jest 17 mar 2026, o 21:57


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 6 maja 2016, o 16:12 
Offline
Nowy

Dołączył(a): 07 gru 2015
Posty: 13
Pomógł: 0

Procesor: ATmega88
Taktowanie: 8MHz

Cześć,
Mam dwa klawisze - lewy i prawy. Prawy ma za zadanie przysuwać pozycję kursora na wyświetlaczu od 0 do 3, a gdy ta wartość zostanie przekroczona zostaje do niej przypisane 0. Lewy klawisz po naciśnięciu dodaje do wartości zmiennej NUMBER 1, gdy wartość jest większa od 9, automatycznie jest stan jest zmieniany na 0. I wszystko pięknie działało do momentu pojawienia się tablicy znaków ENTERING_PIN[4] , jest ona wyświetlana przez timer na wyświetlaczu. Od tej pory każda zmiana wartości NUMBER kończy się pojawieniem na wyświetlaczu "krzaka":

Przed naciśnięciem lewego klawisza:
Obrazek

po naciśnięciu lewego klawisza:
Obrazek


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


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



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



Definicja funkcji wyświetlającej tekst na wyświetlaczu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Natomiast sam kod cleanowałem i buildowałem, to nie pomogło. Z góry dziękuję za każdą odpowiedź, to dla mnie niesamowicie ważne. Gdyby było coś co stanowiło niejasność, proszę śmiało pytać.

------------------------ [ Dodano po: 11 minutach ]

Myślę że warto jeszcze dodać, iż krzak pojawia się w momencie gdy wartość NUMBER jest różna od zera.



Ostatnio edytowano 6 maja 2016, o 17:03 przez Karbos, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 maja 2016, o 16:38 
Offline
Moderator
Avatar użytkownika

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

No, jeśli ty robisz TAKIE rzeczy to wybacz ..... obsługa LCD z poziomu przerwań ? .... poczytaj może najpierw i zorientuj się co to są przerwania i jak one działają. A na tą chwilę zapamiętaj sobie raz na zawsze - że NIGDY ale to NIGDY nie robi się w przerwaniach tak długotrwałych operacji jak wyświetlanie na LCD

_________________
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: 6 maja 2016, o 17:16 
Offline
Nowy

Dołączył(a): 07 gru 2015
Posty: 13
Pomógł: 0

mirekk36 napisał(a):
No, jeśli ty robisz TAKIE rzeczy to wybacz ..... obsługa LCD z poziomu przerwań ? .... poczytaj może najpierw i zorientuj się co to są przerwania i jak one działają. A na tą chwilę zapamiętaj sobie raz na zawsze - że NIGDY ale to NIGDY nie robi się w przerwaniach tak długotrwałych operacji jak wyświetlanie na LCD


Dzięki że w ogóle odpowiedziałeś :D. Po części Cię rozumiem. Rozejrzałem się po funkcjach usługujących wyświetlacz i dochodzę do wniosku, że czas realizacji przerwania wynosi minimum 2ms, a to przy taktowaniu 8MHz wynosi minimum 16 tysięcy taktów procesora, co jest niewątpliwie wielką stratą. Jednak też chcę zwrócić uwagę, że przerwanie to występuje z częstotliwością 3 herców, co dla mikrokontrolera jest raczej wiecznością. Oczywiście mogę sobie napisać obsługę wyświetlacza w pętli while, ale to z wymusiłoby użycie delaya minimum 200ms, a tego za wszelką cenę chciałem uniknąć.

Oczywiście nie wykluczam, że to co właśnie napisałem, może być całkowicie oderwane od rzeczywistości.



Ostatnio edytowano 6 maja 2016, o 17:20 przez Karbos, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 maja 2016, o 17:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Chodzi o to, by wykonywanie obsługi przerwania trwało jak najkrócej. Wystarczy powołać sobie jakąś zmienną jako flaga, a w pętli głównej tylko sprawdzać, czy ta flaga zmieniła swój stan, jeśli tak to wywołanie funkcji wyswietl(); i wyzerowanie flagi.
Spróbuj tak:
Zamiast:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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

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

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

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


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


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 maja 2016, o 17:31 
Offline
Nowy

Dołączył(a): 07 gru 2015
Posty: 13
Pomógł: 0

I za taką odpowiedź szczerze dziękuję, już odpowiednio zmodyfikowałem kod i obecnie wygląda on tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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



Jednak przypominam, że mój problem to dziwnie pojawiający się znaczek gdy wartość NUMBER jest różna od zera z którym kompletnie nie jestem sobie wstanie poradzić.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 maja 2016, o 17:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

W takim razie sądzę, że błąd masz w funkcji:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Niestety jej nie pokazałeś.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 maja 2016, o 17:44 
Offline
Nowy

Dołączył(a): 07 gru 2015
Posty: 13
Pomógł: 0

anshar napisał(a):
W takim razie sądzę, że błąd masz w funkcji:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Niestety jej nie pokazałeś.



Widzisz ona a tę chwilę w ogóle nie istnieje.

------------------------ [ Dodano po: 9 minutach ]

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


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


to nagle problem zniknął :D. Oczywiście nie jest rozwiązanie problemu, a raczej niego zamaskowanie :( .



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 maja 2016, o 18:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 30 sty 2013
Posty: 169
Lokalizacja: Silesia - P-ce
Pomógł: 10

Ja tu widzę błąd w funkcji LCD_WriteText().

Otóż przekazujesz do niej tablicę znaków i poprzez inkrementację komórki (wiersza tej tablicy) w końcu trafiasz na element w pamięci ram (wychodzisz poza swoją tablicę) który ma taki o to właśnie chiński znaczek. Funkcja ta kończy wyświetlanie w momencie gdy trafi na wartość null w komórce RAM.

Wyświetlanie zrób np. w ten sposób:

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


Autor postu otrzymał pochwałę

_________________
Niewiele trzeba by być szczęślwym.Wystarczy chcieć



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 maja 2016, o 18:37 
Offline
Nowy

Dołączył(a): 07 gru 2015
Posty: 13
Pomógł: 0

No i program na tę chwilę działa prawidłowo. Zastanawia mnie jednak dlaczego ten znaczek pojawiał się dopiero gdy zmieniałem wartość zmiennej NUMBER.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 maja 2016, o 18:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 30 sty 2013
Posty: 169
Lokalizacja: Silesia - P-ce
Pomógł: 10

Najwyraźniej zmienna NUMBER znajdowała się w komórce po tablicy ENTERING_PIN.

_________________
Niewiele trzeba by być szczęślwym.Wystarczy chcieć



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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