Sida 1 av 3
Problem med 4bitars initiering av LCD
Postat: 9 augusti 2006, 22:35:41
av JimmyAndersson
Försöker initiera en HD44780-kompatibel display i 4-bitarsläget.
Strombom gjorde en bra guide för några år sedan, men det är något som inte stämmer. Har testat i ett simuleringsprogram och får samma fel. Själva initieringen går bra, men när jag ska stänga på display och markör så verkar det som om något fattas i initieringen. Initieringen ser ut såhär:
Bitarna är i ordningen D7, D6, D5, D4
0011
0011
0011
0010
0010
1000
0000
1000
0000
0001
0000
0110
Sedan försöker jag stänga på display och blinkande markör med:
0000
1111
Men det verkar som om det fattas en rad i initieringen för det enda som händer är att AC hamnar i CGRAM istället. (När jag skickat de senaste 0000 så motsvarar det istället "Set CGRAM address to 32")
Någon som vet vad som är galet?
edit: Ändrade rubriken. En LED behöver inte initieras.....

Postat: 9 augusti 2006, 22:44:09
av strombom
Kolla på sidan 46 här:
http://www.sparkfun.com/datasheets/LCD/HD44780.pdf
Det är den jag har följt tror jag. Jag kan inte komma på vad som är fel.
/Johan
Postat: 9 augusti 2006, 22:48:22
av bengt-re
Timeingen? Kolla så att du inte kör för fort (för korta enable pulser, lägger på komandona för snabbt eller så). Läs databladet och håll dig på säkra sidan.
Postat: 9 augusti 2006, 23:15:33
av JimmyAndersson
bengt-re:
Det är inga problem med timingen eftersom jag även fått samma resultat med ett simuleringsprogram gjort i Javascript.
strombom:
Tack för länken, det fanns *massor* med info där. Men 'din' initiering ser likadan ut som i PDF'en, så allt verkar vara ok så långt.
Kommandot för att stänga på display och visa blinkande markör ser ut såhär:
00001DCB (D = 1 display on, C = 1 cursor on, B = 1 cursor blinkar.)
Då ska jag väl skicka:
0000
E-pinne
1111
E-pinne
Eller hur? RS är 0 under hela tiden.
Postat: 9 augusti 2006, 23:18:54
av sodjan
Kommentera !!
Så får vi se vad du *tror* att du gör.
Om jag har tolkat det rätt :
> 0011 ; 8-bit
> 0011 ; 8-bit
> 0011 ; 8-bit
> 0010 ; 4-bit !
> 0010 ; Set 2-line och 5x7
> 1000
> 0000 ; Displ off, underline off, curs blink off.
> 1000
> 0000 ; Clear display.
> 0001
> 0000 ; "Increment", display shift off.
> 0110
Sedan försöker jag stänga på display och blinkande markör med:
> 0000 ; disp, curs och blink on.
> 1111
Det är alltså 0110 - 0000 som uppfattas som "Set CGRAM address to 32" ?
Stämmer alla komandon innan i simulatorn ?
Någonstans kommer det ur fas...
Postat: 9 augusti 2006, 23:24:23
av sodjan
Bra LCD guide :
http://www.epemag.wimborne.co.uk/resources.htm
De två PDF'erna...
En annan sak, det *kan* vara bra att veta vad det är för LCD...
Postat: 9 augusti 2006, 23:43:43
av JimmyAndersson
Vad jag *tror* att jag gör? Tja, jag följer det som står i stromboms guide och länk. Så, jag tror att jag gör det som står där..
Men detta ser jag i simuleringsprogrammet:
0011 ; 8 bit mode ON, 1 line, 5*8 font. AC = 0. AC points to DDRAM.
0011 ; 8 bit mode ON, 1 line, 5*8 font.
0011 ; 8 bit mode ON, 1 line, 5*8 font.
0010 ; 4 bit mode ON, 1 line, 5*8 font.
0010 ; 4 bit mode ON, 1 line, 5*8 font.
1000 ; Set DDRAM address to 8.
0000 ; Set DDRAM address to 0.
1000 ; Set DDRAM address to 8.
0000 ; Set DDRAM address to 0.
0001 ; Cursor or display shift command:left, move cursor.
0000 ; Cursor or display shift command:left, move cursor. AC = 79.
0110 ; Set CGRAM address to 38.
0000 ; Set CGRAM address to 32. AC = 32. AC points to CGRAM.
1111 ; Set DDRAM address to 127.
Vet inte om det stämmer eller om programmet visar all info.
edit: lcd1.pdf och lcd2.pdf har jag redan kollat.
Displayen är en Sharp LM16A211. Har sett att den brukar kallas "sodjan-displayen" på forumet.

