DEM20486 LCD ei toimi

Tervehdys kaikki,

Olen tässä viikon ajan koittanut saada toimimaan DEM20486 LCD moduulia. Moduuli käyttää ohjaukseensa Samsungin KS0066 piiriä, joka käsittääksei pitäisi olla yhteensopiva HD44780 kanssa.

Moduuli on kytketty AVR AtMega168 seuraavasti:

Moduulin olisi tarkoitus toimia 4-bit modessa.

Kytkennät:
PORTC 0 - 3 ‚Üí LCD DB4-7
PORTC 4 ‚Üí LCD RS
PORTC 5 ‚Üí LCD RW
PORTD 7 ‚Üí LCD EN

Olen koittanut vaikka mitä ( valmiita lcd kirjastoja, sekä koittanut saada omalla koodilla toimimaan ). Mikään ei näytä auttavan. LCD ledit palavat hienosti, mutta siihen se sitten jääkin. Eli LCD moduulin näyttöön en ole saanut missään välissä näkyviin yhtikäs mitään. Itselläni on vastaavia LCD moduuleja 2 kpl joista kumpikaan ei ole ollut yhteistyö haluisia.

Kytkennät olen tarkistanut moneen otteeseen eikä niissäkään vikaa pitäisi olla.

Osaisiko joku fiksumpi sanoa jotain suuntaa antavaa mikä LCD näytössä voisi olla vikana? Vai voiko kummatkin LCD moduuleista olla rikki?

Laitan viimeisimmän oma kirjoittamani LCD driverin koodin.

#define F_CPU 20000000UL

#include <avr/io.h>
#include <util/delay.h>

#define LCD_DDR_1		DDRC
#define	LCD_DDR_2		DDRD
#define LCD_DATA_PORT		PORTC
#define LCD_DATA_PIN4		0
#define LCD_DATA_PIN5		1
#define LCD_DATA_PIN6		2
#define LCD_DATA_PIN7		3
#define LCD_RS_PORT		PORTC
#define LCD_RS_PIN		4
#define LCD_RW_PORT		PORTC
#define LCD_RW_PIN		5
#define LCD_EN_PORT		PORTD
#define LCD_EN_PIN		7

void enableLcd()
{
	LCD_EN_PORT |= LCD_EN_PIN;
	_delay_us( 1 );
	LCD_EN_PORT &= LCD_EN_PIN;	
}

void initLcd()
{

	LCD_DDR_1 = 0xFF;
	LCD_DDR_2 = 0xFF;

	LCD_RS_PORT &= ~LCD_RS_PIN;
	LCD_RW_PORT &= ~LCD_RW_PIN;
	LCD_EN_PORT &= ~LCD_EN_PIN;

	_delay_ms( 35 );

	LCD_DATA_PORT = 0x0A;
	enableLcd();

	_delay_us( 44 );

	LCD_DATA_PORT = 0x0E;
	enableLcd();
	
	_delay_us( 44 );

	LCD_DATA_PORT = 0x01;
	enableLcd();

	_delay_ms( 2 );

	LCD_DATA_PORT = 0x04;
	enableLcd();

}

void writeLcd()
{
	LCD_DATA_PORT = 0x04;
	LCD_RS_PORT |= LCD_RS_PIN;

	enableLcd();

	LCD_RS_PORT &= ~LCD_RS_PIN;

	_delay_us( 44 );
}

int main()
{

	initLcd();

	writeLcd();

	while( 1 )
	{
	
	}

	return 0;
}

Huomasithan, että kirjoittaessasi väylälle tietoa (LCD_DATA_PORT = 0x0A), kirjoitat samalla kaikki kontrollipinnit nollille?

Eikös näin ole tarkoituskin?

e-lab.de/diverse/DEM20486.pdf

Moduulin speksissä kappaleessa 13 ( LCD INITIALIZING BY INSTRUCTION )

13 - 2 4-bit interface mode --> Function Set

Kuten huomaat controlli pinnit RS ja RW tulee olla nollana.

enablelcd() funktio ei luultavasti pelaa kuten olet ajatellut. Enable signaali ei ainakaan sen toimesta mene alas.

Hyvä huomio.

Korjasin tuon + tein muutakin muutosta, mutta ei tahdo vieläkään toimia. :confused:

#define F_CPU 20000000UL

#include <avr/io.h>
#include <util/delay.h>

#define LCD_DDR_1		DDRC
#define	LCD_DDR_2		DDRD
#define LCD_DATA_PORT		PORTC
#define LCD_DATA_PIN4		0
#define LCD_DATA_PIN5		1
#define LCD_DATA_PIN6		2
#define LCD_DATA_PIN7		3
#define LCD_RS_PORT		PORTC
#define LCD_RS_PIN		4
#define LCD_RW_PORT		PORTC
#define LCD_RW_PIN		5
#define LCD_EN_PORT		PORTD
#define LCD_EN_PIN		7

void enableLcd()
{
	LCD_EN_PORT |= LCD_EN_PIN;
	_delay_us( 1 );
	LCD_EN_PORT &= ~LCD_EN_PIN;	
}

void initLcd()
{

	LCD_DDR_1 = 0xFF;
	LCD_DDR_2 = 0xFF;

	LCD_RS_PORT &= ~LCD_RS_PIN;
	LCD_RW_PORT &= ~LCD_RW_PIN;
	LCD_EN_PORT &= ~LCD_EN_PIN;

	_delay_ms( 35 );


	LCD_DATA_PORT = 0x02;
	enableLcd();
	LCD_DATA_PORT = 0x02;
	enableLcd();
	LCD_DATA_PORT = 0x00;
	enableLcd();

	_delay_us( 44 );

	LCD_DATA_PORT = 0x00;
	enableLcd();
	LCD_DATA_PORT = 0x0F;
	enableLcd();
	
	_delay_us( 44 );

	LCD_DATA_PORT = 0x00;
	enableLcd();
	LCD_DATA_PORT = 0x01;
	enableLcd();

	_delay_ms( 2 );

	LCD_DATA_PORT = 0x00;
	enableLcd();
	LCD_DATA_PORT = 0x07;
	enableLcd();

}

void writeLcd()
{
	LCD_DATA_PORT = 0x0F;
	LCD_RS_PORT |= LCD_RS_PIN;

	enableLcd();

	LCD_RS_PORT &= ~LCD_RS_PIN;

	_delay_us( 44 );
}

int main()
{

	initLcd();

	DDRB = 0xFF;

	while( 1 )
	{
		writeLcd();

		//PORTB ^= 0xFF;

		_delay_ms( 20 );
	}

	return 0;
}

Hmm. alustukset näyttää olevan OK.

Muuten näkykö alussa ennen kun alustetaan näytö yhtään mustia ruutuja?

Mietin ett√§ onko toi pin3 LCD Driver ‚Äúk√§yttis‚ÄĚ / kontrasti j√§nnite oikein.

Mustia ruuttuja ei ole näkyny missään vaiheessa. Olen vetänyt tuohon LCD Driver pinniin saman mitä VCC eli suoraa 5V jännite jänniteregulaattorilta.

Speksin mukaan LCD driver jännite pitäisi olla korkeampi kuin käyttöjännite
, mikäli oikein tulkitsin taulukkoa.

Hmm VDD +0.3… Voisiko tosiaan olla tuosta kiinni ettei toimi?

ite kyllä tulkitsen tuon että VDD tai max 15v Vdd:tä matalampi
‚ÄúVdd-15.0 ~ Vdd + 0.3‚ÄĚ

Edit:
Yleensä toi pin3 on kytketty trimmerin keskinastaan, joka on VDD:n ja GND:n välillä

Joissain tapauksissa/vanhemmissa LCD näytöissä tuo vaatii negatiivisen jännitteen.

Ongelma ratkesi. :smiley:

‚ÄúVika‚ÄĚ oli siin√§, ett√§ tosiaan sy√∂tin Pin3 Kontrasti pinniin 5V joka tarkoittaa = Tekstin kirkkaus t√§ysill√§. Kolvasin pin3 s√§√§t√∂vastuksen ja nytten pelitt√§√§ hienosti.

OK
Hyvä että lähti jotenkin pelittää :slight_smile: