Forum: Mikrocontroller und Digitale Elektronik Picomite und LCD Display PC-6749-UUW von Densitron


von Peter N. (alv)


Lesenswert?

Hi

Hier
Beitrag "ARDUINO und LCD Display PC-6749-UUW von Densitron"
steht keider nicht, wie es ausgegangen ist.

Ich möchte dieses Display unter PicoMite am Raspberry Pi Pico betreiben.

Laut Datenblatt des HT1621B 
(https://datasheet.lcsc.com/lcsc/2108251130_HTCSEMI-HT1621BRQZ_C2886391.pdf)
läuft dieser ab 2,4V, also habe ich das Display an 3,3V angeschlossen.

Zum Datenprotokoll und Initialisierung:

Es scheint, daß die Befehlsequenz aus "100", dann aus 9 Bits, also 
insgesamt 12 Bits besteht.

Die Datensequenz besteht aus "101", 6 Adressbits, die das Segment 
angeben, und 4 Bits, die Com angeben. Insgesamt also 13 Bits.

Um das Display zu aktivieren, muß ich also erstmal
10000000001x (Oszillator an)
10000000011x (Display an)
an das Display senden?

Muß Bias auch gesetzt werden? Was bedeutet das?

Wenn ich dann
101 und irgendwelche weiteren 10 Bits
an das Display sende, sollten doch irgendwelche Segmente sichtbar werden 
(muß Com dazu 0 oder 1 sein?

Ist das bisher soweit richtig?


Das Display habe ich mit Data an MOSI, /WR an SCK, /CS an CS am Pico 
angeschlossen.
Unter PicoMite die entsprechenden SPI-Pins definiert,
SPI mit 100kHz und 12 Bit geöffnet,
CS auf 0,
die beiden Kommandos gesendet,
CS auf 1,
SPI geschlossen,
SPI mit 100kHz und 13 Bit geöffnet,
CS auf 0,
und die Daten mal durchgezählt.

Leider bleibt das Display blank.


Habe ich hier noch einen grundsätzlichen Denkfehler?

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Peter N. schrieb:
> Muß Bias auch gesetzt werden? Was bedeutet das?

Bias schaltest du schon an durch das LCD ON Kommando, sollte also fertig 
sein. Ich sende noch ein WDT OFF Kommando (0b10000000101), bin aber 
nicht sicher, ob das überhaupt nötig ist.

Wenn du das Timing Diagram einhältst wie auf Seite 10 und 11 im 
Datenblatt, sollte es dann klappen.
Es schadet nicht, die /CS Leitung vor allem anderen für 100ms auf low zu 
ziehen, um das Display zu resetten.

> CS auf 0,
> die beiden Kommandos gesendet,
> CS auf 1,

Du musst CS nach jedem Kommando mal kurz high setzen.
Das SPI Interface ist mir unbekannt, ich benutze Bit-Banging auf einem 
AVR8.

: Bearbeitet durch User
von Peter N. (alv)


Lesenswert?

Ok, der Hauptfehler, das Display läuft tatsächlich nur mit 5V.

Nach den Init-Befehlen werden alle Segmente angezeigt, die untere rechte 
Ecke aber nur schwach.

Auf Daten reagiert das Display aber nicht...

Matthias S. schrieb:
> Bias schaltest du schon an durch das LCD ON Kommando, sollte also fertig
> sein.
Ich meine diese "BIAS and COM"-Einstellung (Befehl 100 0010 .....)

Matthias S. schrieb:
> Es schadet nicht, die /CS Leitung vor allem anderen für 100ms auf low zu ziehen, 
um das Display zu resetten.

Mache ich am Anfang für 200mS. Aber davon läßt sich das Dispkay nicht 
beeindrucken, wenn es erstmal was anzeigt...

Matthias S. schrieb:
> Das SPI Interface ist mir unbekannt,
Das ist nur ein taktsynchroner serieller Bus, der für einfache serielle 
Ansteuerungen wie hier funktionieren sollte.

Die Anwendung von Bitbang unter PicoMite habe ich bislang nicht 
verstanden.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Peter N. schrieb:
>> Bias schaltest du schon an durch das LCD ON Kommando, sollte also fertig
>> sein.
> Ich meine diese "BIAS and COM"-Einstellung (Befehl 100 0010 .....)

Für das Densitron PC-6749-AA, das es von Pollin gab (3-stellige 
16-Segment) war das nicht nötig.
Meine Init Sequenz ist:
1
// set HT1621 reset for 100ms
2
  DEN_PORT &= ~(1 << BIT_CS);
3
  _delay_ms(100);
4
  DEN_PORT |= (1 << BIT_CS);
5
// release reset for LCD
6
  _delay_ms(50);
7
// set HT1621 operation
8
  send_HTData(11,0x0040); // Command SYS EN
9
  _delay_ms(100);    // wait a little
10
  send_HTData(11,0x00C0); // Command LCD ON
11
  send_HTData(11,0x0A00); // Command WDT OFF
12
// init done, send some letters to RAM
13
  send_HTChar(0x0,'L');
14
 _delay_ms(10);
15
  send_HTChar(0x5,'C');
16
 _delay_ms(10);
17
  send_HTChar(0x9,'D');
18
 _delay_ms(10);
19
// now the main loop
Dazu muss ich sagen, das meine HTData Routine die führende 1 immer 
erzeugt und die 11 steht für die Anzahl der Bits, die dann gesendet 
werden, von links nach rechts. Übergeben wird ein uint16, das aber nur 
11 bits nutzt.
HTChar ist dadurch komplex, das die Adresse 0x0 fürs erste, 0x5 fürs 
zweite und 0x9 fürs dritte Digit benutzt wird.

Edit: Ahh, durch den Schreibfehler im Titel verwirrt worden. Du hast 
genau das gleiche LCD wie ich, das PC-6749-AAW, ausser, das es bei 
Pollin nur 0,25 Euro kostet:
https://www.pollin.de/p/lcd-modul-densitron-pc-6749-aaw-120818

: Bearbeitet durch User
von Peter N. (alv)


Lesenswert?

Wenig Fortschritte bislang.

Ich habe die Elektrik erstmal korrigiert und einen Pegelwandler 3,3V -> 
5V zwischen Pico und Display geschaltet.

Kommandos funktionieren scheinbar auch mit 13 Bit Länge.

Display On/Off per Kommando funktioniert.

Matthias S. schrieb:
> Es schadet nicht, die /CS Leitung vor allem anderen für 100ms auf low zu
> ziehen, um das Display zu resetten.

Das hat scheinbar keinerlei Wirkung

Peter N. schrieb:
> Matthias S. schrieb:
>> Bias schaltest du schon an durch das LCD ON Kommando, sollte also fertig
>> sein.
> Ich meine diese "BIAS and COM"-Einstellung (Befehl 100 0010 .....)

Hier muß auf 4 Commons geschaltet werden, damit das rechte untere 
Viertel der Stellen auch eingeschaltet wird.

Matthias S. schrieb:
> Ich sende noch ein WDT OFF Kommando (0b10000000101), bin aber
> nicht sicher, ob das überhaupt nötig ist.

Der Watchdog löst doch nur einen Interrupt aus. Da diese Leitung aber 
nicht rausgeführt ist, sollte das keinerlei Wirkung haben.

Was mir immer noch nicht gelingt, Segmente ein und auszuschalten.
Nach dem Init sind alle Segmente an, daran kann ich nichts ändern, außer 
ich trenne die 5V vom Display, dann sind bis zum nächsten Init alle 
Segmente aus.

Die Segmentansteuerung verstehe ich so:
Daten schreiben: 101 aaaaaadddd
a adressiert eines der Segmente (0-12)
d entspricht COM und gibt das Viertel an, in dem das adressierte Segment 
liegt.

Wenn ich also 1010000000000 reinschreibe, müßten doch alle Segmente 
ausgehen?

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Peter N. schrieb:
> Daten schreiben: 101 aaaaaadddd
> a adressiert eines der Segmente (0-12)
> d entspricht COM und gibt das Viertel an, in dem das adressierte Segment
> liegt.

Nein, das funktioniert etwas anders. Der RAM ist in 3 Blöcke mit jeweils 
4 Bits organisiert und beginnt bei Adresse 0x0 fürs erste Digit, 0x5 
fürs zweite und 0x9 fürs dritte Digit.
So gibts für jedes Digit die 16 Segmente. Organisiert ist das so (Auszug 
aus meinem Programm):
1
; segment pattern
2
; G AAAAAAA B
3
; G H  I  J B
4
; G  H I J  B
5
; G   H1J   B
6
; F KK L MM C
7
; F   NOP   C
8
; F  N O P  C
9
; F N  O  P C 
10
; F E DDDDD C
11
;
12
; sequence in display RAM is
13
; G  K  F  E  H  L  N D  I M O P A J B C
14
; 15 14 13 12 11 10 9 8  7 6 5 4 3 2 1 0 
15
; 1 word per letter
16
; e.g. Capital Letter A would be the word 0xE44B
Jedes Data Kommando besteht aus der Adresse und dann 4 Bits fürs 
Datennibble. Um COM1-COM4 muss man sich nicht kümmern.

Peter N. schrieb:
>> Ich meine diese "BIAS and COM"-Einstellung (Befehl 100 0010 .....)
>
> Hier muß auf 4 Commons geschaltet werden, damit das rechte untere
> Viertel der Stellen auch eingeschaltet wird.

Mache ich nicht und geht trotzdem in voller Dichte.

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Ach, noch vergessen - RAM Adresse 0x4 ist für den Doppelpunkt zwischen 
Digit 1 und 2 und hat nur ein Nibble.
Man kann mit dem Write Kommando die 4 Nibbles für die 16 Segmente des 
Digits direkt hintereinander schreiben.

: Bearbeitet durch User
von Peter N. (alv)


Lesenswert?

Matthias S. schrieb:
> Nein, das funktioniert etwas anders. Der RAM ist in 3 Blöcke mit jeweils
> 4 Bits organisiert und beginnt bei Adresse 0x0 fürs erste Digit, 0x5
> fürs zweite und 0x9 fürs dritte Digit.

Das verstehe ich nicht...
Weder im HT1621B- noch PC-6749-AA-Datenblatt steht sowas.
Wo steht das genau?

Matthias S. schrieb:
> Organisiert ist das so (Auszug
> aus meinem Programm):

Die Bezeichnung und Anordnung der LCD-Segmente entspricht dem 
PC-6749-AA-Datenblatt.
Aber die "LCD Logic table" muß dann ja völlig falsch sein...

Wo bekomme ich die richtigen Informationen zur Ansteuerung her?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Angehängte Dateien:

Lesenswert?

Peter N. schrieb:
> Aber die "LCD Logic table" muß dann ja völlig falsch sein

Die ist insofern verwirrend, als das damit das Pinout des LCD Glases 
gemeint ist, das für dich uninteressant ist. Das Glas hat nun mal die 17 
Anschlüsse, aber die sind ja schon mit dem HT1621 verbunden.

Peter N. schrieb:
> Wo bekomme ich die richtigen Informationen zur Ansteuerung her?

Über das Datenblatt des HT1621. Das Datenblatt zum LCD enthält nur einen 
Auszug der Ansteuerung und z.B. die wichtigen 'Write' Sequenzen sind da 
gar nicht drin.

: Bearbeitet durch User
von Peter N. (alv)


Lesenswert?

Matthias S. schrieb:
> Das Glas hat nun mal die 17
> Anschlüsse, aber die sind ja schon mit dem HT1621 verbunden.

In dieser Tabelle steht ja auch, welche Display-Segmente mit welchen 
Anschlüssen des HT1621 verbunden sind.

Matthias S. schrieb:
> Über das Datenblatt des HT1621.

Da steht ja auch nicht (zumindest nicht für mich ersichtlich) drin, wie 
sich die  Ram-Ansteuerung auf die LCD-Ausgangspins des HT1621 
auswirkt...

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Peter N. schrieb:
> Da steht ja auch nicht (zumindest nicht für mich ersichtlich) drin, wie
> sich die  Ram-Ansteuerung auf die LCD-Ausgangspins des HT1621
> auswirkt...

Aber ich habs doch geschrieben, wie es funktioniert. RAM Adressen 0x0 - 
0xC sind Nibbles, die aufs LCD gemappt sind.
Sendest du 16 Bits an Adresse 0x0 im Data Modus, dann werden diese auf 
dem ersten Digit angezeigt. Das passt auch zu der LCD Logic Table. 
Sendest du 16 Bit an Adresse 0x5, dann gehts aufs zweite Digit usw.

von Peter N. (alv)


Angehängte Dateien:

Lesenswert?

Ah jetzt, ja.

Ich habe noch ein Diagramm gefunden, in dem die Segmentansteuerung 
verständlich dargestellt wird.

Jetzt brauche ich nur noch eine schöne Chraraktertabelle...

Vorschlag zur Hintergrundbeleuchtung:
Der Pin dafür geht ja direkt auf die Basis von Transistor Q1, mit R3 als 
Pulldown.

Ich habe die Leiterbahn links oben an R3 (GND) durchtrennt und die 
beiden linken Anschlüsse von R2 und R3 verbunden (damit wird R3 ein 
Basispullup).
Somit leuchtet die Hintergrundbeleuchtung ständig, kann aber 
ausgeschaltet werden, wenn man Pin 6 von P1 auf GND zieht.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Angehängte Dateien:

Lesenswert?

Peter N. schrieb:
> Somit leuchtet die Hintergrundbeleuchtung ständig

Warum auch nicht. Ich hatte einen PWM Pin frei und kann ao das BL 
dimmen. Ich hänge dir mal meinen Font an, erspart dir evtl. ein wenig 
Arbeit. Ist für Microchip Studio und enthält die Buchstaben von SPC bis 
zur eckigen Klammer zu. Keine Kleinbuchstaben oder Control Codes.

: Bearbeitet durch User
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.