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



Teraz jest 25 kwi 2024, o 11:12


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 
Autor Wiadomość
PostNapisane: 25 lut 2018, o 14:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 cze 2014
Posty: 820
Lokalizacja: Tam gdzie PYRY są
Pomógł: 64

Witam, snów Was trochę pomęczę pytaniami ;p

Wsego czasu posklejałem sobie fajną biblioteczkę do obsługi ili9341. powstał taki zlepek - trochę z arduino, trochę z GB, coś tam jeszcze z innej biblioteki. Wszystko działało miodnie łącznie z obsługą fontów, oraz rysowaniem obrazków z flasha i microSD.

Teraz postanowiłem sobie wrzucić grafili 72*72px do flasha - mam atmege2560 wiec stać mnie - a co - miejsca oszczędzać nie trzeba.

I tu ZONK!
okazuje się, że to co działało kiedyś teraz nie działa. Grafiki rysują się pięknie do momentu kiedy nie przekraczają rozmiaru koło 30x30pikseli,potem obrazek wygląda jak kupa losowo rozrzuconych pikseli.

Funkcja rysująca wygląda tak: i chyba jest ok, bo działa dobrze do wielkości około 30*30px.
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.





zajętość flasha po kompilacji :


Program: 71672 bytes (27.3% Full)
(.text + .data + .bootloader)

Data: 596 bytes (7.3% Full)
(.data + .bss + .noinit)

Tak się zastanawiam - płytka to arduino mega2560 więc pewnie miała kiedyś jakiś bootloader. Może to mieć znaczenie - nie wiem - zarezerwowana pamięć, fusebity? cokolwiek?

Nie wiem, co mogłem przeoczyć

_________________
IntegraMETEO
WordCLOCK
IntegraTOUCH



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

Dołączył(a): 08 lut 2016
Posty: 96
Pomógł: 2

Hej

Wiem, że to wiele nie da ale na początek zrobił bym na Twoim miejscu funkcję Draw_Pixel(X,Y,Color);
Następnie spróbował wypełnić cały ekran dowolnym kolorem i zobaczył co się stanie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lut 2018, o 15:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 cze 2014
Posty: 820
Lokalizacja: Tam gdzie PYRY są
Pomógł: 64

Wszystko śmiga - rysuje linie punkty, okręgi czcionki i obrazki z SD. tylko nie te nieszczęsne obrazki z flasha

_________________
IntegraMETEO
WordCLOCK
IntegraTOUCH



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lut 2018, o 16:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 369
Lokalizacja: Gliwice
Pomógł: 34

skalarro napisał(a):
Wszystko śmiga - rysuje linie punkty, okręgi czcionki i obrazki z SD. tylko nie te nieszczęsne obrazki z flasha

Hmm, w takich sytuacjach częstym błędem jaki popełniam to zbyt "wąskie" typy danych, które przy większych obiektach powodują nieprzewidziane efekty.
Posprawdzaj dokładnie, czy czasami gdzieś nie trzeba powiększyć typów z uint8_t na uint16_t.
JA często w pętlach daję np takiego babola:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


i problem gotowy :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lut 2018, o 16:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 cze 2014
Posty: 820
Lokalizacja: Tam gdzie PYRY są
Pomógł: 64

Zealota napisał(a):
takich sytuacjach częstym błędem jaki popełniam to zbyt "wąskie" typy danych

To nie to, przejrzałem już dziesiątki razy każdą linijkę kodu, każdą funkcję od bitmapy aż po rysowanie pojedynczego pikselka.

Jejynym miejscem o którym piszesz jest
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
ale tu index jest uint16 co nam daje możliwości aż do 180*180 lub 128*256 pikseli

_________________
IntegraMETEO
WordCLOCK
IntegraTOUCH



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lut 2018, o 18:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 cze 2014
Posty: 820
Lokalizacja: Tam gdzie PYRY są
Pomógł: 64

No dobra, wywaliłem wszytko, zostawiłem tylko wyświetlanie grafiki i... Tadaaammm.... Działa.
Potem stopniowo zacząłem zapychać procesor fontami i grafikami aż zaczęło się sypać. I chyba mam.
Właśnie się przekopuję przez topic19149.html czyli AVR-GCC - dane w pamięci FLASH - poradnik napisany przez kolegę andrews.

Tyle, że to czarna magia jest...

_________________
IntegraMETEO
WordCLOCK
IntegraTOUCH



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lut 2018, o 19:27 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Czego konkretnie nie rozumiesz?

Jeśli Twoje grafiki lądują w pamięci FLASH powyżej adresu 65535, musisz użyć funkcji pgm_read_byte far() zamiast pgm_read_byte() oraz wskaźnika uint_farptr_t zamiast uint8_t.
Adres pobierasz nie za pomocą operatora &, tylko za pomocą funkcji pgm_get_far_address().


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lut 2018, o 19:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 cze 2014
Posty: 820
Lokalizacja: Tam gdzie PYRY są
Pomógł: 64

No tego właśnie wszystkiego co tak pięknie opisałeś:
Po kolei, ładuję grafiki ale nie wiem która leci powyżej FFFF, wiem już, że zapisują się od początku czyli część się zmieści część nie. Mogę wszystkie zmusić żeby były powyżej FFFF? jeżeli tak to jak? Zamiast:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

ale chyba to nie tak co?

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


napiszesz mi gokłądnie co i jak zmienić?? siedzę nad tym już z 8 godzin, przeczytałem pół internetu i wszystko się miesza

_________________
IntegraMETEO
WordCLOCK
IntegraTOUCH



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lut 2018, o 19:45 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

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


Nie mam możliwości przetestowania, ale powinno działać.

EDIT: Jeśli chciałbyś przejść na __flash:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

EDIT: Poprawiłem kod adekwatnie do tego, co słusznie zauważył kolega skalarro (3 posty niżej). Tak bardzo skoncentrowałem się na modyfikacji kodu pod kątem odczytu z FLASH, że nie pomyślałem o konieczności modyfikacji warunku pętli while. Tak jak teraz powinno być OK ;)


Autor postu otrzymał pochwałę


Ostatnio edytowano 26 lut 2018, o 06:24 przez andrews, łącznie edytowano 2 razy

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

Dołączył(a): 19 cze 2014
Posty: 820
Lokalizacja: Tam gdzie PYRY są
Pomógł: 64

Zrobione, niestety efekt nieciekawy. Najlepiej pokaze to filnik. Funkcja wywołana tylko raz...



zaraz zobaczę z flash, muszę kontrolować czy to bedzie flash1,2,3 czy juz mnie to nie musi obchodzic?

_________________
IntegraMETEO
WordCLOCK
IntegraTOUCH



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lut 2018, o 20:34 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Obydwa kody powinny działać, tak jak napisałem.
Użycie makra pgm_read_byte_far() z 32-bitowym wskaźnikiem uint_farptr_t lub wskaźnika z kwalifikatorem __memx gwarantuje prawidłowy odczyt z dowolnego miejsca pamięci FLASH


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lut 2018, o 20:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 cze 2014
Posty: 820
Lokalizacja: Tam gdzie PYRY są
Pomógł: 64

Albo robie jakiegoś piko-babolka albo ja już nie wiem. Drugi sposób zasypał mi eklipsa warningami ale efekt taki sam jak powyzej.

------------------
ok, babol znaleziony.
zmiana z:
tft_ILI9341_write8(pgm_read_byte( &glyph[ idx++ ] ));

na:
tft_ILI9341_write8(pgm_read_byte_far( glyph++ ));

spowodowała, że pętla zależna od idx się nie kończyłą nigdy. Pomogło dodanie idx++;

Dzięki andrews, mega mi pomogłeś

_________________
IntegraMETEO
WordCLOCK
IntegraTOUCH



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

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

skalarro napisał(a):
Drugi sposób zasypał mi eklipsa warningami

Kolega anshar znalazł na to rozwiązanie: http://forum.atnel.pl/topic15543.html#p162317



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

Dołączył(a): 15 lut 2017
Posty: 369
Lokalizacja: Gliwice
Pomógł: 34

Hmm tak sobie myślę, że jednak warto pozostać przy __flash i __memx i powoli przerzucać się na nowe toolchainy i zapomnieć o pgmem_read, które to wydaje się wyjątkowo upierdliwe.
Spróbujcie później zrobić przenośny kod np na stm32. Wiadomo da się, ale po co się męczyć.

"Użycie makra pgm_read_byte_far() z 32-bitowym wskaźnikiem uint_farptr_t lub wskaźnika z kwalifikatorem __memx gwarantuje prawidłowy odczyt"
Skoro użyłeś __memx to nie potrzebujesz już żadnego makra "pgm". Kwalifikator ten rozszerza wskaźnik do 24 bitów i mamy jedną przestrzeń adresową zdolną do adresacji 16MB pamięci, a do odczytu wystarczy zwykłe przypisanie.

Oczywiście trzeba pamiętać o "const". Jeśli dojdzie do migracji na stm32 to wystarczy usnąć __memx. Inaczej można jeszcze zdefiniować jakiś nowy typ, a później tylko w jednym miejscu modyfikować w zależności od MCU.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lut 2018, o 17:51 
Offline
Użytkownik

Dołączył(a): 08 lut 2016
Posty: 96
Pomógł: 2

Panowie, a możecie mi wytłumaczyć w jakim celu i czemu służy funkcja:

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


Pozdrawiam
StaryAnoda



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lut 2018, o 18:21 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 369
Lokalizacja: Gliwice
Pomógł: 34

StaryAnoda napisał(a):
Panowie, a możecie mi wytłumaczyć w jakim celu i czemu służy funkcja:

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



Jeśli dobrze pamiętam to definiujesz okno o początku (x,y), szerokości a, wysokości b, które możesz cyklicznie odświeżać.
Nie musisz buforować całego ekranu, tylko jego wycinek. Bardzo pożyteczna opcja jeśli chcesz aktualizować wybrany, prostokątny fragment obrazu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lut 2018, o 20:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 cze 2014
Posty: 820
Lokalizacja: Tam gdzie PYRY są
Pomógł: 64

Doikładnie. Bardzo pomocne jak np wyświetlasz jakieś sybko zmieniające się dane typu nie wiem - powiedzmy obroty silnika czy wynik z miernika. Przy wysłaniu np cyfry 1 o wymiarach 3x7 pikseli, taki właśnie zostanie ustawiony obszar do wysłania danych do wyświetlacza. Nie wysyłasz całego bufora jak było w oled (chociaż tam szło ustawić tzw active page czyli linię 8x64px chyba o ile pamiętam) tylko wysyłasz dosłownie dane kilku pikseli.

_________________
IntegraMETEO
WordCLOCK
IntegraTOUCH



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 9 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