Problem med LCD och AVR

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Detraw
Inlägg: 630
Blev medlem: 31 januari 2004, 10:32:37
Ort: Stockholm (Nacka)

Problem med LCD och AVR

Inlägg av Detraw »

Halloj jag har tagit upp mitt projekt att lära mig AVR och LCDer nu efter sommaren igen, men nu när jag äntligen har lyckats att initiera LCDn har jag sprungit in i två problem.

För det första så lyckas jag bara initera de första 8 tecknen (det är en 1x16 teckens display) enligt databladet hanteras LCDn logiskt som en 2x8 teckens display, så jag initierar den som en två raders display, men lyckas ändå inte få igång de 8 sista tecknen, vad kan vara fel?

För det andra skriver den inte ut de tecknen som jag vill, när jag försöker skriva AB skriver den istället 00 och om jag försöker skriva ett "-tecken skriver den istället ett /-tecken. Vad kan detta bero på?

Jag kör LCDn i 4-bit mode och den är HD44780 kompatibel. LCDn jag använder är en Sharp LM161556

Jag hoppas att nån av er kan komma på en lösning, för det känns som om jag har testat allt nu....

EDIT: Desutom hoppar markören alltid två steg framåt varje gång jag initierar LCDn även fast jag försöker, förgäves, att skicka hem markören till första tecknet.

EDIT2: Här är databladet om det kanske hjälper nån att komma på en lösning

EDIT3: Jag har mixtrat runt massor nu och kommit fram till att den lyckas skriva de första 4-bitarna rätt när jag försöker skriva ett tecken, men de sista 4-bitarna blir alltid 0b1111 av nån anledning. Därav att tecknen alltid blir fel. Vad kan detta bero på?

EDIT4: Jag flyttade tråden hit till Microprocessor forumet istället för LCD forumet därför frågan kanske passar bättre här, och i hopp om att det ska finnas folk här som kan hjälpa mig.

och här följer min asm kod om nån kanske hittar nått fel där, den är lite stökig, men som sagt jag är fortfarande ganska ny på detta.

Kod: Markera allt

.include "m16def.inc"

.def temp = R16
.def temp_1 = R17
.def Delay1 = R18
.def Delay2 = R19

.def loader = R23
.equ controllport = PORTB
.equ dataport = PORTC
.equ DDRdataport = DDRC
.equ DDRcontrollport = DDRB
.equ PINdataport = PINC
.equ E = 2
.equ RS = 0
.equ RW = 1
.equ busy = 3

.org 0x0000
rjmp Reset

Reset:
	ldi temp,LOW(RAMEND)	;init stack
	out SPL,temp
	ldi temp,HIGH(RAMEND)
	out SPH,temp

	ldi R20, 0xFF
	ldi R21, 0xFF
	ldi R22, 0x04

	ldi temp_1, 0xFF
	out DDRC, temp_1
	out DDRD, temp_1
	out DDRB, temp_1
	
	rjmp START

.macro		enablePulse 
	nop 
	sbi		controllport,E 
	push	loader 
	pop		loader 
	nop 
	nop 
	cbi   controllport,E 
.endmacro 

START:
	rcall	LCDinit

	ldi		temp,0b01101001 ;A
	rcall	SendChartoLCD

;	ldi		temp,0x02 ;B
;	rcall	SendCMDtoLCD

	rjmp	loop

loop:
	sbi		PORTD, 4
	rjmp	loop

SendCMDtoLCD:
	mov     temp_1,temp     ; Copy data to temp_1
	swap    temp_1 			; get lower 4 bits
       
	andi	temp_1, 0b00001111	;mask off lower 4 bits
	out     PORTC,temp_1    ; write lower 4 bits to LCD  

	enablePulse

	andi	temp, 0b00001111	;mask off lower 4 bits
	out     PORTC,temp      ; write upper 4 bits to display
	
	enablePulse

	rcall	busyflag

	ret     				; return

SendChartoLCD:
	sbi		controllport,RS
	rcall	SendCMDtoLCD
	cbi		controllport,RS

	ret

WAIT_2msec:
        ;ldi     Delay1,0x10 
		ldi		Delay1, 0xFF    
D24002: 
        ldi     Delay2,0xFF
D24001: dec     Delay2		
        brne    D24001		
        dec     Delay1		
        brne    D24002
        ret

warte5ms :
        ;ldi     Delay1,0x10 
		ldi		Delay1, 0xFF    
D240022: 
        ldi     Delay2,0xFF
D240011: dec     Delay2		
        brne    D240011		
        dec     Delay1		
        brne    D240022
        ret





;*********************************************
;**		LCD init                                  **
;*********************************************
LCDinit: 
	clr		loader 
	out		dataport,loader   
	out		controllport,loader    
	ser		loader 
	out		DDRdataport,loader          
	out		DDRcontrollport,loader 
    
	rcall	warte5ms   		
	rcall	warte5ms 
	rcall	warte5ms 
	rcall	warte5ms 
    
	ldi		loader,0x03		;initiering
	out		dataport,loader 
	enablePulse 
   
	rcall	warte5ms 
	rcall	warte5ms 
    
	ldi		loader,0x03		;initiering
	out		dataport,loader 
	enablePulse 
    
	rcall	warte5ms 
	rcall	warte5ms 
    
	ldi		loader,0x03		;initiering
	out		dataport,loader 
	enablePulse 
    
	rcall   warte5ms 
	rcall   busyflag			   
	ldi		temp, 0x02 		;enable 4-bit mode
	out		dataport,loader 
	enablePulse 
    
	rcall   busyflag 
    
	ldi		loader,0x0c 	;set interface length (4-bit mode) first nibble
	out		dataport,loader 
	enablePulse 

	ldi		temp, 0x08 		;set interface length (2 row, 5x7 size font) second nibble
	out		dataport,loader 
	enablePulse 
    
	rcall   busyflag 
    
	ldi		loader,0x01		;turn of LCD first nibble
	out		dataport,loader 
	enablePulse 
   
	rcall   busyflag 
    
	ldi		loader,0x00		;turn of LCD second nibble
	out		dataport,loader 
	enablePulse 
    
	rcall   busyflag 
    
	ldi		loader,0x00		;clear the LCD first nibble
	out		dataport,loader 
	enablePulse 
    
	rcall   busyflag 
    
	ldi		loader,0x01		;clear the LCD second nibble 
	out		dataport,loader 
	enablePulse 
   
	rcall   busyflag
	
	ldi		loader,0x00		;Set Cursor Move Direction first nibble 
	out		dataport,loader 
	enablePulse 
   
	rcall   busyflag 

	ldi		loader,0x06		;Set Cursor Move Direction second nibble 
	out		dataport,loader 
	enablePulse 
   
	rcall   busyflag

	ldi		loader,0x00		;Enable Display/Cursor first nibble 
	out		dataport,loader 
	enablePulse 
   
	rcall   busyflag 

	ldi		loader,0x0F		;Enable Display/Cursor second nibble 
	out		dataport,loader 
	enablePulse 
   
	rcall   busyflag
    
	in		loader,controllport 
	andi	loader,0xf8 
	out		controllport,loader 
	clr		loader 
	out		dataport,loader 
	sbi		PORTD, 3
	ret 
    

busyflag: 
	clr		loader 
	out		DDRdataport,loader 
	sbi		dataport, 3
	nop 
	cbi		controllport,RS 
	sbi		controllport,RW 
	nop 
	nop 
	sbi		controllport,E 
	push	loader 
	pop		loader 
	nop 
	nop 
	in		loader,PINdataport 
	cbi		controllport,E    
	nop 
	sbrs	loader,busy
	rjmp	busyende
	rjmp	busyflag 
    
busyende: 
	clr		loader 
	out		controllport,loader 
    
	ser		loader 
	out		DDRdataport,loader 
    
	ret
Tack på förhand
Daniel
Kent
Inlägg: 156
Blev medlem: 19 januari 2004, 10:48:05
Ort: Södra Dalarna
Kontakt:

Inlägg av Kent »

Har du lekt lite med denna? http://www.geocities.com/dinceraydin/dj ... cdsim.html

Detta är det enda jag kan hjälpa dig med. Hade problem med att få igång min LCD med PIC. Men det löste sig när jag riktigt fattade hur LCD'n funkade.
Men jag har fortfarande inte löst min kod så den blir enkel. För att skriva ett ord i assembler så måste jag lägga in mycket kod. Har inte orkat fundera på detta än dock.
mullemeck
Inlägg: 1306
Blev medlem: 27 maj 2003, 23:52:06
Ort: Lund
Kontakt:

Inlägg av mullemeck »

men testa köra den i 8-bitars läge istället, kan kanske funka bättre.
Detraw
Inlägg: 630
Blev medlem: 31 januari 2004, 10:32:37
Ort: Stockholm (Nacka)

Inlägg av Detraw »

Tackar kent, men tyvärr så får jag rätt resultat i simulatorn, men inte på min LCD sen :(

Hmm för att skicka ord till LCD kanske du kan ta lite tips från min kod, kolla på SendChartoLCD, det tycker jag iaf är en smart lösning

mullemeck: jag har tyvärr inte I/O pinnar kvar för att köra den i 8-bit mode, det är därför jag försöker få igång den i 4-bit mode
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg av karlstedt »

Jag har en kodsnutt från Allt om elektronik där dom kör lcd i 4bits mode. Kan skicka den koden om du vill ta en titt på den?
Den är för AT90S2313 om jag minns rätt men det ju bara att justera om något är galet.
Detraw
Inlägg: 630
Blev medlem: 31 januari 2004, 10:32:37
Ort: Stockholm (Nacka)

Inlägg av Detraw »

karlstedt ja det skulle va skit bra... har visserligen kollat på ett antal kodsnuttar, men ett till skadar aldrig, du kan väl maila den till mig, d_tenninge@hotmail.com är min adress. Tackar
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg av karlstedt »

Skickat nu..
Håll till godo.
Detraw
Inlägg: 630
Blev medlem: 31 januari 2004, 10:32:37
Ort: Stockholm (Nacka)

Inlägg av Detraw »

hmm tittade igenom koden nu, men det verkar som om de kör den i 8-bit och inte 4-bit, eller är det jag som bara har suttit för länge med den här skiten nu?

EDIT: hmm nu har jag mixtrat runt lite med min initiering, och nu börjar markören att blinka på första posititionen när jag initierar LCDn, men sen när jag ska försöka skriva ett tecken händer inget alls istället. :( Efter initiering är det väl bara att börjar skirva tecken, eller har jag missuppfattat det?
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg av karlstedt »

ja, det stämmer nog. Hade för mig att det var 4bits... Det var ett tag sedan jag höll på med detta.

my bad :oops:
Detraw
Inlägg: 630
Blev medlem: 31 januari 2004, 10:32:37
Ort: Stockholm (Nacka)

Inlägg av Detraw »

OK du har jag fixat de felsta problemen, tror jag. Bara en sak kvar nu. När jag försöker skriva ett tecken skrivs inte tecknet, markören hoppar bara ett steg framåt och lämnar en blank ruta efter sig, varför detta? kan det vara fel på min initiering eller hur jag skriver ut tecknen?

Så här ser iaf min initiering ut nu:

Kod: Markera allt

LCDinit: 
	clr		loader 
	out		dataport,loader   
	out		controllport,loader    
	ser		loader 
	out		DDRdataport,loader          
	out		DDRcontrollport,loader 
    
	rcall	warte5ms   		
	rcall	warte5ms 
	rcall	warte5ms 
	rcall	warte5ms 
    
	ldi		loader,0x03		;initiering
	out		dataport,loader 
	enablePulse 
   
	rcall	warte5ms 
	rcall	warte5ms 
    
	ldi		loader,0x03		;initiering
	out		dataport,loader 
	enablePulse 
    
	rcall	warte5ms 
	rcall	warte5ms 
    
	ldi		loader,0x03		;initiering
	out		dataport,loader 
	enablePulse 
    
	rcall   warte5ms 
	rcall   busyflag			
   
	ldi		temp, 0x02 		;enable 4-bit mode
	out		dataport,loader 
	enablePulse 
    
	rcall   busyflag 

;		ldi		temp, 0x00 		;enable 4-bit mode
;	out		dataport,loader 
;	enablePulse 
    
;	rcall   busyflag 
    
	ldi		loader,0x02;0x0c 	;set interface length (4-bit mode) first nibble
	out		dataport,loader 
	enablePulse 

	ldi		temp, 0x08 		;set interface length (2 row, 5x7 size font) second nibble
	out		dataport,loader 
	enablePulse 
    
	rcall   busyflag 
    
	ldi		loader,0x00;1		;turn off LCD first nibble
	out		dataport,loader 
	enablePulse 
   
	rcall   busyflag 
    
	ldi		loader,0x08;0		;turn off LCD second nibble
	out		dataport,loader 
	enablePulse 
    
	rcall   busyflag 
    
	ldi		loader,0x00		;clear the LCD first nibble
	out		dataport,loader 
	enablePulse 
    
	rcall   busyflag 
    
	ldi		loader,0x01		;clear the LCD second nibble 
	out		dataport,loader 
	enablePulse 
   
	rcall   busyflag
	
	ldi		loader,0x00		;Set Cursor Move Direction first nibble 
	out		dataport,loader 
	enablePulse 
   
	rcall   busyflag 

	ldi		loader,0x06		;Set Cursor Move Direction second nibble 
	out		dataport,loader 
	enablePulse 
   
	rcall   busyflag

	ldi		loader,0x00		;Enable Display/Cursor first nibble 
	out		dataport,loader 
	enablePulse 
   
	rcall   busyflag 

	ldi		loader,0x0F		;Enable Display/Cursor second nibble 
	out		dataport,loader 
	enablePulse 
   
	rcall   busyflag
    
	in		loader,controllport 
	andi	loader,0xf8 
	out		controllport,loader 
	clr		loader 
	out		dataport,loader 
	sbi		PORTD, 3
	ret 
    

busyflag: 
	clr		loader 
	out		DDRdataport,loader 
	sbi		dataport, 3
	nop 
	cbi		controllport,RS 
	sbi		controllport,RW 
	nop 
	nop 
	sbi		controllport,E 
	push	loader 
	pop		loader 
	nop 
	nop 
	in		loader,PINdataport 
	cbi		controllport,E    
	nop 
	sbrs	loader,busy
	rjmp	busyende
	rjmp	busyflag 
    
busyende: 
	clr		loader 
	out		controllport,loader 
    
	ser		loader 
	out		DDRdataport,loader 
    
	ret
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Byt plats på ordningen du skickar nibblarna i, i tecknet som du vill skriva (i SendCMDtoLCD). Nu skickar du den lägsta nibblen innan den högsta. Gör tvärtom. Om jag inte ser fel.

Har du kopplat D4 till PC0, D5 till PC1, D6 till PC2 och D7 till PC3?
Detraw
Inlägg: 630
Blev medlem: 31 januari 2004, 10:32:37
Ort: Stockholm (Nacka)

Inlägg av Detraw »

tackar cykze, jag ska testa att ändra det nu. och japp jag har kopplat D4 till PC0 och så vidare

EDIT: hmm om jag inte har helt fel så är min SendCMDtoLCD rätt, bara jag som har kallat nibblarna fel i komentarerna, eller har jag fel?

EDIT2: jag ändrade nu som du sa, men det gav samma resultat, inget tecken... just nu försöker jag skriva en svart fyrkant 0xFF som det funkar inte heller, då ska det ju inte spela nån roll om man skickar de höga eller de låga först... tack ändå
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Rätta mig om jag har fel. Men 0xFF genererar väl just en tom ruta på LCDer?
Detraw
Inlägg: 630
Blev medlem: 31 januari 2004, 10:32:37
Ort: Stockholm (Nacka)

Inlägg av Detraw »

oj.. :shock: det har du så rätt i... suck ibland blir man ju helt sned på sig själv....

nu kommer det iaf ett tecken när jag skriver ett iaf, men det blir inget tecken som ska finnas i LCDn, utan det verkar som om den bara visar japanska tecken eller liknande.... jag hittar inte tecknen i ascii tabellen iaf

ett stort tack föresten PaNiC :D

EDIT: :shock: :shock: nu har jag suttit med dett förläng utan pause det märker jag... försökte skriva 0x01000001 istället för 0b01000001 :shock: men nu funkar den iaf verkar det som... tack alla för hjälpen....
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Detraw: Sorry. Blev lite väl förvirrande för mig när kommenteren var fel och att jag blandade ihop temp och temp_1. :oops:

Konstigt det där med att du inte får rätt tecken. Prova att skriva ut en massa olika tecken, till du hittar något du känner igen och undersök vilket värde du skickade för att få det tecknet.
Skriv svar