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

[ATmega644][C] Problem z wyświetlaniem na lcd s65

ePeter1234 02 Lis 2009 20:14 1797 11
REKLAMA
  • #1 7207317
    ePeter1234
    Poziom 18  
    Witam!!!

    Po kilku problem z inicjalizacją wyświetlacza w końcu widze jakieś piksele na min. Teraz chcaiłem sobie zapełnić cały wyśwetlacz jakimś dowolnym kolorem. Tu pojawia się problem. Robie wszystko tak jak w pdf;ie ze strony Superkranza i jakiś programów znalezionych w sieci i nic. Może mam gdzieś problem w programie którego ja nie mogę dostrzec. O to on:

    
    #include <avr/io.h>
    #include <avr/pgmspace.h>
    #include <util/delay.h>
    #include "spi.h"
    #include "s65_lcd.h"
    
    char cmd;
    
    char int1[4] = 
    {
    0xFD, 0xFD, 0xFD, 0xFD,
    };
    
    char int2[20] = 
    {
    0xEF, 0x00, 0xEE, 0x04, 0x1B, 0x04, 0xFE, 0xFE, 0xFE, 0xFE, 0xEF, 0x90, 0x4A, 0x04,
    0x7F, 0x3F, 0xEE, 0x04, 0x43, 0x06
    };
    
    char int3[40] = 
    {
    0xEF, 0x90,  0x09, 0x83,  0x08, 0x00,  0x0B, 0xAF,  0x0A, 0x00,  0x05, 0x00,  0x06, 0x00,
    0x07, 0x00,  0xEF, 0x00,  0xEE, 0x0C,  0xEF, 0x90,  0x00, 0x80,  0xEF, 0xB0,  0x49, 0x02,
    0xEF, 0x00,  0x7F, 0x01,  0xE1, 0x81,  0xE2, 0x02,  0xE2, 0x76,  0xE1, 0x83
    };
    
    char int4[2] =
    {
    0x80, 0x01
    //0xEF, 0x90, 0x00, 0x00
    };
    
    void lcd_init(void)
    {
    
    int i = 0;
    
    	PORTD &=~_BV(PD4);
    	_delay_ms(1);
    	PORTD |=_BV(PD4);
    
    	for(i=0;i<=3;i++)
    	{
    		send_lcd_cmd(int1[i]);
    	}
    	
    	_delay_ms(50);
    
    	for (i=0;i<=19;i++) 
    	{ 
    		send_lcd_cmd(int2[i]); 
    	} 
        
    	_delay_ms(7); 
        
    	for (i=0;i<=39;i++) 
    	{ 
    		send_lcd_cmd(int3[i]); 
    	} 
        
    	_delay_ms(50); 
        
    	for (i=0;i<=1;i++) 
    	{ 
    		send_lcd_cmd(int4[i]); 
    	}
    	
    	_delay_ms(500);
    	
    	lcd_bground();
    	
    }
    
    void lcd_bground(void)
    {
    int i = 0;
    
    send_lcd_cmd(0xEF);
    send_lcd_cmd(0x90);
    send_lcd_cmd(0x05);
    send_lcd_cmd(0x00);
    send_lcd_cmd(0x06);
    send_lcd_cmd(0x00);
    send_lcd_cmd(0x07);
    send_lcd_cmd(0x00);
    
    for (i=0; i<0x5AC0; i++)
    {
    	send_lcd_dat(0xff);
    	send_lcd_dat(0xff);
    }
    }
    
    void send_lcd_cmd(char lcd_data)
    {
    	spi_init_lcd();
    	PORTD =_BV(RST)|_BV(RS);
    	PORTB &=~_BV(CS);
    	
    	spi_send(lcd_data);
    }
    
    void send_lcd_dat(char lcd_data)
    {
    	spi_init_lcd();
    	PORTD =_BV(RST);
    	PORTB &=~_BV(CS);
    }
    


    Dodam, że sprzętowo wszystko jest ok. Sprawdzałęm to wiele razy. Mój wyświetlacz to model LS20. Bardzo proszę o pomoc.
  • REKLAMA
  • #2 7207871
    tmf
    VIP Zasłużony dla elektroda
      252 void LCDDriver::SetLCDWriteRect(coordinate width, coordinate height)
      253 {
      254 	SelectCS(true);		//Select display, this function will not deselect it, since following writes are needed
      255 	WriteCmd(SD_CSET);
      256   	WriteByte(0x08+rect.y+xy.y);  // start is 8, not 0
      257   	WriteByte(0x01);
      258   	WriteByte(0x08+rect.y+xy.y+height);
      259   	WriteByte(0x01);
      260 	WriteCmd(SD_PSET);
      261   	WriteByte(rect.x+xy.x);
      262   	WriteByte(rect.x+xy.x+width);
      263   	WriteCmd(RAMWR);
      264 }
    
      304 		SetLCDWriteRect(arect.width,arect.height);
      305 
      306   // start data transmission
      307   		uint16_t i=(arect.height+1)*(arect.width+1);	//Calculate number of changed pixels
      308 		do {
      309 				WriteWord(bkgcolor);
      310 				i--;
      311 			} while(i>0);
      312 
      313   		SelectCS(false);
    
    


    To dziala ok. Ciezko sie analizuje czyjs kod. Pewnie masz gdzies glupi blad. Mam ten sam wyswietlacz, wiec moj kod mozesz wykorzystac bezposrednio.

    Dodano po 2 [minuty]:

    Na pierwszy rzut oka wysylasz parametry okna w ktorym piszesz jako komenta, a to maja byc zwykle bajty - jako komende wysylasz tylko polecenie ustalenia granic i potem zapisu sekwencyjnego do pamieci.
  • #3 7208051
    ePeter1234
    Poziom 18  
    Dzięki za odp. i kod. Nie rozumiem jak mam wysłać parametry o których mówisz jako zwykłe bajty. Do wyświetlacza cokolwiek mogę wysłać jako komende lub dane inaczej sie nie da.
  • REKLAMA
  • #4 7208077
    Konto nie istnieje
    Poziom 1  
  • #5 7210351
    ePeter1234
    Poziom 18  
    Zmieniłem kod tak jak w poście wyżej i nic. dalej mam tylko pixele po inicjalizacji :(

    Zauważyłem jedną ciekawą rzecz. Jak wgrywam program do procka to po wyświetlaczu biegną różnokolorowe pasy z góry na dół. Jak odłączę programator to one zostają. Reset procka nie pomaga. Muszę wtedy wyłączyć zasilanie na kilka sekund, aż pasy znikną i po tym zabiegu jak podłącze zasilanie to wtedy mam dopiero losowe piksele na ekranie.
  • #6 7210430
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #7 7210484
    ePeter1234
    Poziom 18  
    Zrobiłem tak:

    
    void lcd_bground(void)
    {
    int i = 0;
    
    send_lcd_cmd(0xEF);
    send_lcd_dat(0x90);
    send_lcd_cmd(0x05);
    send_lcd_dat(0x00);
    send_lcd_cmd(0x06);
    send_lcd_dat(0x00);
    send_lcd_cmd(0x07);
    send_lcd_dat(0x00);
    
    for (i=0; i<0x5AC0; i++)
    {
    	send_lcd_dat(0x0F);
    	send_lcd_dat(0x0F);
    }
    }
    


    I tez nic z tego:(

    Chyba przekombinowałem:( Teraz to mi wyświetlacz się już w ogóle nie inicjuje:((( Mam biały ekran.
  • #8 7210504
    tmf
    VIP Zasłużony dla elektroda
    Ostatnim poleceniem musi byc RAMWR - zapis bloku pamieci, wiec z pewnoscia bedzie to cmd a nie dat. RAMWR ma kod 0x5C, u ciebie tego nie widze, wiec to nie ma prawa dzialac. Nie masz tez ustawionych kolumn i wierszy do zapisu - instrukcje 0x15 i 0x75. Skad w ogole wytrzasnales ten swoj kod?
    Dolaczylem ci pdfa z opisem sterownika w tym LCD (jest to ten sam sterownik lub bardzo podobny - u mnie wiekszosc opisanych tam komend dzialala).
    Załączniki:
  • REKLAMA
  • #9 7210518
    ePeter1234
    Poziom 18  
    No ten kod to sam pisałem na postawie pdf'a który krąży w sieci ze strony Superkranca i jeszcze kilka informacji znalazłem na http://www.juras-projects.org/eng/lcd.php Starałem się sam dojść do tego, ale coś mi nie idzie:( wiec jak to jest z tym wyświetlaczem. Możesz mi tak krótko napisać jaka jest idea wyświetlenia czegoś na nim??
  • #10 7210546
    tmf
    VIP Zasłużony dla elektroda
    Przczytaj pdfa, ktory ci wyslalem, szczegolnie spis komend. Ogolna idea jest prosta - definiujesz okno w pamieci do ktorego piszesz, nastepnie wysylasz komende zapisu i nastepnie ciag bajtow, ktore trafia do wczesniej zdefiniowanego okna. Jest to troche moze niejasne, dlatego juz kiedys wyslalem ci linka do mojej (dzialajacej) implementacji procedur wyswietlania na tym LCD. Nie ma sensu odkrywac kola na nowo.
  • #11 7210563
    Konto nie istnieje
    Poziom 1  
  • #12 7210652
    ePeter1234
    Poziom 18  
    Dobra teraz to wszystko przeanalizuje i dam jutro znac czy cos sie zmienilo:)
REKLAMA