Forum: Mikrocontroller und Digitale Elektronik Benutzerdefinierte Zeichen beim LCD WD-C2704


von ;o) (Gast)


Lesenswert?

Guten Tag

Ich habe ein Projekt bei dem das Pollin-LCD WD-C2704 verbaut ist.
(27x4 Textbasierend)
Die Anzeige funktioniert soweit.

Ich wollte jetzt Benutzerdefinierte Zeichen hinzufügen.
Leider wird beim Benutzerdefinierten Zeichen nur Datenmüll angezeigt.
Diese Zeichen sehen nach jedem Resetten des Mikrocontrollers anders aus.

Weis jemand ob beim WD-C2704M überhaupt benutzerdefinierte Zeichen 
unterstützt werden?

Mikrocontroller:
ATmega32L

Programierumgebung:
AVR Studio7

LCD-Bibleothek:
LCD-Bibleothek von Steffan Seegel
Beitrag "lib für Pollin LCD (WINTEK2704)"
1
Main.c:
2
.
3
.
4
.
5
lcd_init(LCD_DISP_ON);
6
WriteSonderzeichen();
7
  
8
lcd_gotoxy(0,1);
9
uint8_t ui;
10
for(ui=0;ui<8;ui++)
11
{
12
    lcd_putc(ui);
13
}
14
while(1){}
15
.
16
.
17
.
18
19
// LCD_GC_CHAR0 = 0
20
// LCD_PIN_E1 = Pinnummer des Enablepins1
21
void WriteSonderzeichen(void)
22
{
23
    // Zeichen 0
24
    uint8_t uchZeichen[8] =    {    0b00011111,
25
                                    0b00011111,
26
                                    0b00011111,
27
                                    0b00011111,
28
                                    0b00011111,
29
                                    0b00011111,
30
                                    0b00011111,
31
                                    0b00000000};
32
    lcd_generatechar(LCD_GC_CHAR0,uchZeichen,LCD_PIN_E1);
33
}
34
35
//wintek2704.c 
36
.
37
.
38
.
39
void lcd_generatechar( uint8_t startadresse, const uint8_t *data, uint8_t uchLCD_Enable_Nr)
40
{
41
    active_e = uchLCD_Enable_Nr;
42
    // Startposition des Zeichens einstellen
43
    lcd_command( LCD_SET_CGRAM | (startadresse<<3) ); //Startadressen: 0;1;2;3;4;5;6;7
44
  
45
    // Bitmuster übertragen
46
    for ( uint8_t i=0; i<8; i++ )
47
    {
48
        lcd_write( data[i],LCD_DATEN );
49
    }
50
}
51
.
52
.
53
.
Weis jemand was ich falsch mache, falls dieses LCD benutzerdefinierte 
Zeichen anzeigen kann?

mfg ;o)

von Axel S. (a-za-z0-9)


Lesenswert?

;o) schrieb:
> Ich habe ein Projekt bei dem das Pollin-LCD WD-C2704 verbaut ist.
> Ich wollte jetzt Benutzerdefinierte Zeichen hinzufügen.
> Leider wird beim Benutzerdefinierten Zeichen nur Datenmüll angezeigt.

Dir ist bewußt, daß dieses LCD von zwei unabhängigen HD44780 
Controllern angesteuert wird? Je einem für die beiden oberen respektive 
die beiden unteren Zeilen? Wenn du ein benutzerdefiniertes Zeichen in 
einem dieser Controller anlegst, ist es auch nur in dessen 
Displayhälfte verfügbar.

von ;o) (Gast)


Lesenswert?

Ja, mir ist dies durchaus bewusst.
Desswegen habe ich ja die Funktion um die Auswahl des 
Prozessor-Enablepins erweitert.
(active_e / uchLCD_Enable_Nr)

Es kann natürlich sein das ich da bei der Enable Auswahl einen Fehler 
gemacht habe.

von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

Hi,
sieht stark nach HD44780 aus von der Initialisierung her.
Wie @Axel schon sagte:
2 Controller. 2 Initalisierungen.
2 Enable Impuls-Eingänge. Zuordnung zu den Zeilen. Bei Locate-Anweisung 
also auch noch den "richtigen" Enable Impuls senden.
Beispielprogramm für e i n e n HD44780 kommt gleich.
Die "User defined characters" verlangen 8 Schreiboperationen jeweils.
Das wird oft vergessen.

ciao
gustav

: Bearbeitet durch User
von Axel S. (a-za-z0-9)


Lesenswert?

;o) schrieb:
> Ja, mir ist dies durchaus bewusst.
> Desswegen habe ich ja die Funktion um die Auswahl des
> Prozessor-Enablepins erweitert.

Nur reicht das allein halt nicht aus. Warum testest du nicht damit, daß 
du deine benutzerdefinierten Zeichen einfach in beide Controller 
schreibst? Danach müssen sie dann in jeder Position auf dem Display 
funktionieren. Und wenn nicht, ist wirklich was kaputt. Wäre das nicht 
deutlich zielführender und vor allem schneller, als in einem Forum zu 
fragen? Noch dazu für Hardware, die Pollin mal vor 10 Jahren verkauft 
hat?

von ;o) (Gast)


Lesenswert?

Ich habe auch schon testweise an beide Controller die selben Daten 
geschrieben.
Das war das Erste was ich versucht habe nachdem es nicht funktioniert 
hat.

Ich habe versucht:
In Beide Controller die Zeichen zu schreiben.
Nur ein Sonderzeichen, alle 8 Sonderzeichen, lauter gleiche, lauter 
unterschiedliche, alle Punkte schwarz, alle Punkte weiß, 
unterschiedliche Timings, Beide Controller unterschiedliche Zeichen, 
beide Controller gleiche Zeichen.


Das hat leider auch nicht funktioniert.

Ich weis das das LCD schon etwas betagter ist.

Ich wollte nur nicht nur wegen einer Spielerei das LCD & Frontblende 
austauschen.

Da ich bis jetzt noch nie benutzerdefinierte Zeichen verwendet habe, war 
mein Verdacht, das ich beim Erweitern der Funktionen Fehler gemacht 
habe.

Ich hatte schon überlegt die Beispiel-LCD Funktionen der Artikel zu 
verwenden.
Da ich aber die Daten & Steuerpins an unterschiedlichen Ports habe 
müsste ich erst die Funktionen umschreiben was auch wieder 
Fehleranfällig ist.
(Da das LCD fest verlötet ist wollte ich das Zerlegen nur für eine 
Spielerei vermeiden. Vor allem weil passender Ersatz nicht mehr so 
leicht zu finden ist.)


Da alle meine Debug-Versuche nichts gebracht haben, habe ich mich an 
dieses Forum gewendet.
Es hätte ja sein können das jemand dieses alte LCD verwendet und 
Erfahrungen damit hat.

von c-hater (Gast)


Lesenswert?

;o) schrieb:

> Da ich bis jetzt noch nie benutzerdefinierte Zeichen verwendet habe, war
> mein Verdacht, das ich beim Erweitern der Funktionen Fehler gemacht
> habe.

Das kannst du als gesichert annehmen, auch wenn ich beim Überfliegen 
deines Codes keine offensichtlichen Fehler feststellen konnte.

Das einzige, was mich wundert: Wozu dient dient eigentlich der zweite 
Parameter von lcd_write()? Da es ja offensichtlich auch eine Funktion 
lcd_write_command gibt, scheint mir lcd_write keinen zweiten Parameter 
zu benötigen.

Dieses Display hat jedenfalls zwei stinknormale HD44780-kompatible 
Controller drinne, bei denen sich auch die Custom-Chars auf die übliche 
Weise definieren lassen. Auch für beide Controller gleichzeitig. 
Natürlich nur, wenn man das Timing einhält und nicht BUSY benutzt, um 
dies zu tun. Sprich: für die von dir benutzten "Befehle" musst du eine 
Mindestzeit von 37µs zwischen den einzelnen Operationen sicherstellen.

Da ich selber noch exakt so ein Display habe (wenn auch mit mittlerweile 
leicht zerkratztem Deckglas), kann ich bestätigen, dass es nicht nur in 
der Theorie, sondern auch in der Praxis funktioniert.

von bingo (Gast)


Lesenswert?

Du hast das Datenblatt gelesen:

* acht benutzerdefinierte Zeichen je Displayhälfte

von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

bingo schrieb:
> Du hast das Datenblatt gelesen:
>
> * acht benutzerdefinierte Zeichen je Displayhälfte

Hi,
hatte auch Probleme damit.
Es sind acht Schreiboperationen nötig pro Character. Nicht nur eine für 
die vorgefertigten im Charakter-ROM gespeicherten ASCII-Zeichen.

Also Bildchen.
Und nach Power off sind die Dinger wieder weg.
Die Routine muss bei jeder Initialisierung wieder durchlaufen werden.

Und die Adressen immer um 8 erhöhen. nicht um eins.
Steht auch im Code oben so:

ascii_00:        ; Charakters zuordnen
ldi  temp,  0x40    ;
rcall kommando      ; fuer ASCII-Code hex00
; dann Pixel definieren aus zugehöriger Tabelle
ascii_01:
ldi  temp,  0x48    ; "Set CGRAM address"-Steuerbefehl
rcall  kommando    ; fuer ASCII-Code hex01
; und wieder Pixel definieren aus Tabelle
ascii_02:
ldi  temp,  0x50    ; "Set CGRAM address"-Steuerbefehl
rcall kommando      ; fuer ASCII-Code hex02
; und immer 8 dazuzählen bis man sonst im anderen Kommando-Befehlssatz 
landet. Mehr ist nicht drin. Also Befehl 40 plus Adresse

ciao
gustav

: Bearbeitet durch User
von ;o) (Gast)


Lesenswert?

@C-Hasser
lcd_write() hatte ich für eine Fehlersuche etwas umgeschrieben und 
vergessen wieder auf den Ursprungszustand zurückzustellen.
Aber in dieser Version unterscheidet sich die Funktion nicht von der 
ursprünglichen Arbeitsweise.


Danke für die Information.
Ich werde den ganzen Quellcode & Schaltung noch einmal genauer 
durchackern.

Und danke für die Bestätigung das die Funktion bei diesem speziellen LCD 
zur Verfügung steht.

Ich habe da aber den bösen Verdacht, das das LCD einen Hau weg hat.
Denn ich habe jetzt das LCD testweise als 27x2 LCD angeschlossen und die 
verschiedensten LCD Funktionen aus verschiedenen Quellen durchgetestet.

Dabei ist mir aufgefallen das die obersten 4 Zeilen im Sonderzeichen mit 
einem zufälligen Muster gefüllt wird und die unteren 4 Zeilen des 
Zeichens sind immer gleich bleiben.



@Bingo
Den Schmierzettel von Pollin hatte ich in der Projektmappe abgeheftet 
und auch noch einmal durchgelesen.
Da diese Pollin-Datenblätter immer wieder etwas von der Wirklichkeit 
abweichen, wollte ich nachfragen bevor ich nach Dingen suche die es 
nicht gibt.



@All
Danke für eure Hinweise.
Ich werde jetzt noch einmal alles sorgfältig durchgehen und überprüfen.
Falls ich dabei nichts finden kann werde ich den Urzustand wieder 
herstellen.
Denn das Ganze ist jetzt die letzten 10+ Jahre ohne Sonderzeichen 
gelaufen und wird das dann auch noch länger ohne Sonderzeichen tun.
Es war halt nur eine Spielerei die mehr Probleme bereitet hat als 
erwartet.

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.