Hallo,

Ik ben al een tijdje bezig met het aansturen van een 16*2 LCD met de HD44780 controller vanaf een tiny2313. Dit gaat allemaal prima en ik heb dan ook geen enkel probleem om er een tekst in te zetten. Alleen als ik de standaard wachttijden vervang door het uitlezen van de busy flag wil het ineens niet meer. Er komt geen karakter meer in beeld.

Nu heb ik op internet diverse assembly broncodes bestudeerd en ook eentje op dit forum en deze zijn vrijwel hetzelfde als mijn eigen code. Ik heb ook een aantal maal een stukje code gekopieerd in mijn eigen code, maar zonder succes.

Nu heb ik een vrij goedkoop display op school gekregen en er staan wel een aantal nummers op, maar als ik dit in google intyp vindt deze bijna niks, in elk geval niet waar ik wat aan heb.

Mijn vraag is nu:
Is het mogelijk dat de goedkopere displays niet van een busy flag aansluiting op db7 zijn voorzien?
of;
Kan het zijn dat bij de klonen van de HD44780 deze op een andere aansluiting zit?

Ik ben er 100% zeker van dat de zaak goed is aangesloten Misschien schort er toch iets aan de besturing, maar na er zeker 10 uren aan te hebben besteed wil ik dat eigenlijk niet meer geloven.

for what it's worth... ik meen ergens iets te hebben gelezen over een bepaald merk/soort display (het waren goedkope dacht ik) die niet perfect 100% volgens de spec werkten... ik weet niet of dat bij jou het geval is, maar je weet nooit...

Da fripster

Dikwijls zie je ook dat in schema's de R/W draad niet verbonden wordt (om een I/O te besparen). Mss ff checken?

De r/w lijn is aangesloten en wordt voordat de busy wordt uitgelezen ook hoog gezet, dus dat kan het probleem niet zijn. Ik zal zien of ik nog een ander LCD te pakken kan krijgen om het opnieuw te testen.

Ik heb nu een ander display van een ander merk geprobeerd en ook dit heeft geen resultaat. Met wachtlus wel tekst en met busy flag uitlezen problemen. Ik heb voor het probleemoplossen een ledje op een poortje gezet en hij blijft hangen in het gedeelte dat hij de busy afvraagt.

Ik heb even gekeken op de andere lijnen. Maar de gehele poort staat hoog als ik de busy ga uitvragen. d.w.z db0 t/m db7 is FF (binair: 11111111).

Op db0 t/m db6 zou een adres moeten staan, maar dat is er dus ook niet.

Poort waarop DB0-7 aangesloten is als input geconfigureerd bij het BF checken?

CD :)

Ja, voor het controleren van de busy wordt portb een input en na het controleren weer output.

RS laag, R/W hoog, E hoog gemaakt vóór het BF checken?

CD :)

Ook dat moet goed gaan. Hier is mijn broncode te bekijken. Misschien dat iemand een fout ziet. Op dit moment staat er een ; teken voor de call naar de busy flag routine. Zodra ik die weghaal en de wachttijd van 50us weghaal doet hij het niet meer.

http://www.mooiwaar.net/lcd8-bit.txt

busy_flag:						;display ready for next instrucion?
	cbi	change_dir , bf_line
	sbi	signal_port , e_line
	sbi	signal_port , rw_line
	nop
bf_loop:
	sbic	db_lines , bf_line			;if bf = 0
	rjmp	bf_loop
	cbi	signal_port , rw_line
	cbi	signal_port , e_line
	sbi	change_dir , bf_line
	ret						;then return

Om te beginnen is het niet zo netjes om alleen PB7 als input te configureren, de andere 7 bits zullen tijdens het lezen door zowel de AVR als de LCD worden aangestuurd. Verder is je fout denk ik dat je slechts 1 keer leest. Volgens mij moet je binnen de wacht-lus steeds opnieuw E hoog en weer laag maken E.

avrfreak heeft gelijk.

Zo doe ik het ook in mijn LCD routine:


LCDBUSY
	BSF	STATUS,RP0		; Select Register page 1
	MOVLW	0xFF			; Set PORTB for input
	MOVWF	LCD_DATA_TRIS
	BCF	STATUS,RP0		; Select Register page 0
	BCF	LCD_CTRL,LCD_RS		; Set LCD for command mode
	BSF	LCD_CTRL,LCD_RW		; Setup to read busy flag
	BSF	LCD_CTRL,LCD_E		; LCD E-line High
	MOVF	LCD_DATA,W		; Read busy flag + DDram address
	BCF	LCD_CTRL,LCD_E		; LCD E-line Low
	ANDLW	0x80			; Check Busy flag, High = Busy
	BTFSS	STATUS,Z
	GOTO	LCDBUSY

LCDNOTBUSY
	BCF	LCD_CTRL,LCD_RW
	BSF	STATUS,RP0		; Select Register page 1
	MOVLW	0x00
	MOVWF	LCD_DATA_TRIS		; Set PORTB for output
	BCF	STATUS,RP0		; Select Register page 0
	RETURN

Sorry, 't is wel PIC-ASM code maar het principe blijft hetzelfde.

CD :)

Ik heb er nu het volgende van gemaakt:


busy_flag:						;display ready for next instruction?
	clr	r16					;change db0-7 to input
	out	change_dir , r16
	sbi	signal_port , rw_line		;set rw_line
	cbi	signal_port , rs_line		;reset rs_line
bf_loop:
	sbi	signal_port , e_line		;set enable
	in	r16 , db_lines			;read db0-7
	andi	r16 , 0b10000000			;reset db0-6
	cbi	signal_port , e_line		;reset enable
	tst	r16					;if busy flag = 0
	brne	bf_loop				;then go out routine

	cbi	signal_port , rw_line		;reset rw_line
	ser	r16					;change db0-7 to output
	out	change_dir , r16
	ret

Maar helaas lukt het nog steeds niet. Het scherm blijft leeg. Ik ga het na het pinksterweekend nog eens proberen met een lcd van school waar de originele HD44780 chip op geplaatst is, want ik twijfel er aan of dit lcd wel van een busy flag voorzien is.

Domme vraag maar bij een PIC moet je eerst de Busy port in read zetten.
Dus normaal zet je de data op de poort en switcht dan naar read op de busy te lezen en schakeld daarna terug naar write om de volgende byte te versturen.

Is dat bij een AVR ook zo ?

Op 2 juni 2006 19:26:36 schreef Jilmer:
Maar helaas lukt het nog steeds niet. Het scherm blijft leeg. Ik ga het na het pinksterweekend nog eens proberen met een lcd van school waar de originele HD44780 chip op geplaatst is, want ik twijfel er aan of dit lcd wel van een busy flag voorzien is.

Misschien moet je nog een paar cycles delay toevoegen nadat je E hoog hebt maakt. Volgens de datasheet die ik hier heb, kan het tot 160ns duren voordat de data beschikbaar is, en de minimum puls breedte is 230ns.

Ik heb het geprobeerd. Ik heb er een aantal toegevoegd en uiteindelijk zelfs een wachtlus van 20 usec, maar niets lijkt te helpen. Ik heb nu een 40*2 scherm met de echte HD44780 chip geprobeerd en ook nu geen resultaat, dus er moet een fout in de programmering zitten. Ik krijg het idee dat de busy flag niet geconfigureerd wordt in de initialisatie, want bij uitlezen vanaf het scherm staat db0 t/m db7 op 0xFF. Het is jammer dat het niet lukt, want ik probeer het in assembly aan te sturen om maximale snelheid te kunnen bereiken.

Het probleem is opgelost !!!

Op een gegeven moment staat er in de busy flag routine:
in r16 , db_lines
oftewel
in r16 , portb

en dat portb moest pinb zijn. Nu werkt ie
Iedereen die me heeft proberen te helpen bedankt!

Greetz, Jilmer.