Får inte LCDn att fungera

Lysdioder, Optiska sensorer, Fiberoptik, Displayer, Lasrar, Optiska kopplare
Nickeh
Inlägg: 82
Blev medlem: 9 augusti 2006, 00:41:37
Ort: Linköping
Kontakt:

Får inte LCDn att fungera

Inlägg av Nickeh »

Sitter och försöker få min HD44780 LCD att fungera i 4-bits läge hittade lite info om det och har läst databladen men får det inte att fungera.

Som det ser ut nu så startar displayen och har översta raden svart, sedan så skickar jag följande kommandon

Kod: Markera allt

R/S | D4-D7
0   | 0011      function set 8 bit
0   | 0011 
0   | 0011
0   | 0010      function set 4 bit
0   | 0010      första delen av:
0   | 1010      Function set 2 lines 
0   | 0000      första delen av:
0   | 1000      Display off
0   | 0000      första delen av: 
0   | 0001      Clear Display
0   | 0000      första delen av:
0   | 0110      Set Entrymode
0   | 0000      första delen av:
0   | 1111      Display on, cursor, blink
Detta resulterar i att displayen blir helt tom först för att sedan återgå till att visa den svarta linjen och sedan tillbaka till att vara helt tom. Ingen markör eller något.

Har lagt in rätt delays som är väl tilltagna om man kollar i databladet vad som rekommenderas.


Kikade på denna tråd och det gav rätt mycket men hittar inte riktigt någon lösning...
http://www.elektronikforumet.com/forum/ ... 80&start=0

hoppas att någon här kan klura ut detta för jag börjar få slut på ideér nu[/code]
Senast redigerad av Nickeh 24 september 2006, 20:27:22, redigerad totalt 1 gång.
Användarvisningsbild
björn
EF Sponsor
Inlägg: 2570
Blev medlem: 29 mars 2004, 23:09:55

Inlägg av björn »

Jag kan inte se några fel nu direkt, kolla dock om du har gjort rätt på "increment display shift" vilket jag får till att det ska vara

Kod: Markera allt

0001
01XX (X=dont care)
Togglar du E enligt databladet?

EDIT: Nej, du har gjort rätt på Increment med.
Nickeh
Inlägg: 82
Blev medlem: 9 augusti 2006, 00:41:37
Ort: Linköping
Kontakt:

Inlägg av Nickeh »

Det verkar onekligen vara något med togglingen utav E som strular.
Skulle koppla en LED till den för att se vad som skedde. Kopplade först fel så att E blev konstant hög och helt plötsligt så fungerade allt som det skulle

Problemet nu är att jag inte får det att fungera utan E knuten till 5v

Har testat att lägga in större delay för att öka toggle tiden men det verkar inte ge något vidare resultat

Komm till ett läge där displayen visade en massa citattecken och i slutet det tecken som jag testat att skriva ut....

Kod: Markera allt

SENDNIB				;Sends a nibble
				;In: nibToSend 
	clrf	W
	movf	nibToSend, 0	;Load nibble into W
	movwf	PORTB		;Send nibble
	nop
	nop
	nop
	bsf	PORTA,lcdE	;Pulse the LCD Enable high
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop	
	nop
	bcf	PORTA,lcdE	;lower LCD enable
	nop
	nop
	nop	
	return
[/code]
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Kan du förtydliga, fungerar det nu eller inte ?
Nickeh
Inlägg: 82
Blev medlem: 9 augusti 2006, 00:41:37
Ort: Linköping
Kontakt:

Inlägg av Nickeh »

Som det ser ut nu så fungerade det då jag kopplat E till 5v. Kör jag utan det så beror resultatet lite på hur lång puls jag lägger på E.
Har testat med både väldigt långa delays vilket resulterade i att skärmen visade ca 20 st citattecken och sedan det tecken jag ville visa. Och med kortare pulser så är skärmen oftast helt blank (Ingen markör) efter initieringen.


E är kopplad på RA0 och comparatorn är avstängd är det något annat som kan orsaka problem där?

I data bladet för LCDn så står det att längden på pulsen till E ska vara minst 480 ns vilket borde räcka med några nop som jag gjort i koden ovan.
Den där koden är tagen från exempel på piclist så helt fel kan den ju inte vara.

Hoppas att jag lyckats få med den info som behövs nu.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> En annan tanke är att bygga en sådan programmerare.

Viken processor och vilka pinnar använder du (och till vad) ?
Nickeh
Inlägg: 82
Blev medlem: 9 augusti 2006, 00:41:37
Ort: Linköping
Kontakt:

Inlägg av Nickeh »

Såhär har jag kopplat LCDn till en PIC 16F628A

Kod: Markera allt

; LCD		PIC
; RS (6)	RA2(1)
; R/W (7)	RA1(18)
; E (8)		RA0(17)
; DB4(13)	RB3(9)
; DB5(14)	RB2(8)
; DB6(15)	RB1(7)
; DB7(16)	RB0(6)
När jag kopplar in lysdioden (5+ -> LED -> Motstånd 330 Ohm -> RA0 ) så fungerar LCDn som det ska men då borde väl E ligga hög. Förstår inte riktigt varför det inte fungerar utan att koppla in LEDen men inte då jag bara har kopplat RA0 till E på LCDn

