LCD met Picaxe

Een collega gebruikte Picaxe voor zijn projecten. Hij is nu een tijdje met pensioen en er werd me gevraagd om zijn job over te nemen. Aangezien er een hoop Picaxe controllers voor handen zijn ben ik ermee aan de slag gegaan om een realytester te ontwikkelen. Ik ben enkele jaren een Arduino-gebruiker en dus niet echt vertrouwd met Basic.

Ik wil eenvoudigweg een LCD-display aansturen en zoals gebruikelijk test ik een code uit met de bekende woorden "Hello World". De voorbeeldprogramma's maken gebruik van een seriële of een I2C communicatie. Maar zo'n display hebben we dan weer niet voorradig. Nu gebruik ik een courante LCD met HD44780 controller die ik steeds met mijn Arduino gebruik. Het display wordt met 4 databits aangestuurd. De microcontroller is een picaxe20x2 of een picaxe20m2 (ik probeer ze alletwee) Het eindresultaat is geen Hello World op het display maar 2 volledige lijnen met blokjes van 5*8 dots met daartussen een lijn met blokjes van 5*3. Ik heb in de initialisatie cyclus al verschillende instellingen gewijzigd, maar het resultaat blijft hetzelfde. Het lijkt of het LCD blokjes van 5*11 wil weergeven. (BTW het LCD is 20 characters bij 4 lijnen)

Hieronder het programmaatje dat ik heb geschreven. Hopelijk is er iemand die mijn fout opmerkt

pic basic code:

'driving a 20*4 LCD with HD44780 controller

symbol EN = B.2				;controlsignals
symbol RS = B.3

symbol db4 = B.4				;databits LSB
symbol db5 = B.5
symbol db6 = B.6
symbol db7 = B.7				;databits MSB

;symbol rscmdmask = %00000000
;symbol rsdatmask = %00000100

symbol chars = b0
symbol LCDdata = b1
symbol rsbit = b2

DirsB = %11111100


'EEPROM value and text

' Nibble command - to initialize 4bit mode
	
	EEPROM 0, ($33);($33)	;%0011---- %0011----
	EEPROM 1, ($32);($32)	;%0011---- %0010----

'Byte command to configure LCD
	'initialisation
	
	EEPROM 2, (%00100000)	;%001L NF00 Display format
					;L : 0 = 4bit mode	1 = 8bit mode
					;N : 0 = 1 line		1 = 2 lines
					;F : 0 = 5*8 dots		1 = 5*11 dots

	EEPROM 3, (%00001111)	;%0000 1DCB Display On
					;D : 0 = display off	1 = display on
					;C : 0 = cursor off	1 = cursor on
					;B : 0 = no blink		1 = blink

	EEPROM 4, (%00000110)	;%0000 01IS Cursor move
					;I : 0 = decrement	1 = increment
					;S : 0 = cursor move	1 = display shift

	EEPROM 5, ($01);($01)	; clear screen

'Messages
	
	EEPROM 6, ("Hello")
	EEPROM 11, ("World")

PowerOnReset:

	gosub InitLCD

Main:

	LCDdata = %00001111	;Display on
clearscreen:


	LCDdata = %01
	gosub SendCmdByte

MoveCursorToStartOfFirstLine:


	LCDdata = $80
	Gosub SendCmdByte

	
DisplayTopLine:


	For chars = 6 to 10
		Read chars, LCDdata
		Gosub SendDataByte
	Next

MoveCursorToStartOfSecondLine:


	LCDdata = $94
	Gosub SendCmdByte

DisplayBottomLine:
	

	For chars = 11 to 16
		read chars, LCDdata
		gosub SendDataByte
	Next

	wait 5			;wait 5 seconds
	LCDdata = %00001011	;display off
	gosub SendCmdByte
	wait 1
goto main
End
		
InitLCD:
		

	for chars = 0 to 5
		read chars, LCDdata		;read data from eeprom and store 
							;in LCDdata
		gosub sendInitCmdByte		;send command to display
	next
	
	Return
	
SendInitCmdByte:
	

	Pause 150
	
SendCmdByte:


	RSbit = $00					; RS is set for command

SendDataByte:
	

	PinsB = LCDdata & %11110000 | RSbit	;put MSB out first
	pulsout EN, 150				;Give 10msec pulse on Enable
	pause 150
	PinsB = LCDdata * %00010000 | RSbit		;put LSB out second
	Pulsout EN, 150
	
	RSbit = $04					;send to dataregiter next
	Return
Depeet
Lambiek

Special Member

Jammer dat de picaxe geen print commando heeft, dat zou het een stuk simpeler maken. :)

Geef mij maar de normale pic's. :)

Als je haar maar goed zit, GROETEN LAMBIEK.

Tja Lambiek, je moet vaak roeien met de riemen die men je geeft :-p Maar volgens mijn bescheiden mening kan je met een printcommando geen LCD initialiseren ;-) Ik vermoed dat het daar reeds verkeerd loopt. Met een AVR-chipje die ik met C++ programmeer (dus niet eens met het Arduinotaaltje) lukt het het wel om het LCD aan te sturen

Depeet
Lambiek

Special Member

Nee dat klopt, dat doe ik met Declare. En daarna kun je schrijven naar je display wat je wil met een print opdracht.

Volgens mij moet jij dit gebruiken om je LCD te initialiseren.

code:


#define  Define a name to control conditional compilation   
Als je haar maar goed zit, GROETEN LAMBIEK.

Probleem is opgelost. Zoals gewoonlijk zat het probleem tussen de stoel en het klavier :-p

In de SendDatabyte-routine had ik RSbit = $04 geschreven. Hiermee zette ik de Enable-line van het LCD hoog in plaats van de RS-lijn (registerselect). Met RSbit = $08 zat ik wel juist en werkt het zoals ik het bedoelde.

Deze topic mag worden afgesloten

Depeet
Lambiek

Special Member

In ieder geval mooi dat het nu werkt. :)

Als je haar maar goed zit, GROETEN LAMBIEK.