Fel tecken kommer ut på min LCD display *Löst problemet*

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Carmis
Inlägg: 72
Blev medlem: 2 december 2008, 16:54:53
Ort: Växjö

Fel tecken kommer ut på min LCD display *Löst problemet*

Inlägg av Carmis »

Jag har köpt en 2x20 tecken JHD202A LCD display på electrokit och försöker nu få den att fungera inför ett projekt.
Men efter att både ha läst datablad för ks0066 och hd44780 så kan jag omöjligt få den att fungera som den ska. Har läst att ks0066 ska fungera likadant som en hd44780 så jag testade med koden jag har använt på en sådan display och då får jag ut detta:
Bild
Datan jag skickar till displayen är en variabel som jag räknar upp med ett för varje bokstav och det som kommer ut är alltså 8 stycken likadana tecken på rad.
Vad är det som händer?

Koden jag använder är den följande:

Kod: Markera allt

char main(void)
{
	unsigned char test = 'a';
	DDRB = 0xFF;
	DDRD = 0xFF;
	PORTB = 0;
	PORTD = 0;
	TIMSK |= (1<<TOIE1);
	MCUCR |= (1<<SE);
	sei();

	init();

	PORTD = 0x02; //LCD data = 0x02
	PORTB |= (1<<PB2); //LCD enable = 1
	__asm__ __volatile__ ("sleep" ::);
	PORTB &= ~(1<<PB2); //LCD enable = 0

	PORTD = 0x0E; //LCD data = 0x0E
	PORTB |= (1<<PB2); //LCD enable = 1
	__asm__ __volatile__ ("sleep" ::);
	PORTB &= ~(1<<PB2); //LCD enable = 0

	PORTD = 0x14; //LCD data = 0x14
	PORTB |= (1<<PB2); //LCD enable = 1
	__asm__ __volatile__ ("sleep" ::);
	PORTB &= ~(1<<PB2); //LCD enable = 0

	PORTD = 0x80; //LCD data = 0x80
	PORTB |= (1<<PB2); //LCD enable = 1
	__asm__ __volatile__ ("sleep" ::);
	PORTB &= ~(1<<PB2); //LCD enable = 0

	while(1)
	{
		PORTD = test; //LCD data = test
		PORTB |= (1<<PB0); //LCD RS = 1
		PORTB |= (1<<PB2); //LCD enable = 1
		__asm__ __volatile__ ("sleep" ::);
		PORTB &= ~(1<<PB2); //LCD enable = 0

		test++;
	}
}

void init(void)
{
	setTimer1(sekund/10);
	TCCR1B |= (1<<CS12) + (1<<CS10);

	PORTB &= ~(1<<PB0); //LCD RS = 0
	PORTB &= ~(1<<PB1); //LCD RW = 0
	PORTB |= (1<<PB2); //LCD enable = 1
	__asm__ __volatile__ ("sleep" ::);
	PORTB &= ~(1<<PB2); //LCD enable = 0

	PORTD = 0x30; //LCD data = 0x30
	PORTB |= (1<<PB2); //LCD enable = 1
	__asm__ __volatile__ ("sleep" ::);
	PORTB &= ~(1<<PB2); //LCD enable = 0

	PORTD = 0x30; //LCD data = 0x30
	PORTB |= (1<<PB2); //LCD enable = 1
	__asm__ __volatile__ ("sleep" ::);
	PORTB &= ~(1<<PB2); //LCD enable = 0

	PORTD = 0x30; //LCD data = 0x30
	PORTB |= (1<<PB2); //LCD enable = 1
	__asm__ __volatile__ ("sleep" ::);
	PORTB &= ~(1<<PB2); //LCD enable = 0

	PORTD = 0x38; //LCD data = 0x38
	PORTB |= (1<<PB2); //LCD enable = 1
	__asm__ __volatile__ ("sleep" ::);
	PORTB &= ~(1<<PB2); //LCD enable = 0

	PORTD = 0x08; //LCD data = 0x08
	PORTB |= (1<<PB2); //LCD enable = 1
	__asm__ __volatile__ ("sleep" ::);
	PORTB &= ~(1<<PB2); //LCD enable = 0

	PORTD = 0x01; //LCD data = 0x01
	PORTB |= (1<<PB2); //LCD enable = 1
	__asm__ __volatile__ ("sleep" ::);
	PORTB &= ~(1<<PB2); //LCD enable = 0

	PORTD = 0x06; //LCD data = 0x06
	PORTB |= (1<<PB2); //LCD enable = 1
	__asm__ __volatile__ ("sleep" ::);
	PORTB &= ~(1<<PB2); //LCD enable = 0
}
Senast redigerad av Carmis 26 april 2009, 13:02:08, redigerad totalt 1 gång.
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Re: Fel tecken kommer ut på min LCD display

