Sida 1 av 3

Lyckas inte skriva på rad 2 på min LCD...

Postat: 5 oktober 2010, 16:50:20
av PHermansson
Testar lite med PicKit2:s utvecklingskort och har lött på en HD44780-kompatibel LCD. Jag lyckas skriva vad jag vill på rad 1, men inget på rad två? Lite kod:

Kod: Markera allt

	movlw	0x0
	call	LCD_SetLocation
	movlw	"s"
	call	LCD_Data

	movlw	0x4
	call	LCD_SetLocation
	movlw	"2"
	call	LCD_Data

	movlw	0x40
	call	LCD_SetLocation
	movlw	"M"
	call	LCD_Data

Det blir ett "s" till vänster på första raden, en "2" på femte positionen. Men ser inget M, och då har jag ändå provat en massa värden att skicka till LCD_SetLocation? Hmm?

Kod: Markera allt


;--------------------------------------------------------
; LCD Set Location
;--------------------------------------------------------
LCD_SetLocation
	iorlw	80H
	goto	LCD_Cmd

;--------------------------------------------------------
; LCD Send Data
;--------------------------------------------------------
LCD_Data
	movwf	DispData		; Save Data
	swapf	DispData, w		; Swap Nibbles
	call	LCD_OutData		; Output first Nibble
	movf	DispData, w		; Retreive Data
	call	LCD_OutData		; Output second Nibble
	call	LCD_Sleep50u
	return	

;--------------------------------------------------------
; LCD Send Command
;--------------------------------------------------------
LCD_Cmd
	movwf	DispData		; Save Data
	swapf	DispData, w		; Swap Nibbles
	call	LCD_OutCmd		; Output First Nibble
	movf	DispData, w		; Retreive Data
	call	LCD_OutCmd		; Output Second Nibble
	call	LCD_Sleep
	return

LCD_OutCmd
	andlw	0x0F			; LCD RS Pin = 0 (Command)
LCD_PulseEnable
	movwf	PORTC
	iorlw	0x20			; LCD EPin = 1 (Enable Transfer)
	movwf	PORTC
	andlw	0x1F			; LCD EPin = 0 (End Transfer)
	movwf	PORTC
	return

;--------------------------------------------------------
; LCD Sleep 5m
;--------------------------------------------------------
LCD_Sleep
	call	LCD_Sleep1m
	call	LCD_Sleep1m
	call	LCD_Sleep1m
	call	LCD_Sleep1m
	call	LCD_Sleep1m
	return


Re: Lyckas inte skriva på rad 2 på min LCD...

Postat: 5 oktober 2010, 16:56:02
av sodjan
> och då har jag ändå provat en massa värden

Men tydligen inte tillräckligt många. :-)

Har du något datablad till just din LCD som verifierar att
det är just h'40' som är rätt adress ? Ofta är det det, men...

Fixa koden så att den loopar igenom alla adresser och se vad som händer.

> movlw 0x40
> iorlw 80H

Varför inte ha *ett* sett att ange konstanter ?

Re: Lyckas inte skriva på rad 2 på min LCD...

Postat: 5 oktober 2010, 17:53:30
av PHermansson
Mmm får nog prova en loop. Databladet är svårhittat, beteckningen jag ser på LCD:n är "YJ-802A" och jag tror jag köpt den av dig en gång i tiden.
Jag hittar den omnämnd här; http://www.mikrocontroller.net/topic/119844, spåren leder till en LCD med beteckningen SD0802A. Den hittar jag några datablad för, men inget som avhandlar mjukvaran...

Varför inte ett sätt att ange konstanter? För att... ja för att jag inte tänkt på det? :)

Re: Lyckas inte skriva på rad 2 på min LCD...

Postat: 5 oktober 2010, 18:04:41
av ToPNoTCH
Är den rätt initierad ? (datblad + kod saknas)
Det ser rätt ut annars

Lite långsökt (då du har liv i den) men har du provat att lägga in lite fördröjningar ?

p.s
Personligen tyckte jag det blev lite rörigt med iorlw och andlw i PulseEnable rutinen. Jag tycker defines på RS & E och bsf/bcf blir mer lätt att förstå och portera.
Men det är ju en smaksak.
Ex.

Kod: Markera allt

#define	RS  PORTB,4
#define	E   PORTB,6
.
.
.
bcf E
bcf RS
d.s

Re: Lyckas inte skriva på rad 2 på min LCD...

Postat: 5 oktober 2010, 18:12:16
av PHermansson
Ja databladet saknas, jag vet :)

Initieringskoden:

Kod: Markera allt

;--------------------------------------------------------
; LCD Initialization
;--------------------------------------------------------
LCD_Init
    call    LCD_Sleep        ; Wait
    call    LCD_Sleep
    call    LCD_Sleep
    movlw    0x03            ; Set 4 bit mode
    call    LCD_OutCmd
    call    LCD_Sleep
    movlw    0x03            ; Set 4 bit mode
    call    LCD_OutCmd
    call    LCD_Sleep
    movlw    0x03            ; Set 4 bit mode
    call    LCD_OutCmd
    call    LCD_Sleep
    movlw    0x2E            ; Set 2 Lines and 5x10 Characters
    call    LCD_Cmd
    movlw    0x0C            ; Display On off Control (Display on, Cursor off, Blink off)
    call    LCD_Cmd
    movlw    0x06            ; Set Direction: Increment and No Display Shift
    call    LCD_Cmd
    call    LCD_Clear
    call    LCD_Home
    return
Bra tips annars, ska snygga till koden när jag fått det att fungera.

Re: Lyckas inte skriva på rad 2 på min LCD...

Postat: 5 oktober 2010, 18:36:55
av ToPNoTCH
Det ser inte rätt ut :humm:

Har du tänkt på att det är 4 MSB som används när du initierar mot 4-bit.
(Det funkar ju om du kopplat D7-D4 på displayen till motsv. PORTC.3-PORTC.0 på MCU'n)

Men det känns i övrigt som det saknas kommandon för initiering överlag.
Kolla igenom WIKIN http://elektronikforumet.com/wiki/index ... le=HD44780 och då särskilt under rubriken "4-bitarsinterface"

Re: Lyckas inte skriva på rad 2 på min LCD...

Postat: 5 oktober 2010, 18:55:53
av PHermansson
Min fina loop ger en rad med nollor på första raden, inget på den andra :/
Kollade lite annan kod och jo det verkar som att det fattas init-kommandon. Men det blir inte bättre när jag använder denna kod (tagen delvis från Wikin):

Kod: Markera allt

LCD_Init
    call    LCD_Sleep        ; Wait
    call    LCD_Sleep
    call    LCD_Sleep
    movlw    0x03            ; Set 4 bit mode
    call    LCD_OutCmd
    call    LCD_Sleep
    movlw    0x03            ; Set 4 bit mode
    call    LCD_OutCmd
    call    LCD_Sleep
    movlw    0x03            ; Set 4 bit mode
    call    LCD_OutCmd
    call    LCD_Sleep

    movlw    b'0010'
    call    LCD_Cmd
    movlw    b'0010'
    call    LCD_Cmd
    movlw    b'1000'
    call    LCD_Cmd
    movlw    b'0000'
    call    LCD_Cmd
    movlw    b'1000'
    call    LCD_Cmd
    movlw    b'0000'
    call    LCD_Cmd
    movlw    b'0001'
    call    LCD_Cmd
    movlw    b'0000'
    call    LCD_Cmd
    movlw    b'0110'
    call    LCD_Cmd

    call    LCD_Home
    call    LCD_Clear

Re: Lyckas inte skriva på rad 2 på min LCD...

Postat: 5 oktober 2010, 18:57:08
av sodjan
Om *fel* 4-bitar var kopplade så vore det väl lite märkligt (eller tur/otur)
om allt fungerade mot första raden på LCD'n.

Men visst, det hemlighålls ju hur det hela är kopplat, så det
blir mest gissningar...

Re: Lyckas inte skriva på rad 2 på min LCD...

Postat: 5 oktober 2010, 19:01:02
av bearing
Har för mig att en av bitarna i initieringen väljer ifall displayen ska vara en- eller tvåradig, så ifall den biten är fel kommer så klart inte rad 2 fungera.

Re: Lyckas inte skriva på rad 2 på min LCD...

Postat: 5 oktober 2010, 19:14:36
av sodjan
> movlw 0x2E ; Set 2 Lines and 5x10 Characters

Har du någon ref till det ?
Prova annars med 0x28 och se om det blir någon skillnad.

Re: Lyckas inte skriva på rad 2 på min LCD...

Postat: 5 oktober 2010, 19:30:31
av ToPNoTCH
Om vi börjar med din första kod så skickar du ju 0x2E för mot funktionset för att (enligt kommentaren) "Set 2 Lines and 5x10 Characters"

Det blir ju lite svårt att överföra på 4-bitar (och jag hänger inte med hur du kommit fram till det värdet).

Skall se om jag ser något i den andra koden.

EDIT:Sodjan hann emellan (inte helt ovanligt)

Re: Lyckas inte skriva på rad 2 på min LCD...

Postat: 5 oktober 2010, 19:54:30
av sodjan
ToPNoTCH, jag är inte helt med på vad du menar, är det att det
är svårt (eller itne går) att ställa in 4-bit mode med bara 4-bitar anslutna ?
Det går självklart. Man jag kannske missförstog dig.

Det jag menade var att i min HD44780 manual so ska det vara en
"0" i kommendot där PHermansson har en "1". vet inte om det är avgöande,
det var därför jag skrev "testa med"...

Re: Lyckas inte skriva på rad 2 på min LCD...

Postat: 5 oktober 2010, 20:21:43
av ToPNoTCH
Nja det är klart det går.
Men att skicka 0x2E med 4-bitar och ett kommando går inte.

EDIT: Jag gör en pudel här. Observerade inte att han två olika rutiner för att skicka kommandon i både 8 och 4 bit. My misstake.

Re: Lyckas inte skriva på rad 2 på min LCD...

Postat: 5 oktober 2010, 20:35:28
av ToPNoTCH
Här är en initiering som jag använder med framgång på tre olika fabrikat av 2X16 diplayer.
Här är ju då PORTC7-4 ansultet till displayens D7-D4, så om TS skall tillämpa den (med den misstänkta kopplingen C3-C0 till diplayen D7-D4) så får denne tänka bort 4 MSB i varje kommando.

(Tabbarna blir lite konstiga i CODE sektioner)

Kod: Markera allt

	bcf			E
	bcf			RS

	call		Delay15ms
   movlw      b'00110000'
   movwf      PORTC
	bsf			E
	call		Delay1ms
	bcf			E
	bsf			E
	call		Delay1ms
	bcf			E
	bsf			E
	call		Delay1ms
	bcf			E

	movlw		b'00100000'
	call		send_command
	movlw		b'00100000'
	call		send_command
	movlw		b'10000000'
	call		send_command
	movlw		b'00000000'
	call		send_command
	movlw		b'11000000'
	call		send_command
	movlw		b'00000000'
	call		send_command
	movlw		b'00010000'
	call		send_command
	movlw		b'00000000'
	call		send_command
	movlw		b'01100000'
	call		send_command

Re: Lyckas inte skriva på rad 2 på min LCD...

Postat: 6 oktober 2010, 08:45:48
av PHermansson
Displayen är kopplad enligt detta schema:

Bild

http://www.nldv.com/2010/02/pic-16f690- ... r-lcd-8x2/

'28' eller '2E' gör inget skillnad.