Hjälp med LM16A211 LCD

Lysdioder, Optiska sensorer, Fiberoptik, Displayer, Lasrar, Optiska kopplare
xezer
Inlägg: 65
Blev medlem: 8 mars 2005, 20:41:21

Inlägg av xezer »

Har ändrat en del i koden sen sist jag postade den. Här kommer den igen.
Som sagt, problemet är att displayen töms inte och cursorn hoppar fram 5 tecken.

Sodjan:
Jag tror att det blir W xor W, altså den töms?


Kod: Markera allt


;*********************************************
;*  Delay på 5mSek, genererad från
;* http://www.piclist.com/techref/piclist/codegen/delay.htm                           *
;*********************************************

; 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		


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

DISPLAY_SEND:
	IORLW		DISP_STAT		;Lägger till eventuella status-bitar som E och RS

	MOVWF		PORTB 		;Skickar till displayen
	XORLW		DISP_E 		;Tar bort Enable
	MOVWF		PORTB
	
	CALL		Delay_5ms ;Dröjer 5mSek
	
	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'00110000'
	CALL		DISPLAY_SEND	; 8-bit
	MOVLW		b'00110000'
	CALL		DISPLAY_SEND	; 8-bit

	MOVLW		b'00110000'
	CALL		DISPLAY_SEND	; 8-bit
	MOVLW		b'00100000'
	CALL		DISPLAY_SEND	; 4-bit!

	MOVLW		b'00100000'
	CALL		DISPLAY_SEND
	MOVLW		b'10000000'
	CALL		DISPLAY_SEND	; 2rader och 5x7pixlars font

	MOVLW		b'00000000'
	CALL		DISPLAY_SEND
	MOVLW		b'10000000'
	CALL		DISPLAY_SEND	; Display off, curs off, blink off

	MOVLW		b'00000000'
	CALL		DISPLAY_SEND
	MOVLW		b'00010000'
	CALL		DISPLAY_SEND	; Clear display
	
	CALL		Delay_5ms

	MOVLW		b'00000000'
	CALL		DISPLAY_SEND
	MOVLW		b'01100000'
	CALL		DISPLAY_SEND	; Display shift off

	MOVLW		b'00000000'
	CALL		DISPLAY_SEND
	MOVLW		b'11110000'
	CALL		DISPLAY_SEND	; 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
	;###


	BSF			DISP_STAT,DISP_EBIT		;Sätter Enable pinnen
	CALL		DISPLAY_INIT			;Initiera displayen
	BSF		DISP_STAT,DISP_RS		;Sätter RS-flaggan så det är tecken vi handskas med nu

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

Inlägg av sodjan »

> Jag tror att det blir W xor W, altså den töms?

Jag misstänke att du trodde det... :-)

För övrigt saknas det delar av din kod för att kunna säga
något om den. Definition av konstanter (DISP_RS t.ex) och
variabler (som tex TIMER1 och TIMER2)...
xezer
Inlägg: 65
Blev medlem: 8 mars 2005, 20:41:21

Inlägg av xezer »

Okej, här kommer resten av 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'7'			;Enable
DISP_RS		EQU	b'00000010'		;Register-select
DISP_RW		EQU	b'00000100'		;Read/Write
DISP_STAT	EQU	b'00000000'		;Håller i statusen för DISP_RS, E och DISP_RW


TIMER1		EQU	h'E7'
TIMER2		EQU     h'04'


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


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

Inlägg av sodjan »

Du behöver läsa på mer, både databladet och tidigare inlägg i tråden.
Du har *inte* rättat de fel som har nämnt här tidigare...

> TIMER1 EQU h'E7'
> TIMER2 EQU h'04'

Helt galet... :-)
Kolla var adresserna H'04' resp h'E7' ligger !!
Är det verkligen där du vill ha variablerna ???

Är allt klart nu när det gäller "literal" instruktionerna ?
xezer
Inlägg: 65
Blev medlem: 8 mars 2005, 20:41:21

Inlägg av xezer »

TIMER1 och TIMER2 hade jag satt såhär innan:

CBLOCK 0x20
TIMER1
TIMER2
ENDC

Ändrade visst aldrig tillbaka efter det att jag hade fifflat runt och testat en massa. :oops:
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Innan vadå ?
CBLOCK'et ser väl helt OK ut.
Varför ändra det ?

Och har du fixat DISP_RS ?
xezer
Inlägg: 65
Blev medlem: 8 mars 2005, 20:41:21

Inlägg av xezer »

Sodjan:
Innan jag såg en delay-funktion som hade satt variablerna utanför ett CBLOCK, tyckte det borde vara fel men testade att ta bort det och sätta värden.

om du menar:
BSF DISP_STAT,DISP_RS

så är det ändrat till:
DISP_RSBIT EQU d'1' ;Register-select bit

BSF DISP_STAT, DISP_RSBIT


Jag tror felet har med antingen att jag initierar den fel eller att Enablen inte är som den ska; den verkar komma ur fas eller något :?


EDIT:
Ska man skicka ut bitarna, sedan sätta på Enable, sedan sätta av Enable, sedan ta bort bitarna?
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Till editen: JA!

På min hemsida, under "Freebies", finns ett PDF-dokument som anger hur man styr såna LCD.
xezer
Inlägg: 65
Blev medlem: 8 mars 2005, 20:41:21

Inlägg av xezer »

Icecap:

Så om jag skriver om DISPLAY_SEND såhär borde den delen fungera?

Kod: Markera allt

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

DISPLAY_SEND:
   IORLW      DISP_STAT      ;Lägger till eventuella status-bitar som RS och RW
   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 
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> IORLW DISP_STAT

Fungerar, men antagligen inte som du tror...

DISP_STAT är ju = b'00000000', så du gör *alltid* OR med b'00000000'.

Som sagt, du behöver kolla lite extra på "literal" instruktionerna...
xezer
Inlägg: 65
Blev medlem: 8 mars 2005, 20:41:21

Inlägg av xezer »

Sodjan:
Det hade jag inte tänk på. Jag la dit DISP_STAT i CBLOCKet nu och sätter värde på den med:

movlw b'00000000'
movwf DISP_STAT

Icecap:
Bra manual det där :)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Lite "goddag yxskaft" det här... :-)

Vad har CBLOCK'et med IORLW att göra ????

Skit samma, jag hoppar av...
xezer
Inlägg: 65
Blev medlem: 8 mars 2005, 20:41:21

Inlägg av xezer »

Sodjan:

>Vad har CBLOCK'et med IORLW att göra ????

Inte mycket, vad jag trodde du menade var att DISP_STAT är en konstant och kommer alltid erhålla värdet 0.
Därför satte jag det bland övriga variabler.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Så som du använder DISP_STAT (d.v.s i IORLW instruktionen) så
är DISP_STAT fortfarande en konstant, nämligen adressen till
en variabel som heter DISP_STAT...

Så du kommer hela tiden att göra OR med *adressen* till DISP_STAT...

Kolla *IGEN* på hur IORLW fungerar !
Och alla andra "literal" intstruktioner...
xezer
Inlägg: 65
Blev medlem: 8 mars 2005, 20:41:21

Inlägg av xezer »

Nu förstår jag literala operatorer bättre och inser misstaget med IORLW.
Nu har jag delvis fått det att fungera, displayen clear'as, det ända som är lite lustigt är att cursorn förflyttas framåt hela tiden :?

Vad kan vara fel?
Initieringen ser ut som följande:

Kod: Markera allt

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	; 8-bit
	MOVLW		b'00110000'
	CALL		DISPLAY_SEND	; 8-bit

	MOVLW		b'00110000'
	CALL		DISPLAY_SEND	; 8-bit
	MOVLW		b'00100000'
	CALL		DISPLAY_SEND	; 4-bit!

	MOVLW		b'00100000'
	CALL		DISPLAY_SEND
	MOVLW		b'11000000'	;5x10
	CALL		DISPLAY_SEND	; 2rader och 5x7pixlars font

	MOVLW		b'00000000'
	;XORLW		W
	CALL		DISPLAY_SEND
	MOVLW		b'10000000'
	CALL		DISPLAY_SEND	; Display off, curs off, blink off

	MOVLW		b'00010000'
	;XORWF		W
	CALL		DISPLAY_SEND
	MOVLW		b'11000000'
	CALL		DISPLAY_SEND	; Display shift off

	MOVLW		b'00000000'
	;XORLW		W
	CALL		DISPLAY_SEND
	MOVLW		b'00010000'
	CALL		DISPLAY_SEND	; Clear display

	MOVLW		b'00000000'
	;XORWF		W
	CALL		DISPLAY_SEND
	MOVLW		b'11110000'
	CALL		DISPLAY_SEND	; Display on, curs on, blink on
Skriv svar