Inlägg av thepirateboy »

Vad gör __asm__ __volatile__ ("sleep" ::); ?

Vad händer om du lägger in en delay före test++ (t ex _delay_ms(20);)

Ska du inte sätta RS till 0 också?
Användarvisningsbild
Carmis
Inlägg: 72
Blev medlem: 2 december 2008, 16:54:53
Ort: Växjö

Re: Fel tecken kommer ut på min LCD display

Inlägg av Carmis »

__asm__ __volatile__ ("sleep" ::); gör så att den utför assembler kommandot sleep, sen har jag satt en timer till att göra interrupt var 100e ms.

Jag har testat att lägga in delay före test nu, men det blir ingen skilland.

Var ska jag sätta RS till 0?

Upptäckte precis att displayen verkar köra i någon typ av 4-bitars mode även fast jag har satt den till 8-bitar.
När jag testar att räkna upp till 255 i 4-bitars mode skriver den ut alla olika tecken, fast i helt fel ordning, så här skriver den: Bild

Skrev om while loopen för 4-bitars mode:

Kod: Markera allt

	while(1)
	{
		PORTD = test; //LCD data = test
		PORTB |= (1<<PB0); //LCD RS = 1
		PORTB |= (1<<PB2); //LCD enable = 1
		__asm__ __volatile__ ("sleep" ::);
		PORTB &= ~(1<<PB2); //LCD enable = 0

		unsigned char temp = 0b00001111 & test;

		PORTD = temp*16;
		PORTB |= (1<<PB2); //LCD enable = 1
		__asm__ __volatile__ ("sleep" ::);
		PORTB &= ~(1<<PB2); //LCD enable = 0
		test++;
	}
Edit: La till bild

Edit2: Jag hade tydligen kopplat databitarna bakvänt, nu funkar det :)
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Re: Fel tecken kommer ut på min LCD display *Löst problemet*

Inlägg av thepirateboy »

Oki bra. Jag kollade på min egen kod och där sätter jag alltid RS till 0 efter data, men det ska inte behövas ser jag nu.
Användarvisningsbild
korp
Inlägg: 1216
Blev medlem: 30 maj 2006, 02:21:18
Ort: Strömstad

Re: Fel tecken kommer ut på min LCD display *Löst problemet*

Inlägg av korp »

Ett litet tips. Vinkla din kamera lite grann så att inte blixten slår rakt tillbaka. Det är en rätt enkel åtgärd för att få bilderna bättre, när du ändå lägger ner energi på att fota menar jag. :bravo:
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Fel tecken kommer ut på min LCD display *Löst problemet*

Inlägg av sodjan »

Enligt första bilden har du sekvenser med 8 lika tecken, sedan byter det.
Har du gjort en binär analys av de tecken som visas ? Det ser ut som
om du t.ex har 3 bitar som inte är ansutna eller något liknande. Samma sak
med det andra fallet där du får olika tecken men i "fel ordning". Har du
gjort någon analys alls av de tecken du skickar mot de tecken som visas ?
Du kanske har tolkat pinout till 2x7 kontakten fel ?

EDIT: Såg nu att du hade löst det och att det i princip var som jag trodde... :-)
Skriv svar