Forum: Mikrocontroller und Digitale Elektronik Defekter CGRAM in HD44780 ?


von Marius (Gast)


Angehängte Dateien:

Lesenswert?

Hey Leute, habe grade an meinem DFRobot LCD Keypad Shield etwas 
eigenartiges festgestellt und meine jetzt, es auf das Display Modul 
eingegrenzt zu haben.

Zum testen speichere ich in allen 8 CGRAM Plätzen das gleiche Bitmuster 
ab und stelle sie dann nacheinander auf dem Display dar.

Die Ausgabe von CGRAM Charakter Nr. 7 ist aber in sich "gespiegelt", 
d.h. die unteren 4 Pixelreihen des einzelnen Custom Chars überschreiben 
immer auch in die oberen 4 Reihen (s. Foto mit zwei verschiedenen 
Patterns)

Handelt es sich um einen defekten RAM des Displays ?
1
#include <LiquidCrystal.h>
2
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //Angabe der erforderlichen Pins
3
4
5
6
byte testpattern[8] = {
7
  0b00000,
8
  0b00000,
9
  0b00000,
10
  0b00000,
11
  0b01100,
12
  0b10010,
13
  0b10010,
14
  0b01100
15
};
16
17
void lcdtest(){
18
  
19
  lcd.createChar(0, testpattern);
20
  lcd.createChar(1, testpattern);
21
  lcd.createChar(2, testpattern);
22
  lcd.createChar(3, testpattern);
23
  lcd.createChar(4, testpattern);
24
  lcd.createChar(5, testpattern);
25
  lcd.createChar(6, testpattern);
26
  lcd.createChar(7, testpattern);
27
  lcd.clear();
28
  for(int i = 0; i<8;i++){
29
    lcd.write(uint8_t (i));
30
  }
31
}
32
33
void setup() {
34
  lcd.begin(16, 2); 
35
  lcdtest();
36
37
}
38
39
void loop() {
40
41
}

von C. W. (chefkoch)


Lesenswert?

Bei mir tritt es jedenfalls mit deinem Code nicht auf.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Da wird wohl das höchste Bit bei der Adressierung klemmen. Dadurch wird 
ein Bereich doppelt angesprochen und die andere Hälfte gar nicht. Hast 
Du mal ein anderes Display draufgesteckt?

von pegel (Gast)


Lesenswert?

Wenn ich Display Probleme hatte und kein Defekt vorlag, lag es 
eigentlich immer am Timing.

Vielleicht mag es nicht so hektisch, baue deshalb zur Probe ein paar 
Delays ein.

von Marius (Gast)


Lesenswert?

Delays bringen leider nichts, selbst wenn ich nur dieses eine Custom 
Char ausgebe tritt der Fehler auf.

Das Display ist leider auf dem Shield verlötet, habe aber noch andere 
HD47780 hier, die werden bei Zeiten mal getestet und dann berichtet.

Trotzdem direkt mal den DDRAM durchtesten, evtl gibts ja noch mehr 
defekte Speicherzellen.
Der CGROM war soweit in Ordnung

Aber denke mal es hat nen Grund, warum es damals die billigsten Artikel 
ihrer Art in der China-Bucht waren...

¯\_(ツ)_/¯

von c-hater (Gast)


Lesenswert?

Marius schrieb:

> Delays bringen leider nichts, selbst wenn ich nur dieses eine Custom
> Char ausgebe tritt der Fehler auf.

Er meinte sicher nicht (nur) zwischen den Customchars, sondern auch 
zwischen den einzelnen Kommandos, die für einen Char notig sind, 
insbesondere die Stelle zwischen dem setzen der CGRAM-Adresse und dem 
ersten Byte des Chars.

von interessent (Gast)


Lesenswert?

Ben B. schrieb:
> Da wird wohl das höchste Bit bei der Adressierung klemmen.

pegel schrieb:
> Wenn ich Display Probleme hatte und kein Defekt vorlag, lag es
> eigentlich immer am Timing.

