HD44780-kompatibel display: Kommer inte över till CGRAM...
Postat: 10 augusti 2013, 15:19:06
Jag har ett gäng rutiner (skrivna i Python) till min display. (Använder 4bit för data-pinnarna.)
Allt fungerar fint. Kan initiera, skriva text, byta rad/kolumn.
Men jag lyckas inte göra egna tecken.
Jag skickar nedanstående i tur och ordning:
(med 1 sekunds mellanrum för att utesluta att displayen inte hinner med.)
RS: 0
DB7-DB4: 0100
Skaka E-pinnen (skicka först 1 sedan 0 till den.)
DB7-DB4: 0000
Skaka E-pinnen (samma här.)
(Totalt sett blir ju detta 0b01000000, som är "Set CGRAM adress to AC (Adress Counter)".)
Det som händer är att markören på displayen går ner till första kolumnen på rad 2.
Varför? Jo: DDRAM-adressen för "första kolumnen på rad 2" är också 0b01000000 !
Men jag förstår inte vad jag gör för fel...
Jag sätter ju RS till 0.
För att sätta DDRAM adressen till AC (som man gör för att ändra markörens position) så ska ju RS vara 1.
Men jag har kollat med oscilloskopet och RS sätts till 0 innan jag skickar 0b01000000.
RS stannar även kvar på 0 efter att 0b01000000 har skickats.
Därefter har jag en Break i koden som avslutar där, så det är inget annat konstigt som påverkar.
Jag har även kollat med oscilloskopet så att 0b01000000 verkligen skickas och att det kommer i rätt tid.
Och som sagt:
Jag kan ju skriva text/siffror och ändra markörens position (med flit)
så allt är ju rätt kopplat och kodat i övrigt.
Jag har kollat igenom allt många gånger. Både i dag och i går.
För att vara säker på att "det jag tror att jag skickar" är samma sak som "det jag skickar" så har jag
en massa print-rader som (på datorns skärm) visar innehållet i den variabel som går direkt till displayens pinnar.
Här är därför utskriften av det jag påstår mig skicka ovan:
Förklaringar:
Bit 7-4 = DB7-DB4 på displayen.
Bit 3 = Används inte. (Funderade ett tag på att använda R/W-pinnen, men ångrade mig.)
Bit 2-1 = E-pinnarna på displayerna. (Det är en 4x40-display, därav 2st. Jag t.ex initierar båda samtidigt framgångsrikt.)
Bit 0 = RS-pinnen.
(Krysset/kryssen inom parentes markerar vilken/vilka bitar som kommentaren gäller.)
Utskriften på skärmen:
Först RS 0:
00000000 = RS off (-------X)
Nu CGRAM:
01000000 = DB (XXXX----) Högsta 4 bitarna.
01000110 = E on (-----XX-) Notera att datan från DB ligger kvar. Displayen "laddar" den till minnet när E är hög.
00000000 = E off (-----XX-) Här är datan från DB borta. Helt som det ska. Displayen har redan fångat det.
00000000 = DB (XXXX----) Lägsta 4 bitarna.
00000110 = E on (-----XX-)
00000000 = E off (-----XX-)
-----------------------
Såhär ser koden ut när jag anropar rutinerna och skickar den aktuella datan:
print("Först RS 0:")
lcd.rs(0)
sleep(1)
print("Nu CGRAM:")
lcd.db(0b01000000)
Om någon fastnade för det här med att jag inte har med DB7-DB4 när jag släcker E-pinnarna:
Jag använder exakt samma rutiner för när jag initierar displayen och skriver text/siffror. Dvs lcd.rs() och lcd.db()
E-pinnarna sköts av rutinen lcd.db()
Jag har även testat att låta datan från DB7-DB4 vara kvar när jag släcker E-pinnarna, utan skillnad.
Jag kan förstås visa koden, men jag tänkte först höra om någon känner igen fenomenet med att man stannar i DDRAM..
Något tips på vad som kan vara galet? (Bortsett från att den verkar stanna kvar i DDRAM.)
edit: Två av de datablad som jag studerat:
http://www.farnell.com/datasheets/1485446.pdf <-- Den aktuella displayen.
http://icecap.se/Sublevel/LCD_Dot_Matri ... Manual.pdf <-- Databladet för HD44780 från Sharp.
Länk till displayen hos Farnell:
http://se.farnell.com/midas/mc44005a6w- ... dp/2063179
Allt fungerar fint. Kan initiera, skriva text, byta rad/kolumn.
Men jag lyckas inte göra egna tecken.
Jag skickar nedanstående i tur och ordning:
(med 1 sekunds mellanrum för att utesluta att displayen inte hinner med.)
RS: 0
DB7-DB4: 0100
Skaka E-pinnen (skicka först 1 sedan 0 till den.)
DB7-DB4: 0000
Skaka E-pinnen (samma här.)
(Totalt sett blir ju detta 0b01000000, som är "Set CGRAM adress to AC (Adress Counter)".)
Det som händer är att markören på displayen går ner till första kolumnen på rad 2.
Varför? Jo: DDRAM-adressen för "första kolumnen på rad 2" är också 0b01000000 !
Men jag förstår inte vad jag gör för fel...
Jag sätter ju RS till 0.
För att sätta DDRAM adressen till AC (som man gör för att ändra markörens position) så ska ju RS vara 1.
Men jag har kollat med oscilloskopet och RS sätts till 0 innan jag skickar 0b01000000.
RS stannar även kvar på 0 efter att 0b01000000 har skickats.
Därefter har jag en Break i koden som avslutar där, så det är inget annat konstigt som påverkar.
Jag har även kollat med oscilloskopet så att 0b01000000 verkligen skickas och att det kommer i rätt tid.
Och som sagt:
Jag kan ju skriva text/siffror och ändra markörens position (med flit)
så allt är ju rätt kopplat och kodat i övrigt.
Jag har kollat igenom allt många gånger. Både i dag och i går.
För att vara säker på att "det jag tror att jag skickar" är samma sak som "det jag skickar" så har jag
en massa print-rader som (på datorns skärm) visar innehållet i den variabel som går direkt till displayens pinnar.
Här är därför utskriften av det jag påstår mig skicka ovan:
Förklaringar:
Bit 7-4 = DB7-DB4 på displayen.
Bit 3 = Används inte. (Funderade ett tag på att använda R/W-pinnen, men ångrade mig.)
Bit 2-1 = E-pinnarna på displayerna. (Det är en 4x40-display, därav 2st. Jag t.ex initierar båda samtidigt framgångsrikt.)
Bit 0 = RS-pinnen.
(Krysset/kryssen inom parentes markerar vilken/vilka bitar som kommentaren gäller.)
Utskriften på skärmen:
Först RS 0:
00000000 = RS off (-------X)
Nu CGRAM:
01000000 = DB (XXXX----) Högsta 4 bitarna.
01000110 = E on (-----XX-) Notera att datan från DB ligger kvar. Displayen "laddar" den till minnet när E är hög.
00000000 = E off (-----XX-) Här är datan från DB borta. Helt som det ska. Displayen har redan fångat det.
00000000 = DB (XXXX----) Lägsta 4 bitarna.
00000110 = E on (-----XX-)
00000000 = E off (-----XX-)
-----------------------
Såhär ser koden ut när jag anropar rutinerna och skickar den aktuella datan:
print("Först RS 0:")
lcd.rs(0)
sleep(1)
print("Nu CGRAM:")
lcd.db(0b01000000)
Om någon fastnade för det här med att jag inte har med DB7-DB4 när jag släcker E-pinnarna:
Jag använder exakt samma rutiner för när jag initierar displayen och skriver text/siffror. Dvs lcd.rs() och lcd.db()
E-pinnarna sköts av rutinen lcd.db()
Jag har även testat att låta datan från DB7-DB4 vara kvar när jag släcker E-pinnarna, utan skillnad.
Jag kan förstås visa koden, men jag tänkte först höra om någon känner igen fenomenet med att man stannar i DDRAM..
Något tips på vad som kan vara galet? (Bortsett från att den verkar stanna kvar i DDRAM.)

edit: Två av de datablad som jag studerat:
http://www.farnell.com/datasheets/1485446.pdf <-- Den aktuella displayen.
http://icecap.se/Sublevel/LCD_Dot_Matri ... Manual.pdf <-- Databladet för HD44780 från Sharp.
Länk till displayen hos Farnell:
http://se.farnell.com/midas/mc44005a6w- ... dp/2063179