PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Benötige Hilfe bei i2c Ansteuerung TLC59116F



HannoHupmann
10.01.2013, 07:46
Hallo,

gestern hab ich endlich die Adapterplatine für den i2c Baustein Y59116F bekommen. Den gibt es leider nur in der Gehäusebauform SOP28 und um den auf einem Steckbrett zu testen habe ich eine Adapterplatine gekauft. Leider sind die Pads ein wenig zu weit auseinander, so dass der Chip nicht sauber aufgelötet werden kann. Ich habs mit dem Multimeter gemessen und meine es müsste jeder Kontakt angeschlossen sein, doch sicher bin ich mir nicht. Außerdem könnte ich mir vorstellen, dass ich bei dieser umständlichen Löterrei der Chip überhitzt habe.

Mein erster Versuch den Chip mit einem USB -> i2c Adapter anzusteuern schlug leider fehl, nun weis ich nicht ob es:

A) am möglicherweise defekten Chip liegt
oder
B) ich einfach die falschen Befehle geschickt habe.

Daher jetzt meine Frage zu A: gibt es irgend eine einfache Möglichkeit heraus zu finden ob der Chip überhaupt noch funktioniert oder schon tot ist?
und zu B: wie würdet ihr das Datenblatt interpretieren bezüglich der Befehle die an den Chip geschickt werden müssen? Ich hab leider gar keine richtige Idee.

Hier gibts das Datenblatt: http://www.datasheetarchive.com/Y59116F-datasheet.html

Bisher hab ich als Befehlsfolge:
S C0 05 94 55 P
ausprobiert. Wobei S der Start sein sollte, C0 die Adresse mit A0..A3 frei bzw. auf GND (0) und 05 ein Steuerbefehl des Adapters ist. Im Beispiel auf Seite 22 sind dann die Befehle 94 und 55 angegeben um alle 16LEDs auf On zu schalten. Das P beendet die Übertragung. Nur funktioniert das nicht!

Jemand eine Idee wo der Fehler sein könnte?

robin
10.01.2013, 09:51
Sofern die 05 stimmen, sollte auch der Rest der Übertragung passen. Nur das nicht alle 16 LEDs eingeschaltet werden sondern nur die ersten 4 (wenn ich die Register richtig verstehe). Wenn du die 55 vier mal sendest müssten alle Pins eingeschaltet sein.

Siehst du bei deinem Wandler auch die Acks des Slaves? Wenn ja, erkennt dieser überhaupt seine Adresse? Ansonsten hilft wohl nur ein LA oder Oszi um den Bus anzuschauen.

Nach den Pullups an SDA und SCL frag ich jetzt nicht, die sollten vorhanden sein, sonst sollte dein Wandler einen Fehler ausgeben.

E: Im beispiel auf Seite 22 ist zum setzen aller LEDs der Befehl obendrüber notwendig, der die All-Call adresse ändert.

Wenn du alle LEDs setzen willst, müsstest du S D0 05 94 55 P senden, da D0 die All-call adresse ist.

Klebwax
10.01.2013, 10:11
Daher jetzt meine Frage zu A: gibt es irgend eine einfache Möglichkeit heraus zu finden ob der Chip überhaupt noch funktioniert oder schon tot ist?

Die einfachste Möglichkeit ist, nur ein Adressbyte mit dem R/W Bit auf 0 (WRITE) gesetzt zu schicken, und zu schauen, ob der Slave ein ACK generiert. Wenn man unsicher bei der Adresse ist, kann man auch alle 127 Adressen durchprobieren, bis man eine findet, bei der ein ACK kommt. Das testet zwar nicht den ganzen Chip, ist aber ein Anfang.

MfG Klebwax

Che Guevara
10.01.2013, 13:21
Hi,

evtl. kann man auch mal einen General-Call probieren, also einfach als Adresse den Wert 0 verwenden, und schauen, ob ein ACK zurückkommt.

Gruß
Chris

HannoHupmann
10.01.2013, 18:26
Erst mal hab ich rausgefunden, dass ich mit dem Adapter im Hyperterm auch anzeigen kann ob ein Ack oder ein Nack kommt.
Daher war es auch möglich einfach nur S C0 P an das IC zu schicken ob es überhaupt noch lebt.
Die gute Nachricht: Ich bekomme ein Ack angezeigt bei einer anderen Adresse auch ein Nack. Also stimmt wohl auch die Adresse

Dann wollte ich natürlich den Beispielcode übertragen SC0 94 55 P bzw. SC0 05 94 55 wobei ich mittlerweile glaube dass die 05 Bausteinspezifisch sind und gar nicht zwingend für das Y59116F notwendig.

Leider tut sich außer, dass ich vier Ack bekomme nichts. Keine LED leuchtet nichts. Ich hab die LEDs von +5 zu IC angeschlossen mit entsprechendem Widerstand und natürlich auch getestet ob sie funktionieren.

Leider hab ich damit auch schon wieder keine Idee mehr woran es liegen könnte, dass sich immernoch nichts tut.

Natürlich sind von SDA und SCL Widerstände zu 5V verbaut und ich hab auch RESET auf +5V gelegt da ich sonst nur Nacks bekomme.

Habt ihr noch eine Idee?

