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

[ATMega32][C] LCD 2,8" TFT ILI9235. 8 bitowa transmisja danych poprzez 74HC

psicho 17 Lis 2011 01:11 3908 22
  • #1 10147822
    psicho
    Poziom 11  
    Witam,

    próbuję odpalić wyświetlacz TFT 2,8" TFT (ILI9235) na ATMega32 wykorzystując transmisję 8bitową. Korzystam z gotowych bibliotek ze strony Link. Problem w tym, że sterownik w moim wyświetlaczu wykorzystuje dodatkowo zatrzask 74HC573D (DB17~DB10 podane na wejscia zatrzasku). Niby sprawa banalna ale nie mogę odpalić wyświetlacza. Co robię źle?

    Dodam, że dopiero zaczynam zabawę z wyświetlaczami graficznymi dlatego chciałem po prostu uruchomić gotowca ze strony i na początek pobawić się funkcjami.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 10149351
    psicho
    Poziom 11  
    Dobra, na pewno jeden z problemów leży w zatrzasku ( Datascheet zatrzasku ). Czy ktoś miałby pomysł dlaczego dana zatrzaskuje się jedynie gdy opóźnienie "delay" wynosi minimum około 10s?(!).

    /*
    [...]
    #define LCD_LE_DPRT DDRD
    #define LCD_LE_PRTS PORTD
    #define LCD_LE_PRTC PORTD
    #define LCD_LE_PIN PB2


    #define Setb(port,bitnum) port |= _BV(bitnum)
    #define Clrb(port,bitnum) port &= ~(_BV(bitnum))

    */

    int main(void)
    {
    DDRA = 0xff;
    LCD_LE_DPRT = 0xff;

    Clrb(LCD_LE_PRTC,LCD_LE_PIN); //clear LE

    PORTA = 0b11111111;

    Setb(LCD_LE_PRTS,LCD_LE_PIN); //set LE
    Delay100ms(100); //??????????
    Clrb(LCD_LE_PRTC,LCD_LE_PIN); //clear LE

    PORTA = 0b00000000;

    while(1){}

    return 0;
    }
  • Pomocny post
    #3 10149440
    michalko12
    Specjalista - Mikrokontrolery
    Najpierw to się zdecyduj gdzie masz podpięty LCD_LE_PIN.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Niby PB2, ale w porcie PORTD
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Może i masz na PD2, ale skąd my to możemy wiedzieć?
    No i używaj znaczników [ syntax=c] kod [/syntax]
  • #4 10149472
    psicho
    Poziom 11  
    I kolego rozwiązałeś problem przerzutnika :) Stokrotne dzięki.
  • #5 10151362
    psicho
    Poziom 11  
    Z pierwszym postem chciałem pójść na łatwiznę i brak odpowiedzi mnie nie dziwi. Ale teraz mam nadzieję, że pomożecie w sprawie tego wyświetlacza.

    Sprawa wygląda tak. Rozumiem, że przerzutnik jest po to, aby po zapisaniu połowy danej w zatrzasku (wyjścia zatrzasku wg schematu kierowane są na wejścia DB0~DB7) i drugiej połowy na wyjściach DB10~DB17 całość wysłać jako 16 bitowa dana do wyświetlacza. Takie oszukanie wyświetlacza. Czy dobrze rozumiem?

    Jeśli tak to wg noty katalogowej sterownika dla 16bit transmisji...

    [ATMega32][C] LCD 2,8" TFT ILI9235. 8 bitowa transmisja danych poprzez 74HC

    ...powinienem procedurę wysłania danej wykonać w następujący sposób:

    Wysłanie 16 bitów danych:
    [syntax=c]
    void TSLCDOutDat(unsigned short dat)         //write data to LCD
    {
            LCD_LE_DPRT = 0xff;                        //port obsługi zatrzasku jako wyjście
    	     	 Clrb(LCD_LE_PRTC,LCD_LE_PIN);    // clear LE
            LCD_DB_DPRT = 0xFF;                      // port danych jako wyjście
            LCD_DB_PORT = dat >> 8;                // wystawienie starszej części danej 
                 Setb(LCD_LE_PRTS,LCD_LE_PIN);           //set LE - wczytanie starszej części danej do przerzutnika
    				Delay1us(1);				
    	     	 Clrb(LCD_LE_PRTC,LCD_LE_PIN);//clear LE - "zatrzaśnięcie starszej części danej"	
    	
    	    	 Clrb(LCD_CS_PRTC,LCD_CS_PIN); // clear CS	
    	    	 Setb(LCD_RS_PRTS,LCD_RS_PIN);  // set RS 
    	    	 Setb(LCD_RD_PRTS,LCD_RD_PIN); // set RD
    	    	 Clrb(LCD_WR_PRTC,LCD_WR_PIN); // clear WR	
     
           LCD_DB_PORT = dat;  // wystawienie młodszej części danej
      
                 Setb(LCD_WR_PRTS,LCD_WR_PIN); // set WR
    	     	 Setb(LCD_CS_PRTS,LCD_CS_PIN); // set CS
    }
     [/syntax]


    Wysłanie instrukcji

    [syntax=c]
    void TSLCDOutIns(unsigned short ins) //write instruction to LCD
    {
            LCD_LE_DPRT = 0xff;                        //port obsługi zatrzasku jako wyjście
    	        Clrb(LCD_LE_PRTC,LCD_LE_PIN);    // clear LE
            LCD_DB_DPRT = 0xFF;                      // port danych jako wyjście
    		LCD_DB_PORT = ins >> 8;                 // wystawienie starszej części 
    	        Setb(LCD_LE_PRTS,LCD_LE_PIN);   //set LE - wczytanie starszej części do przerzutnika
    				Delay1us(1);				
    	        Clrb(LCD_LE_PRTC,LCD_LE_PIN);    //clear LE - "zatrzaśnięcie" starszej części 	
    
    	        Clrb(LCD_CS_PRTC,LCD_CS_PIN); // clear CS
    			Clrb(LCD_RS_PRTC,LCD_RS_PIN); // clear RS
     
    	        Setb(LCD_RD_PRTS,LCD_RD_PIN);//set RD
    	        Clrb(LCD_WR_PRTC,LCD_WR_PIN);//clear WR
     
    	    LCD_DB_PORT = ins;                  //wystawienie młodszej części 
    
                Setb(LCD_WR_PRTS,LCD_WR_PIN);//set WR
    	        Setb(LCD_CS_PRTS,LCD_CS_PIN);//set CS
     
    [/syntax]

    Jednak taka realizacja tych funkcji nie działa. Wyświetlacz ani drgnie a powinien wyświetlić grafikę testową wg kodu z pliku Plik w pokrewnym temacie

    I jeszcze schemat pcb na którym zamontowany jest wyświetlacz. Dodam, że zwarłem R7 aby uaktywnić przerzutnik.

    [ATMega32][C] LCD 2,8" TFT ILI9235. 8 bitowa transmisja danych poprzez 74HC
  • #6 10151392
    michalko12
    Specjalista - Mikrokontrolery
    Z tego wykresu czasowego jasno wynika, że dane na szynie masz wystawić przed niskim stanem na WR, a ty młodszą połówkę wystawiasz po niskim stanie WR. Kolejna sprawa to po co za każdym razem konfigurujesz port jako wyjściowy? Strata czasu, który jest potrzebny przy wyświetlaczach graficznych.

    Jak używasz znaczników [ syntax...] to nie uzywaj [ code].
    [ syntax=c]
    c++;
    [/syntax]


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #7 10151409
    psicho
    Poziom 11  
    Niestety nie pomogło. Wyświetlacz nadal milczy. Konfigurację portów też już zmieniłem.
  • #8 10160370
    Nagus
    Poziom 27  
    Dlaczego w połowie wysyłania polecenia podnosisz CS blokując wyświetlacz?
    Polecenie składa się z dwóch części: indeksu (numeru rejestru) i parametru, obie to liczby 16-bitowe. Na przytoczonym wykresie nie widać by dopuszczone było podnoszenie CS w połowie tej operacji.

    Na wykresie masz wyraźnie okazane, że dane muszą być wystawione na szynie przed wprowadzeniem WR w stan niski. Pełne 16 bitów a nie połowa jak u ciebie.

    Sprawdź czy R4 i R6 na pewno ustawiają ci LCD w tryb 16-bitowy.
  • #9 10160892
    psicho
    Poziom 11  
    Witaj,

    dzięki za odpowiedź. CS było jak było gdyż wzorowałem się na załączonych bibliotekach choć nie ukrywam, że się nad tym zastanawiałem i i próbowałem pozostawić CS w stanie niskim po wysłaniu indexu ale wiele nie pomogło. Nie do końca rozumiejąc dlaczego w gotowych bibliotekach CS był podnoszony stwierdziłem, że tak musi być i pozostawiłem jak było. Wystawianie danych na szynę również poprawiłem ale nie pomogło. Powiedz gdzie jest informacja na temat tego, że rezystorami R4 i R6 steruję rejestrami IM3:0? Na schemacie pcb który zamieściłem napisane jest, że R4 = 10k a R6 = 0 jednakże na fizycznym pcb zarówno w polach R4 jak i R6 jest przerwa.

    Czy podanie sygnałów 5v na piny danych i piny sterujące mogło uszkodzić wyświetlacz czy jest jakieś zabezpieczenie w tego typu układach?
  • #10 10161238
    Nagus
    Poziom 27  
    Te biblioteki są cokolwiek dziwne. Po internecie krąży kilka przykładów obsługi wyświetlaczy na ILI9325, chociażby do modułu ITDB02 ITead Studio (dostępnego i u nas) czy Tech-toys'a.
    Ustawianie trybu (8/16bit) opisane jest w karcie katalogowej kontrolera ILI9325. Jednak nie każdy wyświetlacz ma odpowiednie piny wyprowadzone na złącze. Tu nota katalogowa wyświetlacza może pomóc. Jak mniemam moduł był domyślnie skonfigurowany na 8-bit, więc może lepiej od tego zacząć?
  • #11 10161358
    psicho
    Poziom 11  
    Sprzedawca zapewnił mnie, że docelowo wyświetlacz ustawiony jest na 16bit, lecz poprzez zwarcie rezystora R7 tryb zostaje zmieniony na 8bit. Nie mam już pomysłu na to co może być źle. Próbowałem wysłać dane jako pełne 16bit z dwóch portów mikrokontrolera, jako dwie połówki 8 bit łączone poprzez przerzutnik w 16 bit i wysyłane jako całość, oraz jako dwie połówki po 8 bit nie uwzględniające przerzutnika. Niestety żaden ze sposobów nie ożywił wyświetlacza. Kupiłem wyświeltacz na ILIxxxx bo zależało mi na szybkim odpaleniu gdyż termin ukończenia projektu goni a tu problem na starcie. Nie chcę myśleć co będzie później :)
  • #12 10161884
    Nagus
    Poziom 27  
    Cytat:
    Sprzedawca zapewnił mnie, że docelowo wyświetlacz ustawiony jest na 16bit, lecz poprzez zwarcie rezystora R7 tryb zostaje zmieniony na 8bit.

    Ale przecież jest dokładnie odwrotnie... Zwarcie R7 uaktywnia wyjścia zatrzasku (dolny bajt) czyli włącza 16-bit.
    Sprawdź na stronie producenta modułu jak jest z przełączeniem 8/16bit w wyświetlaczu. Nie w każdym wyświetlaczu jest to wyprowadzone na zewnątrz. Brak obu rezystorów R4/R6 sugeruje, że wyświetlacz jest fabrycznie zafiksowany na 8-bit (przelutowanie elementów znajdujących się na taśmie połączeniowej wyświetlacza jest raczej kiepskim pomysłem).
  • #13 10162428
    psicho
    Poziom 11  
    Hmm teraz to już zgłupiałem. Niestety wyprowadzeń IM nie ma. Ale znalazłem notę tego samego wyświetlacza na podobnym pcb i wg tego co tam jest napisane wynika, że zwarcie R7 pozwala sterować poprzez 8bit. Oto link LCD. Natomiast bardzo zastanowiło mnie to, że piszesz iż brak R4 i R6 sugeruje, że wyświetlacz jest ustawiony na 8 bit. I to, że na schemacie jest R4 = 10k i R6 zwarte a fizycznie na obu jest przerwa.
  • #14 10162998
    Nagus
    Poziom 27  
    A zobacz do czego masz wpięty zatrzask w module Tech-toys'a a do czego w twoim.
    W trybie 8-bitowym dane zapisywane są przez DB8:15.
    Jeżeli na module nie ma żadnego z rezystorów wybierających rodzaj interfejsu można przyjąć, że albo jest wybrany na stałe, albo rozpoznaje automatycznie (np. podając komendę na górny oktet).
  • #15 10163766
    psicho
    Poziom 11  
    No zatrzask podpięty jest pod linie DB10~DB17. Wyjście zatrzasku podpięte jest pod linie DB0~DB7. Pin LE sterujący zatrzaskiem został wyprowadzony na zewnątrz. O to chodziło? Jeśli interfejs jest wybrany na stałe to wynikałoby właśnie, że jest to interfejs 16 bitowy a rezystorem R7 ustalam jedynie czy chcę wysyłać 16 bitów z fizycznie 16 pinów mikrokontrolera czy 16 bitów wykorzystując 8 pinów mikrokontrolera oraz zatrzask.
  • #16 10164055
    Nagus
    Poziom 27  
    Auć, faktycznie ten LCD jest fabrycznie zafiksowany na 16-bitów.
    Jeżeli jesteś pewien, że kolejne oktety danych pojawiają się na właściwych szynach (jak teraz wygląda kod?) i piny sterujące majtają się we właściwej kolejności (wykres) to sprawdź jeszcze sekwencję resetu i inicjalizacji. Użyj innego przykładu niż z linku podanego na początku... tamten kod jest dziwny.
  • #17 10189121
    psicho
    Poziom 11  
    Przepraszam za późną odpowiedź ale przez ostatnie dni musiałem zająć się innymi sprawami.

    A więc tak. Wyświetlacz jest sprawny w 100% (wysłanie 16 bit sprawdzony na ARM z przykładowego kodu) także podanie 5v nie spowodowało uszkodzenia LCD. Od tego trzeba zacząć gdyż już zaczynałem wątpić w to czy pomimo napisania dobrego kodu wyświetlacz zadziała.

    Na schematach podobnych wyświetlaczy PIN_11 zarezerwowany jest dla bitu IM0 sterującego wyborem trybu 8/16bit. Na schemacie mojego wyświetlacza (kilka postów wyżej) widać, że PIN_11 jest oznaczony jako NC. Jednakże tak jak w schematach podobnych pcb do PIN_11 mimo, że oznaczonego jako NC doprowadzono masę lub + do wyboru rezystorami R4, R6. Na fizycznym pcb w miejscach R4 i R6 jest przerwa co by potwierdzało, że PIN_11 jest nieużywany jednakże po co w takim razie te rezystory? Ustawiono na sztywno 16 bit? Na to wynika. Bez sensu moim zdaniem no ale cóż.

    Skoro doszliśmy do tego, że 16 bit jest ustawiony na sztywno i muszę wysyłać dane wg wykresu czasowego dla 16 bit i WR ustawiać w stan niski przed podaniem danych na magistralę to dlaczego w kolejnej bibliotece (w załączniku) WR ustawiany jest w stan niski przed wystawieniem danej na szynie? CS również jest podnoszony po wysłaniu indexu... Co prawda jest to sterowanie 8bit ale z czasówki 8bit wynika to samo co czasówki 16bit.

    [ATMega32][C] LCD 2,8" TFT ILI9235. 8 bitowa transmisja danych poprzez 74HC

    A kod wygląda tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #18 10189372
    michalko12
    Specjalista - Mikrokontrolery
    Spojrzałem teraz na DS ILI9325 i czegoś nie rozumiem. Chodzi o podłączenie 74HC573.
    Według DS w 16bitowym trybie, 8 bitów LSB podłączonych jest do [DB1..DB8] LCD, a na tym schemacie do [DB0..DB7]. Na czym sprawdzałeś ten wyświetlacz, czy aby na pewno jest to ILI9235?
  • #19 10189986
    psicho
    Poziom 11  
    Odesłałem do sprzedawcy aby sprawdził czy nie popaliłem tym 5v i czy być może w tym leży problem i jeśli tak to, żeby wysłał nowy LCD. Ale sprzedawca powiedział, że z LCD wszystko ok i zapewnił, że jest tam sterownik ILI9325.

    Dodano po 24 [minuty]:

    Znalazłem schemat podobnego pcb z TechToys'a (Schemat) ze strony (Strona). Przerobię bibliotekę PIC na ATmegę i jak tylko dostanę LCD do domu to sprawdzę czy pomoże. Jak widać PIN_11 zwarty do masy czyli potwierdza to 16bitowy tryb na sztywno. Jak tylko sprawdzę to dam znać co z tego wyszło.
  • Pomocny post
    #20 10196043
    Nagus
    Poziom 27  
    Po pierwsze: przestań podnosić CS w połowie operacji, tj. między wysłaniem indeksu a wysłaniem zawartości rejestru.
    A jesteś pewien, że wysyłasz oktety we właściwej kolejności? Skoro na zatrzasku wisi młodsza połówka szyny to czemu zatrzaskujesz w nim starszy oktet?
  • #21 10198330
    psicho
    Poziom 11  
    Nagus napisał:
    A jesteś pewien, że wysyłasz oktety we właściwej kolejności? Skoro na zatrzasku wisi młodsza połówka szyny to czemu zatrzaskujesz w nim starszy oktet?


    Racja! Dopiero teraz zauważyłem, że na schemacie TechToys'a zatrzask podłączony jest całkowicie odwrotnie niż u mnie. Po inicjalizacji wyświetlacz lekko przygasł i widać wyraźne pixele. To znaczy, że inicjalizacja przebiegła prawidłowo? Na razie żadne funkcje nie działają, tzn po ich użyciu wyświetlacz ponownie staje się jasny jak przy suchym zasileniu (muszę na spokojnie to wszystko przeanalizować).

    Dodano po 28 [minuty]:

    Działa! :) Wyświetlacz pali się na zadane kolorki! Kolego Nagus stokrotne dzięki :)

    Dodano po 4 [godziny] 5 [minuty]:

    Nie wiem czy wypada znów pytać ale jeszcze jednym się nie nacieszyłem a już mam kolejny problem. Otóż nie mogę wyświetlić tekstu ani grafiki. Gdy wysyłam tekst na wyświetlacz to zarówno tło tekstu jak i kolor czcionki się zgadza, jednakże zamiast znaków są krzaki. Jeśli chodzi o wyświetlanie obrazków to problem polega na tym, że na ekran ładuje się sieczka. Litery tekstu odczytuję z tablicy zapisanej w pamięci programu. Tablicę zadeklarowaną mam następująco: const prog_char english[][16]={{...}}. Problem dotyczy funkcji w których wykorzystuję pamięć programu, choć być może to tylko przypadek.

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



    I jeszcze funkcja zapisu:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #22 10200207
    Nagus
    Poziom 27  
    A jak sieczka to typowy myk: masz ustawiony kierunek rysowania nie w tą stronę co chciałeś. Karta katalogowa ILI9325 - rejestr Entry Mode 03h (str 55/56) - dobierz odpowiednią wartość.
  • #23 10200604
    psicho
    Poziom 11  
    Problem rozwiązany :) dzięki!
REKLAMA