Hjälp med LM16A211 LCD

Lysdioder, Optiska sensorer, Fiberoptik, Displayer, Lasrar, Optiska kopplare
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Bra :-)
Det är ett vanligt misstag att tänka sig att en "literal" kan vara en "variablel",
men värdet på en "literal" sätts under assembleringen och är sedan ett
konstant hårdkodat värde i PIC koden/instruktionen. Samma gäller
naturligtsvis alla "literal" instruktioner, t.ex den "XORLW W" som du hade
med förrut. "W" är en symbol i MPASM med värdet h'00' (noll) så det blir
en "XORLW b'00000000'", vilket inte var vad du ville ha, eller hur ?

Att cursurn flyttar på sig låter som om modulen tror att den får tecken den ska
skriva. Problem med R/S kanske ??

En liten detalj...

Du kör ju i 4-bitars mode, vilket är ganska vanligt.
Normalt brukar man dock lägga "splitten" av en 8-biters byte i själva
LCD subrutinen (DISPLAY_SEND i ditt fall). Problemet med din lösning är
att du själv måste dela varje tecken som ska skrivas ut. Fundera t.ex på
om du vill skriva ut "Hej". I ditt fall måste du dela upp "H", "e" och "j" i
deras 4-biars delar och anropa DISPLAY_SEND 6 gånger. Det vore enklare att
göra :

MOVLW a'H'
CALL DISPLAY_SEND
MOVLW a'e'
CALL DISPLAY_SEND
MOVLW a'j'

jämfört med hur det skulle se ut med din nuvarande lösning.

Men, för att gå vidare, lägg till lite kod som skiver ut några ASCII tecken,
så får vi se vad som händer...
xezer
Inlägg: 65
Blev medlem: 8 mars 2005, 20:41:21

Inlägg av xezer »

Det verkade vara i och med det här stycket som den började bete sig konstigt.

Kod: Markera allt

   MOVLW      b'00100000'
   CALL      DISPLAY_SEND
   MOVLW      b'11000000'   ;5x10
   CALL      DISPLAY_SEND   ; 2rader och 5x7pixlars font