Klebwax
10.01.2013, 18:59
Nur mal zum Verständniss:
ein I2C Nack ist kein Signal, es ist die Abwesenheit eines Signals, es ist der Pegel von SDA beim 9. Takt, also die Spannung am Pullup. Ack heißt, beim 9. Takt zieht jemand, ein Slave, SDA gegen den Pullup auf low.

Deine Probleme mit dem Y59116F haben aber nichts (mehr) mit I2C zu tun. Ich hab das Datenblatt mal überflogen, ist ein ganz schön komplexer Chip. Da ich ihn nicht habe ... Sorry ..

MfG Klebwax

MagicWSmoke
10.01.2013, 19:50
Die RN Propellerclock verwendet den TLC59116, das Pdf dazu enthält Code zur Ansteuerung, zumindest für Leds ein/aus über die Output Control Register.
http://www.robotikhardware.de/download/rn_propellerclock_1.11.pdf
Die Brightness Control Register werden dort nicht benutzt, aber basierend darauf lässt sich der Code weiterentwickeln.

robin
10.01.2013, 20:12
Kannst du deinen I2C Adapter mal posten, bzw woher kommen diese 05?
Ich denke, dass dir die reinfunken und du statt deinen 14 Register 05 adressierst.

Weil wenn du ein Ack bekommst, dann sollte es auch funktionieren.

HannoHupmann
10.01.2013, 22:02
Den Adapter hab ich in unserer Wiki beschrieben: http://www.rn-wissen.de/index.php/I2C_USB_PC_Adapter ist ein USB zu i2c Adapter. Ich hab mir auch schon gedacht und deswegen heute auch nochmal nachgeprüft, dass die 05 ein Problem sein könnten. Daher hab ich den Code wie oben auch mal ohne die 05 gesendet. Doch leider mit dem gleichen Ergebniss.

Eigentlich hat es schon noch was mit i2c zu tun, da es um die Ansteuerung geht. Natürlich weniger darum wie i2c allgemein funktioniert.

@MagicWSmoke ah sehr gut danke, dann werd ich mal versuchen aus dem PDF ein paar Comados zu lesen.
EDIT: Verflu.... das ist Bascom damit kenn ich mich noch weniger aus. So komm ich auch nicht weiter :(

EDIT2: Soweit ich Datenblatt, PDF und Co verstehe müsste folgender Befehl eigentlich alle LED einschalten
S C0 14 55 15 55 16 55 17 55 P Nur leider tut sich da gar nichts außer lauter Ack

MagicWSmoke
10.01.2013, 22:56
Versuch's mal so:
S C0 00 W 00 P S C0 14 W 55 P
Sollte Led0 - Led3 einschalten. Auch daran denken, dass auch für die Steuerung über die PWM-Register 02h - 11h es erforderlich ist, dass die Output Control Register 14h - 17h entsprechend gesetzt werden.
Das TI-Datenblatt, Seite 17 unten, gibt darüber Aufschluss.

HannoHupmann
11.01.2013, 16:34
Hallo MagicWSmoke deine Idee war fast richtig :-D. Erst mal hab ich zur Sicherheit einen neuen Baustein aufgebaut und damit mein letztes Muster verlötet. Dann hab ich deine Befehlsfolge probiert allerdings ohne Erfolg, denn: W wird nicht akzeptiert.

Die Befehle lauten also

S C0 00 00 P
S = Start
C0 = Damit wir die Adresse des Bausteins gewählt
00 = Kein Inkrement und Mode 1 auswählen oder?
00 = hab ich noch nicht ganz verstanden? Wird damit der Mode 2 eingestellt?
P = Stopp

Danach kann mit
S C0 14 55 P Register mit der ersten LED Gruppe angesprochen werden und entsprechen alle LEDs auf ON gesetzt werden.
Für die anderen Gruppen gibt es eben 15, 16, 17 als Adresse.

Dimmen und Co hab ich jetzt noch nicht ausprobiert sondern nur an und aus, das reicht mir für den Anfang schon.

Der erste Baustein funktioniert übrigens auch.

- - - Aktualisiert - - -

Wie befürchtet ist es wenn man weis wies geht teuflisch einfach, für PWM:
S C0 00 00 P
S C0 14 AA P
Alle LEDs von 0 bis 3 auf PWM individuell einstellen
S C0 02 00..FF P
Die LED0 auf einen Wert zwischen 0% und 100% einstellen dabei gilt
256 * x% = Wert und diesen Wert umrechnen in Hex also 0% = 00h, 50% = 80h und 100% = FFh

Mehr muss man nicht machen und so kann man beliebig alle LEDs individuell einsellen. Vermutlich kann man auch mehrere LEDs auf einmal einstellen wenn man die Register entsprechen nacheinander schreibt.

Danke nochmal an alle für die Hilfe

MagicWSmoke
11.01.2013, 17:25
00 = Kein Inkrement und Mode 1 auswählen oder?
Das wählt das zu adressierende Register, Registeradresse 00h, also Mode 1 Register aus

00 = hab ich noch nicht ganz verstanden? Wird damit der Mode 2 eingestellt?
und initialisiert es, sorgt damit auch dafür dass der Oszillator ein und der Baustein nicht im Sleep-Mode ist.