Tycker även att det är lite konstigt att LCDn inte bara matar ut en massa tecken helatiden iom att E alltid borde vara 1.

Någon som kan förklara vad som som händer när jag kopplat med dioden?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Tycker även att det är lite konstigt att LCDn inte bara matar ut en massa tecken helatiden iom att E alltid borde vara 1.

"E" är *flank* styrd, inte *nivå* styrd.
Minns inte vilken flank, men det vet vilket datablad som helst för en HD44780 display...

R/W, behöver du *läsa* från displayen ? Oftast lägger man den bara låg (till gnd). Spar en I/O pinne...

Du har stängt av komparatorerna (enligt databladet) ?

> Någon som kan förklara vad som som händer när jag kopplat med dioden?

Är förtfarande E kopplat till RA0 när dioden är inkopplad ?
Nickeh
Inlägg: 82
Blev medlem: 9 augusti 2006, 00:41:37
Ort: Linköping
Kontakt:

Inlägg av Nickeh »

>"E" är *flank* styrd, inte *nivå* styrd.
>Minns inte vilken flank, men det vet vilket datablad som helst för en HD44780 display...

Ska läsa på om det, har plöjt igenom datablad för displayen och ett anat som Icecap hade på sin hemsida.

>R/W, behöver du *läsa* från displayen ? Oftast lägger man den bara låg (till gnd). Spar en I/O pinne...

LCDn skall ännu inte användas i någon aplikation, är i rent lärningssyfte som jag har gjort detta. Kan ju inte skada att lära sig så mycket som möjligt när man väl har kopplat upp allt.

> Du har stängt av komparatorerna (enligt databladet) ?

Ja, tagit kod från exemplet på PORTA initiering från databladet


>Är förtfarande E kopplat till RA0 när dioden är inkopplad ?
Precis, kabeln till E är kopplad närmast RA0 och motstånd + LED några hål bort på labbplattan...


EDIT:
Efter en titt på databladet så förstår jag vad du meade med att E var flank styrd. Men jag blir ännu mera förbryllad för om jag förstår det rätt så bord ju displayen aldrig läsa när den är kopplad till 5 v. Om det inte blir någon nivåskillnad när RA0 ändar läge...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Du har en poäng där...

Men, det spelar ingen roll, en *puls* på E är det som ska användas för
att "klocka in" ett kommando eller data (i två delar "nibbles" i ditt fall).
Så om inte det fungerar så är något annat galet.

Jag vet inte vilket material du har arbetet med, men själv tyckte
jag att dessa två artiklar var användsbara i början :
http://www.epemag.wimborne.co.uk/resources.htm

Kolla de två PDF'erna mitt på sidan...
Nickeh
Inlägg: 82
Blev medlem: 9 augusti 2006, 00:41:37
Ort: Linköping
Kontakt:

Inlägg av Nickeh »

Har kikat igenom de där pdf:arna, riktigt bra faktist.
Fick mig att förstå en hel del om själva initieringen...


Ska ta ett kort på min labbplatta och lägga upp då det känns som att det är där som det är något galet, iom att koden är tagen ur olika exempel osv. Måste bara ladda batterier till kameran....

Kan längden på kabeln mellan E och RA0 spela någon roll?

Lägger in hela min kod ifall det är någon galen inställning eller nåogt liknande som jag gjort...

Kod: Markera allt

;****************************************************
; Pic LCD Driver
; LCD: HD44780 based
; Processor: 16F628A
; Creator: Nicklas Haraldsson
; Date: 2006-09-18
;
; Training program to interface with HD44780 LCDs
;
; Wiring:
; LCD		PIC
; RS (6)	RA2(1)
; R/W (7)	RA1(18)
; E (8)		RA0(17)
; DB4(13)	RB0(6)
; DB5(14)	RB1(7)
; DB6(15)	RB2(8)
; DB7(16)	RB3(9)
;
; Switches wired to PORTA
;
;*****************************************************

	list		p=16F628A
	#include	<p16F628A.inc>
	__CONFIG	_CP_OFF & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _INTOSC_OSC_NOCLKOUT & _MCLRE_ON & _LVP_OFF

;*****************
; Ram Definitions
;*****************

	CBLOCK	0x20
hiByte
loByte
LCDByte
counter_outer
counter_inner
nibToSend
d1
	ENDC

lcdRS	equ	2	;RS on RA0
lcdRW	equ	1	;RW on RA1
lcdE	equ	0	;E on RA2
;PortB used for data ports

;*****************
;Code begins here
;*****************
	org 0x0000

	clrf	PORTA
	clrf	PORTB
	movlw	0x07		; Disable comparators to enable
	movwf	CMCON		; pins for I/O
	bsf	STATUS,RP0	;RAM Page 1
	clrf	TRISA
	clrf	TRISB
	
	movlw	0xfe
	call	DelayXX		;Wait for everything to start
	movlw	0xfe
	call	DelayXX
	movlw	0xfe
	call	DelayXX
	movlw	0xfe
	call	DelayXX
	
Main	bcf 	PORTA, lcdE
	bcf	PORTA, lcdRS	;Prepare LCD for commands
	movlw 	b'0011' 	; 8 Bit
	movwf	nibToSend	; Send
	call	SENDNIB
	movlw	0xfe	
	call 	DelayXX	

	movlw 	b'0011' 	; 8 Bit
	movwf	nibToSend	; Send
	call	SENDNIB
	movlw	0xfe	
	call 	DelayXX	
;
; Resten av initieringe ser lika dan ut. ....
;
;
Loop
	goto	Loop


;******************
;Sub routines
;******************

LCDBYTE		;Sends a byte to LCD i 4 BIT
		;IN LCDByte	OUT: hiByte, loByte
	clrf	hiByte		;Clear vars
	clrf	loByte
	bcf	STATUS,0	;clear carry to avoid screwing bitshifting
	rlf	LCDByte, 1	;Rotate LCDByte left puting LCDByte<7> in the STATUS,0 Carry bit
	rlf	hiByte		;Move carry to hiByte
	rlf	LCDByte, 1	
	rlf	hiByte
	rlf	LCDByte, 1
	rlf	hiByte
	rlf	LCDByte, 1
	rlf	hiByte
	movf	LCDByte, 0	;Load LCDByte into W
	movwf	loByte		;And inte loByte
	swapf	loByte,	1	;Swap hi and lo nibble and put it back

	movf	hiByte, 0	;Move hiByte into w
	movwf	nibToSend	;Put it in the outbox
	call 	SENDNIB
	movf 	loByte,0
	movwf	nibToSend
	call 	SENDNIB	
	call	SHORTDLY	;Wait until instructions are done
	return

SENDNIB				;Sends a nibble
				;In: nibToSend 
	clrf	W
	movf	nibToSend, 0	;Load nibble into W
	movwf	PORTB		;Send nibble
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	bsf	PORTA,lcdE	;Pulse the LCD Enable high
	nop
	movlw	0x01
	call	DelayXX
	bcf	PORTA,lcdE	;lower LCD enable
	nop
	nop
	nop	
	nop
	nop
	nop
	return
;******************
;Delay XX 
;Usage: 
;	movlw 5 	;Bigger value delay longer (1...255) 
;	call DelayXX	;Delay 4+w
;
;******************

DelayXX	
	movwf	counter_outer	;Store delay time
	
loop_outer
	clrf	counter_inner	;Prepare inner loop
	
loop_inner
	decfsz	counter_inner	;dec and loop 256 times
	goto 	loop_inner	;1+2 inst x 256 (Delay period) 
	
	clrwdt			;Give the dog a bone
	decfsz	counter_outer	;Dec outer loop_outer	
	goto	loop_outer	; 1+1+2 inst x value of counter_outer
	
				;Total delay 4 * W + (3*256) * W	
				; Example W = 5
				; (4*5) + (3*256) * 5 = 20 + (768 * 5) =
				; 20 + 3840 = 3860 Instructioncycles

	retlw	0		;Return and clear w


SHORTDLY ;Around 50us
	movlw	0x48
	movwf	d1
SHORTDLY_0
	decfsz d1, f
	goto	SHORTDLY_0
				;4 cycles including call 
	return

	END
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Kontrollera din bank-hantering !
Den ser inte rätt ut.

TRISA/TRISB ligger i bank1, men variablerna som DelayXX använder ligger *inte* i bank1...

Tips, om du *vill* anropa DelayXX oberoende på vilken bank som för
tillfället är vald, lägg counter_outer och counter_inner från h'70', d.v.s
i det som kallas "unbanked memory".

Sen, skriv aldrig "bcf STATUS, 0" ! Använd symbolerna, d.v.s "bcf STATUS, C",
om det är Carry-flaggan som avses.

Sen kanske du har gjort det lite väl komplicerat med alla dina rotates.
Nornalt skriver man bara 4 bitar, gör en SWAP och skriver de andra 4 bitarna.
Nickeh
Inlägg: 82
Blev medlem: 9 augusti 2006, 00:41:37
Ort: Linköping
Kontakt:

Inlägg av Nickeh »

Antog att min kod inte skulle vara speciellt slipad. Är ju fortfarande i ett rätt tidigt stadium. Nu har jag en hel del att kolla över men nu är det dags att sova!

Tack för all input, ska kolla igenom koden i veckan och se om jag kommer någon vart.
Nickeh
Inlägg: 82
Blev medlem: 9 augusti 2006, 00:41:37
Ort: Linköping
Kontakt:

Inlägg av Nickeh »

Kollade över koden och ändrade det du påpekade och då fungerade det klockent!
Tusen tack för hjälpen!

Ska nu försöka skriva en LCDBYTE funktion som inte ändra de oanvända PORTB linorna så att man kan använda de till annat...
Skriv svar