Forum: Mikrocontroller und Digitale Elektronik DOGM Eigener Zeichensatz


von Lokus P. (derschatten)


Angehängte Dateien:

Lesenswert?

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.

von Lokus P. (derschatten)


Lesenswert?

nichts? gar nichts?

von John B. (johnbauer)


Lesenswert?

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

von Lokus P. (derschatten)


Lesenswert?

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);

von John B. (johnbauer)


Lesenswert?

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.

von Lokus P. (derschatten)


Lesenswert?

Und wie sollte das aussehen?
Dachte man liest die direkt aus dem CGRAM aus?

von John B. (johnbauer)


Lesenswert?

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

von Lokus P. (derschatten)


Lesenswert?

Das passiert in der dogm.c. Dort werden die entsprechenden Zeichen durch 
dir Position der selbstdefinierten Zeichen im CGRAM ersetzt.

von John B. (johnbauer)


Lesenswert?

Dann meine nächste Frage:
Was zeigt das LCD an den entsprechenden Stellen an?

von Lokus P. (derschatten)


Lesenswert?

leeren Inhalt

von Sascha W. (sascha-w)


Lesenswert?

(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

von Lokus P. (derschatten)


Lesenswert?

Das heißt ich muß mir eine neue Funktion basteln? Oder gibts einen 
anderen Weg?

von Sascha W. (sascha-w)


Lesenswert?

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

von Lokus P. (derschatten)


Lesenswert?

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.

von Sascha W. (sascha-w)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

Bevor du auf das CG-RAM schreibst, solltest du sicher stellen, das die 
Instruction Table 0 eingestellt ist.

MfG Spess

von Sascha W. (sascha-w)


Lesenswert?

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

von Lokus P. (derschatten)


Lesenswert?

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
Noch kein Account? Hier anmelden.