Sida 1 av 3

Kan inte få LCD display att fungera

Postat: 22 augusti 2010, 22:38:28
av jfri
Jag har köpt denna LCD drive
http://www.electrokit.se/opto-display-l ... v_41003720
Försöker nu använda den med en PIC16F690 som är kopplad direkt till de tre kontrollsignalerna E RW RS. Databyten matas via en 74HC595. Genom att mäte direkt på LCD displayens kontakter så ser jag att där finns de spänningar jag förväntar mig. I LCD displayens datablad finns listat ett antal instruktioner som jag försöker använda. Mitt problem är att jag kan inte få någonting att visas på displayen. Den är och förblir helt mörk. Endast genom att vrida upp backlightning kan jag se en rad fyrkanter mycket svagt. Använder Pickit 2 på ett eget kretskort. Jag söker någon form av enkel exempelkod som kan visa något på displayen. Nedan lite exempelkod jag försökt. Först har jag en fördröjning på 15 mS sedan anropar jag först LCDfunction() och sedan LCDonoff() vilken jag förväntar mig skulle visa en blinkande cursor. Vad missar jag?

Kod: Markera allt

void	Load_shiftreg(char	data)
{
	int	i;

	printf("char data=%c data=0b",data);

	for (i=0;i<8;i++)
		{
		if (data & 0b00000001)
			DS = 1;
		else
			DS = 0;
		data>>=1;
		if (DS)
			printf("1");
		else
			printf("0");
		SH_CP = 0;
		__delay_us(10);
		SH_CP = 1;
		ST_CP = 0;	
		__delay_us(10);
		ST_CP = 1;
		}
	ST_CP = 0;	
	__delay_us(10);
	ST_CP = 1;
	printf("\n\r");
}

void	LCDonoff()
{
	char	c=0b00001111;

	Load_shiftreg(c);
	E = 0;
	RS=0;
	RW=0;
	__delay_ms(15);
	E=1;
	__delay_us(2);
	E=0;
	do {} while (TRUE);
	__delay_us(10);
}

void	LCDfunction()
{
	char	c=0b00111000;

	Load_shiftreg(c);
	E = 0;
	RS=0;
	RW=0;
	__delay_ms(15);
	E=1;
	__delay_us(2);
	E=0;
	__delay_us(60);
}

Re: Kan inte få LCD display att fungera

Postat: 22 augusti 2010, 22:44:21
av Klas-Kenny
Nu kan jag inte språket din kod är skriven i och orkar inte fördjupa mig i koden, men har du initierat displayen?

Re: Kan inte få LCD display att fungera

Postat: 22 augusti 2010, 22:52:35
av jfri
Språket är C och jag använder HiTech C lite. Mina båda funktioner LCDfunction och LCDonoff initierar data längd antal rader fonttyp och cursor och sätter på displayen.

Re: Kan inte få LCD display att fungera

Postat: 22 augusti 2010, 22:55:37
av Klas-Kenny
Testat skriva ut något tecken? Kanske bara cursorn som spökar och inte syns?
Jordat (Har jag för mig det är man gör..) kontrast-pinnen?

Re: Kan inte få LCD display att fungera

Postat: 22 augusti 2010, 23:36:16
av sodjan
> Endast genom att vrida upp backlightning kan jag se en rad fyrkanter mycket svagt.

Låter som standardläget efter POST men innan man har gjort något mot den.
Det är väl den ena raden som har mörka fyrkanter ?

> Först har jag en fördröjning på 15 mS...

Låter lite kort.

> ...sedan anropar jag först LCDfunction()


> Vad missar jag?

Antagligen att du har för korta delayer innan du försöker initiera displayen.
Sannolikt hinner inte LCD igenom POST innan din kod försöker köra.

En annan sak...

> RW=0;

Varför ? Behöver du även kunna läsa från LCD'n ?
I 9 fall av 10 struntar man i det och lägger bara RW till GND.

Vart skriver den printf() som ligger i koden ?

Re: Kan inte få LCD display att fungera

Postat: 22 augusti 2010, 23:56:43
av ToPNoTCH
Nu begriper jag inte C, men det där ser inte ut som en initiering av en HD44780

Har du kollat http://www.elektronikforumet.com/wiki/i ... le=HD44780

Re: Kan inte få LCD display att fungera

Postat: 23 augusti 2010, 00:10:35
av sodjan
> men det där ser inte ut som en initiering av en HD44780

Nej, det gör det ju inte. Antingen är det inte all kod, eller så
vet jfri riktigt vad han håller på med. Jag kollade inte så noga,
men antog att det helt enkelt inte var all kod...

Re: Kan inte få LCD display att fungera

Postat: 23 augusti 2010, 00:14:50
av jfri
15 mS för kort? Nåväl jag tiodubblade det till 150 mS och problemet kvarstår.
printf skriver till datorns serieport och det fungerar.

Re: Kan inte få LCD display att fungera

Postat: 23 augusti 2010, 00:17:26
av jfri
sodjan skrev:> men det där ser inte ut som en initiering av en HD44780

Nej, det gör det ju inte. Antingen är det inte all kod, eller så
vet jfri riktigt vad han håller på med. Jag kollade inte så noga,
men antog att det helt enkelt inte var all kod...
Nej det är inte all kod. Postade bara LCD funktionerna och den funktion som anropas inifrån dessa.

Re: Kan inte få LCD display att fungera

Postat: 23 augusti 2010, 00:23:08
av sodjan
OK, så var är din init av LCD'n ?

> printf skriver till datorns serieport och det fungerar.

Det är oklart vad det är du kallar "datorn".

Re: Kan inte få LCD display att fungera

Postat: 23 augusti 2010, 09:39:23
av sugarman64
Eftersom jag inte är en dängare på C så undrar jag hur denna rad fungerar

Kod: Markera allt

do {} while (TRUE);

Re: Kan inte få LCD display att fungera

Postat: 23 augusti 2010, 11:47:36
av snigelen
Det betyder: "Gör ingenting så länge TRUE != 0". Dvs programmet stannar där om TRUE är definierat till att vara icke noll. Så det är nog inte så bra att ha i det här fallet...

Re: Kan inte få LCD display att fungera

Postat: 23 augusti 2010, 13:00:09
av sugarman64
OK. Var väl det svar jag väntat mig. Nu är ju visserligen inte all kod bifogad men jag undrade lite hur man tar sig ifrån den där loopen. Eftersom det inte finns några statements mellan klammrarna.

Re: Kan inte få LCD display att fungera

Postat: 23 augusti 2010, 13:11:35
av sodjan
> Så det är nog inte så bra att ha i det här fallet...

Tja, vi vet ju inte syftet med den där koden. Eftersom det hela är
ihophafsat utan vettiga kommenterar så blir det bara gissningar.
Dock så ser det ju lite underligt ut med en delay *efter* loopen...

> men jag undrade lite hur man tar sig ifrån den där loopen.

Det finns flera sätt. Interrupt, brownout och/eller watchdog-timeout t.ex.

Re: Kan inte få LCD display att fungera

Postat: 23 augusti 2010, 13:15:52
av jesse
Det var ju inte den bäst kommenterade koden direkt. Vad är det meningen att funktionen LCDonoff() ska göra egentligen? Namnet på funktionen är lite dubbeltydigt? Sätt på och stäng sedan av? Hur som hest så är det ju klart att när man väl kommit dit så kommer du inte längre - du fastnar i do-while-satsen... Men ditt största problem är nog det som redan påpekats: Du måste initiera displayen först. Kolla TOpnOtch's länk ovan!