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

[ATmega][LCD 3510i] Problem z wyświetlaczem LCD

Kabuto15 29 Lip 2008 10:35 12119 10
  • #1 5388027
    Kabuto15
    Poziom 19  
    Witam.
    Od dłuższego czasu męczę się bezskutecznie z wyświetlaczem od telefonu Nokia 3510i. Sprawdzałem już kilka wyświetlaczy i żaden ani drgnął.
    Poniżej prezentuje schemat połączeniowy oraz kod źródłowy. Dodam iż próbowałem już ładować różne kody źródłowe i wyświetlacz ani razu nie dał znać. Podejrzewam, że coś nie gra w połączeniu LCD do mikrokontrolera.

    [ATmega][LCD 3510i] Problem z wyświetlaczem LCD
  • #2 5390907
    Freddy
    Poziom 43  
    Użyj klawisza szukaj! Na temat tego wyświetlacza było już setki postów, jeśli nie tysiące. Były schematy i soft.
  • #3 5390921
    Kabuto15
    Poziom 19  
    użyłem PRZYCISKU szukaj na elektrodzie i na googlach, no i te "setki" postów i informacji nie pomogły mi, może ktoś ma lepsze rady?
  • #4 5391206
    d.d
    Poziom 20  
    Przede wszystkim napisz pod jaką to jest Atmegę.
    W kodzie widzę kilka potencjalnych błędów ale musze wiedzieć jaka to Atmega .

    Po minimalnych zmianach działa mi to na Atmega8.
  • #5 5391379
    Kabuto15
    Poziom 19  
    jak na razie testowałem to wyłącznie na ATmega16
  • #6 5391481
    d.d
    Poziom 20  
    Tak myślałem że to Mega16 .

    Błąd masz w inicjacji wyświetlacza
    komenda INIESC u ciebie jest 0x06 a powinno być 0xC6
    ale jest coś jeszcze bo po zmianie nie działa jak wstawiłem swoją inicjacje od razu odpaliło .
    To działa na 100%
    #include <avr/io.h>
    #include <stdlib.h>
    
    #include "global.h"
    #include "config.h"
    #include "delay.h"
    
    #include <stdint.h>
    #include <inttypes.h>
    
    #define CMD 0
    #define DATA 1
    
    //dyrektywy kompilatora
    #include <avr/io.h> 
    #include <stdlib.h> 
    #include "delay.h"
    
    //marka
    #define PORT_3510i PORTB
    #define SCK_3510i 7
    #define SIO_3510i 5
    #define CS_3510i  4
    #define RES_3510i 3
    
    //dane - dane do wyslania
    //rodzaj - rodzaj informacji: 0 - COMMAND, 1 - DATA
    void send_3510i(unsigned char data, unsigned char op_kind)
    {
    	
    	PORT_3510i &= ~(1<<CS_3510i); //CS ustaw na zero
    	// Wyłączenie spi
    	SPCR &= ~(1<<SPE); //ustawienie bitu SPE na zero
    	
    	//transmisja bitu D8
    
    	PORT_3510i &= ~(1<<SCK_3510i);  //ustawienie SCK na zero
    	
    	//wyslanie odpowiedniego bitu w zaleznosci od
    	//rodzaju przesylanych danych
    	
    	if (op_kind==0) 
    	{ 								//komenda - wyslij zero
    		PORT_3510i &= ~(1<<SIO_3510i); 
    	} 
    	else
    	{								//dane - wyslij jeden	
    		PORT_3510i |= 1<<SIO_3510i; 
    	} 
    	
    	PORT_3510i |= 1<<SCK_3510i; //podciagnij SCK
    
        //transmisja bitow D7-D0
    	//odblokowanie SPI
    	SPCR |= 1<<SPE; //uaktywnienie SPI
    	//wyslanie danych do sterownika
    	SPDR = data;
    	while(!(SPSR & 1<<SPIF)) {}; 
    	//poczekaj na ustawienie flagi
    	PORT_3510i |= 1<<CS_3510i; //ustaw CS jako jeden
    	
    } 
    
    
    void init_SPI(void)						
    {			
    	DDRB=0xff;		//11111111
    	PORTB=0xb0;																		
        SPCR = _BV(SPE) | _BV(MSTR) | _BV(CPOL);  
        SPSR = _BV(SPI2X);
    } // init_SPI
    
    
    
    //inicjacja wyswietlacza nokia 3510i
    void init_3510i(void)
    {
    int i; // licznik pętli
    	uint8_t x, y;
    //hardware reset
    	PORT_3510i &= ~(1<<RES_3510i); 
    	delayms(5);
    	PORT_3510i |= 1<<RES_3510i | 1<<SCK_3510i | 1<<SIO_3510i | 1<<CS_3510i;
    	delayms(5);
    	
            send_3510i(0x01, CMD);        // LCD Software Reset
        delayms(10);
        
        send_3510i(0xC6, CMD);        // Initial Escape
        delayms(10);
    
    //*** phase 2: display setup 1
        send_3510i(0xB9, CMD);        // Refresh set
        send_3510i(0x00, DATA);
        
        send_3510i(0xB6, CMD);        // Display Control
        send_3510i(0x80, DATA);
        send_3510i(0x80, DATA);        //no N line inversion
        send_3510i(0x81, DATA);        //frame freq; bias rate of LCD drive voltage; 98x67; diplay duty=1/67; 
        send_3510i(84, DATA);
        send_3510i(69, DATA);
        send_3510i(82, DATA);
        send_3510i(67, DATA);
        
        send_3510i(0xB3, CMD);        // Gray Scale Position
        send_3510i(0x11, DATA);
        send_3510i(0x22, DATA);
        send_3510i(0x33, DATA);
        send_3510i(0x44, DATA);
        send_3510i(0x55, DATA);
        send_3510i(0x66, DATA);
        send_3510i(0x77, DATA);
        send_3510i(0x88, DATA);
        send_3510i(0x99, DATA);
        send_3510i(0xAA, DATA);
        send_3510i(0xBB, DATA);
        send_3510i(0xCC, DATA);
        send_3510i(0xDD, DATA);
        send_3510i(0xEE, DATA);
        send_3510i(0xFF, DATA);
        
        send_3510i(0xB5, CMD);        // Gamma Curve Set
        send_3510i(1, DATA);
    
       send_3510i(0xBD, CMD);        // Common driver setup
       send_3510i(0, DATA);
    
    //*** phase 3: power supply
        send_3510i(0xBE, CMD);        // Power Control
       send_3510i(4, DATA);
        
        send_3510i(0x11, CMD);        // Sleep out
        
        send_3510i(0xBA, CMD);        // Voltage control
        send_3510i(127, DATA);
        send_3510i(3, DATA);
        
        send_3510i(0x25, CMD);        // Write contrast
        send_3510i(63, DATA);
    
        send_3510i(0x2D, CMD);        // Colour set (only for 8-bit/pixel)
        send_3510i(0x00, DATA);       // RED
        send_3510i(0x02, DATA);
        send_3510i(0x04, DATA);
        send_3510i(0x06, DATA);
        send_3510i(0x09, DATA);
        send_3510i(0x0b, DATA);
        send_3510i(0x0d, DATA);
        send_3510i(0x0f, DATA);
        send_3510i(0x00, DATA);       // GREEN
        send_3510i(0x02, DATA);
        send_3510i(0x04, DATA);
        send_3510i(0x06, DATA);
        send_3510i(0x09, DATA);
        send_3510i(0x0b, DATA);
        send_3510i(0x0d, DATA);
        send_3510i(0x0f, DATA);
        send_3510i(0x00, DATA);       // BLUE
        send_3510i(0x05, DATA);
        send_3510i(0x0a, DATA);
        send_3510i(0x0f, DATA);
        
        send_3510i(0xB7, CMD);        // Temperature gradient set
        send_3510i(0, DATA);
        send_3510i(0, DATA);
        send_3510i(0, DATA);
        send_3510i(0, DATA);
        send_3510i(0, DATA);
        send_3510i(0, DATA);
        send_3510i(0, DATA);
        send_3510i(0, DATA);
        send_3510i(0, DATA);
        send_3510i(0, DATA);
        send_3510i(0, DATA);
        send_3510i(0, DATA);
        send_3510i(0, DATA);
        send_3510i(0, DATA);
        
        send_3510i(0x03, CMD);        // Booster Voltage ON
        delayms(40);
        
    //*** phase 4: display setup 2
        send_3510i(0x21, CMD);        // Inversion control (OFF)
        
    //*** phase 5: display setup 3
        send_3510i(0x3A, CMD);        // 8bpp
        send_3510i(0x02, DATA);
        
        send_3510i(0x29, CMD);        // Display On
    }
    
    
    
    int main(void)
    {
    DDRB=0xff;
    init_SPI();
    init_3510i();
    
    delayms(100);
     
    
    unsigned int n;
    unsigned char kolor;
    while(1)
    {
    
    send_3510i(0x2C, 0);
    
    for(n=0;n<6566;n++)
    {
    if(n==0)kolor=0b11100000;
    if(n==2000)kolor=0b00011100;
    if(n==4000)kolor=0b00000011;
    send_3510i(kolor, 1);
    }
    
    
    }
    
    
    return 0;
     }
    
    


    Wynikiem powinny być trzy pasy czerwony , zielony i niebieski.
    Jeszcze jedno w trybie 8 bitowym 1 bajt to jeden pixel RRRGGGBB w trybie 12 bitowym trzy bajty to dwa pixele
    RRRRGGGG
    BBBBRRRR
    GGGGBBBB

    Co do połączenia ja mam to zrobione na dzielniku rezystorowym .
  • #7 5391905
    Kabuto15
    Poziom 19  
    kurcze dalej nic nie rusza :( sprawdzałem już Twój program i kilka innych i wyświetlacz ani drgnie. Mógłbyś podesłać dokładny schemat Twojego podłączenia, bo powoli dochodzę do obłędu. Swoją drogą testuje 2 wyświetlacze więc wykluczam możliwość, że mogą być uszkodzone.
  • Pomocny post
    #8 5392170
    d.d
    Poziom 20  
    Ok tak na szybko narysowałem .
    Reset można podpiąć na stałe do +3.3v gdyż soft reset robi dokładnie to samo co hard .
    rezystory możesz dać inne w necie jest pełno kalkulatorów i wzorów do obliczania .
    u mnie na takim podłączeniu śmiga z maksymalną prędkością SPI na ATMega8 z kwarcem 20MHz a nawet 25MHz

    [ATmega][LCD 3510i] Problem z wyświetlaczem LCD
  • #9 5397131
    Kabuto15
    Poziom 19  
    Dziękuję za pomoc. Mimo tego wyświetlacz ani drgnął. Próbowałem różne softy, różne AVRy, sprawdzałem na oscyloskopie co i jak, wszystko wygląda na ok, jedynie wyświetlacz ani drgnie. Podejrzewam, że być może wyświetlacze posiadają inny sterownik, lub są uszkodzone. Jak na razie spróbuję inny typ wyświetlacza obsłużyć z innym programem, być może kiedyś znów pomęczę te 3510i. Dziękuję jeszcze raz za poświęcony czas :)
  • #10 5397441
    d.d
    Poziom 20  
    Kiedyś jak pierwszy raz podłączyłem ten wyświetlacz to za pierwszym razem odpalił później coś się stało i myślałem że się zjarał .
    Po prawie roku podłączyłem jeszcze raz i nic ale podlutowałem kabelki i odpalił .
    Teraz chwilami też nie daje oznak życia ale jak docisnę kable to działa.

    Sprawdź czy masz wszystko dokładnie przylutowane i czy przylutowane do odpowiednich pinów .

    Możesz też podłączyć pod lpt TU LINK jest schemat i program ( z ciekawości przetestowałem i działa ) .
    zamiast tych buforów można podłączyć przez dzielnik rezystorowy .

    NIE poddawaj się jeśli wyświetlacz jest sprawny i dobrze podłączony to musi działać .
  • #11 6349211
    lorak17
    Poziom 15  
    Po czasie ale może komuś się przyda, to jest działający kod do obsługi wyświetlacza od 3510i, atmega8 16MHz bez sprzętowego SPI, piny wyświetlacza definiowane dowolnie.


    
    #include <avr/io.h>
    #include <util/delay.h>
    
    
    #define PORT_3510i PORTB
    #define SCK_3510i 5
    #define SIO_3510i 3
    #define CS_3510i  4
    #define RES_3510i 0 //może być podpięty pod 3.3V na stałe
    #define CMD 0
    #define DATA 1
    
    void init_3510iport(void)
    {
    DDRB = (1<<SIO_3510i)|(1<<SCK_3510i)|(1<<CS_3510i);
    PORTB=0xff;
    }
    
    void send_to_lcd(unsigned char data, unsigned char op_kind)
    {
       
       int i;
       PORT_3510i &= ~(1<<CS_3510i); //CS ustaw na zero
       PORT_3510i &= ~(1<<SCK_3510i);	
       if (op_kind==0)
       {                         //komenda - wyslij zero
          PORT_3510i &= ~(1<<SIO_3510i);
       }
       else
       {                        //dane - wyslij jeden   
          PORT_3510i |= 1<<SIO_3510i;
       }
       PORT_3510i |= 1<<SCK_3510i;
       //transmisja bitow D7-D0
       for (i=7; i>=0; i--)
       {
       	PORT_3510i &= ~(1<<SCK_3510i);
    	if ((data & _BV(i))==0)
    	{
    	PORT_3510i &= ~(1<<SIO_3510i);
    	}
    	else
    	{
    	PORT_3510i |= 1<<SIO_3510i;
    	}
    	PORT_3510i |= 1<<SCK_3510i;
       }
       PORT_3510i |= 1<<CS_3510i;
    
    }
    
    
    void init_3510i(void)
    {
    //inicjacja wyswietlacza nokia 3510i
    //hardware reset (gdy pin reset podpięty)
    /*
        PORT_3510i &= ~(1<<RES_3510i);
        _delay_ms(5);
        PORT_3510i |= 1<<RES_3510i | 1<<SCK_3510i | 1<<SIO_3510i | 1<<CS_3510i;
        _delay_ms(5);
    */   
        send_to_lcd(0x01, CMD);        // LCD Software Reset
        _delay_ms(10);
        send_to_lcd(0xC6, CMD);        // Initial Escape
    	_delay_ms(10);
    // phase 2: display setup 1
        send_to_lcd(0xB9, CMD);        // Refresh set
        send_to_lcd(0x00, DATA);
        send_to_lcd(0xB6, CMD);        // Display Control
        send_to_lcd(128, DATA);
        send_to_lcd(128, DATA);        //no N line inversion
        send_to_lcd(129, DATA);        //frame freq; bias rate of LCD drive voltage; 98x67; diplay duty=1/67;
        send_to_lcd(84, DATA);
        send_to_lcd(69, DATA);
        send_to_lcd(82, DATA);
        send_to_lcd(67, DATA);
        send_to_lcd(0xB3, CMD);        // Gray Scale Position
        send_to_lcd(1, DATA);
        send_to_lcd(2, DATA);
        send_to_lcd(4, DATA);
        send_to_lcd(8, DATA);
        send_to_lcd(16, DATA);
        send_to_lcd(30, DATA);
        send_to_lcd(40, DATA);
        send_to_lcd(50, DATA);
        send_to_lcd(60, DATA);
        send_to_lcd(70, DATA);
        send_to_lcd(80, DATA);
        send_to_lcd(90, DATA);
        send_to_lcd(100, DATA);
        send_to_lcd(110, DATA);
        send_to_lcd(127, DATA);
        send_to_lcd(0xB5, CMD);        // Gamma Curve Set
        send_to_lcd(1, DATA);
        send_to_lcd(0xBD, CMD);        // Common driver setup
        send_to_lcd(0, DATA);
    //phase 3: power supply
        send_to_lcd(0xBE, CMD);        // Power Control
        send_to_lcd(4, DATA);
        send_to_lcd(0x11, CMD);        // Sleep out
        send_to_lcd(0xB7, CMD);        // Temperature gradient set
    	for (int i=0; i<=14;i++)
    	{
        send_to_lcd(0, DATA);
    	} 
        send_to_lcd(0x03, CMD);        // Booster Voltage ON
        _delay_ms(40);
        send_to_lcd(0x20, CMD);        // Inversion control (OFF)
        send_to_lcd(0xBA, CMD);        // Voltage control
        send_to_lcd(117, DATA);
        send_to_lcd(3, DATA);
        send_to_lcd(0x25, CMD);        // Write contrast
        send_to_lcd(63, DATA);
        send_to_lcd(0x2D, CMD);        // Colour set (only for 8-bit/pixel)
        send_to_lcd(0x00, DATA);       // RED
        send_to_lcd(0x02, DATA);
        send_to_lcd(0x04, DATA);
        send_to_lcd(0xC6, DATA);
        send_to_lcd(0x09, DATA);
        send_to_lcd(0x0b, DATA);
        send_to_lcd(0x0d, DATA);
        send_to_lcd(0x0f, DATA);
        send_to_lcd(0x00, DATA);       // GREEN
        send_to_lcd(0x02, DATA);
        send_to_lcd(0x04, DATA);
        send_to_lcd(0xC6, DATA);
        send_to_lcd(0x09, DATA);
        send_to_lcd(0x0b, DATA);
        send_to_lcd(0x0d, DATA);
        send_to_lcd(0x0f, DATA);
        send_to_lcd(0x00, DATA);       // BLUE
        send_to_lcd(0x05, DATA);
        send_to_lcd(0x0a, DATA);
        send_to_lcd(0x0f, DATA);
        send_to_lcd(0x3A, CMD);        // 8bpp
        send_to_lcd(0x02, DATA);
        send_to_lcd(0x29, CMD);        // Display On
    	
    }
    
    int main(void)
    {
    
    DDRD=0b11000000;
    init_3510iport();
    init_3510i();
    PORTD=0b00000000;
    unsigned int n;
    unsigned char kolor;
    while(1)
    {
    send_to_lcd(0x2C, CMD);
    
    for(n=0;n<6566;n++)
    {
    if(n==0)kolor=0b11111111;
    if(n==2000)kolor=0b00011100;
    if(n==4000)kolor=0b00000011;
    send_to_lcd(kolor, DATA);
    }
    
    } 
    return 0;
    } 
    
REKLAMA