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

Jak poprawnie wysłać komendy do LCD TFT 3.2 ILI9341 z AtMega328 w Bascom?

ceceros 13 Maj 2014 19:47 5862 14
  • #1 13598131
    ceceros
    Poziom 10  
    Cześć

    Zakupiłem ostatnio wyświetlacz LCD taki jak tutaj
    Moderowany przez ANUBIS:

    3.1.18. Zabronione jest publikowanie informacji do źródeł, które po pewnym czasie wygasają (publikowanie odnośników do stron o charakterze krótkotrwałym).

    4218813488. Chciałem go połączyć z moją Atmegą, ale nie mogę przejść samego początku i chociaż wyświetlić 1 piksel.

    Programuję w bascomie i przeczytałem całą dokumentację nawet kilku producentów wyświetlaczy używających tego modułu ILI9341. Do końca nie było jasno wyjaśnione jak wysyłać komendy, ale jakoś to ogarnąłem po swojemy. Stworzyłem kod bazując na inicjalizacjach innych osób. Stworzyłem coś takiego jednak nie działa, a może działa, ale ja nie widzę efektu. Mógłby ktoś powiedzieć gdzie jest błąd albo podrzucić jakiś działający kod na ktorym można się wzrowować?

    Chciałbym żebyście się skupili na writecomand i writedata czy na sto procent jest poprawnie wykonany.

    $regfile = "m328pdef.dat"
    $crystal = 8000000
    $hwstack = 40
    $swstack = 16
    $framesize = 32
    
    Config Portd = &B1111111
    Config Portc = &B1111111
    
    Db Alias Portd
    Wr Alias Portc.5
    Rs Alias Portc.4
    Rd Alias Portc.3
    Cs Alias Portc.2
    Rst Alias Portc.1
    
    Declare Sub Writedata(byval Comand As String)
    Declare Sub Writecomand(byval Comand As String)
    
    Cs = 0
    
    Rst = 1
    Waitms 5
    Rst = 0
    Waitms 15
    Rst = 1
    Waitms 15
    
    
    
    Call Writecomand( "1")
    Waitms 15
    
    Call Writecomand( "c0")
    Call Writedata( "26")
    
    Call Writecomand( "c1")
    Call Writedata( "11")
    
    Call Writecomand( "c5")
    Call Writedata( "35")
    Call Writedata( "3e")
    
    Call Writecomand( "c7")
    Call Writedata( "be")
    
    
    Call Writecomand( "36")
    Call Writedata( "48")
    
    Call Writecomand( "3a")
    Call Writedata( "55")
    
    Call Writecomand( "b1")
    Call Writedata( "00")
    Call Writedata( "1a")
    
    Call Writecomand( "f2")
    Call Writedata( "8")
    
    Call Writecomand( "26")
    Call Writedata( "1")
    
    Call Writecomand( "E0")
    Call Writedata( "1f")
    Call Writedata( "1a")
    Call Writedata( "18")
    Call Writedata( "a")
    Call Writedata( "f")
    Call Writedata( "6")
    Call Writedata( "45")
    Call Writedata( "87")
    Call Writedata( "32")
    Call Writedata( "a")
    Call Writedata( "7")
    Call Writedata( "2")
    Call Writedata( "7")
    Call Writedata( "5")
    Call Writedata( "0")
    
    Call Writecomand( "E1")
    Call Writedata( "0")
    Call Writedata( "25")
    Call Writedata( "27")
    Call Writedata( "5")
    Call Writedata( "10")
    Call Writedata( "9")
    Call Writedata( "3a")
    Call Writedata( "78")
    Call Writedata( "4d")
    Call Writedata( "5")
    Call Writedata( "18")
    Call Writedata( "d")
    Call Writedata( "38")
    Call Writedata( "3a")
    Call Writedata( "1f")
    
    Call Writecomand( "2a")
    Call Writedata( "0")
    Call Writedata( "0")
    Call Writedata( "0")
    Call Writedata( "EF")
    
    Call Writecomand( "2b")
    Call Writedata( "0")
    Call Writedata( "0")
    Call Writedata( "1")
    Call Writedata( "3F")
    
    Call Writecomand( "34")
    
    Call Writecomand( "b7")
    Call Writedata( "7")
    
    Call Writecomand( "b6")
    Call Writedata( "a")
    Call Writedata( "82")
    Call Writedata( "27")
    Call Writedata( "00")
    
    Call Writecomand( "11")
    
    Waitms 60
    
    
    Call Writecomand( "29")
    
    Waitms 100
    
    Call Writecomand( "2c")
    
    Call Writecomand( "5D")
    
    
    
    
    End
    
    
    Sub Writedata(comand As String)
    Rd = 1
    Rs = 1
    Wr = 0
    Db = Hexval(comand)
    Waitus 100
    Wr = 1
    Waitus 100
    End Sub
    
    
    
    Sub Writecomand(comand As String)
    Rd = 1
    Rs = 0
    Wr = 0
    Db = Hexval(comand)
    Waitus 100
    Wr = 1
    Waitus 100
    End Sub
    



    Dzięki!
  • #2 13598285
    mi14chal
    Poziom 28  
    Nie znam Bascoma, nie pokazałeś połączenia, ale mnie ciekawi jedno jak ty wysyłasz 16 bitowe dane do wyświetlacza używając portu 8 bitowego.
  • #3 13598322
    M. S.
    Poziom 34  
    Czy aby na pewno wysyłał liczby 16 bitowe?

    Mnie nurtuje inne pytanie. Po co używać tekstu jako argument funkcji Writecomand i Writedata skoro można im podawać zmienne liczbowe hex np. &HFF zamiast "FF"? Ilość "uderzeń" w klawiaturę ta sama, a procesor będzie miał mniej roboty.
  • #4 13598353
    ceceros
    Poziom 10  
    Cytat:
    Nie znam Bascoma, nie pokazałeś połączenia, ale mnie ciekawi jedno jak ty wysyłasz 16 bitowe dane do wyświetlacza używając portu 8 bitowego.


    Czyli rozumiem, że muszę wysyłać dane na wszystkie 16 portów? Żadna liczba nie wychodzi poza zakres 8 bitów, więc nie widzę ustawiania tamtych portów.

    Cytat:
    Mnie nurtuje inne pytanie. Po co używać tekstu jako argument funkcji Writecomand i Writedata skoro można im podawać zmienne liczbowe hex np. &HFF zamiast "FF"? Ilość "uderzeń" w klawiaturę ta sama, a procesor będzie miał mniej roboty.


    Osobiście specjalizuje się w językach C++, PHP, Java.. i nie jestem wymiataczem w składni Basic'a więc starałem się rozwiązać problemy które mnie nurtowały w najprostszy dla mnie sposób. Nie musi być najszybsze ważne żeby działało potem przyjdzie pora na optymalizację :)
  • #5 13598456
    mi14chal
    Poziom 28  
    ceceros napisał:
    zyli rozumiem, że muszę wysyłać dane na wszystkie 16 portów? Żadna liczba nie wychodzi poza zakres 8 bitów, więc nie widzę ustawiania tamtych portów.


    Na dwa porty jak coś i dopóki nie użyjesz dwóch portów to wyświetlacz ci nie zadziała. Na jednym będziesz wystawiać górną część 16 bitową na drugim dolną.
  • #6 13598824
    M. S.
    Poziom 34  
    Wyświetlacz ma też interface 8 bitowy.

    Tu jest PDF i przykład

    http: //www.google.pl/url?sa=t&rct=j&q=&esrc=s&source=web&cd=7&ved=0CEwQFjAG&url=http%3A%2F%2Fwww.lispol.com%2Ffileget.php%3Ffile%3DdXBsb2FkZWQvcHJvZHVjdHNfZmlsZXMvMTM2NDQ5MTQ2Nl82NzA4NDIwMC5wZGY%3D%26name%3DILI9341&ei=3n1yU86ELqm7yAOP7YDYCg&usg=AFQjCNEEIyDrjyIbFLHqpiMZfzRDrG_WOg&bvm=bv.66330100,d.bGQ

    Wykasuj spację po dwukropku.
  • #7 13599491
    ceceros
    Poziom 10  
    Dzięki za ten link bo tego jeszcze nie znalazłem, ale problem tkwi w tym, że nie wiem czy funkcja writecomand działa u mnie poprawnie bo nigdzie nie mogę znaleźć źródła lcdWriteCommand() w tym PDFie i w większości nigdzie niema tego opisanego.

    Na dwa porty jak coś i dopóki nie użyjesz dwóch portów to wyświetlacz ci nie zadziała. Na jednym będziesz wystawiać górną część 16 bitową na drugim dolną.


    Dlaczego mam wysyłać na górną cześć bitów jakieś dane jak zawsze to będzie 0?

    Jeszcze gdzieś czytałem i mam pytanie czy podpiąłem to poprawnie ponieważ ja wszystkie porty D podpiąłem w sposób DB0 = PORTD.0 czy jest to poprawnie czy powinienem zacząć jednak od tyłu? DB15=PORTD.0
  • #8 13599753
    el2010tmp
    Poziom 25  
    ceceros napisał:
    Osobiście specjalizuje się w językach C++, PHP, Java.. i nie jestem wymiataczem w składni Basic'a

    To dlaczego nie używasz C/C++ ?

    ceceros napisał:
    Dlaczego mam wysyłać na górną cześć bitów jakieś dane jak zawsze to będzie 0?

    Nie zawsze będzie zero. Chyba że używasz magistrali 8-bit, ILI9341 ma taką możliwość. http://www.newhavendisplay.com/app_notes/ILI9341.pdf rozdział 7.1.1

    ceceros napisał:
    Jeszcze gdzieś czytałem i mam pytanie czy podpiąłem to poprawnie ponieważ ja wszystkie porty D podpiąłem w sposób DB0 = PORTD.0

    Tak jest poprawnie, oczywiście DB15-PORTx.7, DB14-PORTx.6 itd. (chyba że chcesz odwracać lub przesuwać :))
  • #9 13600167
    ceceros
    Poziom 10  
    Cytat:
    To dlaczego nie używasz C/C++ ?


    Błąd przy instalacji Eclipse uniemożliwia mi połączenie, a ten program jest moim ulubionym + na zajęciach na studiach zawsze używaliśmy BASCOMA.

    Cytat:
    Nie zawsze będzie zero. Chyba że używasz magistrali 8-bit, ILI9341 ma taką możliwość. http://www.newhavendisplay.com/app_notes/ILI9341.pdf rozdział 7.1.1


    Wiem. Tylko mój układ nie posiada wejść IM0,..IMX i nie mogę skonfigurować tego poprawnie. Dodatkowo nie wiem na jakim przesyle działa ten układ defaultowa ponieważ żadnych informacji nie mogę odnaleźć

    Jak poprawnie wysłać komendy do LCD TFT 3.2 ILI9341 z AtMega328 w Bascom?

    Tak wyglądają PINY w tym urządzeniu.
  • #10 13600349
    tplewa
    Poziom 39  
    ceceros napisał:

    Błąd przy instalacji Eclipse uniemożliwia mi połączenie, a ten program jest moim ulubionym + na zajęciach na studiach zawsze używaliśmy BASCOMA.


    Eclipse nie jest konieczne by pisac w C/C++ mozesz zintegrowac sobie z dowolnym IDE np. uzywac AVR Studio gdzie jeszcze masz symulator...

    A co do zajec i mowieniu o studiach - to ja bym sie tym nie kierowal... bo nauczanie bascoma na studiach raczej swiadczy o kiepskim poziomie studiow...

    Lepiej generalnie pisac w C nie dosc ze darmowe to jeszcze szybszy kod...

    Ten wyswietlacz wymaga dosc szybkiego kontrolera, nawet na ARM-ach on nie za szybko dziala... na AVR + Bascom to bedziesz mial Slideshow :)
  • #11 13601344
    ceceros
    Poziom 10  
    Dzięki za rady, ale żadna nic nie wniosła do tematu. Dalej nie wiem czy dobrze robię inicjalizację i czy moja funkcja działa poprawnie.
  • #12 13602852
    tplewa
    Poziom 39  
    ceceros napisał:
    Dzięki za rady, ale żadna nic nie wniosła do tematu. Dalej nie wiem czy dobrze robię inicjalizację i czy moja funkcja działa poprawnie.


    Zerknij na biblioteki do Arduino (z tego co wiem sa), osobiscie nie bawilem sie w sterowanie 8bit... do tego jak patrze na Bascoma to drgawek dostaje i nie chce mi sie tego analizowac czy to dziala poprawnie... dlatego rada o pisaniu w C gdzie znajdziesz pomoc wiekszej ilosci osob. Natomiast w Bascomie za zwyczaj pisza poczatkujacy (choc znam kilka zaawansowanych projektow tez) i trudniej uzyskac od poczatkujacych jakas pomoc...
  • #13 13604053
    ceceros
    Poziom 10  
    Sprawdzałem już te biblioteki i nic ciekawego nie znalazłem. Wszystko jest bardzo podobnie..
  • #14 13605757
    ceceros
    Poziom 10  
    Przepisałem ten program do języka C. Sprawdzcie i doradzcie co i jak żeby to zadziałało :)

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #15 13615652
    tplewa
    Poziom 39  
    No troche lepiej to wyglada ;)

    Warto jeszcze dac commenty co dana funkcja robi i tutaj pytanie gdzie dorwales ta konfiguracje. Prawde mowiac nie wiem czy to jest istotne - ale sekwencja jest dziwna. ot:

    writecmd(0xcf); //Power Control B

    writecmd(0xed); //Power on sequence control

    writecmd(0xe8); //Driver timing control A

    no wlasnie a gdzie Power Control A... gdzies dalej. Natomiast na poczatku masz reset (0x01) i nie wiem czy mozna ustawic timing control A jesli nie jest wlaczony Power Control A.

    To sa takie moje domysly bo osobiscie kiedys robilem to tak na zdrowy rozsadek i dzialalo (choc nie wiem czy nie ma tego w DS - teraz nie mam czasu go czytac w calosci by to zweryfikowac).

    Niestety nie moge teraz znalezc mojego kodu by to dokladnie zweryfikowac - mam tylko dla SSD1289. Ale z znalezieniem poprawnej sekwencji nie powinno byc problemow bo troche kodow dla tego ILI jest w necie.

    Sprawdz sekwencje najpierw ustawiasz power Control A i B czyli 0xcb i 0xcf.
    Potem timingi dla A i B dopiero po tym:

    Power on sequence control
    Pump ratio control
    Power Control 1
    Power Control 2

    itd.

    Zerknij w dokumentacje najlepiej :) i to opisz bo z takim kodem trudno sie analizuje gdzie jest problem jak na pale sie wysyla jakies dane. Przynajmniej commenty co by to mozna bylo jakos normalnie analizowac.

    Do tego jeszcze jedna sprawa:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    przenies ten delay wyzej co by po wyslaniu na portD danych nie bylo odrazu ustawiane WR na HI czyli:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    to samo z writecommand... a najlepiej to znowu zerknij do DS i sprawdz timingi jakie maja byc pomiedzy ustawianiem stanow na RD, RS, WR, CS itd. bo to widze tez jakos tak zrobione chyba na czuja ;)
REKLAMA