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

Xmega64A3 podłączenie LCD S95160 ze sterwonikiem SSD1289Z

Igor22 29 Lis 2010 21:57 1792 2
REKLAMA
  • #1 8806463
    Igor22
    Poziom 11  
    Witam znawców tematu!

    podjąłem się jak dla mnie poważnego wyzwania uruchomienia wyświetlacza LCD
    S95160 na sterowniku SSD1289Z w połączeniu z Xmegą64A3. Niestety utknąłem i dlatego piszę ten post...

    jest to dla mnie początek z wyświetlaczami LCD więc nie jestem w tym temacie zbyt obeznany, mam za sobą parę dni czytania datasheeta tego sterownika ale nie rozumiem jeszcze wszystkiego.

    Utknąłem na inicjalizacji. Mimo że wszystko podłączyłem Wg opisu LCD:

    1、GND
    2、VCC : +3 V DC power supply (Note that voltage can not be more than 3.3V)
    3、CS : chip selection, effective when low
    4、RS : register selectio n, data register when high, command register when low
    5、WR : write
    6、RD : Reading
    7、RST : reset
    8-15、DB15-DB8 : data line
    21、DCLK : 7843 clock
    22、DCS : 7843 chip selection, effective when low
    23、DIN : 7843 data input
    24、BUSY : 7843 busy signal output
    25、DOUT : 7843 data output
    26、PENIRQ : 7843 Interrupt output
    27、DB7-DB0 : Data Cable
    28-35、 8-bit parallel port is DB15-DB8, 16-bit parallel port is DB15-DB0. Default setting is 8-bit parallel port. If you need 16-bit parallel port, please tell us.

    Jest to opisy ze strony sprzedawcy, proszę zwrócić uwagę że na końcu jest napisane że default'owo jest LCD ustawiony na 8-bit i chodzi tu o piny DB15DB8. Niestety nie zgadza się to z datasheetem sterownika SSD1289 gdzie do transmisji 8 bitowej są przypisane piny DB1-DB8. Próbowałem jednak podłączyć to w taki i taki sposób bez pozytywnych skutków. Efekt jaki mam to cały czas biały wyświetlacz...


    Na elektrodzie czy to w polskim internecie nie znalazłem nic na temat sterownika SSD1289Z, czy komuś udało się go obsłużyć???? Czy ktoś jest z nim zapoznany?

    Jeszcze jedno pytanie do znawców wyświetlaczy, czy inicjalizacja w ogóle wystarczy by zobaczyć jakąś różnicę na LCD, np czarne tło a nie białe? bo może to działa a potrzeba jeszcze dodać jakąś komendę?

    oto mój kod C, Kod jest złożony z kawałka kodu z internetu do sterowania takim LCD z naniesionymi moimi zmianami:


    Oto mój kod:
    
    #include <avr/io.h>
    #include <util/delay.h>
    
    #define DATAOUT_PORT    PORTB.OUT
    #define DATAOUT_PIN		PINB
    #define DATAOUT_DDR		DDRB
    
    #define CTRLOUT_PORT	PORTD.OUT
    #define CTRLOUT_PIN		PIND
    #define CTRLOUT_DDR		DDRD
    #define CTRLOUT_E	    5
    #define CTRLOUT_RW		3
    #define CTRLOUT_DC		4
    #define CTRLOUT_RESET   6
    
    
    
    /*
    *********************************************************************************************************
    *                         				LOW LEVEL COMMAND WRITE TO LCD
    *
    * Description : This function performs low level command write to LCD
    * Arguments   : (uint8_t) 'cmd' 	is the command written to the LCD module
    * Returns     : none
    * Notes		  : Hardware specific.
    *********************************************************************************************************
    */
    static inline void cDispWrCmd(uint8_t cmd)
    {
        DATAOUT_PORT = cmd;
        CTRLOUT_PORT &= ~( _BV(CTRLOUT_RW) | _BV(CTRLOUT_DC));
        CTRLOUT_PORT |= _BV(CTRLOUT_E);
        CTRLOUT_PORT &= ~_BV(CTRLOUT_E);
    }
    /*
    *********************************************************************************************************
    *                         				LOW LEVEL DATA WRITE TO LCD
    *
    * Description : This function performs low level display data write to LCD
    * Arguments   : (uint8_t) 'dat' 	is the data written to the LCD module
    * Returns     : none
    * Notes		  : Hardware specific.
    *********************************************************************************************************
    */
    static inline void cDispWrDat(uint8_t dat)
    {
        DATAOUT_PORT = dat;
        CTRLOUT_PORT &= ~_BV(CTRLOUT_RW);
        CTRLOUT_PORT |= _BV(CTRLOUT_DC);
        CTRLOUT_PORT |= _BV(CTRLOUT_E);
        CTRLOUT_PORT &= ~_BV(CTRLOUT_E);
    }
    
    static inline void SetWriteDataMode( void )
    {
        CTRLOUT_PORT &= ~_BV(CTRLOUT_RW);
        CTRLOUT_PORT |= _BV(CTRLOUT_DC);
    }
    
    static inline void WriteData( uint8_t data )
    {
        DATAOUT_PORT = data; 
        CTRLOUT_PORT |= _BV(CTRLOUT_E);
        CTRLOUT_PORT &= ~_BV(CTRLOUT_E);
    }
    
    static void LCD_Init(void)
    {
        cDispWrCmd(0x07);
        cDispWrDat(0x00);
        cDispWrDat(0x33);
    
    
        cDispWrCmd(0x28);
        cDispWrDat(0x00);
        cDispWrDat(0x06);
    
        cDispWrCmd(0x2F);
        cDispWrDat(0x12);
        cDispWrDat(0xAE);
    
        cDispWrCmd(0x00);	//Start Oscillation
        cDispWrDat(0x00);
        cDispWrDat(0x01);
    
        cDispWrCmd(0x03);	//Power Control (1)
        cDispWrDat(0xAA);
        cDispWrDat(0xAC);
    
        cDispWrCmd(0x0C);	//Power Control (2)
        cDispWrDat(0x00);
        cDispWrDat(0x02);
    
        cDispWrCmd(0x0D);	//Power Control (3)
        cDispWrDat(0x00);
        cDispWrDat(0x0A);
    
        cDispWrCmd(0x0E);	//Power Control (4)
        cDispWrDat(0x2C);
        cDispWrDat(0x00);
    
        cDispWrCmd(0x1E);	//Power Control (5)
        cDispWrDat(0x00);
        cDispWrDat(0xAA);
    
        cDispWrCmd(0x25);	//Frame Freq
        cDispWrDat(0x80);
        cDispWrDat(0x00);
        _delay_ms(15);
    
        cDispWrCmd(0x01);	//Driver Output Control	(233f) 
        cDispWrDat(0x29);
        cDispWrDat(0x3F);
    
        cDispWrCmd(0x02);	//LCD Drive AC Control
        cDispWrDat(0x06);
        cDispWrDat(0x00);
    
        cDispWrCmd(0x10);	//Exit Sleep Mode
        cDispWrDat(0x00);
        cDispWrDat(0x00);
    
        cDispWrCmd(0x11);	//Set Display color mode for 262k color	? 64k
        cDispWrDat(0x48);
        cDispWrDat(0x38);
    
        _delay_ms(20);
    
        cDispWrCmd(0x05);
        cDispWrDat(0x00);
        cDispWrDat(0x00);
    
        cDispWrCmd(0x06);
        cDispWrDat(0x00);
        cDispWrDat(0x00);
    
        cDispWrCmd(0x16);   // Horizontal Porch
        cDispWrDat(0xEF);
        cDispWrDat(0x1C);
    
        cDispWrCmd(0x17);   // Vertical Porch
        cDispWrDat(0x00);
        cDispWrDat(0x03);
    
        cDispWrCmd(0x07);	//Display Control
        cDispWrDat(0x02);
        cDispWrDat(0x33);
    
        cDispWrCmd(0x0B);	// Frame Cycle Control
        cDispWrDat(0x53);
        cDispWrDat(0x12);
    
        cDispWrCmd(0x0F);	// Gate Scan Start position
        cDispWrDat(0x00);
        cDispWrDat(0x00);
    
        cDispWrCmd(0x23);
        cDispWrDat(0x00);
        cDispWrDat(0x00);
    
        cDispWrCmd(0x24);
        cDispWrDat(0x00);
        cDispWrDat(0x00);
    
        _delay_ms(30);		//delay 30ms
    
        cDispWrCmd(0x44);	//Horizontal RAM address position start/end setup
        cDispWrDat(0xEF);	//dec 239
        cDispWrDat(0x00);	//dec 0, i.e. horizontal ranges from 0 -> 239
        //POR value is 0xEF00 anyway. This address must be set before RAM write
    
        cDispWrCmd(0x45);	//Vertical RAM address start position setting
        cDispWrDat(0x00);	//0x0000 = dec 0
        cDispWrDat(0x00);
    
        cDispWrCmd(0x46);	//Vertical RAM address end position setting
        cDispWrDat(0x01);	//0x013F = dec 319
        cDispWrDat(0x3F);
    
    }
     
     int main(void){
    //----------------------------- USTAWIAMY CLOCK NA 32 MHZ!!!! 
    
    OSC.CTRL = OSC_RC32MEN_bm; //enable 32MHz oscillator
    while(!(OSC.STATUS & OSC_RC32MRDY_bm));   //wait for stability
    CCP = CCP_IOREG_gc; //secured access
    CLK.CTRL = 0x01; //choose this osc source as clk 
    
    //------------------------------------------------------------
    
    
    
     /*
      * Inicjalizacja portu D 
      * piny 6,5,4,3 - wyjścia
     */
    
     (&PORTD)->OUT = 0x00;           /* Port D jako wyjscie piny 6,5,4,3 */
     (&PORTD)->DIRSET = 0x78;        /* ustaw piny 6,5,4,3 jako wyjście */
    
    
    
    
    
    
    
    /* port B cały jako wyjście szyna 8 bit! */
    
     (&PORTB)->OUT = 0xFF;           /* Port B jako wyjscie piny wszytskie */
     (&PORTB)->DIRSET = 0xFF;        /* ustaw piny wszytskie jako wyjście */
    
      /* nieskończona pętla... */
    
    /*-----------------------------------------------------------------------------*/
    
        CTRLOUT_PORT |= _BV(CTRLOUT_RESET);
        _delay_ms(20);
        CTRLOUT_PORT &= ~_BV(CTRLOUT_RESET);
        _delay_ms(100);
        CTRLOUT_PORT |= _BV(CTRLOUT_RESET);
        _delay_ms(100);
    
        
    LCD_Init();
    
    
    
    
    
      
     }
    
    
    


    Proszę o wszelką pomoc!
  • REKLAMA
  • #2 8814976
    Igor22
    Poziom 11  
    Witam ponownie!

    udało mi się przez dwa dni co nie co dowiedzieć metoda prób i błędów.

    Otóż okazało się że wyświetlacz deafaul'towo jest w trybie 16sto bitowym a nie 8 jak było napisane na stronie sprzedawcy. Zatem to co było napisane na stronie sprzedawcy wprowadziło mnie w błąd. Po podłączeniu LCD szyną 16bit udało się go z inicjalizować. Po inicjalizacji okazuje się że Na LCD widoczne są różnokolorowe przypadkowe piksele, czyli śmiecie z ramu sterownika.

    To tyle na ten temat. Gdyby ktoś kiedyś miał problem z tym LCD niech pisze do mnie. Postaram się jeszcze zamieścić foto jak już coś konkretnego wyświetlę.
  • #3 8818567
    Igor22
    Poziom 11  
    Tak jak wspominałem wcześniej, udało mi się w końcu uruchomić LCD a teraz już wyświetlić obraz testowy który nie oddaje możliwości tego LCD. Gdyż jest to 320x240 z 262k kolorów. Zatem to dopiero początek :)

    Xmega64A3 podłączenie LCD S95160 ze sterwonikiem SSD1289Z
REKLAMA