PIC-ASM: problem med LCD kod

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
DarkSilver
Inlägg: 128
Blev medlem: 24 augusti 2010, 20:26:35
Ort: Linköping

PIC-ASM: problem med LCD kod

Inlägg av DarkSilver »

Hejsan EF

Jag sitter här hemma nu och sliter håret av mig i frustration. I snart två veckor nu har jag suttit och läst igenom ett flertal exempel och tutorials som sägs beskriva hur man kommunicerar med en LCD modul med HD44780. Trots det har jag inte lyckats att skriva ett fungerande protokoll än och det börjar bli riktigt irriterande. Som en sista utväg ber jag därför er om hjälp med detta.
Det som händer just nu är att jag får ett ifyllt block på LCD modulen, samt en blinkade cursor bredvid(fyllt block varvat med 2 ifyllda linjer längst ner). Resten är tomma.
I mitt fall använder jag mig utav en PIC16F886 MCU med följande kod(utdrag ur koden):

Kod: Markera allt

    list      p=16F886
    #include <p16F886.inc>

    errorlevel  -302

    __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
    __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V

(...Mer kod...)

RegEdit		MACRO	_reg, _dat, _mode
	#IF _mode == 0x01
		banksel	_reg
		movlw	_dat
		movwf	_reg
	#ENDIF
	#IF _mode == 0x02
		banksel	_dat
		movfw	_dat
		banksel	_reg
		movwf	_reg
	#ENDIF

	ENDM

DelayMs		MACRO	_ms, _mode
	#IF _mode == 0x01
		movlw	_ms
		call 	sDelay
	#ENDIF
	#IF _mode == 0x02
		movfw	_ms
		call 	sDelay
	#ENDIF

	ENDM

(...Mer kod...)

Start:
	RegEdit		TRISA, 0x00, 0x01
	RegEdit		PORTA, 0x00, 0x01
	RegEdit		TRISB, 0x00, 0x01
	RegEdit		PORTB, 0x00, 0x01
	RegEdit		TRISC, 0x00, 0x01
	RegEdit		PORTC, 0x00, 0x01
	clrf		ANSEL
	clrf		ANSELH

	call LCD_Init

MainLoop:

	goto    MainLoop

(...Mer kod...)

sDelay:	; Adds a delay that lasts X milliseconds
	movwf	vDC

	#IF _clockFreq == .4 ; Are we running at 4 MHz?
sDelay1:
	movlw	0xC7
	movwf	vDC+1
	movlw	0x01
	movwf	vDC+2
sDelay2:
	decfsz	vDC+1, f
	goto	$+2
	decfsz	vDC+2, f
	goto	sDelay2

	decfsz	vDC, f
	goto	sDelay1
	#ENDIF
	#IF _clockFreq == .8 ; Are we running at 8 MHz?
sDelay1:
	movlw	0x8E
	movwf	vDC+1
	movlw	0x02
	movwf	vDC+2
sDelay2:
	decfsz	vDC+1, f
	goto	$+2
	decfsz	vDC+2, f
	goto	sDelay2

	decfsz	vDC, f
	goto	sDelay1
	#ENDIF

	return

LCD_Init:
	DelayMs .255, 0x01

	movlw	0b00101000		; Set 4 bit mode
	call	LCD_Cmd

	movlw	0b00001111		; Set display on/off and cursor command
	call	LCD_Cmd

	movlw	0b00000110		; Entry mode set
	call	LCD_Cmd

	movlw	0b00000010		; Move to home
	call	LCD_Cmd

	movlw	0b00000001		; Clear display
	call	LCD_Cmd

	return

LCD_Cmd:
	movwf	vTemp
	swapf	vTemp, w		;send upper nibble
	andlw	0x0f			;clear upper 4 bits of W
	movwf	PORTB
	bcf		PORTA, 0		;RS line to 1
	call	Pulse_e			;Pulse the E line high

	movf	vTemp, w		;send lower nibble
	andlw	0x0f			;clear upper 4 bits of W
	movwf	PORTB
	bcf		PORTA, 0		;RS line to 1
	call	Pulse_e			;Pulse the E line high

	DelayMs .5, 0x01

	return

LCD_CharD:
	addlw	0x30
LCD_Char:	
	movwf	vTemp			;display character in W register
	swapf	vTemp, w		;send upper nibble
	andlw	0x0f			;clear upper 4 bits of W
	movwf	PORTB
	bsf		PORTA, 0		;RS line to 1
	call	Pulse_e			;Pulse the E line high

	movf	vTemp, w		;send lower nibble
	andlw	0x0f			;clear upper 4 bits of W
	movwf	PORTB
	bsf		PORTA, 0		;RS line to 1
	call	Pulse_e			;Pulse the E line high

	DelayMs .5, 0x01

	return

Pulse_e:
	bsf	PORTA, 1
	nop
	bcf	PORTA, 1

	return
Kan nästan garantera att det är något dumt fel, men jag kan inte hitta det :evil:
All hjälp uppskattas :D
Användarvisningsbild
Icecap
Inlägg: 26658
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: PIC-ASM: problem med LCD kod

Inlägg av Icecap »

Enl. det datablad jag har om LCD ska 4-bit initieringen se ut som följer:

1: Vänta minst 15ms från det att spänningen når 4,5V.
2: Skriv kommando 0x20 (upper nipple)
3: Vänta minst 4,1ms
4: Skriv kommando 0x20 (upper nipple)
5: Vänta minst 100µs
6: Skriv kommando 0x20 (upper nipple)
7: Vänta minst 40µx
8: Skriv kommando 0x20 (upper nipple)

Sedan ska man skriva alla bytes i 2 halvor.

9: Skriv kommando 0x28, vänta minst 40µs
10: Skriv kommando 0x0C, vänta minst 40µs
11: Skriv kommando 0x01, vänta minst 1,64ms
12: skriv kommando 0x06, vänta minst 40µs

Sedan ska det vara klart att ta emot.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47002
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: PIC-ASM: problem med LCD kod

Inlägg av TomasL »

Kolla också kontrasten, den kan ju vara felställd, med bl.a detta resultat.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC-ASM: problem med LCD kod

Inlägg av sodjan »

Det framgår inte vad du har tittat på för exempel, men jag har ett här :
http://www.jescab.se/HD44780.html. Också för 16F886.

Sen så har jag inte fördjupat mig i din kod, en sak bara...

Kod: Markera allt

   ...
   RegEdit      TRISC, 0x00, 0x01
   RegEdit      PORTC, 0x00, 0x01
   clrf         ANSEL
   clrf         ANSELH
   ...
Jag är osäker på om det verkligen är ANSEL/ANSELH som clearas där.
Snarare kommer det att vara PORTD/PORTE som det skrivs till, och
alltså kommer de analoga funktionerna fortfarande att vara påslagna
och det i sin tur medför att dina BCF/BSF mot PORTA-pinnar kommer
att bli lite osäkra.

Det verkar lite konstigt att du inte har gjort så här istället :

Kod: Markera allt

   ...
   RegEdit      TRISC, 0x00, 0x01
   RegEdit      PORTC, 0x00, 0x01
   RegEdit      ANSEL, 0x00, 0x01
   RegEdit      ANSELH, 0x00, 0x01
   ...
eller :

Kod: Markera allt

   ...
   RegEdit      TRISC, 0x00, 0x01
   RegEdit      PORTC, 0x00, 0x01
   banksel      ANSEL
   clrf         ANSEL
   clrf         ANSELH
   ...
Men eftersom du nu har ett macro som sköter bankningen
så finns det väl ingen anledning till att inte använda den.

Slutligen, om jag nu har rätt i detta, så borde/skulle detta synas direkt om
man kör koden genom MPSIP och sätter en "watch" på ANSEL/ANSELH...
Användarvisningsbild
DarkSilver
Inlägg: 128
Blev medlem: 24 augusti 2010, 20:26:35
Ort: Linköping

Re: PIC-ASM: problem med LCD kod

Inlägg av DarkSilver »

@ Icecap,
Jag testade att skicka kommandona i den ordningen och det funkade fortfarande inte. Det blev bara tomt, ingen cursor eller nått sånt(ändrade koden för det). Prövade dessutom att skicka ett H till displayen. Inget :(

@ TomasL,
Konstrasten är det inget fel på. Har en 10K pot som jag vrider fram och tillbaka på.

@ sodjan,
Ditt exempel har jag kikat på, och jag har testat din initeringskod, dock inte din kod i sin helhet.
Ja tusan, det har du rätt i :doh: Tanken bakom clrf ANSEL och ANSELH var att minska programanvändningen. Men det kanske är bättre att få det att funka allra först.

Ska ta och testa sodjans exempel rakt av och se om det fungerar(vilket det borde).
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC-ASM: problem med LCD kod

Inlägg av sodjan »

> Ska ta och testa sodjans exempel rakt av och se om det fungerar(vilket det borde).

Börja med att fixa bankningen av ANSEL/ANSELH. Det är ju uppenbart fel.

> Tanken bakom clrf ANSEL och ANSELH var att minska programanvändningen.

Ja, men vad hjälper det när det ändå inte fungerar !?


En annan lite sak som inte direkt har med felet att göra...
Eftersom du nu har gjort jobbet att fixa ett par makron för att sätta registervärden,
så skulle jag kanske se till att göra det färdigt. Något i stil med :

Kod: Markera allt

...
Lit_val    set   h'01'
Reg_val    set   h'02'
...
...
RegEdit      MACRO   _reg, _dat, _mode
   #IF _mode == Lit_val
...
   #ENDIF
   #IF _mode == Reg_val
...
   #ENDIF
   ENDM
...
...
Start:
   RegEdit      TRISA, 0x00, Lit_val
   RegEdit      PORTA, 0x00, Lit_val
   RegEdit      TRISB, 0x00, Lit_val
...
   RegEdit      PORTA, my_var, Reg_val
...
O.s.v
Det gör koden mer lättläst, och man måste inte hålla reda på vilket
av 1 eller 2 som var literal eller register...
Användarvisningsbild
DarkSilver
Inlägg: 128
Blev medlem: 24 augusti 2010, 20:26:35
Ort: Linköping

Re: PIC-ASM: problem med LCD kod

Inlägg av DarkSilver »

Smart, den idén snor jag direkt :mrgreen:
Jag testade ditt exempel och efter ett tags fipplande med att ändra ansel till ANSEL osv så fick jag det att kompilera. Det funkade faktiskt! Så det är antagligen något fel i min kod som jag fortfarande inte har hittat. Ska sitta lite här nu och jämföra din kod med min.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC-ASM: problem med LCD kod

Inlägg av sodjan »

> ...med att ändra ansel till ANSEL osv

Stäng av "case sensitivity" istället.
Det är av någon konstig anledning "på" per default.

> Så det är antagligen något fel i min kod som jag fortfarande inte har hittat.

Har du fixat bankningen för ANSEL/ANSELH ?
Användarvisningsbild
DarkSilver
Inlägg: 128
Blev medlem: 24 augusti 2010, 20:26:35
Ort: Linköping

Re: PIC-ASM: problem med LCD kod

Inlägg av DarkSilver »

Japp, den är fixad och jag har kontrollerat det med MPLAB SIM.
Det verkar som om jag kan initiera displayen, men inte skicka någon data till den. Här är lite uppdaterad kod(i stoet sett snodd från sodjan :vissla: )

Kod: Markera allt

#define     LCD_E       PORTA, 0
#define     LCD_RS      PORTA, 1
#define     LCD_PORT    PORTA

(...Mer kod...)

Start:
	RegEdit		TRISA, 0x00, 0x01
	RegEdit		TRISB, 0x00, 0x01
	RegEdit		TRISC, 0x00, 0x01
	RegEdit		ANSEL, 0x00, 0x01
	RegEdit		ANSELH, 0x00, 0x01
	RegEdit		INTCON, 0x00, 0x01

	call 		LCD_Init

	movlw		0x80
	call 		LCD_Cmd

	movlw		'H'
	call 		LCD_Char

	InfLoop

(...Mer kod...)

LCD_Init:
	DelayMs .255, 0x01
	DelayMs .255, 0x01
	DelayMs .255, 0x01
	DelayMs .255, 0x01
	bcf     LCD_E
    bcf     LCD_RS

	movlw	0x30			; Set 4 bit mode
	call 	LCD_Cmd4
	DelayMs .5, 0x01

	movlw	0x30			; Set 4 bit mode
	call 	LCD_Cmd4
	DelayMs .5, 0x01

	movlw	0x30			; Set 4 bit mode
	call 	LCD_Cmd4
	DelayMs .1, 0x01

	movlw	0x20			; Set 4 bit mode
	call 	LCD_Cmd4
	DelayMs .1, 0x01

	movlw	b'00101000'
	call	LCD_Cmd

	movlw	b'00010100'
	call	LCD_Cmd

	movlw	b'00001110'		
	call	LCD_Cmd

	movlw	b'00000110'
	call	LCD_Cmd

	movlw	b'00000010'
	call	LCD_Cmd

	movlw	b'00000001'
	call	LCD_Cmd

	return

LCD_Cmd4:
	banksel LCD_PORT
	movwf   vTemp
	movlw   b'00001111'
	andwf   LCD_PORT, w 
	iorwf   vTemp, w
	movwf   LCD_PORT
	call    Pulse_e
	
	return

LCD_Cmd:
	banksel LCD_PORT
	bcf     LCD_RS
	call    LCD_Byte
	DelayMs .5, 0x01
	
	return

LCD_CharD:
	addlw	0x30
LCD_Char:
	banksel LCD_PORT
	bsf     LCD_RS
	call    LCD_Byte
	DelayMs .1, 0x01
	
	return

LCD_Byte:
	movwf   vTemp+1  
	movlw   0b11110000  
	andwf   vTemp+1, w    
	call    LCD_Cmd4 
	swapf   vTemp+1, f   
	movlw   0b11110000   
	andwf   vTemp+1, w     
	call    LCD_Cmd4 
	
	return

Pulse_e:
	banksel LCD_PORT
	bsf		LCD_E
	nop
	bcf		LCD_E
	nop

	return
Resterande kod är densamma som ovan.
slft
Inlägg: 493
Blev medlem: 9 oktober 2009, 10:45:21
Skype: sm6xwe
Ort: Tibro

Re: PIC-ASM: problem med LCD kod

Inlägg av slft »

hade problemet med att jag inte kunde skriva text till min display

efter mycket felsökande så hittade jag förklaringen

rs var kortsluten mot jord så den kunde inte ta emot text

kolla så du inte har ett sådant hårdvarufel RS eller R/W pinnen

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

Re: PIC-ASM: problem med LCD kod

Inlägg av sodjan »

Om det vore felkopplat så borde ingen kod fungera, inte ens
min kod fixar det...
Användarvisningsbild
DarkSilver
Inlägg: 128
Blev medlem: 24 augusti 2010, 20:26:35
Ort: Linköping

Re: PIC-ASM: problem med LCD kod

Inlägg av DarkSilver »

@ slft,
Nej, det är något som är fel mjukvarumässigt med tanke på att sodjans exempel fungerade utmärkt, men inte min egna kod.

@ sodjan,
Tillslut fick jag det att fungera! Tack för din hjälp, speciellt tack för ditt fina exempel :D
Jag trodde inte att det fanns någon skillnad mellan

Kod: Markera allt

0b00001111
och

Kod: Markera allt

b'00001111'
Tydligen fanns det en skillnad, då det senare fungerade utmärkt. Skulle någon kunna förklara det, så att man slipper göra samma fel igen?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC-ASM: problem med LCD kod

Inlägg av sodjan »

> Tydligen fanns det en skillnad, då det senare fungerade utmärkt. Skulle någon kunna förklara det...

Vadå "förklara" ? Du har ju redan i samma mening sagt vad skillnaden är,
det ena är korrekt och fungerar det andra är fel och fungerar inte.
Varför tror du att det som är fel skulle fungera ?
Om du inte redan har RTFM, så är det sidan 40 i MPASM manualen.

Dessutom får jag detta när jag försöker använda 0b........ :
Warning[202] C:\DATA\PROJ\TEST\ABC.ASM 39 : Argument out of range. Least significant bits used.

Lite märkligt att du inte också fick det. Eller fick du varningen och struntade i det ?
Skriv svar