LCD PIC problem

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
luffare
EF Sponsor
Inlägg: 132
Blev medlem: 4 oktober 2005, 16:25:21
Ort: Uppsala
Kontakt:

LCD PIC problem

Inlägg av luffare »

Hej här kommer ännu en tråd om att få igång en lcd :waving:
Har en lcd från kjell 2*16
4Mhz osc och delayrutiner från piclist:s mall.
Körde först med en pic16F84A. Då fick jag igång den men nästan alla tecken blev några andra. Kunde få fram det jag ville på skärmen genom att experimentera lite men det stämde inte med ascii tabellen i databladet. När man körde clear så gick pekaren till första raden men inga tecken raderades.
Bytte processor till en 16F867A istället för att utesluta att picen var paj eller bråkade med wispen(portb=db0-7). Då får jag en helt annat fel skärmen blir helt blank efter initieringen.
Har mixtrat med tiderna och bytt kristal men det ser inte ut att hjälpa, har jag missat nåt i initieringen av portarna? Har testat och mätt att alla portar gör det dom ska. lcd porten visar att det sista tecknet jag ville skriva ut är på(bit 0&5 på db0-7). Man ser att det händer något iallfall då jag väntar en sekund innan den initeras och då ser man svarta fyrkanter på 1 rad innan den blir blank...

Kod: Markera allt

;   Använder extosc på 4 Mhz.
;
;   E : RA0
;   RW:GND
;	RS: RA2
;   D1-D7 : Rc1-Rc7
; 
;
;**********************************************************************
	List	p=16F876A		;Val av pic
	Include	<P16F876A.inc>	;Inkluderar variabler etc för reg.
	__CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF  &_PWRTE_ON & _WDT_OFF & _hs_OSC & _LVP_OFF
	ERRORLEVEL	-302		;Visar inte jobbit felmedd...
;************************************************************
;VAriabler för utgångar	
	#define     LCD_E       PORTA, 1
   ; #define     LCD_RW      PORTA, 0
	#define     LCD_RS      PORTA, 2
    #define     LCDDAT	    PORTC		;8 data bitar.
;VAriabler för delay
	cblock 0x21
	d1
	d2
	d3	
	endc

;************************************************************	
	org 0x000				;Resetvektor (start av program)
	goto	init
;************************************************************
init						;Initiering av portar och register...
	banksel		adcon1		;Bank 1
	movlw		b'00000110'	;Stänger av alla Analoga I/O.
	movwf		adcon1		;så att alla blir Digitala..

	movlw		0x00		;Port A & B,C är utgångar
	movwf		trisa		
	movwf		trisb
	movwf		trisc
	banksel		porta		;Bank0	
	bcf			adcon0,adon	;stänger av A/D omvandlare.
	bcf			intcon,gie	;Stänger av Interupts.
	clrf		porta		;Rensar portarna
	clrf		portb
	clrf		portc
	clrw
;**********************************************************************
start
	call	Dly1s			;Väntar 1sek så allt hinner starta upp...
;	MOVLW	0XFF
;	MOVWF	LCDDAT
;	bsf		lcd_e
;	bcf		lcd_rs
;	GOTO	$
	call 	LCDinit
	call	dly1s
bsf	porta,3
	;movlw	0x01		;LCD clr
	;call	lcdwrc
	movlw	0x4b	;H
	call	lcdwr
	movlw	0x45	;E
	call	lcdwr
	movlw	0x4a	;J
	call	lcdwr
	movlw	0x20	;SPACE
	call	lcdwr
	movlw	0x44	;D
	call	lcdwr
	movlw	0x55	;U
	call	lcdwr
	movlw	0x21	;!
	call	lcdwr
	
	call	dly1s
	call	dly1s
	call	dly1s
	call	dly1s
	call	dly1s
;	movlw	0x00		;LCD clr
;	call	lcdwrc
loop	goto loop
;**********************************************************************
LCDinit
;	bcf		lcd_rw
	bcf		lcd_rs
	bcf		lcd_e
	call	Dly45ms
	call	dly5ms
	movlw	0x3c		;Function set: 2rader, 5x10pix, 8bitar
	call	LCDWRC
	call	dly5ms
	call	dly5ms

	movlw	0x3c		;Function set: 2rader, 5x10pix, 8bitar
	call	lcdwrc
	call	dly100us
	call	dly100us

	movlw	0x3c		;Function set: 2rader, 5x10pix, 8bitar
	call	lcdwrc
	call	dly40us

	movlw	0x3c		;Function set: 2rader, 5x10pix, 8bitar
	call	lcdwrc
	call	dly40us

	movlw	0x08		;LCD OFF
	call	lcdwrc
	call	dly40us

	movlw	0x01		;LCD clr
	call	lcdwrc
	call	dly40us
	call	dly40us

	movlw	0x07		;entrymode
	call	lcdwrc
	call	dly40us
	call	dly40us

	movlw	0x0F		;lcd on
	call	lcdwrc
	call	dly40us
	call	dly40us

	return
;**********************************************************************
LCDWRC		;Skriver till lcd:s kontrollregister.
	movwf	lcddat	;Lägger ut datan på porten
;	bcf		lcd_rw	;Write
;	nop
	bcf		lcd_rs	;Välj dataregister
;nop
;	nop
	bsf		lcd_e	;Enable
;nop
;	nop
;	nop
	bcf		lcd_e	;Disable
	call	dly40us
	return
;**********************************************************************
LCDWR		;Skriver till lcd:s dataregister.
	movwf	lcddat	;Lägger ut datan på porten
;	bcf		lcd_rw	;Write
;	nop
	bsf		lcd_rs	;Välj dataregister
nop
	nop
	bsf		lcd_e	;Enable
	nop
nop
	nop
	bcf		lcd_e	;Disable
	call	dly40us
	call	dly40us
	return
;**********************************************************************
dly40us			;40 cycles
	movlw	0x0D
	movwf	d1
Delay_0
	decfsz	d1, f
	goto	Delay_0
	return
;**********************************************************************
dly100us			
			;100 cycles
	movlw	0x21
	movwf	d1
Delay_1
	decfsz	d1, f
	goto	Delay_1

	return
;**********************************************************************
dly5ms			;4998 cycles
	movlw	0xE7
	movwf	d1
	movlw	0x04
	movwf	d2
Delay_2
	decfsz	d1, f
	goto	$+2
	decfsz	d2, f
	goto	Delay_2

			;2 cycles
	goto	$+1
	return
;**********************************************************************
Dly45ms			
			;44998 cycles
	movlw	0x27
	movwf	d1
	movlw	0x24
	movwf	d2
Delay_3
	decfsz	d1, f
	goto	$+2
	decfsz	d2, f
	goto	Delay_3

			;2 cycles
	goto	$+1

	return
;**********************************************************************
Dly1s		;999997 cycles
	movlw	0x08
	movwf	d1
	movlw	0x2F
	movwf	d2
	movlw	0x03
	movwf	d3
Delay_4
	decfsz	d1, f
	goto	$+2
	decfsz	d2, f
	goto	$+2
	decfsz	d3, f
	goto	Delay_4

			;3 cycles
	goto	$+1
	nop
	return
;**********************************************************************
    end
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: LCD PIC problem

Inlägg av sodjan »

Du kan jämföra med denna kod som också är för en 16F88x processor:
http://www.jescab.se/HD44780.html
Speciellt subrutinen "lcd_init_hd44780".
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: LCD PIC problem

Inlägg av Marta »

Är Du helt säker på att det skall vara Rc1 till Rc7 och inte Rc0 till Rc7? Du måse nog använda 8 bitar om Du skall köra i 8-bit läge. ... Eller så har Du bara skrivit fel i kommentaren överst i programmet.

Lite svårt att jämföra en init för 4-bit med en för 8-bit.

Det är normalt absolut inga problem att få en LCD att fungera. Vill det sig inte så gör ett testprogram som skiftar teckenporten en bit åt gången för att kunna verifiera att allt är rätt kopplat och att Du har rätt nivåer så ingen finess är glömd som Du skulle ha stängt av.

Är strömmen OK? Är Du säker på att displayen är hel? Svänger oscillatorn som den skall?
Användarvisningsbild
Glenn
Inlägg: 36780
Blev medlem: 24 februari 2006, 12:01:56
Ort: Norr om Sthlm
Kontakt:

Re: LCD PIC problem

Inlägg av Glenn »

Är du säker på att du kopplat rätt ? ..av egen erfarenhet vet jag att pinconfigen kan skilja sej en del mellan olika displayer.
Användarvisningsbild
luffare
EF Sponsor
Inlägg: 132
Blev medlem: 4 oktober 2005, 16:25:21
Ort: Uppsala
Kontakt:

Re: LCD PIC problem

Inlägg av luffare »

Sodjan hade redan kollat ditt exempel men inte tillräckligt noga för nu funkar det, hade missförstått(kollat för många exempel) och trodde att man skulle stänga av den först och sen på. Ändrade init till en kopia av din fast med 8bit i stället.

Marta: det var jag som skrivit fel har en variabel för hela portC, och alla portar var testade.

