Hab noch einen liegen. Wenn der nicht so teuer wär, würd ich ihn dir glatt schicken![]()
Hab noch einen liegen. Wenn der nicht so teuer wär, würd ich ihn dir glatt schicken![]()
Das hat leider auch nicht funktioniert
HTML-Code:Zehner = X / 10 Zehner = Zehner Mod 10 Einer = X Mod 10 I2cstart I2cwbyte &B01110000 I2cwbyte &B00100000 I2cwbyte Zehner I2cwbyte &B00100001 I2cwbyte Einer I2cstop
Ich glaube das Problem ist, dass der MAX nicht wissen kann, dass &b00100000 und &b00100001 die Adressen der zu beschreibenden Register sind.
Im Datenblatt steht folgendes:
The address pointer in the MAX6958/MAX6959 autoincrements
after each data byte. If multiple data bytes
are transmitted before a STOP condition is detected,
these bytes are stored in subsequent MAX6958/
MAX6959 internal registers (Figure 8 ), unless the
address pointer has reached address 01111111. The
address pointer does not autoincrement once address
01111111 has been reached (Table 3).
Das heißt also, er schreibt den Wert "Zehner" noch korrekt in das Register &B00100000. Das nächste Byte (&b00100001) wird dann aber wieder als Datenbyte interpretiert und in das nächsthöhere Register geschrieben, und das Byte "Einer" in das wiederum nächsthöhere Register.
Andersrum gesagt würde ich es mal so versuchen, einfach nur das erste Digit-Register zu adressieren (also &b00100000), und dann beide Ziffern-Bytes nacheinander zu senden. Sie müssten dann von selbst in den beiden aufeinanderfolgenden Registern (00100000 und 0100001) landen.
Bleibt natürlich noch ein Problem: Das Decode-Mode-Register (0x01): Da steht beim Einschalten ´ne &b00000000 drin - also "no decode for digits 3-0".
Damit die Digits 0 und 1 angesteuert werden, muss da &b00000011 reingeschrieben werden. Dieses Register steht aber an einer ganz anderen Stelle als die anderen zu beschreibenden Register, so dass man das nicht unmittelbar hintereinander weg per automatischem Increment machen kann.
Ich würde also mal versuchen, zuerst das data decode register zu beschreiben, und dann in einem zweiten Teil die eigentlichen Ziffern in die Digit-Register:
I2cstart
I2cwbyte &b01110000
I2cwbyte &b00000001 (Adresse des Data Decode Registers)
I2cwbyte &b00000011 (=Digits 0 und 1)
I2cstop
I2cstart
I2cwbyte &b01110000
I2cwbyte &b00010000 (= 0x20, Adresse Digit 0)
I2cwbyte Einer
I2cwbyte Zehner (geht automatisch ins Register 0x21)
I2cstop
Danke für die Mühen, geht auch nicht, grrr
Ich hab schon die Firma angeschrieben, die wollen mir nochmal einen Schaltplan und Code-Beispiele senden.
Auch die Displays hab ich schon x-Mal neu aufgebaut, weil ich dachte, ich hab da was falsch gemacht, aber aus den Ausgängen der LED kommt kein Mux raus.
Das gibt´s´doch nicht... hast Du schon mal mit dem Display Test Register rumgespielt? Das aktiviert alle Display-Segmente mit einer Helligkeit von 28/64, so dass man auf jeden fall was sehen müsste. Übrigens ist die Intensität nach dem Einschalten erstmal bei 4/64, was laut Datenblatt einem Strom von gerade mal 1,4 mA entspricht. Bei einem normalen LED-Display dürfte da nicht allzuviel zu sehen sein.
Zehner = X / 10
Zehner = Zehner Mod 10
Einer = X Mod 10
I2cstart
I2cwbyte &b01110000
I2cwbyte &B00000001
I2cwbyte &B00000011
I2cwbyte &B00010000
I2cwbyte Einer
I2cwbyte Zehner
I2cstop
Also mit der Einstellung leuchtet überhaupt irgendwas an dem Display.
Leider ist es nur 0(0). Wobei die erste Null dauerhaft leuchtet, wenn "Zehner" 1,3 oder 5 ist.
Wenn dann "Einer" 0,1,2; 4,5,6 ;8,9 ist leuchtet die zweite Null dazu, aber nur wenn die erste schon an ist.
Ich raff das einfach nicht. Vielleicht hilft ja MAXIM (nicht die Zeitschrift) mit einer versprochenen Antwort weiter.
Aber so kann es auch nicht funktionieren! Das wird vielleicht etwas klarer, wenn Du Dir mal genau vergegenwärtigst was wirklich passiert:
Am ersten Byte (&b01110000) erkennt der Chip, dass er gemeint ist.
Das zweite Byte (&b00000001) sagt ihm, welches Register er als erstes beschreiben soll.
Das dritte Byte (&b00000011) geht somit ins Decode Mode Register (Adresse 0x01).
Soweit, so gut. Aber danach geht´s schief:
Der MAX kann doch nicht wissen, dass das nächste Byte jetzt wieder eine Adresse sein soll! Er versteht auch dieses Byte (&b00010000) als Datenbyte und schreibt es automatisch ins nächste Register (0x02). Das ist das Helligkeits-Register, und &b00100000 bewirkt dort 32 von 64 Helligkeitsstufen, also 50%.
Der Wert von "Einer" geht dann an die Adresse 0x03, und "Zehner" an 0x04. Letzteres ist das Configuration Register, in dem allerlei Einstellungen festgelegt werden, die ich mir jetzt im Einzelnen nicht durchgelesen habe. Es könnte aber erklären, weshalb die beiden Nullen so unterschiedlich angezeigt werden, je nachdem was der Inhalt dieses Registers ist.
Die eigentlichen Digit-Register 0x20 und 0x21 werden aber überhaupt nicht erreicht - und deshalb werden Dir auch immer nur Nullen angezeigt!
Wie gesagt - wenn Du den Chip einmal angesprochen und ihm das erste Adress-Byte gesendet hast, schreibt er alle weiteren Bytes ganz stur in die folgenden Register! Für einen Adress-Sprung müsstest Du m.E. die Übertragung beenden (I2cstop) und mit der gewünschten Adresse neu starten (I2cstart, I2cwbyte &b01110000, I2cwbyte neue_Adresse, I2cwbyte Datenbyte_1, I2cwbyte Datenbyte_2...., I2cstop).
Die relevanten Register liegen ja in zwei Blöcken beieinander: Das Decode Mode Register (0x01) und das Helligkeitsregister (0x02), und dann die Digit-Register (0x20 und 0x21). Das müsste also in zwei I2c-Sequenzen machbar sein!
Geändert von Sauerbruch (16.11.2014 um 22:56 Uhr)
Lesezeichen