Jag gav mig på ett försök att göra en funktion som delar upp en hel byte, och nu fungerar inget istället :(
Säker på att det är ännu något öppenbart fel jag gjort :cry:

Har ni föresten någon bok i ämnet att rekommendera? Finns dåligt med litteratur för PIC tycker jag.

I alla fall, här kommer koden:

Kod: Markera allt


#include <include_files/P16F628A.INC> 

	__CONFIG        _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _INTOSC_OSC_NOCLKOUT





;==========================================================================
;       Globala variabler
;==========================================================================

DISP_E		EQU	b'00000001'		;Enable
DISP_EBIT	EQU	d'0'			;Enable bit
DISP_RS		EQU	b'00000010'		;Register-select
DISP_RSBIT	EQU	d'1'			;Register-select bit
DISP_RW		EQU	b'00000100'		;Read/Write
DISP_RWBIT	EQU d'2'			;Read/Write bit


CBLOCK 0x20
	TIMER1
	TIMER2
	DISP_STAT ;Håller i statusen för DISP_RS, E och DISP_RW
	BYTE
	SENDDATA
	
ENDC


;Bootar upp
	ORG		0x0	; Resettar vektor adressen
	GOTO		START	; Hoppa till START vid boot



;*********************************************
;*  Delay på 5mSek                           *
;*********************************************

; Delay = 0.005 seconds
; Clock frequency = 4 MHz

; Actual delay = 0.005 seconds = 5000 cycles
; Error = 0 %

Delay_5ms:
			;4998 cycles
	MOVLW		h'E7'
	MOVWF		TIMER1
	MOVLW		h'04'
	MOVWF		TIMER2
Delay_5ms_0:
	DECFSZ	TIMER1, 1
	GOTO		$+2
	DECFSZ	TIMER2, 1
	GOTO		Delay_5ms_0
			;3 cycles
	GOTO		$+1

			;2 cycles (including call)
	RETURN		


DISPLAY_SEND_BYTE:
   MOVWF		BYTE
  
   MOVF		BYTE, SENDDATA		;Flytta BYTE till SENDDATA
   CALL		DISPLAY_SEND	;Sänder till displayen
   
   SWAPF	BYTE, 1
   MOVF		BYTE, SENDDATA
   CALL		DISPLAY_SEND	;Sänder till Displayen
   
   RETURN



;*********************************************
;*  Sänder data till display	               *
;*********************************************

DISPLAY_SEND:
   
   BCF		  SENDDATA, DISP_EBIT		;Försäkra om att dessa inte är aktiva
   BCF		  SENDDATA, DISP_RSBIT
   BCF		  SENDDATA, DISP_RWBIT
   
   MOVF		  SENDDATA, W
    
   MOVWF      PORTB       ;Skickar till displayen
   
   BSF		  PORTB,DISP_EBIT ;på  ;Sköter enable?
   BCF		  PORTB,DISP_EBIT ;av
   
   MOVLW      b'00000000'
   MOVWF      PORTB
   CALL      Delay_5ms ;Dröjer 5mSek

   RETURN 

	

;*********************************************
;*  Initiera display 	             	   *
;*********************************************
DISPLAY_INIT:
	CALL		Delay_5ms
	CALL		Delay_5ms 
	CALL		Delay_5ms 
	CALL		Delay_5ms ;Låter displayen starta upp i 20mSek

	MOVLW		b'00110011'
	CALL		DISPLAY_SEND_BYTE	; 8-bit

	MOVLW		b'00110010'
	CALL		DISPLAY_SEND_BYTE	; 4-bit!!

	MOVLW		b'00101100'
	CALL		DISPLAY_SEND_BYTE	; 2rader och 5x10pixlars font

	MOVLW		b'00001000'
	CALL		DISPLAY_SEND_BYTE	; Display off, curs off, blink off

	MOVLW		b'00011100'
	CALL		DISPLAY_SEND_BYTE	; Display shift off

	MOVLW		b'00000001'
	CALL		DISPLAY_SEND_BYTE	; Clear display

	;MOVLW		b'00001111'
	;CALL		DISPLAY_SEND_BYTE	; Display on, curs on, blink on
	
	RETURN	
	


;*********************************************
;*  Start rutinen 	             	   *
;*********************************************
START:
	;###Initiera PICen
	MOVLW		b'00000111'
	MOVWF		CMCON			;Alla pinnar ska vara digitala

	BSF		STATUS, RP0		;Switchar till Bank1

	MOVLW		b'11111'
	MOVWF		TRISA			;Alla pinnar på PortA är inputs

	MOVLW		b'00000000'
	MOVWF		TRISB			;Alla pinnar på PortB är outputs
	
	BCF		STATUS, RP0		;Switchar tillbaka till Bank0
	;###


	MOVLW		b'000000'
	MOVWF		DISP_STAT
	
	CALL		DISPLAY_INIT			;Initiera displayen
	;BSF		DISP_STAT,DISP_RSBIT		;Sätter RS-flaggan så det är tecken vi handskas med nu

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

Inlägg av sodjan »

> MOVF BYTE, SENDDATA

Fungerar *inte* ! Se beskrivningen av MOVF !!
Ska vara :

MOVF BYTE, W
MOVWF SENDDATA

PIC16 har ingen move-register-to-register instruktion.
(PIC18 har en MOVFF instruktion som fungerar precis så där...)

> SWAPF BYTE, 1

"1":an ovan är "destination" flaggan. Använd *enbart* "W" eller "F" !! Aldrig 1/0.
Ingen ska behöva hålla i minnet om det är W eller F som är "1"...

> CALL Delay_5ms ; Dröjer 5mSek

Mest kosmetiskt, men är inte den kommentaren lite onödig ? :-) :-)

> BSF PORTB,DISP_EBIT ;på ;Sköter enable?
> BCF PORTB,DISP_EBIT ;av

Lägg gärna i alla fall en NOP, kanske två, mellan dessa två. Svårt att
förklara helt kort, men det har med det som kallas "read-modify-write"
att göra...

> MOVLW b'00110011'
> CALL DISPLAY_SEND_BYTE ; 8-bit

Här får du tänka till lite. Från start kör ju modulen 8-bitars mode,
så jag vet inte om du kan anropa 4-bits rutinen här i början. Det *kanske*
fungerar, men fundera gärna igenom om det fungerar...
xezer
Inlägg: 65
Blev medlem: 8 mars 2005, 20:41:21

Inlägg av xezer »

Undrar om det här någonsin kommer gå ihop för mig.
Ännu en kväll i bråk med LCDn.
Allt som händer är att den flimmrar på alla rutor.
Det är som om den blinkar fast cursorn flyttar sig.

Skickar jag bitarna i rätt ordning?
Kan jag göra så när jag skickar de första kommandorna i 8bitar?

EDIT:
Ändrade Delay-funktionen, så nu skriver den ut tecken.
Problemet är bara att det är fel tecken och att de "vandrar" åt höger :?
Vad kan det vara tros?

Kod: Markera allt

#include <include_files/P16F628A.INC> 

	__CONFIG        _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _INTOSC_OSC_NOCLKOUT





;==========================================================================
;       Globala variabler
;==========================================================================

DISP_E		EQU	b'00000001'		;Enable
DISP_EBIT	EQU	d'0'			;Enable bit
DISP_RS		EQU	b'00000010'		;Register-select
DISP_RSBIT	EQU	d'1'			;Register-select bit
DISP_RW		EQU	b'00000100'		;Read/Write
DISP_RWBIT	EQU d'2'			;Read/Write bit


CBLOCK 0x20
	TIMER1
	TIMER2
	DISP_STAT ;Håller i statusen för DISP_RS, E och DISP_RW
	BYTE
	SENDDATA
	
ENDC


;Bootar upp
	ORG		0x0	; Resettar vektor adressen
	GOTO		START	; Hoppa till START vid boot



;*********************************************
;*  Delay på 5mSek                           *
;*********************************************

; Delay = 0.005 seconds
; Clock frequency = 4 MHz

; Actual delay = 0.005 seconds = 5000 cycles
; Error = 0 %

;Delay_5ms:
;			;4998 cycles
;	MOVLW		h'E7'
;	MOVWF		TIMER1
;	MOVLW		h'04'
;	MOVWF		TIMER2
;Delay_5ms_0:
;	DECFSZ	TIMER1, 1
;	GOTO		$+2
;	DECFSZ	TIMER2, 1
	
;	GOTO		$+1
			;2 cycles (including call)
;	RETURN		



Delay_5ms:
			;6993 cycles
	movlw	0x76
	movwf	TIMER1
	movlw	0x06
	movwf	TIMER2
Delay_0
	decfsz	TIMER1, f
	goto	$+2
	decfsz	TIMER2, f
	goto	Delay_0

			;3 cycles
	goto	$+1
	nop

			;4 cycles (including call)
	return



DISPLAY_SEND_BYTE:
   MOVWF		BYTE
  
   MOVWF	SENDDATA
   CALL		DISPLAY_SEND	;Sänder till displayen
   
   SWAPF	BYTE, W
   MOVWF	SENDDATA
   CALL		DISPLAY_SEND	;Sänder till Displayen
   
   RETURN



;*********************************************
;*  Sänder data till display	             *
;*********************************************

DISPLAY_SEND:
   
   BCF		SENDDATA, DISP_EBIT		;Försäkra om att dessa inte är aktiva
   BCF		SENDDATA, DISP_RSBIT
   BCF		SENDDATA, DISP_RWBIT
   
   BTFSC		DISP_STAT, DISP_RSBIT
   BSF		SENDDATA, DISP_RSBIT
   
   MOVF		SENDDATA, W
   MOVWF      	PORTB       ;Skickar till displayen
   
   BSF		PORTB,DISP_EBIT ;på
   NOP
   NOP
   NOP
   NOP
   BCF		PORTB,DISP_EBIT ;av
   
   MOVLW      b'00000000'
   MOVWF      PORTB
   CALL      Delay_5ms

   RETURN 

	

;*********************************************
;*  Initiera display 	             	   *
;*********************************************
DISPLAY_INIT:
	CALL		Delay_5ms
	CALL		Delay_5ms 
	CALL		Delay_5ms 
	CALL		Delay_5ms ;Låter displayen starta upp i 20mSek

	MOVLW		b'00110000'
	CALL		DISPLAY_SEND_BYTE	; 8-bit
	
	MOVLW		b'00110000'
	CALL		DISPLAY_SEND_BYTE	; 8-bit
	
	MOVLW		b'00110000'
	CALL		DISPLAY_SEND_BYTE	; 8-bit

	MOVLW		b'00100000'
	MOVWF		SENDDATA
	CALL		DISPLAY_SEND	; 4-bit!!

	MOVLW		b'00101100'
	CALL		DISPLAY_SEND_BYTE	; 2rader och 5x10pixlars font

	MOVLW		b'00001000'
	CALL		DISPLAY_SEND_BYTE	; Display off, curs off, blink off

	MOVLW		b'00000001'
	CALL		DISPLAY_SEND_BYTE	; Clear display

	MOVLW		b'00000110'
	CALL		DISPLAY_SEND_BYTE	; ENTRY

	MOVLW		b'00001111'
	CALL		DISPLAY_SEND_BYTE	; Display on, curs on, blink on
	
	
	RETURN	
	


;*********************************************
;*  Start rutinen 	             	   *
;*********************************************
START:
	;###Initiera PICen
	MOVLW		b'00000111'
	MOVWF		CMCON			;Alla pinnar ska vara digitala

	BSF		STATUS, RP0		;Switchar till Bank1

	MOVLW		b'11111'
	MOVWF		TRISA			;Alla pinnar på PortA är inputs

	MOVLW		b'00000000'
	MOVWF		TRISB			;Alla pinnar på PortB är outputs
	
	BCF		STATUS, RP0		;Switchar tillbaka till Bank0
	;###


	MOVLW		b'00000000'
	MOVWF		DISP_STAT
	
	CALL		DISPLAY_INIT			;Initiera displayen
	BSF		DISP_STAT,DISP_RSBIT		;Sätter RS-flaggan så det är tecken vi handskas med nu
	
	MOVLW		b'01001010'			;J
	CALL	DISPLAY_SEND_BYTE

	MOVLW		b'01000101'			;E
	CALL	DISPLAY_SEND_BYTE

	MOVLW		b'01010011'			;S
	CALL	DISPLAY_SEND_BYTE

	MOVLW		b'01010011'			;S
	CALL	DISPLAY_SEND_BYTE

	MOVLW		b'01001001'			;I
	CALL	DISPLAY_SEND_BYTE

	MOVLW		b'01000011'			;C
	CALL	DISPLAY_SEND_BYTE

	MOVLW		b'01000001'			;A
	CALL	DISPLAY_SEND_BYTE


	

END
Senast redigerad av xezer 5 oktober 2006, 23:36:16, redigerad totalt 1 gång.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Igentligen verkar det inte som om du har så mycket problem med LCD'n i sig.
Mest har det varit missförstånd i hur olika instruktioner fungerar. Om det
beror på slarv vid läsningen av datablad eller något annat, det vet jag inte.

Dock finns det tendenser till att du inte läser riktigt vad som skrivs här i
tråden, ofta svarar du t.ex inte på olika (mot-) frågor som ställs. Det gör
att man även misstänker att det brister i läsningen av dokumentationen.
Fort men fel, brukar det bli då... :-)

Men tillbaka till LCD'n...

Jag tror *inte* att du ska köra med 4-bitars rutinerna så länge som
displayen befinner sig i 8-bitars mode, d.v.s i början av INIT rutinen.

Har du kört koden i simulatorn (MPSIM i MPLAB) och kollat att PORTB
hela tiden sätts så som du har tänkt ?

Sen skulle jag förenkla koden tills dislayen hoppar igång.
Alltså skriva mer "rak" kod utan subrutiner (förrutom delay'en, den
är nog OK) så att man har bättre kontroll över vad som händer. Sedan,
när man har hittat vad som är problemet, kan man justera iden
"riktiga" koden.

Jag skulle antagligen skriva en DISPLAY_INIT rutin som *inte* använder
DISPLAY_SEND_BYTE, utan kör mer "rakt på", så att säga.

Som sagt, jag tror *inte* att du kan köra med subrutinen som använder
4-bitars mode direkt från start...
xezer
Inlägg: 65
Blev medlem: 8 mars 2005, 20:41:21

Inlägg av xezer »