Edit: vad gör bit i entrymode (display shifted), testade med den på och då blev lcd blank.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: LCD PIC problem

Inlägg av vfr »

vad gör bit i entrymode (display shifted)

Vilken bit? Det där fattade jag inget av... Hur menar du?
Användarvisningsbild
luffare
EF Sponsor
Inlägg: 132
Blev medlem: 4 oktober 2005, 16:25:21
Ort: Uppsala
Kontakt:

Re: LCD PIC problem

Inlägg av luffare »

bit 0, men jag tror jag har hajjat det. Men en annan grej är hur man gör för att byta rad, får väl läsa sodjans exempel igen.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: LCD PIC problem

Inlägg av sodjan »

> Men en annan grej är hur man gör för att byta rad,

Igentligen byter man inte rad, man anger adressen för nästa tecken.
Det är alltså samma kommando oavsett om man "byter rad" eller inte.
Om den nya adressen råkar ligga på en annan rad, så kan man kanske
säga att man har "bytt rad"... :-)

Databladet bör/ska ha info om hur adresseringen ser ut. Annars så
är det standard för HD44780 och vilket standard dokument som helst
ska fungera. Sedan använder du det speciella kommandot för att
sätta adressen...
Användarvisningsbild
luffare
EF Sponsor
Inlägg: 132
Blev medlem: 4 oktober 2005, 16:25:21
Ort: Uppsala
Kontakt:

Re: LCD PIC problem

Inlägg av luffare »

okej nu fattar jag varje ruta på lcd:n är en adress, nu gick det lättare att fatta databladet och få det att fungera :)
Hur lägger man in å eller nåt annat special tecken som inte är med i acsii tabellen?
Är det till detta man ska använda "cg ram"?
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: LCD PIC problem

Inlägg av vfr »

Japp!

Om jag inte minns fel så finns det ena av tecknen 'ÅÄÖ' i den fasta teckenuppsättningen, fast på en annan teckenadress. Dom andra två får man skapa som egendefinierade tecken. Och motsvarande för små bokstäver.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: LCD PIC problem

Inlägg av v-g »

ä & ö finns å däremot finns inte.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: LCD PIC problem

Inlägg av vfr »

Ok. Tvärtom alltså. Två finns men inte den tredje. Halvt rätt. :D
Användarvisningsbild
luffare
EF Sponsor
Inlägg: 132
Blev medlem: 4 oktober 2005, 16:25:21
Ort: Uppsala
Kontakt:

Re: LCD PIC problem

Inlägg av luffare »

Hur fungerar och vad gör macron?
Försöker begripa sodjans exempel.
Det lägger en start adress i eeprom? men vad e adressen?
t.ex

Kod: Markera allt

lcd_text    macro   text_label
        banksel eeadr               ; byt till rätt bank...
        movlw   high text_label     ; bit 8-15 av adressen till texten
        movwf   eeadrh
        movlw   low text_label      ; bit 0-7 av adressen till texten
        movwf   eeadr
Blir lcd_text1 en start adress i minnet för infot efter "data" eller hur funkar det?
Och hur\när läggs texten in i minnet?
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: LCD PIC problem

Inlägg av v-g »

Du anger adressen när du anropar macrot. Dvs lcd_text Adressen

Ett macro är en kodsekvens som du inte önskar skriva flera gånger men som är ständigt återkommande.

Man kan jämföra det med en funktion där funktionen ständigt anropas och således "återanvänds", men när det gäller macro så är det lite som copy/paste att koden inte återanvänds utan infogas på varje plats där du "anropar" macrot. Det gäller alltså att tänka lite vad man ska använda och till vad. Macro kan även ta input (som i exemplet du postat) och då infogas detta i koden.

Vill du se vad som sker rekommenderar jag att du tittar runt lite med MPSIM, man lär sig ganska mycket.
Användarvisningsbild
luffare
EF Sponsor
Inlägg: 132
Blev medlem: 4 oktober 2005, 16:25:21
Ort: Uppsala
Kontakt:

Re: LCD PIC problem

Inlägg av luffare »

ok då e ja med lite mer
Får error147(Directive only allowed when generating an object file
) på alla code rader och på

Kod: Markera allt

DLY_VAR      UDATA_SHR
när jag simulerar, vad behövs göras och vad gör code?

Edit: Försöker förstå vad som sker i macrot, men det är luddigt vad gör text_label och high\low?
Och hur går det till när den anropar i början av koden "lcd_text lcd_text1"?
Senast redigerad av luffare 27 januari 2009, 19:20:20, redigerad totalt 1 gång.
Skriv svar