logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Wyświetlanie połowy bitmapy na TFT ILI9341 z AVR EVB1 i AtMega32A

mariuszA1985 03 Lut 2017 11:19 1998 17
REKLAMA
  • #1 16249573
    mariuszA1985
    Poziom 10  
    Witam, od kilku dni próbuje wyświetlić bitmapę na wyświetlaczu graficznym TFT ze sterownikiem ILI9341. Pracuje na zestawie uruchomieniowym AVR EVB1 który ma na pokładzie AtMege32A zasilaną 5V przez programator USBASP. Do konwersji napięć 5V/3.3V zrobiłem konwerter na układach 74lvc125. Wyświetlacz komunikuje się z procesorem przez SPI (5linii).

    Jak wspomniałem walcze z wyswietleniem bitmapy z pamięci FLASH. Problem polega na tym że, wyświetla się połowa obrazu.
    Wyświetlanie połowy bitmapy na TFT ILI9341 z AVR EVB1 i AtMega32A
    Bitmapa do wyświetlenia wygląda tak:
    Wyświetlanie połowy bitmapy na TFT ILI9341 z AVR EVB1 i AtMega32A

    Kolor pikseli jest zapisany w formacie (888). Konwersje bitmapy na format (888) przeprowadziłem w PixelFactory.

    Program w C :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Załączony program obejmuje inicjalizacje, czyści ekran kolorem błękitnym i wyświetla bitmapę a na koniec sygnalizuje diodą że skończył wyświetlanie.

    Moje pytanie co zrobić żeby wyświetliła się cała bitmapa na ekranie.
    Dodam że inne funkcje, rysowania linii pełnego prostokąta działają.
  • REKLAMA
  • #2 16249970
    Konto nie istnieje
    Konto nie istnieje  
  • #3 16250024
    mariuszA1985
    Poziom 10  
    Myślę że tak po kompilacji rozmiar wsadu jest powiększony o wielkość bitmap

    Dodano po 43 [sekundy]:

    Myślę że tak po kompilacji rozmiar wsadu jest powiększony o wielkość bitmapy.
  • REKLAMA
  • #4 16250044
    Konto nie istnieje
    Konto nie istnieje  
  • #5 16250093
    mariuszA1985
    Poziom 10  
    Teraz nie mogę tego sprawdzić. Zrobię to wieczorem i odpowiem.
  • REKLAMA
  • #6 16250723
    ASMnauka_
    Poziom 15  
    Piotrus_999 napisał:

    Oooooo piszesz komentarze po chińsku? Nazwa funkcji polska a komentarz .....
    Wyświetlanie połowy bitmapy na TFT ILI9341 z AVR EVB1 i AtMega32A
    Jestem pod wrażeniem

    Piotrus_999, wytłumacz mi, jaki związek ma kontrast do wyświetlania bitmapy (której częściowo nie widać) ?
    mariuszA1985, w listingu masz linijkę:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Ze zdjęć widać, że bitmapa nie jest kwadratem :(
    Więc zacznij od tego ;)
    Pozdrawiam
  • #7 16250951
    mariuszA1985
    Poziom 10  
    zapełniłem taki sam obszar jak dla bitmapy i udało się prostokąt jest cały czarny.

    Użyłem do tego celu takiej funkcji:
    Wyświetlanie połowy bitmapy na TFT ILI9341 z AVR EVB1 i AtMega32A

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dodano po 8 [minuty]:

    Zgadzam się z ASMnauka_ faktycznie bitmapa nie jest prostokątem.
    Nie mam takiego programu w którym mógłbym narysować bitmapę i miał pewność że jest prostokątem. I na dodatek generował plik .h
  • REKLAMA
  • #8 16251028
    Konto nie istnieje
    Poziom 1  
  • #9 16251041
    tmf
    VIP Zasłużony dla elektroda
    @mariuszA1985 Zwróć uwagę na typy zmiennych w funkcji wyświetlania bitmapy. Wyrażenie width*height*3 z dużym prawdopodobieństwem przekracza typ int. Poza tym po co to *3? Przecież w jednym obiegu pętli odczytujesz trzy składowe. A więc wysyłasz 3x więcej danych niż potrzeba. Kolejna sprawa to pokręcony kod - to nie wpływa na błędne wyświetlanie, lecz jego efektywność będzie znikoma.
  • #10 16251311
    Konto nie istnieje
    Konto nie istnieje  
  • #11 16251703
    tmf
    VIP Zasłużony dla elektroda
    To prawda, jest trzykrotnie inkrementowany, niemniej przy int max licznik to 32767, w efekcie wyświetlenie bitmapy większej niż troszkę ponad 100 pikseli będzie niemożliwe. Sam obraz wydaje się być wyświetlany ok - szkoda, że autor nie napisał jaki jest tryb zapisu do GRAM - niestety nie chce mi się odkodowywać tej masy magic numbers, żeby się tego dowiedzieć. Ponieważ część obrazu wyświetlana jest poprawnie, obstawiałbym, że może jest też coś nie tak z samą reprezentacją obrazu w pamięci.
    BTW, wskaźnik może adresować na AVR obecnie do 24-bitów po dodaniu __memx.
  • #12 16251736
    Konto nie istnieje
    Konto nie istnieje  
  • #13 16251749
    tmf
    VIP Zasłużony dla elektroda
    Nie ma co podejrzewać, wystarczy sprawdzić. Łatwo się domyślić, że 24 bity na 8-bitowym MCU są bardziej kosztowne niż 16-bitów. Przy pokazanym kodzie autora lepiej nie mówmy o optymalizacji :) Po pierwsze autor łączy się z LCD po SPI, które demonem szybkości nie jest, dwa, że nie korzysta z buforowania nadajnika, czyli nawet teoretycznie maksymalnej szybkości transferu po SPI nie osiągnie, trzy, że sam kod...
  • #14 16251845
    Konto nie istnieje
    Konto nie istnieje  
  • #15 16251961
    mariuszA1985
    Poziom 10  
    Zmieniłem kod programu tak aby nie "przepełnić" zakresu zmiennych.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Niestety to nie pomogło nadal na ekranie mam pół obrazu na reszcie śmieci.
  • #16 16252034
    Konto nie istnieje
    Konto nie istnieje  
  • #17 16252606
    tmf
    VIP Zasłużony dla elektroda
    @mariuszA1985 A co robi instrukcja lcd_wyslij_bajt(0,0x2c);? Bo twoja funkcja ustawiająca okno kończy się poleceniem zapisu do GRAM po którym powinieneś wysłać ciąg bajtów bitmapy.
    BTW, najlepiej testowo zapełnić obszar nie jednolitym kolorem, a wzorkiem, np. pionowe linie. Wtedy widać, czy nic się nie przesunęło.

    Dodano po 1 [minuty]:

    Piotrus_999 napisał:
    tmf napisał:
    Po pierwsze autor łączy się z LCD po SPI


    To takich celów wystarczy :). Na STM-ie preportowałem swoich starych invadersów i bez problemu chodzi - a co więcej muszę opóźniać.


    Nie twierdzę, że nie, to ty zastanawiałeś się nad wydajnością __memx.
  • #18 16254738
    trol.six
    Poziom 31  
    mariuszA1985 napisał:
    Jak wspomniałem walcze z wyswietleniem bitmapy z pamięci FLASH. Problem polega na tym że, wyświetla się połowa obrazu.

    Wyświetl te bitmape od końca, co jest równoznaczne z obrotem o 180 stopni i zobacz jaki będzie efekt.

    mariuszA1985 napisał:
    Zmieniłem kod programu tak aby nie "przepełnić" zakresu zmiennych.

    Jednak idx masz wciąż 16 bitowy... szczerze to nie wiem jaki zakres danych przyjmuje pgm_read_byte() jakoś nigdy nie miałem do czynienia z flash >64k
    .
REKLAMA