Kann mir da jemand weiterhelfen: Ich möchte gerne auf einem DOGM 2x16 einen eigenen Zeichensatz anzeigen. Für ein HD44780U Kompatibles gibt es ja schon genug Beispiele dafür. Für das DOGM habe ich das Beispiel von Mario Richter genommen und um etwas erweitert. Leider bekomme ich es nicht hin meine Zeichen darzustellen. Hat jemand einen Idee dazu? Wie kann ich überprüfen ob die zeichen ins cgram geschrieben wurden? Ich vermute nämlich fast das die selbstdefinierten zeichen zwar drinnen sind, aber nicht ausgelesen werden.
Hallo Manfred, an welcher Stelle deines Programms schreibst du die Adressen deiner selbst definierten Zeichen ins DDRAM damit sie auf dem Display erscheinen? Gruß John
Hier:
1 | // Selbstdefinierter Zeichensatz in den CGRAM kopieren
|
2 | // ---------------------------------------------------
|
3 | dogm_putc_cgram_p(PfeilL,0); |
4 | dogm_putc_cgram_p(PfeilR,1); |
5 | dogm_putc_cgram_p(BalkenLL,2); |
6 | dogm_putc_cgram_p(BalkenRL,3); |
7 | dogm_putc_cgram_p(KugelL,4); |
8 | dogm_putc_cgram_p(KugelV,5); |
9 | dogm_putc_cgram_p(BalkenL,6); |
10 | dogm_putc_cgram_p(BalkenV,7); |
Damit definierst Du die Zeichen im CGRAM. Damit sie auf dem LCD erscheinen musst Du die Adresse des jeweiligen Zeichens, an der Stelle ins DDRAM schreiben, an der sie auf dem LCD erscheinen sollen.
Und wie sollte das aussehen? Dachte man liest die direkt aus dem CGRAM aus?
Manfred W. schrieb: > Dachte man liest die direkt aus dem CGRAM aus? Ja. Das macht der Controller des LCDs. Du musst ihm nur mitteilen an welcher Stelle er die Zeichen ausgeben soll. Hier definierst Du eine Zeichenkette zur Ausgabe auf dem LCD: > const char menu_103[] PROGMEM = "{##=======} 2"; Der ASCII-Code der Zeichen ist: { -> 0x7B # -> 0x23 = -> 0x3D Das ergibt: [0x7B 0x23 0x23 0x3D 0x3D 0x3D 0x3D ...] Diese Bytes werden zum Display gesendet und dort ins DDRAM geschrieben. (Der ASCII-Code entspricht der jeweiligen Adresse des Zeichens im CGRAM.) Wenn jetzt statt "#" BalkenV und statt "=" BalkenL angezeigt werden soll, dann musst du die Zeichenkette entsprechend ändern. BalkenL -> 0x06 (Adresse im CGRAM) BalkenV -> 0x07 Das ergibt: [0x7B 0x07 0x07 0x06 0x06 0x06 0x06 ...] Gruß John
Das passiert in der dogm.c. Dort werden die entsprechenden Zeichen durch dir Position der selbstdefinierten Zeichen im CGRAM ersetzt.
Dann meine nächste Frage: Was zeigt das LCD an den entsprechenden Stellen an?
(dogm.c)
1 | // ************************************************************
|
2 | // Store individual character from flash on cgram
|
3 | // ************************************************************
|
4 | void dogm_putc_cgram_p(const char *progmem_s, unsigned char _position) |
5 | {
|
6 | dogm_write_nocheck(0, (1<<LCD_CGRAM)+_position*8); |
7 | register char c; |
8 | register char x1; |
9 | for (x1=0;x1<=7;x1++) |
10 | {
|
11 | (c = pgm_read_byte(progmem_s++)); |
12 | dogm_putc(c); <<HIER schreibst du wieder ins DDRAM und nicht ins CGRAM! |
13 | }
|
14 | dogm_clear(); |
15 | }
|
Sascha
Das heißt ich muß mir eine neue Funktion basteln? Oder gibts einen anderen Weg?
halt Kommamdo zurück - in *dogm_putc(c)* setzt du ja nicht die Adresse sondern gibts nur die Daten aus. Allerdings könnte dir deine Switch-Verzweigung die binärdaten der Zeichen unbrauchbar machen. Nimm lieber dogm_write_check. Aber das sieht komisch aus ...
1 | dogm_write_nocheck(0, (1<<LCD_CGRAM)+_position*8); |
die CGRAM-Adressen beginnen zumindest beim HD44780 mit Null - bei dir aber mit 64! Sascha
dogm_write_check schreibt aber mit 8Bit. Damit bekomme ich nichts mehr aufs LCD. Wie kommst du auf 64? LCD_CGRAM ist mit 6 deklariert.
Manfred W. schrieb: > dogm_write_check schreibt aber mit 8Bit. ja und 1 Byte eben, als Command oder Data > Damit bekomme ich nichts mehr aufs LCD. wieso?? > Wie kommst du auf 64? LCD_CGRAM ist mit 6 deklariert. na (1<<6) = 64 Ich hab mir die DOGM's noch nicht angesehen, scheinen aber ja HD44780 kompatibel zu sein. Dort beginnen die Ardessen für's CGRAM bei 0x00. Sascha
Hi Bevor du auf das CG-RAM schreibst, solltest du sicher stellen, das die Instruction Table 0 eingestellt ist. MfG Spess
so nun hab ich mir doch noch das Datenblatt angeschaut ... das LCD_CGRAM=6 passt beim dogm doch, aber wie Spess schon schreibt, stellst du während des Init's
1 | dogm_write_check(0, 0x29);// 4-Bit Datenlänge, 2 Zeilen, Instruction table 1 |
auf Instruction table 1, um die CGRAM-Adresse zu setzen musst du am Ende des Init's wieder auf Instruction table 0 zurückschalten (0x28) Sascha
WOW! Ihr seit göttlich! Daran lags tatsächlich. Da wäre ich nie drauf gekommen. Seltsamerweise funktioniert es jetzt nur mit der dogm_write_check Funktion, die mir vorher überhaupt nichts auf LCD gebracht hat. Danke euch!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.