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?
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.
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.
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?
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
;segmentpattern
2
;GAAAAAAAB
3
;GHIJB
4
;GHIJB
5
;GH1JB
6
;FKKLMMC
7
;FNOPC
8
;FNOPC
9
;FNOPC
10
;FEDDDDDC
11
;
12
;sequenceindisplayRAMis
13
;GKFEHLNDIMOPAJBC
14
;1514131211109876543210
15
;1wordperletter
16
;e.g.CapitalLetterAwouldbetheword0xE44B
Jedes Data Kommando besteht aus der Adresse und dann 4 Bits fürs Datennibble. Um COM1-COM4 muss man sich nicht kümmern.
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.
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?
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.
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.
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.
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.
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.