SD1289 display problem

Lysdioder, Optiska sensorer, Fiberoptik, Displayer, Lasrar, Optiska kopplare
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

SD1289 display problem

Inlägg av dangraf »

Hallå!
Jag sitter och försöker sparka igång en display men lyckas inte. Nu tror jag att jag kört huvudet in i väggen för jag vet varken ut eller in.

Displayen jag pillrar med heter SD1298
http://www.techtoys.com.hk/Displays/FG ... WHG01.htm

På hemsidan ovan finns färdiga programmerings exempel och kopplingsscheman för hur displayen skall kopplas in och initieras. Trots all denna hjälp lyckas jag inte. Den enda lycka jag haft är att lyckas tända/släcka backlighten :-)

Jag försökte först använda SPI interfacet till displayen, men lyckades inte. De jag beställde displayen av sa att det var långsamt och att de inte ens försökt. Efter en hel del meckande, utan att få igång den försöker jag nu med paralell interfacet.

Just nu har jag uppkopplat en platta med 8 bitars paralellbuss och tillgång till
CS, WR, WD, CD och RESET till displayen. Jag har testat alla pinnarna så att det går att toggla mellan 1 och 0 (testet har jag gjort upprepade gånger då jag trott att det var problemet)

Man kan ställa in hur man vill prata med displayen genom att sätta PS3, PS1 och PS0, och är satt till [1,0,0] som motsvarar 8080 8 bit paralell interface enligt databladet.

Jag har stegat genom koden för ett skriv kommando och mätt så att pinnarna får rätt värden och att det sker i rätt ordning, men displayen ändrar sig ingenting. Ett tag trodde jag att den behövde en längre reset-puls, så jag låter reset vara låg i ca 40ms efter att processorn startar uppt för att låta den resettas ordentligt.

Jag har även testat att skriva "read" commandon till displayen för att se om jag kan läsa ut samma värde som jag skrivit, men jag läser bara 0xFF på databussen från displayen.

Jag börjar misstänka att det är nått problem med själva displayen, men vet av erfarenhet att jag brukar missa på en del enkla grejjer. Har ni någon aning om vad jag skulle kunna testa för att se om displayen lever över huvud taget??

här kommer lite kod som jag kör på displayen:

Kod: Markera allt


int main(void)
{
	uint8 x;
	// peperials
	timer2_init();
 	init_io();
	board_3VSens_dis();		// pull RESET pin low
	timer2_delay_ms(40);
	board_3Vdisp_en();		// pull RESET pin high
	board_3VSens_en();

	ssd_lcd_init();
	while(1)
	{
		// init display
		ssd_lcd_init();
		// write a line
		for(x=0;x<240;x++) cDispSetPixel(x, 32, RGB16(0,0,31));
		timer2_delay_ms(200);
		
	}
	return 1;
}

#define DISP_CMD	0
#define DISP_DAT	1

// pin definitions.
#define DISP_SHDN_BL		PORTBbits.RB11		// pwm for backlight control
#define DISP_CD				PORTBbits.RB13
#define DISP_WR				PORTBbits.RB14	//<		// kolla om den verkligen behövs.
#define DISP_CS				PORTGbits.RG15	//<
#define DISP_RD				PORTFbits.RF3	//<		// kolla om den verkligen behövs

#define DISP_BUS			PORTD



uint8 ssd_read(void)
{
	uint8 u8Temp;
	DISP_BUS|= 0x00FF;	//set dataport to input
	DISP_WR = 1;
	DISP_RD = 0;
	DISP_CD = 1;
	DISP_CS  =0;
	DISP_CS = 1;
	Nop();
	Nop();
	Nop();
	u8Temp = PORTD &0xFF;

	DISP_RD = 1;
	return u8Temp;
}	

void ssd_lcd_data(uint8 u8Data)
{
	TRISD &= 0xFF00;
	DISP_BUS &= 0xFF00;	
	DISP_BUS |= u8Data;
	DISP_CD = HIGH;		// high for display data
	DISP_WR = LOW;
	DISP_RD = HIGH;
	DISP_CS = LOW;
	DISP_CS  =HIGH;
}	
void ssd_lcd_cmd(uint8 u8Data)
{
	TRISD &= 0xFF00;
	DISP_BUS &= 0xFF00;
	DISP_BUS |= u8Data;
	DISP_CD = LOW;		// high for display data
	DISP_WR = LOW;
	DISP_RD = HIGH;
	// clock pulse
	DISP_CS = LOW;
	DISP_CS  =HIGH;
}	

