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



Teraz jest 15 lis 2024, o 18:20


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 22 lut 2021, o 23:52 
Offline
Użytkownik

Dołączył(a): 10 cze 2020
Posty: 29
Pomógł: 0

Cześć! Aktualnie pracuję nad zegarkiem na rękę z wyświetlaczem OLED 0,96 cala, komunikacja SPI. Przy pomocy programu PixelFactor na licencji z greenbooka stworzyłem sobie dwie bitmapy, prezentujące dwie wersje tego samego logo. Wyświetlanie owych bitmap uwarunkowałem poprzez wciśnięcie przycisków. W tym momencie pojawił mi się pewien problem... Całą bibliotekę tworzę razem z Panem Mirkiem na podstawie jego filmików o SSD1306, więc wykorzystuję funkcję zawarte w jego filmach. W momencie wywołania bitmapy, wyświetla się ona na OLEDZIE, jednak jej współrzędne tak jakby zostają przesunięte. Z tego powodu każdorazowa zmiana bitmapy powoduję, że wyświetla się ona przesunięta o daną ilość miejsc. Analizowałem kod i nie mogę znaleźć miejsca, w którym mógłbym naprawić to przesunięcie... Wstawiam kod programu oraz zdjęcia prezentujące pracę układu. Dodam, że wgranie takiej samej bitmapy kilka razy z rzędu również przesuwa współrzędne. Proszę o pomoc.

Plik 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.


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


Funkcję wykorzystywane w SuperDebounce i init_key();
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Obrazek
Obrazek
Obrazek
Obrazek
Obrazek
Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lut 2021, o 16:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2015
Posty: 187
Pomógł: 10

Spróbuj zmienić w funkcji mk_ssd1306_drawBitmap_P, linię (numer 7 poniżej):

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


na 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.


lub takiego

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lut 2021, o 19:17 
Offline
Użytkownik

Dołączył(a): 10 cze 2020
Posty: 29
Pomógł: 0

Niestety nie pomogło ;/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lut 2021, o 23:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2015
Posty: 187
Pomógł: 10

Nie wiem jakiego kompilatora używasz i jakiej architektury ale może spróbuj zmienić typ zmiennej z int na przynajmniej uint8_t lub uint16_t. Być może dochodzi do overflow jeśli użyty int faktycznie posiada przedział wartości <-128 ... 127>

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lut 2021, o 23:19 
Offline
Użytkownik

Dołączył(a): 10 cze 2020
Posty: 29
Pomógł: 0

Próbowałem już wcześniej zmienić typy zmiennych int na uint16_t, jednak żadnego efektu to nie przeniosło... Problem musi tkwić albo w funkcji mk_ssd1306_drawBitmap_P albo mk_ssd1306_setPixel. Ewidentnie wywołanie bitmapy powoduje przesunięcie się jakby punktu początkowego całego obrazu w prawą stronę. Tak przesunięty obraz "wychodzi" z drugiej strony i przesuwa logo... Analizowałem obie te funkcję i naprawdę nie widzę tam błędu. W filmach Pana Mirka takie rozwiązanie działało... Dodam, że używam wyświetlacza z pinami D/C, CS, REST



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2021, o 17:38 
Offline
Użytkownik
Avatar użytkownika

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

Morales napisał(a):
Problem musi tkwić albo w funkcji mk_ssd1306_drawBitmap_P albo mk_ssd1306_setPixel
No to nie "albo" tylko sprawdź to na żywym organizmie. Zamiast bitmapy wysyłaj jeden piksel i będziesz widział czy też się przesuwa...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lut 2021, o 18:15 
Offline
Użytkownik

Dołączył(a): 10 cze 2020
Posty: 29
Pomógł: 0

Sprawdziłem to w taki sposób. Teoretycznie linia powinna się cały czas rysować na tej samej wysokości Y, jednak tak nie jest. Zrobiłem dwa zdjęcia. Na wyświetlaczu ta linia cały czas się rysuje, jednak jej współrzędne startowe przesuwają się o daną odległość... Dodatkowo pojawiła się jakaś dziwna kropka, która również przesuwa się wraz z linią... Ja już nie rozumiem w czym jest problem... Aktualnie zająłem się programowanie RTC, bo tutaj nie umiem znaleźć rozwiązania.

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.


ObrazekObrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lut 2021, o 21:23 
Offline
Użytkownik
Avatar użytkownika

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

W drugim listingu kodu z pierwszego posta (nazwanego "Funkcję do obsługi wyświetlacza:") w linijce 143 powinno być CS_LOW, nie wiem czy to to jest problemem, ale dziwne że wogule cokolwiek się wyświetla na wyświetlaczu bo w takim wypadku przed wysyłką bufora wyświetlacz nie jest aktywowany do komunikacji...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lut 2021, o 21:38 
Offline
Użytkownik

Dołączył(a): 10 cze 2020
Posty: 29
Pomógł: 0

Poprawiłem tę linijkę i kompletnie nic to nie zmieniło... Próbowałem również funkcji z najnowszej wersji Adafruit bo tam odrobinę się one różnią i również nie pomogło...
Myślałem również, że może mam za dużo zajętej pamięci RAM i że do wartości tych współrzędnych trafiają śmieci, ale mam zajęte 54% RAM, więc jeszcze mam trochę zapasu oraz bitmapy i narysowane linie, zawsze przesuwają się o taką samą wartość, więc to nie mogą być śmieci...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lut 2021, o 21:47 
Offline
Użytkownik
Avatar użytkownika

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

Ok, to może inaczej, oprócz funkcji o których wspomniałeś, za to co się wyświetla na ekranie odpowiedzialna jest również ta do wysyłania bufora czyli mk_ssd1306_display().
Ja bym zrobił to tak:
w buforze umieściłbym 1 piksel, po czym samej zawartości bufora bym już nie ruszał, a cyklicznie co np 1 sekundę wysyłałbym bufor do wyświetlacza (ewentualnie można by tu podpiąć migniecie jakąś diodą przy każdej wysyłce by ewentualnie dla oka wiedzieć kiedy jest wysyłka) jeśli piksel będzie nieruchomy to wiemy że funkcja wysyłająca bufor jest ok, i można szukać dalej...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lut 2021, o 23:26 
Offline
Użytkownik

Dołączył(a): 10 cze 2020
Posty: 29
Pomógł: 0

To był dobry strzał! Bufor się wysyła, ale pixel nadal się przesuwa. Dodatkowo na ekranie pojawiły się 3 dziwne pixele, nie określone przeze mnie w buforze. Pojawiają się i od razu znikają. Wychodzi na to, że problem musi być w tych 3 funkcjach...

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


EDIT : Wychodzi na to, że problem został zażegnany... Te 3 komendy co wymieniłem powyżej okazały się niepotrzebne. Nawet jak użyłem dokładnych komend, które wykorzystuje Adafruit w swojej bibliotece to problem nadal występował. Ostatecznie spróbowałem wgrać kod, beż nich i sukces! Bitmapy zmieniam przy pomocy przycisku i nic się nie przesuwa! Bardzo dziękuję za pomoc użytkownikowi xentis. Fajnie mnie nakierowałeś... Wychodziłem z założenia, ze display() jest poprawnie napisana i szukałem w dwóch pozostałych funkcjach. Dzięki!

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



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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