Har även kollat det databladet förstås.
edit 2:
"Det är alltså 0110 - 0000 som uppfattas som "Set CGRAM address to 32" ?"
Det verkar så.
"Stämmer alla komandon innan i simulatorn ?"
Det var bl.a det jag ville ha hjälp med. I inläggen ser ni exakt vad jag skickat på D-pinnarna.
edit 3:
Ska man alltid dela upp D-bitarna när man kör i 4bitars-läget? Dvs om kommandot för att stänga på skärmen mm (som jag skrivit tidigare) är 0001111. Ska man då först skicka 0000 och sedan 1111 ?
Simuleringsprogrammet
Postat: 10 augusti 2006, 10:02:04
av JimmyAndersson
Fortsätter i ett nytt inlägg..
Men vad skickas egentligen vid en initiering?
När man skickar de första raderna, dvs:
0011
0011
0011
så är den ju i 8bitars-läget. Skickar man då egentligen:
00110000
00110000
00110000
eller?
Men de raderna finns inte i datablad, guider, lcd1.pdf eller lcd2.pdf.
Postat: 10 augusti 2006, 11:38:17
av Icecap
Enl. databladet på min hemsida:
4-bit initiering.
Vänta 15ms eller mer efter spänningspåslag.
0011 till adress 0
Vänta 4,1ms eller mer.
0011 till adress 0
Vänta 100µs eller mer.
0011 till adress 0
Från och med nu kan man kolla Busy-flaggan vid behov.
0010 till adress 0
Nu är den i 4-bits läge!
0010 ; Set storlek, rader osv
NF**
osv.....
Postat: 10 augusti 2006, 11:53:08
av strombom
0011
0011
0011
0010
0010
0000
1000
0000
1000
0000
0001
0000
0110
det verkar funka för mig

Postat: 10 augusti 2006, 12:19:54
av JimmyAndersson
De raderna ser bekanta ut. Tror jag lärt mig dem utantill nu.
Men stänger det även på displayen (Dvs Display=ON) hos dig?
Det gör det inte hos mig, varken i simuleringsprogrammet eller i verkligheten.
Däremot visade pdf-filen på Icecap's sajt några saker jag inte sett hos mina andra fem guider/datablad. Så detta fungerar:
0011
0011
0011
0010 - 4bitars-läge
1010 - 2 rader, 5x8-font.
0000 - "Invalid command" men det måste vara med för annars fungerar inte:
1111 - Stänger på display och markör som blinkar.
Det fungerar i simuleringen iallafall. Ni får gärna testa det i 'verkligheten'.
Som jag frågat några gånger tidigare:
Ska man alltid dela upp D-bitarna när man kör i 4bitars-läget? Dvs om kommandot för att stänga på skärmen mm (som jag skrivit tidigare) är 0001111. Ska man då först skicka 0000 och sedan 1111 ?
Postat: 10 augusti 2006, 12:35:41
av Icecap
Det är MSB först, sedan LSB, just som du skriver:
00001111 skrivs
0000 ; Först
1111 ; Sen
Kom ihåg timingen under initialiseringen, den är mycket viktig!
T.e. tar en Clear-Screen längre tid att utföra än "vanliga" kommandon...
Postat: 10 augusti 2006, 14:03:49
av JimmyAndersson
Aha, men då har jag nog koll på läget.
Ska ha koll på timingen.
Tack för hjälpen!
edit: Nähepp, i den verkliga världen framför labbplattan så blinkar inte markören. LCD'n initieras rätt däremot. (Båda raderna har samma kontrast.) Har testat att skriva ut lite text på LCD'n men den syns inte.
Fungerar stromboms kod för er? Utför den någon Display = ON? Blinkar markören?
Postat: 10 augusti 2006, 14:18:57
av Icecap
Jag initierar alltid utan blinkande markör.....
Markören behövs inte för att skriva till modulet, det är mer en användare-grej om man ska knappa in värden siffer för siffer.
Postat: 10 augusti 2006, 14:52:20
av JimmyAndersson
Jag brukar också göra så, men med risk för att verka tjatig

(jag har frågat om detta fem gånger nu) så undrar jag:
Stänger t.ex stromboms 4bit-initiering på displayen, eller initieras den bara?
Det som jag haft problem med sedan första inlägget är att jag inte lyckas stänga på displayen efter initieringen.