Wird beim original HD44780 die MSB Leitung nicht auch als Ready-Signal 
benutzt? Da tippe ich auf eine Kombination aus beidem.

von Karl B. (gustav)


Lesenswert?

interessent schrieb:
> Wird beim original HD44780 die MSB Leitung nicht auch als Ready-Signal
> benutzt?

Hi,
Du meinst wahrscheinlich das ominöse Busy-Flag?

Beitrag "Re: HD44780+PIC18F25k22 Rise Time Probleme?"

ciao
gustav

von Uwe (de0508)


Lesenswert?

Hallo Marius,

ich habe an einen LCD Assembler Interface gearbeitet und muss das 
Schreiben einen Custom Char durch setzen der DDRam Adresse, beenden.

So sähe das in diesem AVR Assemblerdialekt aus
1
_Lcd4DefChar:
2
movw  ZH:ZL,_HA1:_HA0      ;Adresse der Zeichenbits holen (Datenobjekt)
3
PopPC
4
pop  _HA3        ;index (replaces ASCII 0-7)
5
PushPC
6
or  _HA0,_HA1      ;pr?fen
7
breq  __Lcd4DefCharExit    ;raus wenn ung?ltig
8
cpi  _HA3,8        ;index pr?fen (0-7 erlaubt)
9
brsh  __Lcd4DefCharExit    ;raus wenn ung?ltig
10
lsl  _HA3        ;index 3 bits nach links
11
lsl  _HA3
12
lsl  _HA3
13
ldi  _HA0,Lcd4Command_CGRAMAddress
14
or  _HA0,_HA3      ;index einkn?pfen
15
call  _Lcd4Command      ;Kommando schreiben
16
ldi  WL,8        ;reset zeilenz?hler
17
18
__Lcd4DefCharLoop:
19
20
lpm  _HA0,Z+
21
call  _Lcd4Char      ;zeilenbyte schreiben
22
dec  WL        ;incr zeilenz?hler
23
brne  __Lcd4DefCharLoop
24
__Lcd4DefCharExit:
25
; ==============>
26
ldi  _HA0,Lcd4Command_DDRAMAddress
27
jmp  _Lcd4Command
28
; <==============
29
:end

von c-hater (Gast)


Lesenswert?

Uwe S. schrieb:

> ich habe an einen LCD Assembler Interface gearbeitet und muss das
> Schreiben einen Custom Char durch setzen der DDRam Adresse, beenden.

Nein, musst du nicht. Kein HD44780 verlangt das.

Was aber alle verlangen: dass man die Minimalzeiten für jedes einzelne 
verschissene "Kommando" einhält, was über's Interface geht. Bei vielen 
kompatiblen Displays sind diese Mindestzeiten (teils dramatisch) kürzer 
als beim Original. Nur kann man sich nur auf die Zeiten des Originals 
verlassen, wenn man den Kram nicht für jedes einzelne Display erneut 
anpassen möchte.

Also sorgt man dafür, dass man immer die Mindestzeiten des Originals 
einhält, dann werden auch alle "HD44780-kompatiblen" Displays problemlos 
funktionieren.

Im Bezug auf die im konkreten Problem verwendeten "Kommandos" bedeutet 
das: es müssen immer mindestens 37µs dazwischen liegen.

von Uwe (de0508)


Lesenswert?

Hallo,

c-hater schrieb:
> Nein, musst du nicht. Kein HD44780 verlangt das.

ja, bestimmt !

Sonst wird bei nächsten Schreibvorgang eines LCD-Zeichens eine falsche 
Ramadresse angesprochen.

Man kann dass natürlich auch durch eine set_cursor(row, col); vor einem 
erneuten Schreiben umgehen.

Bei mir ist es integriert..

von spess53 (Gast)


Lesenswert?

Hi

>Man kann dass natürlich auch durch eine set_cursor(row, col); vor einem
>erneuten Schreiben umgehen.

Ja, genau dort gehört die neue Adressierung hin. Nach dem Beschreiben 
des CG-RAMs weißt du ja die neue Adresse noch gar nicht. Also ist das 
Ende der CG-RAM-Initialisierung der falsche Punkt für eine neue 
Adressierung des DDRAMs.