uint16 ssd_read_data(uint8 addr)
{
	uint16 u16Temp;
//	ssd_lcd_cmd(addr);	// set register address
	u16Temp = ssd_read();
	u16Temp = u16Temp<<8;
	u16Temp |= ssd_read();
	return u16Temp;
	
	
}	

void ssd_clr(uint16 u16Color)
{
	uint8 i,hiByte,lowByte;
	uint16 j;

	hiByte  = u16Color>>8;
	lowByte = (uint8)u16Color;

	for(j=0;j<320;j++)
	{
		for(i=0;i<240;i++)
		{
			ssd_lcd_data(i); ssd_lcd_data(j);
		}

	}
	
}


void cDispSetPixel(uint8 x, uint16 y, uint16 color)
{
	uint8 hiByte, lowByte;

	ssd_lcd_cmd(0x4E);		//set address in the 240 pixel direction
	ssd_lcd_data(0x00);		//hiByte first fill all zero
	ssd_lcd_data(x);			//0<x<239

	hiByte 	= y>>8;
	lowByte = (uint8)y;

	ssd_lcd_cmd(0x4F);		//set address in the 320 pixel direction
	ssd_lcd_data(hiByte);
	ssd_lcd_data(lowByte);
	
	hiByte  = color>>8;
	lowByte = (uint8)color;

	ssd_lcd_cmd(0x22);		//RAM write command
	ssd_lcd_data(hiByte);		//write color content here
	ssd_lcd_data(lowByte);	
}
void ssd_lcd_init(void)
{
	volatile uint16 u16Temp;
	DISP_SHDN_BL = 1;
	DISP_CD	= 1;
	DISP_WR	= 1;		//<		// kolla om den verkligen behövs.
	DISP_CS	= 1;	
	TRISD &= 0xFF00;
	PORTD &= 0xFF00;
		
	ssd_lcd_cmd(0x00);	//Start Oscillation
	ssd_lcd_data(0x00);
	ssd_lcd_data(0x01);

	u16Temp = ssd_read_data(0x00);
	ssd_lcd_cmd(0x01);	//Driver Output Control
	ssd_lcd_data(0x23);
	ssd_lcd_data(0x3F);

	u16Temp = ssd_read_data(0x01);
	
	ssd_lcd_cmd(0x02);	//LCD Drive AC Control
	ssd_lcd_data(0x06);
	ssd_lcd_data(0x00);

	ssd_lcd_cmd(0x03);	//Power Control (1)
	ssd_lcd_data(0xA8);
	ssd_lcd_data(0xA6);

	ssd_lcd_cmd(0x07);	//Display Control
	ssd_lcd_data(0x00);
	ssd_lcd_data(0x33);

	ssd_lcd_cmd(0x11);	//Entry Mode (R11h): Set Display color mode for 65k/262k color
	ssd_lcd_data(0x68);	//DFM1:DFM0=1:1 for 65k color (POR)
	ssd_lcd_data(0x30);
	
	ssd_lcd_cmd(0x0C);	//Power Control (2)
	ssd_lcd_data(0x00);
	ssd_lcd_data(0x05);

	ssd_lcd_cmd(0x0D);	//Power Control (3)
	ssd_lcd_data(0x30);
	ssd_lcd_data(0x0B);

	ssd_lcd_cmd(0x0E);	//Power Control (4)
	ssd_lcd_data(0x20);
	ssd_lcd_data(0x00);

	ssd_lcd_cmd(0x10);	//Exit Sleep Mode
	ssd_lcd_data(0x00);
	ssd_lcd_data(0x00);
	timer2_delay_ms(30);
//DelayMs(30);		//delay 30ms

	ssd_lcd_cmd(0x1E);	//Power Control (5)
	ssd_lcd_data(0x00);
	ssd_lcd_data(0xA8);

	ssd_lcd_cmd(0x44);	//Horizontal RAM address position start/end setup
	ssd_lcd_data(0xEF);	//dec 239
	ssd_lcd_data(0x00);	//dec 0, i.e. horizontal ranges from 0 -> 239
						//POR value is 0xEF00 anyway. This address must be set before RAM write
	
	ssd_lcd_cmd(0x45);	//Vertical RAM address start position setting
	ssd_lcd_data(0x00);	//0x0000 = dec 0
	ssd_lcd_data(0x00);

	ssd_lcd_cmd(0x46);	//Vertical RAM address end position setting
	ssd_lcd_data(0x01);	//0x013F = dec 319
	ssd_lcd_data(0x3F);

	ssd_lcd_cmd(0x22);	//RAM write command

	ssd_clr(SSD_GREEN);

	
}	
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