Är rädd att det blivit slarv-läsning av databladen till slut, har läst delar av dem ett flertal gånger, och när jag läser samma sak en gång till blir det "men det här kan jag" så hoppar jag vidare. Vilket jag många gånger nu har insett att jag inte alls kan :oops:

Jag försöker svara och rätta till det som påpekas, men ofta så har jag missuppfattat något :(
T.ex. nu när jag ombedes se över att jag skickar i 4bitars format i början av initieringen. Där trodde jag att det skulle sändas 8bitar istället för att lägga ihop kommandona som jag gjorde tidigare.
För jag kan ju inte sända på alla 8 pinnarna :roll:

Eller var det meningen att jag skulle sända såhär i början?
MOVLW b'00100000'
MOVWF SENDDATA
CALL DISPLAY_SEND


Jag använde PIC Simulator IDE från Ocshon Soft. Mycket bra funktionellt program må jag säga.
Kruxet nu ligger väll i att där får jag faktiskt ut de tecken jag vill få ut, vilket jag inte får på 'min' lcd.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Allså, modulen är i 8-bitarsmode vid spänningstillslag och jobbar i
8-bitars mode från början fram till att kommandot för att byta till
4-bits mode kommer.

*MEN*, det är så smart konstruerat att (bl.a) kommandot för att switcha
över till 4-bitars mode behöver bara 4-bitar för att vara unikt. Modulen
behöver alltså inte de andra (ej anslutna) 4 bitarna alls !

Och så länge som modulen befinner sig i 8-bitarsmode så förväntar den
sig *inte* att det kommer dubbla E-strobar för varje kommando !!

Så fram tills att man har skickat kommandot som ställer om till
4-bit mode, så ska varje kommando skickas i 8-bitars mode (men
naturligtsvis kommer bara 4 bitar att användas !).

> Jag använde PIC Simulator IDE från Ocshon Soft.

Ingen susning vad det är för "hack"...
Man du kör med MPLAB för utvecklingen ??

Ett problem med dessa "smarta" tredjeparts verktyg, är att det blir
lite mer struligt att få hjälp av alla de (de flesta antagligen) som *inte*
kör just det verktyget...

> Kruxet nu ligger väll i att där får jag faktiskt ut de tecken jag vill få ut,...

Sanningen är ju den att din kod *kanske* faktiskt fungerar !
Det kan ju vara någon felkoppling t.ex...
Användarvisningsbild
JimmyAndersson
Inlägg: 26578
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

xezer: Jag har också haft problem med 4bit-initiering. Fick då bl.a detta svar från sodjan som rätade ut alla frågetecken. :)
xezer
Inlägg: 65
Blev medlem: 8 mars 2005, 20:41:21

Inlägg av xezer »

Tack för alla svar! Nu fungerar det änligen :D
Lite konstigt flimmer bara, men kanske kan ha med kontrasten att göra?

JimmyAndersson:
Det var den länken som stod mellan mig och en fungerande display =)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Och nu vill vi veta *VAD* som var fel i din kod !!!

"Nu fungerar det" räcker INTE !

> Lite konstigt flimmer bara

50 Hz flimmer ?
Dåligt avkopplat matningsspänning ?
Flimrar det hela tiden ?
xezer
Inlägg: 65
Blev medlem: 8 mars 2005, 20:41:21

Inlägg av xezer »

Ett av felen låg i början av initieringen när jag skulle sända i 8bitar.
Eftersom jag E-strobade 2ggr på ett kommando kom allt ur fas.

Sen fick jag höja Delayen lite :)

Jo, den flimmrar hela tiden, är som den försöker rita ut gång på gång på gång..
Sen flimmrar texten snabbt ner på andra raden lite då och då.

50Hz flimmer? Ja kanske, har tänkt att köpa ett aggregat på Kjell&Co så småningom när ekonomin tillåter, just nu använder jag ett nätaggregat från en PC.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Nja, du har nog inget som "fångar upp" processorn i slutet av koden.

loop
goto loop

eller liknande.

Så processorn loopar runt till början hela tiden (ungefär som
om man satt och tryckte "reset" hela tiden).
xezer
Inlägg: 65
Blev medlem: 8 mars 2005, 20:41:21

Inlägg av xezer »

Och där löste sig det också :D Tack!
Skriv svar