Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

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

mas24 25 Aug 2015 10:00 2073 15
  • #1
    mas24
    Level 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?
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
  • #2
    BlueDraco
    MCUs specialist
    A jakie to fiasko poniosłeś przepisując kod z C++ na C i na czym polega problem?
  • #3
    mas24
    Level 16  
    Że nie znam się na C++. W C nadal w sumie jestem początkującym, np. taki kod:

    Code: c
    Log in, to see the code


    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
    piotrva
    VIP Meritorious for electroda.pl
    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
    mas24
    Level 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
    dondu
    Moderator on vacation ...
    mas24 wrote:
    ... 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
    mas24
    Level 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:

    Code: c
    Log in, to see the code


    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
    piotrva
    VIP Meritorious for electroda.pl
    Pewnie pisze, że "implict declaration" albo coś w tym stylu - brakuje CI nagłówka math.h o ile dobrze pamiętam.
  • #9
    mas24
    Level 16  
    Szkoda dołączać całej biblioteki matematycznej. Dla sprawdzenia przykładu lepiej narysować kilka prostokątów "na sztywno".
  • #10
    mas24
    Level 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.

    Code: c
    Log in, to see the code


    W oryginalnym kodzie brakuje funkcji Point, rysującej punkt o podanych współrzędnych. Funkcja przydatna przy rysowaniu wykresów. Oto ona;
    Code: c
    Log in, to see the code
  • #11
    piotrva
    VIP Meritorious for electroda.pl
    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
    mas24
    Level 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:
    Code: c
    Log in, to see the code


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

    Code: c
    Log in, to see the code


    przykład użycia w programie:

    Code: c
    Log in, to see the code
  • #13
    mas24
    Level 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
    tmf
    Moderator of Microcontroller designs
    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
    mas24
    Level 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:

    Code: c
    Log in, to see the code



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

    Code: c
    Log in, to see the code


    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:

    Code: c
    Log in, to see the code


    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:
    Code: c
    Log in, to see the code

    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.

    Code: c
    Log in, to see the code


    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
    mas24
    Level 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:
    Code: c
    Log in, to see the code


    i plik "główny"

    Code: c
    Log in, to see the code