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



Teraz jest 16 kwi 2024, o 07:07


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 
Autor Wiadomość
PostNapisane: 26 paź 2018, o 12:06 
Offline
Użytkownik

Dołączył(a): 24 sty 2017
Posty: 33
Pomógł: 0

Cześć fachowcy:)

Mam pewien problem ze wspomnianym w temacie wyświetlaczem. No sprawa tego typu wyświetlaczy wydaje się banalna, ale okazało się, że wymiękłem. Proszę Was o pomoc w namierzeniu/rozwiązaniu problemu.
A problem jest taki:
- wyświetlacz 4x20 podłączony równolegle na 4-bitach z użyciem pinu RW
- sterownik z BlueBook
- wyświetlacz w przerwaniu zewnętrznym co sekundę wyświetla datę i godzinę z timera DS3231 oraz w przerwaniu z Timer3 wyświetla w tym przypadku wypełnienie PWM. I wszystko się wydaje proste. Wszystko się wyświetl zgodnie z założeniami, jednak co jakiś czas (różny... kilka, kilkanaście, kilkadziesiąt sekund) pewne dane są jakby kopiowane w losowe miejsca wyświetlacza LCD. Więc np. po 10 minutach pracy jak zerknę na wyświetlacz to oczywiście to co powinno się wyświetlać się wyświetla, ale dookoła jest pełno bałaganu.

Serio już nie mam na to siły. Bardzo proszę o jakieś wskazówki. Coś nie tak ze sterownikiem, że wysyła dane pod inne adresy? Czy może coś nie tak z LCD? A może z czymś innym?

Kodu nie ma co zamieszczać, bo to głównie lcd_locate, lcd_str i lcd_int więc nie ma w tym żadnej filozofii.

Dzięki za pomoc



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2018, o 12:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Witam,
Chyba bym zaczął od przeanalizowania przerwań,
czy czasem jedno przerwanie nie przerywa drugiego,
lub innej wrażliwej na czas części kodu.

Wysłane z mojego Lenovo K33a42 przy użyciu Tapatalka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2018, o 12:32 
Offline
Użytkownik

Dołączył(a): 24 sty 2017
Posty: 33
Pomógł: 0

Zastanawiały mnie te przerwania... co się dzieje z uC gdy wystąpi jakiś konflikt, bo z pewnością występują, skoro zewnętrzne jest co 1s, a timer 3 chodzi z preskalerem 1024 przy taktowaniu 16MHz. Ale nie mam wiedzy na ten temat. Czy sam uC w jakiś sposób to kolejkuje, czy jak?
Tak czy inaczej uznałem, że to nie to, bo tak na logikę... załóżmy , że przerwanie ext zostaje przerwane przez timer3 to mógłby mi nie wysłać godziny do wyświetlacza. A on ją wysyła tylko, że wyświetla się w innym miejscu, trafia pod inny adres.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2018, o 12:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Wysłanie do wyświetlacza trwa...
Widzę informację że zarówno w jednym jak i drugim przerwaniu jest coś wysyłane.
Czy nie lepiej utworzyć i aktualizować bufor wyswietlacza i wysyłać raz.?

Wysłane z mojego Lenovo K33a42 przy użyciu Tapatalka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2018, o 13:00 
Offline
Użytkownik

Dołączył(a): 24 sty 2017
Posty: 33
Pomógł: 0

Daro69 napisał(a):
Wysłanie do wyświetlacza trwa...
Czy nie lepiej utworzyć i aktualizować bufor wyswietlacza i wysyłać raz.?

a widzisz... dobry trop :) To chyba już wiem co będę robił wieczorem :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 paź 2018, o 10:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1020
Lokalizacja: Trójmiasto
Pomógł: 188

Daro69 napisał(a):
czy czasem jedno przerwanie nie przerywa drugiego,
coś takiego nie może mieć miejsca. Gdy wystąpi żadanie przerwania podczas gdy inne jest obsługiwane podnoszona jest tylko flaga zgłoszenia przerwania. W momencie gdy wykonywane przerwanie się zakończy następuje skok powrotny do programu po czym wykona się 1 instrukcja programu i nastąpi skok do obsługi przerwania oczekującego zgłoszoną flagą. Ewentualnie jeśli jest podniesione kilka różnych flag przerwań, ich kolejność obsługi jest zgodna z priorytetami danego uC.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 paź 2018, o 10:45 
Offline
Użytkownik

Dołączył(a): 24 sty 2017
Posty: 33
Pomógł: 0

tak tez myslalem, bo gdyby tak nie bylo to uC byłby nie do ogarnięcia

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

W każdym razie zaimplementuje to co podpowiedział Daro69. Wszystkie linie wyświetlacza będę wyświetlał co 1s w przerwaniu od DS3231. Tylko jeszcze nie bardzo wiem jak to ogarnąć. To moje pierwsze urządzenie (lampa 700W do akwarium) i pierwsze kroki w tym temacie. Ale ważne że elektronika działa, więc tylko kwestia dopracowania programu. Jaką strukturę danych powinienem zadeklarować dla tego wyświetlacza 4x20?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 paź 2018, o 12:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1020
Lokalizacja: Trójmiasto
Pomógł: 188