>Bei mir ist es integriert..

Ja, falsch.

MfG Spess

von Soul E. (Gast)


Lesenswert?

c-hater schrieb:

> Was aber alle verlangen: dass man die Minimalzeiten für jedes einzelne
> verschissene "Kommando" einhält, was über's Interface geht. Bei vielen
> kompatiblen Displays sind diese Mindestzeiten (teils dramatisch) kürzer
> als beim Original. Nur kann man sich nur auf die Zeiten des Originals
> verlassen, wenn man den Kram nicht für jedes einzelne Display erneut
> anpassen möchte.

Leider hängt das Timing nicht nur von Typ und Charge des Controllers ab, 
sondern auch noch von der Temperatur. Wer nicht immer den absoluten 
worst-worst-case abwarten will, der sollte sich zweckmäßigerweise ans 
Datenblatt halten und das Busy-Flag auswerten.

von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

Hi,
ob Adressen automatisch erhöht oder erniedrigt werden, definiert man 
afaik doch vorher in der Initialisierung. Mein Display kann zum Beispiel 
auch "rückwärts" schreiben, wenn ich das möchte.

Uwe S. schrieb:
> Man kann dass natürlich auch durch eine set_cursor(row, col); vor einem
> erneuten Schreiben umgehen.
Ich nenne das "locate-Anweisung".

Anbei noch ein Auszug aus dem Datenblatt.

(Und bei der Busyflagabfrage sollte noch mindestens ein NOP dazwischen.)

ciao
gustav

von Harald A. (embedded)


Lesenswert?

Marius schrieb:
>
> Aber denke mal es hat nen Grund, warum es damals die billigsten Artikel
> ihrer Art in der China-Bucht waren...
>
Wenn schon FTDIs und AVRs in China kopiert werden trifft das mit 
Sicherheit auch auf den HD44780 zu. Es gibt immer wieder Chips, die 
ihren Originalen nur zu 99% entsprechen. Gerade bei einer relativ selten 
genutzten Option wie dem CG RAM sind Fehler im Silizium ganz bestimmt 
nicht ausgeschlossen.

von spess53 (Gast)


Lesenswert?

Hi

>Wenn schon FTDIs und AVRs in China kopiert werden trifft das mit
>Sicherheit auch auf den HD44780 zu.

Der HD44780 ist schon seit Jahren abgekündigt und dürfte in keinem z.Zt. 
hergestellten Displays zu finden sein. Und kompatible ICs gibt es schon 
seit mindestens den 90ern des letzten Jahrtausend.

>Gerade bei einer relativ selten
>genutzten Option wie dem CG RAM sind Fehler im Silizium ganz bestimmt
>nicht ausgeschlossen.

So selten ist bei mir die Nutzung des CG-Rams gar nicht. Und ich hatte 
noch nie Probleme damit. Das ist vom Hersteller garantiert und hat zu 
100%
funktionieren. Wenn nicht, ist der Chip defekt.

Allerdings nutze ich erprobte eigene Assemblerroutinen.

Wenn allerdings der Rest des Programms wie das Geschreibsel des TOs 
weiter oben aussieht, würde ich meine Hand dafür nicht ins Feuer legen.

MfG Spess

von c-hater (Gast)


Lesenswert?

soul e. schrieb:

> Wer nicht immer den absoluten
> worst-worst-case abwarten will, der sollte sich zweckmäßigerweise ans
> Datenblatt halten und das Busy-Flag auswerten.

Das ist lt. Datenblatt genauso legal, wie die "blinde" Einhaltung der 
Mindestzeiten, denn diese berücksichtigen ja gerade auch den worst case.

Man tauscht halt bei Verwendung des Busy-Flags (im Idealfall sogar 
deutlich) kürzere Transferzeiten gegen die Notwendigkeit eines 
zusätzlichen IO-Pins.

Falsch ist nur, weder das eine noch das andere zu tun. Das geht dann 
halt oft schief...

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.