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
Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
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.
Turbokeu
Golden Member
I love watching conspiracy theorists use the airtight logic of the argument from incredulity: "Well I don't understand how it works so it can't be real!!!"
Turbokeu
Golden Member
I love watching conspiracy theorists use the airtight logic of the argument from incredulity: "Well I don't understand how it works so it can't be real!!!"
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.
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 returnOm 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.
Turbokeu
Golden Member
I love watching conspiracy theorists use the airtight logic of the argument from incredulity: "Well I don't understand how it works so it can't be real!!!"
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.