Mirek popełnił kiedyś poradniki o tworzeniu biblioteki do oled-ów między innymi było tam pokazane buforowanie wyświetlania może Ci pomoże
https://www.youtube.com/watch?v=3wpxucHCFdI&list=PLtXXWLsA5QNg1SLhEnlM8Emlg-Mc5ydhf tyle że trochę tego oglądania jest :lol: ale bardzo pouczające :D
Z wyświetlaczem 4x20 jest łatwiej ponieważ całość jest zorganizowana w 4 wierszach. W oledach trzeba jeszcze odpowiednio bufor podzielić bo tam wyświetlacz podzielony jest na wiersze, a każdy wiersz na kolumny po 8 bitów...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 paź 2018, o 15:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

wojtassm napisał(a):
Tylko jeszcze nie bardzo wiem jak to ogarnąć.

można np. utworzyć bufor o rozmiarze ilości znaków wyświetlacza, + 1 w szerokości na znak NULL.
char buf[4][20+1];
utworzyć funkcję wypełniającą ten bufor w odpowiednich miejscach danymi.
jedna funkcja np str_do_buf(wskaznik_na_string, poz_y, poz_x);
a druga np int_do_buf(wskaznik_na_int, poz_y, poz_x); // nie zapomnieć o prze konwertowaniu int'a na str, np funkcją itoa().
tak wypełnioną tablicę/bufor char, można wysyłać w całości do LCD za pomocą for oraz lcd_str() linia po linii.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 paź 2018, o 21:41 
Offline
Użytkownik

Dołączył(a): 24 sty 2017
Posty: 33
Pomógł: 0

Dzięki Daro69 :) Twój pomysł na ban zadziała. A co to za funkcja itoa() ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 paź 2018, o 22:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

funkcja wbudowana, w bibliotece "stdlib.h". trzeba zainkludować.
a to ciało funkcji skopiowane z tej biblioteki.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

int __val to wartość konwertowana,
char *__s to wskaznik docelowy łańcucha,
int __radix to bazy liczbowe: 2-dwójkowy, 8-ósemkowy, 10-dziesiętny, ... do 36.
zwraca wskaźnik na łańcuch docelowy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 paź 2018, o 17:13 
Offline
Użytkownik

Dołączył(a): 24 sty 2017
Posty: 33
Pomógł: 0

Troche magia póki co. W weekend nie maiałem czasu, ale jakoś powalcze w tygodniu



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 paź 2018, o 20:18 
Offline
Użytkownik

Dołączył(a): 24 sty 2017
Posty: 33
Pomógł: 0

Daro69 napisał(a):
można np. utworzyć bufor o rozmiarze ilości znaków wyświetlacza, + 1 w szerokości na znak NULL.

Daro69.... możesz mi wyjaśnić po co ten NULL na koniec wiersza please? :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 paź 2018, o 21:33 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2561
Pomógł: 126

A jak się kończy string w C?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 paź 2018, o 21:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

wojtassm napisał(a):
Troche magia póki co.

e... tam. zaraz magia. jeżeli się wczytasz w ciało funkcji to może i tak. :P
ale w skrócie, to funkcja itoa(wartosc, wskaznik_string, radix);
pobiera 'wartosc' -> formatuje na ciąg znaków w systemie liczbowym 'radix' -> i umieszcza w komórkach zaczynając od wskazanego adresu 'wskaznik_string', po czym go zwraca.
ale to tylko jeden ze sposobów, bo można zastosować np funkcję 'sprintf'.
Co do Null na końcu, to tylko po to żeby podzielić bufor na linie/ciągi char.
potem można tak wypełniony bufor znakami char, wysłać do wyświetlacza np.
zaznaczam na przykład.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

teraz można bawić się dalej.
A można też przestudiować Mirka biblioteki i po zrozumieniu, używać je w dowolny wygodny sposób. :)
...............................
o widzę że kolega'micky' też podpowiada. ;)

------------------------ [ Dodano po: 23 minutach ]

dodam jeszcze ....
Dlaczego by nie wysłać całości naraz.
a dlatego że wyświetlacz ma jakoś tak dziwnie(a może przemyślanie),
że długi string wyśle do pierwszej linii wyświetlacza a reszta wyląduje w trzeciej, następnie w drugiej a na koniec w czwartej linijce. :P
to tak dla zrozumienia że trzeba kombinować albo analizować jak to robią inni. ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 paź 2018, o 20:56 
Offline
Użytkownik

Dołączył(a): 24 sty 2017
Posty: 33
Pomógł: 0

Dzieki Panowie za pomoc. Jakoś to ogarnę. Znalazłem fajny temat dotyczący szybkiego dostępu do LCD na blogu Mirka. Ten temat jest zdaje się zgłębiony w BlueBook, więc czekam na dostawę :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 paź 2018, o 12:50 
Offline
Użytkownik

Dołączył(a): 24 sty 2017
Posty: 33
Pomógł: 0

wojtassm napisał(a):
Dzieki Panowie za pomoc. Jakoś to ogarnę. Znalazłem fajny temat dotyczący szybkiego dostępu do LCD na blogu Mirka. Ten temat jest zdaje się zgłębiony w GreenBook, więc czekam na dostawę :)



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 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