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

[ATmega88][avr-gcc]Wyświetlacz ze sterownikiem ILI 9325-AVR

Cersunited 23 Gru 2012 15:31 3996 15
  • #1 11688153
    Cersunited
    Poziom 16  
    Witam
    Mam następujący problem z obsłużeniem wyświetlacza TFT 2,4" ze sterownikiem ILI9325. Zaadaptowałem sobie bibliotekę ze strony http://www.henningkarlsen.com/electronics/library.php?id=51
    Kod napisany jest w C pod Atmege 88. Biblioteka działa poprawnie , wyświetlacz inicjalizuje się, mogę zmieniać kolory tła , obiektów wyświetlać napisy itp. Problem mam jednak z wstawieniem jakiejś prostej Bitmapy. Tworzę prostą bitmapę np w Photoshopie lub Paincie , następnie przerabiam ją do hexa w formie tablicy i wstawiam do pliku z biblioteką. Za wyświetlenie tego pliku odpowiada funkcja DrawBitmap. W funkcji należy podać współrzędne początkowe oraz końcowe obrazka(rozmiar). Próbowałem wstawić bitmapy używane wcześniej do wyświetlaczy KS108(monochromatyczne) jednak funkcja nie działa. Na ekranie pokazuje sie wprawdzie okno o podanym wymiarze(w tym przypadku 128x64 pix) lecz w jego środku jest tylko mozaika pikseli. Nie wiem czy źle konwertuje obrazek(zła forma tablicy) czy może problem leży gdzieś indziej. Widziałem nie którzy mieli do czynienia z tymi LCD i może jest ktoś będzie w stanie mi doradzić:)
    Poniżej daję wywołanie funkcji w main oraz tablice którą próbuję wyświetlić. Dodam że gdy wpisuję w funkcji nazwę tablicy bez cudzysłowia ,kompilator wywala błąd, tak jakbym odnosił się do nieistniejącego objektu. Będę wdzięczny za wskazanie co robię źle:)


    Kod: text
    Zaloguj się, aby zobaczyć kod


    Kod: text
    Zaloguj się, aby zobaczyć kod



    Czekam na sugestie:)

    Pozdrawiam no i wesołych świat :)
    Moderowany przez LordBlick:

    Moje sugestie odnośnie poszanowania reguł panujących na forum oraz użytkowników udzielających odpowiedzi to:
    - używanie na przyszłość tagu [syntax=C] do wklejania kodu w C...[/syntax].
    - zawieranie w tytule tematu nazwy mikrokontrolera i kompilatora.
    Tym razem poprawiłem.
    Proszę się zapoznać z zasadami korzystania z działu:
    https://www.elektroda.pl/rtvforum/topic349089.html

  • #2 11688232
    robiw
    Poziom 26  
    Hej,
    Skoro jest to TFT to kolorowy a skoro kolorowy to Twoja tablica opisująca kolory poszczególnych pikseli musi być zgodna z akceptowanym przez sterownik TFT formatem, zwykle jest to RGB 565 czyli dwa bajty koloru na jeden piksel RRRRRGGGGGGBBBBB. Ponadto ważna jest też szerokość magistrali danych - to wszystko musisz sprawdzić w dokumentacji by napisać odpowiedni konwerter...robiw
  • #3 11688487
    Cersunited
    Poziom 16  
    Dziękuję za odpowiedź. Faktycznie nie napisałem o tym :) Wyświetlacz kontrolowany jest za pomocą magistrali 8 bitowej. Konwerter np na stronie http://www.henningkarlsen.com/electronics/library.php?id=51
    konwertuje pliki do tablicy hex tylko dla trybu 16 bitowego. Starałem się uzyć więc innych konwerterów jednak bez skutku. Chciałbym również aby spojrzał ktoś czy samo wywołanie funkcji jest dobrze zrealizowane. Opisy funkcji są na podanej w linku stronie również. Znacie może jakieś konwertery Jpeg lub Bmp do hex własnie dla wyświetlaczy 65tys kolorów? Z tego co szukałem znajduję tylko dla monochromatycznych.

    Pozdrawiam
  • #4 11688706
    Konto nie istnieje
    Konto nie istnieje  
  • #5 11898079
    Cersunited
    Poziom 16  
    Witam. Niestety z braku czasu nie robiłem nic z wyświetlaczem jednak problem nadal nie rozwiązany. Co do programu szukałem(img2lcd) jednak nic nie udało mi się znaleźć. Najlepszym rozwiązaniem byłoby chyba przerobienie całej biblioteki dla Arduino Henninga Karlsena na C dla AVR. Czy miał ktoś w praktyce do czynienia z tymi bibliotekami może? Mam przerobiona okrojoną ich część na AVR jednak funkcja drawBmp nadal nie działa:/ A przerabianie całej biblioteki z Arduino niezbyt mi się uśmiecha szczególnie że nie robiłem nigdy czegoś takiego.

    Pozdrawiam
  • #6 11898166
    BlueDraco
    Specjalista - Mikrokontrolery
    "obrazek" - to adres umieszczonego w pamięci RAM łańcucha znaków "obrazek", więc raczej nie da się w ten sposób dostać do tablicy o nazwie obrazek.

    Jak jest zadeklarowana funkcja wyświetlania obrazka? Twój obraz jest zapisany w pamięci programu (atrybut PROGMEM) - być może funkcja, której używasz, kopiuje dane z pamięci danych, a nie programu.
  • #7 11898487
    2rs232
    Poziom 18  
    Zerknij na ten program do konwersji bitmap.
    Bmpcvt
  • #8 11898942
    Cersunited
    Poziom 16  
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Tak wygląda funkcja odpowiedzialna za wyświetlenie obrazka.

    Kod: text
    Zaloguj się, aby zobaczyć kod

    oraz wywołanie funkcji z parametrami -wielkość i nazwa tablicy.
    Dzięki programik zaraz sprawdzę , przekonwertuję jakąś bmp i zobaczę co z tego wyjdzie:)

    Pozdrawiam
  • #9 11899898
    BlueDraco
    Specjalista - Mikrokontrolery
    drawBitmap oczekuje ostatniego argumentu typu unsigned int *, a Ty próbujesz przekazać PROGMEM unsigned char *. Największy problem to ten PROGMEM. Proponuję zmodyfikować drawBitmap tak, żeby jej argument był wskaźnikiem na PROGMEM, czyli odwołania do obrazka w funkcji wykonywać przez prog_read_byte albo prog_read word. Funkcja chce mieć piksele 16-bitowe, Ty masz obrazek zapisany jako ciąg bajtów - coś tu trzeba zmienić - albo zmienić postać deklaracji obrazka, albo w funkcji odwoływać się do bajtów i składać z nich 16 bitów.
  • #10 11900137
    Cersunited
    Poziom 16  
    Nie bardzo własnie wiem jak zmodyfikować tą funkcję. Jeżeli chodzi o PROGMEM to później można by się tym zająć , narazie chciałbym tylko dostać się do tablicy i odczytać dane. Co do sugestii kolegi wyżej znacznie łatwiej zmienić zapis obrazka na 565 i dane 16 bitowe. Przykładowo mam ikonke 16x16 ,w formacie 565 ,16bit w formie tablicy:

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


    jak powinienem odnieść się do tej tablicy teraz aby funkcja DrawBitmap mogła wyświetlić dane? Jak ewentualnie zmodyfikować funkcje DrawBitmap?
    Pierwszy raz bawię się TFT wcześniej miałem styczność z wyświetlaczami na ks108 jednak tam wszystko było dużo prostsze(co oczywiste):)


    Pozdrawiam
  • #11 11900162
    BlueDraco
    Specjalista - Mikrokontrolery
    W drawBitmap zastąp zwykłe odwołania do pikseli wywołaniami funkcji prog_read_word. Przykłady znajdziesz w wielu miejscach.

    To nie ma nic wspólnego z typem wyświetlacza - chodzi o dostęp do pamięci Flash AVR.
  • #12 11922863
    Cersunited
    Poziom 16  
    Z wyświetlaniem Bmp już sobie poradziłem, funkcja działa. Trochę to trwało ponieważ w międzyczasie przeniosłem sie na większą megę. Mam natomiast inny problem. Po przerobieniu obrazka np 128x128 pix , kompilator zgłasza error odnośnie za dużego rozmiaru tablicy. Pozostaję tylko podzielenie tablicy np na dwie mniejsze ,czy jest jakieś inne wyjście? Dzielenie może być nieco kłopotliwe.

    Pozdrawiam
  • #13 11922905
    tmf
    VIP Zasłużony dla elektroda
    Tablica nie może mieć więcej elementów niż maksymalna wartość typu int. Stąd problem. Zamiast robić tablice, zainteresuj się programem objcopy, który jest w toolchainie - przerabia on m.in. wskazany plik binarny na plik obj, który można zlinkować z resztą projektu. Taki plik w programie będzie identyfikowany przez zdefiniowany symbol (wskaźnik).
  • #14 11928595
    Cersunited
    Poziom 16  
    Chyba nie do końca jest tak jak kolega mówi. Jeśli wynikałoby to z wartości int to powinno wystarczyć zmiana zmiennej tablicowej na typ np long
    lub unsigned long , mimo tego kompilator nadal zgłasza błąd.Wydaje mi się że to chodzi o ilość indeksów danej tablicy. Wygląda to na ograniczenie do 65536 indeksów niezależnie od rozmiaru. Stworzenie o jeden indeks mniejszej tablicy pozwala skompilować program obojętnie czy dane w tablicy to 8 czy 16 bit . Może jest to ograniczenie samego avr gcc?
  • #15 11928836
    tmf
    VIP Zasłużony dla elektroda
    Raczej kolega nie zrozumiał tego co napisałem. Ograniczenie wielkości tablicy do maksymalnej wartości typu int wynika ze standardu języka c. Po prostu tablica nie może zajmować więcej pamięci niż maksymalna wartość int - dla AVR, dla którego int jest 16-bitowy wartość ta wynosi 32767, na PC gdzie typ int jest 32/64 bitowy wartość ta jest odpowiednio większa. Typ zmiennej, którą użyłeś do indeksowania tablicy nie ma znaczenia. Także żadne 65536 indeksów, po prostu sizeof(tablica) dla AVR musi być <32768.
  • #16 11984875
    Cersunited
    Poziom 16  
    -->tmf- dokładnie chodziło mi o 32768 indeksy źle się wyraziłem. Problem obecnie rozwiązałem dzieleniem tablic dla większych BMP. Co do sugerowanego objcopy powrócę jak tylko uporządkuję całą bibliotekę
REKLAMA