Hej, jag har lekt lite med ssd1298 och den verkar fungerar bra för min del. (de är oxå köpt från http://www.techtoys.com.hk) Jag kan inte se någe direkt fel i din code.
Så det ända jag kan komma på är bitarna på data-bussen är fel vända eller liknade eller PS3..0 är fel "vända" (de ska vara off, on, on valfri, då de kortsluter till jord vid "on") alternativt att du skriver för snabbt till den.

Tyvärr kan jag inte komma på någe annat ....
Användarvisningsbild
chille
Inlägg: 2469
Blev medlem: 25 juni 2003, 20:54:41
Ort: Stockholm
Kontakt:

Inlägg av chille »

Oj, det där var en fin display till ett bra pris. Skulle leta upp på en passande touch screen så skulle den bli perfekt i mitt hemautomationsprojekt. 8)

Hur är betraktningsvinkeln på den där?

EDIT: Det kan inte vara något med timingen som är fel då? Att någon/några pulser är för långa eller korta? Det brukar ju vara ett vanligt fel. Har du mätt upp så att dina delay-loopar verkligen är så långa som dom borde vara, och altså inte bara beräknat hur lång tid dom tar?
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

tja.. jag sitter med den just nu och pillar lite. Har testat lite. Om jag lägger ut värdet 0x01 så kommer D1 bli hög och D2-D8 låga.
Har testat att skicka en massa data för att se hur flankerna ser ut och om signalerna går fram, men det ser helt fantastiskt bra ut.. *mysteriskt*

PS0 PS1 och PS3 har jag lekt lite med och mätt direkt på pinnarna till kontakten, och de verkar inte heller vara några problem. Har även testat invertera för säkerhets skull :-)

Hur snabbt klockar du ut dina kommandon, tänkte om det är nått timingfel?
just nu är mina CS signaler ca 5uS långa och enligt databladet så skall man kunna komma ner i pulser på 500nS, så jag tycker jag ligger väldigt bra till.


>> chille Det finns 3" displayer med touchscreen för ca 70$ om du tittar vidare på sidan
http://www.techtoys.com.hk/Displays/TY ... 40320.htm [/url]
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

Nästan så snabbt det går på en AVR @ 20Mhz delvis är cs endast låg i 50ns...

chille: betraktningsvinkeln är helt OK, Där i mot är väll den kanske lite väl blek men det går väll kanske är via några commando till TFT. ^^
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

Då har jag en fråga till.
Har du lagt några signaler på de överiga pinnarna? tänkte speciellt på SHDN och DEN (som ska användas vid RGB interfacet). enligt databladet ska man antingen jorda eller sätta dessa till VDD om de inte används.

Jag har testat att jodra alla andra pinnar förutom de som avnvänds vid 8080 interfacet. Just nu har jag bara kopplat in de pinnarna som är definierade i koden, dvs
SHDN_BL, DISP_CD, DISP_WR, DISP_CS DISP_RD , RESET och D1-D8.
Resten hänger i luften.. Tycker det känns som nått idiotfel som jag tokmissat.
Användarvisningsbild
chille
Inlägg: 2469
Blev medlem: 25 juni 2003, 20:54:41
Ort: Stockholm
Kontakt:

Inlägg av chille »

dangraf: Mjo, fast $70 var lite väl dyrt för en display med touch screen. Bättre att köpa en display för $30 och en touch screen för $20 :)

Du har inte funderat på om det är så att displayen är riktigt grinig och att du faktist skickar för långa pulser? Brukar väl oftast inte vara några problem på LCD-displayer, men andra kretsar kan bli lite gnälliga om man har för långa pulser. Står det specificerat någon maxlängd i databladet?
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

Tanken har slagit mig att pulslängderna är för långa, men jag har gjort en delay-funktion för min chip-select puls och har testat lite olika. 2Mhz borde inte vara för långsamt, när det går som snabbast... Det står inget om max-puler i databladet, bara minimum.
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

Om du har reseten "flytande" kan jag förstå att det inte fungerar speciellt bra, den ska vara kopplad till vcc eller en io-pine (eller som jag tillsamman med cpu reseten), för om jag tar loss kabeln till reset så är lcd sten död...
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

Reseten sitter på en IO pinne, så den är det ingen fara med. Har dubbel och trippelkollat så att den är hög ;-)
Skriv svar