DOGM Eigener Zeichensatz

#2340054
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.
Angehängte Dateien:
#2340616
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);
#2340719
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
#2340820
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
#2340873
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
#2341347
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
#2341419
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren