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

Obsługa wyświetlacza TFT 3,5'' (ILI9327_8) pod zwykłym C

mas24 25 Sie 2015 10:00 2154 15
  • #1 14945591
    mas24
    Poziom 16  
    Witam,

    Zakupiłem wyświetlacz TFT 3,5'' na tej stronie Link

    Jest to moduł dedykowany dla Arduino. Ja tymczasem chciałem go użyć w swoim układzie i zaprogramować go w zwykłym C (AVR-GCC).

    Byłem na stronie GIDHub, ale tam wszystko dla Arduino jest właśnie. Znalazłem też temat na Elektrodzie, ale także dotyczy Arduino. Analizowałem przykłady kodu dla Arduino i są one dziwne, a próba przepisania czegokolwiek na C zakończyła się fiaskiem.

    Czy ktoś może wie, gdzie zdobyć biblioteki/przykłady na zwykłe C, bez użycia Arduino?
  • #2 14945597
    BlueDraco
    Specjalista - Mikrokontrolery
    A jakie to fiasko poniosłeś przepisując kod z C++ na C i na czym polega problem?
  • #3 14945711
    mas24
    Poziom 16  
    Że nie znam się na C++. W C nadal w sumie jestem początkującym, np. taki kod:

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


    poczytałem, o funkcji Digital Write, ale co np. oznaczają parametry wpisane jako pierwszy argument? Tak, wiem, ogólnie numer pinu, ale którego pinu, jakiego portu? Ten przykład wydaje się być wyrwany z kontekstu (z jakiegoś większego projektu). Nie znam się kompletnie na Arduino, wolę pisać w "zwykłym" C.
  • #4 14945942
    piotrva
    VIP Zasłużony dla elektroda
    Pierwszy parametr to numer pinu Arduino - zobacz jak są zmapowane piny procesora na Arduino i wtedy dowiesz się, że np. pin o numerze 0 to PD0, 7 to PD7 8 to PB1 itd.
  • #5 14946012
    mas24
    Poziom 16  
    Dobra, to wygląda na proste, zrobię jak radzisz.

    Dziwna jest też ta pierwsza funkcja Lcd_Write_Bus(), z inkrementacją pinów w pętli, nie mógłbym po prostu zapisać, np. PORTC =0b0001000 ?
  • #6 14946134
    dondu
    Moderator na urlopie...
    mas24 napisał:
    ... nie mógłbym po prostu zapisać, np. PORTC =0b0001000 ?

    Taki rozkaz ustawi jedynkę na pinie PC3 mikrokontrolera, a na pozostałych w porcie C ustawi zero. Jeśli o to Ci chodzi, to oczywiście możesz tak zrobić.
  • #7 14946264
    mas24
    Poziom 16  
    To wiem, aż takie podstawy języka C znam :)
    Rzeczywiście, piny w Arduino mają takie właśnie nazwy, powinienem sobie poradzić.

    Dodano po 4 [godziny] 18 [minuty]:

    Wysmażyłem taki oto kod, jutro dowiem się, czy działa:

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


    Po namysłach stwierdziłem, że cały port adresu/danych (8 bit), musi być na jednym porcie mikrokontrolera. W oryginale przekombinowali to, gdyż ten port w LCD, połączony jest do dwóch portów mikrokontrolera w Arduino, w dodatku tak dziwnie, żeby linie RxD i TxD w Arduino pozostały wolne, najprawdopodobniej do komunikacji.

    Jednak pisze mi Warninga na funkcję "rand()", jakby jej nie znał, ale kod się kompiluje.
  • #8 14946956
    piotrva
    VIP Zasłużony dla elektroda
    Pewnie pisze, że "implict declaration" albo coś w tym stylu - brakuje CI nagłówka math.h o ile dobrze pamiętam.
  • #9 14947273
    mas24
    Poziom 16  
    Szkoda dołączać całej biblioteki matematycznej. Dla sprawdzenia przykładu lepiej narysować kilka prostokątów "na sztywno".
  • #10 14947944
    mas24
    Poziom 16  
    Przykład działa! Program rysuje na wyświetlaczu biały prostokąt. Instrukcja CLS wymaga jeszcze optymalizacji, bo dość wolno czyści ten ekran. Jednak przykład odpaliłem na Atmega8 z zegarem 8MHz.

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


    W oryginalnym kodzie brakuje funkcji Point, rysującej punkt o podanych współrzędnych. Funkcja przydatna przy rysowaniu wykresów. Oto ona;
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #11 14948131
    piotrva
    VIP Zasłużony dla elektroda
    Fajnie, że się udało ;)
    Nie takie portowanie biblioteki straszne, jak się spodziewałeś, a satysfakcja, że dałeś radę sam chyba większa niż gotowiec?
  • #12 14948340
    mas24
    Poziom 16  
    Dokładnie! Program podzieliłem na pliki i chętnie się podzielę, by w przyszłości tacy jak ja, nie błądzili.

    Program rysuje na wyświetlaczu sinusoidę, zdefiniowaną w tablicy TAB. Dla większych tablic dane trzeba skalować. Rysowaniem sinusoidy zajmuje się funkcja "wykres()", która rysuje na biało dwie osie współrzędnych, a sam wykres na zielono. Kolory można zmieniać za pomocą predefiniowanych wartości, znajdujących się w pliku "LCD_ILI9327.h", choć niektóre kolory są przekłamane, Np wpisanie słowa YELLOW, rysuje na czerwono.

    Plik nagłówkowy:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    źródłówka pliku nagłówkowego:

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


    przykład użycia w programie:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #13 14951296
    mas24
    Poziom 16  
    Coś nie mogę uruchomić tego wyświetlacza na Xmega. Zauważyłem, że sygnały sterujące wychodzące z Xmegi mają tylko 2,3v (sprawdzane oscyloskopem). To może być za mało do prawidłowego odczytu portów jako konkretny stan. Wyświetlacz zasilam z 5v a w nim jest stabilizator na 3.3v najprawdopodobiej dla logiki. 5v idzie na podświetlenie. Procka zasilam z 3.3v z oddzielnego stabilizatora i niby powinno być ok a nie jest.
  • #14 14951484
    tmf
    VIP Zasłużony dla elektroda
    Jeżeli w stanie wysokim mam tylko 2,3V to znaczy, że coś jest źle podłączone. Sprawdź Vcc XMEGA czy na pewno jest 3,3V, sprawdź konfigurację portów - czy są wyjściami, a nie wybrałeś np. wyjść typu OC z podciąganiem do Vcc. I przede wszystkim pokaź kod na XMEGA.
  • #15 14951517
    mas24
    Poziom 16  
    Sprawa rozwiązana. Moje oko nie dostrzegło, ale miernik na zwarcia tak- zwarcie pomiędzy dwiema nogami Xmegi SMD. Po przeskrobaniu układ ruszył i teraz mogę podzielić się wersją na Xmega.

    W stosunku do wersji na AVR AtMega, zmiany są takie:

    Procedura setup() jest następująca:

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



    zmieniły się także definicje sygnałów w pliku LCD_ILI9327.h:

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


    I to mogłoby być już wszystko, ale... gdzie czcionki na wyświetlaczu? Będę nad nimi pracował.

    Wyszła jeszcze inna dziwna sprawa ze sposobem podłączenia zasilania.
    Gdy podłączam wyświetlacz do +5V do jednego źródła (zasilacz), a płytkę z prockiem do +3,3V z innego źródła (programator USB), to układ pracuje.

    Jeśli jednak podłączę cały układ do zasilacza +5V, także wyświetlacz pod to +5V (płytka z prockiem ma swój stabilizator 3,3V), a programator skonfiguruję na zasilanie zewnętrzne (+3,3V to samo co Xmega), to układ wariuje. Pojawiają się poziome, kolorowe paski RGB, które przeskakują i dziwnie się animują. Najprawdopodobniej to zakłócenia, (wyświetlacz nie ma np. żadnego kondensatora na pokładzie na zasilaniu, wszystko na przewodach) uniemożliwiają mu właściwą pracę. Wyświetlacz podczas pracy pobiera 160-180mA (5V), głównie na podświetlenie.

    dodano później.

    Napotkałem na inny problem: próbiję zrobić generator znaków.
    tablicę z fontami mam jako __memx:

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


    i chciałbym wybiórczo kopiować po 8 bajtów z tej tablicy do tablicy w RAM

    próbowałem funkcją "memcpy_PF, ale odczytywał krzaki

    za to taka funkcja:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    powoduje wewnętrzny błąd kompilacji:

    main.c:72:6: internal compiler error: in convert_memory_address_addr_space, at explow.c:326

    jeśli zamiast "u" wpisze stała wartość, np. 32 (wielokrotność 8), to odczytuje znak dobrze.

    Nie wiem, o co tu chodzi. Tablica specjalnie jest w __memx, gdyż w programie będzie bardzo dużo danych i nie wiem, w jaki obszar Flash zostanie "rzucona".

    dodano po chwili

    Poradziłem sobie inaczej. Zdefiniowałem tą tablicę jako zwykły progmem. Wtedy, jak mniemam kompilator wrzuci ją w przestrzeń poniżej 64kb i będę mógł ją odczytywać przez _pgm_read_word.... Czy dobrze myślę?

    Wreszcie się udało napisać procedurkę wyświetlającą napisy. Na razie bez polskich znaków, ale już coś jest. Ponieważ dochodzi tu tablica fontów, pozwolę sobie przytoczyć całą zawartość pliku "LCD_X_ILI9327.c". Literka X mówi, że biblioteka jest dla Xmega.

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


    Nowa jest tu funkcja "napis", która wyświetla tekst w podanych współrzędnych (lewy dolny róg napisu) i o podanym kolorze.

    Dla początkujących:
    Napis trzeba przygotować w jakiejś tablicy znaków i umieścić nazwę tej tablicy jako trzeci argument funkcji.
    Należy także zaprototypować tą funkcję w pliku "LCD_X_ILI9327.h", by była widoczna dla programu głównego.
  • #16 15319928
    mas24
    Poziom 16  
    Popracowałem nad tą biblioteką, m. innymi dołączyłem funkcję wyświetlającą wartości stałoprzecinkowe. Potrafi wyświetlać 32-bitowe liczby, wiec nie powinno być problemu. Jest to wersja pod AVR Xmega.

    Biblioteka ma jeszcze kilka niedociągnięć, np. funkcje wyświetlające linie mają kolor 8-bitowy, ale funkcja wyświetlająca punkt, a także napisy wyświetlają już kolory 16-bitowe.

    plik nagłówkowy:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i plik "główny"

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