Hallo
Ich bin gerade dabei etwas über TWI zu lernen. Dazu habe ich mir einen
TLC59116LED Treiber gekauft, mit dem ich mir dann einen LED Controller
bauen möchte.
Ich habe mir den Baustein erst einmal auf eine Testplatine aufgelötet.
Ich habe jedoch trotz den ganzen gestrigen Tag Datenblätter lesen,
Google ausfragen und in der Bascom Hilfe zu suchen, es nicht geschafft
auch nur zu verstehen, wie man Daten in ein Register des Bausteines
schreibt. Ich habe schon einige Seiten gefunden, wo etwas über TWI
steht, jedoch habe ich keine Seite gefunden, die davon aus geht, dass
man NICHTS über TWI weiß.
Ich habe schon versucht eine Routine zu schreiben, mit der ich eine LED
zum leuchten bringe, doch da tut sich nichts.
Ich würde also gerne wissen, wie ich Daten an den Baustein schicke oder
ihr gebt mir einen Link zu einem guten Tutorial.
Ich benutze den Atmega32 und die Standard TWI Ports. Ich habe auch
4,7kOhm Pull-up Widerstände an SDA und SCL und ich habe nur einen
Baustein an dem Bus. Angehängt ist mein jetziges Porgramm.
@Joachim: Also wenn ich deine Frage richtig verstanden habe, es sind
alle adressierungsausgänge A0 bis A3 auf masse also auf 0 gelegt. Und
RExt ist ein 2k ohm widerstand für eine blaue LED an Out0. Das Minus
beinchen der LED ist auf den Pin Out0 und das Plusbeinchen an 5V. Alle
GND Pins sind mit Masse verbunden und Vcc hat 5V und Reset ist mit einem
10kohm widerstand an Vcc. Die restlichen Out pins sind nicht verbunden,
nur Out0.
@Entwickler: Ich muss doch verstehen, wie ich den Bus steuere um dann
den TLC59116 anzusteuern. Ich weiss jetzt auch nicht was du mit den
Applikationen von NXP meinst.
So ich habe natürlich noch weiter geforscht und denke mir ich mus so die
Daten senden.
1: Ich sende die Adresse des anzusprechenden Slaves als Write adresse
mit einem ACK dahinter. Also I2Cwbyte Slaveadr, ack
2: Ich sende die Hex zahl des registers, in das ich etwas schreiben
möchte, ebenfalls mit einem ACK. Also i2cwbyte out0, ack
3: Ich sende den Wert, der in das register soll, z.b. 255 für volle
helligkeit, aber diemal ohne ack, weil der transfer abgeschlossen ist.
ALso i2cwbyte &HFF , nack
Ist die überlegung so richtig?
Hm, zuallererst hättest Du Dir die Beispiele zu I2C im Bascom Sample
Ordner durchsehen sollen, dann wärst Du nicht auf die Schnapsidee
gekommen, beim Schreiben auf I2C ein ACK/NACK schicken zu wollen. Dein
eigentliches Problem warum's nicht klappt, besteht aber darin daß die
Ausgangstreiber des 59116 erst eingeschaltet werden werden müssen, bevor
über die PWM Register gedimmt werden kann. Eingeschaltet werden die
Treiber über Register 0x14-0x17. Im DB steht's genau beschrieben.
Ok danke dafür, jedoch werde ich aus der Liste nicht schlau. Da ich ja
die LED0 mit PWM steuern möchte muss ich für die LED 11 schicken. Da ich
dann auch schon dabei bin dachte ich, aktiviere ich die anderen LED's
genauso und schicke also an das Register 14 das byte 11111111 oder?
Und was sollen unter Bit in den Tabellen die Zahlen 7:0 z.b. beim PWM0
Register?
Killerawft schrieb:> Und was sollen unter Bit in den Tabellen die Zahlen 7:0 z.b. beim PWM0> Register?
Lies den Doppelpunkt als 'bis'
Im Register PWM0 bezeichnen die Bits 7 bis 0 den gewünschten PWM Wert.
> und schicke also an das Register 14 das byte 11111111 oder?
Keine Ahnung ob Du group dimming/blinking haben möchtest, ich hätte da
jetzt eher &b10101010 reingeschrieben.
Außerdem sehe ich gerade, daß Du nichts getan hast um den Baustein zu
initialisieren, denn by default befindet er sich im sleep. Wie schon
gesagt DB durchlesen, da stehen auch so kleine Zahlen (wie bei
Handyverträgen), welche die default values beschreiben.
Das hier initialisiert den 59116:
Achso man muss den Baustein noch extra initialisieren. Ich dachte das
macht man indem man die register 14 bis 17 beschreibt.
Ich hab das Programm mal erweitert und auch die Errorflags ausgelesen.
Die haben beide den Wert von 255. Sie sollten baer den wert 0 haben. WAS
mache ich denn noch falsch?
Keine Ahnung, was Du da mit i2creceive anstellst, aber sicher keine
Fehler abholen, eher welche produzieren.
Die Variable "Err" steht in Bascom zur Verfügung um Erfolg oder
Mißerfolg der I2C Aktion abzufragen, Err braucht nur gelesen werden.
Und ansonsten musst Du die Nummer des Registers schicken dessen Wert Du
beschreiben willst, und hier hast Du es vergessen:
mit i2creceive wollte ich die beiden Error register 1d und 1e auslesen
um zu sehen ob da irgendwelche Fehler sind.
Das I2cwbyte &H14 war ein Flüchtigkeitsfehler.
Wie ist das mit den A0 bis A3, mit denen ich die Slaveadresse einstelle.
Die muss ich doch einfach nur an Masse machen ohne irgendein widerstand
pull up oder pull down widerstand oder?
> mit i2creceive wollte ich die beiden Error register 1d und 1e auslesen> um zu sehen ob da irgendwelche Fehler sind.
Erst mal musst Du sicherstellen, daß die grundsätzliche I2C
Kommmunikation klappt, und das geht über Err. Der Rest ergibt sich wenn
man die Register richtig beschreibt.
> Das I2cwbyte &H14 war ein Flüchtigkeitsfehler.
Ein (mit)entscheidender...
Adresspins einfach auf Masse.
Resetpin mit Widerstand an Plus geschaltet ?
ja der Resetpin ist mit einem 10kOhm nach Plus geschaltet.
Ich habe das Programm mal so umgeschrieben, dass nach jedem i2c befehl
abgefragt wir ob err eine 1 hat und mir das auf dem LCD angezeigt wird,
wenn ja. Das Programm ist jedoch ohne Fehler durchgelaufen.
Und geht immer noch nicht ?
Hab' Dir mal einen angepassten Auszug aus meinem Propelleruhrprogramm
gemacht. Basierte auf der Propelleruhr vom RNetz, war aber dann eine
tatsächliche Uhr, während die RN Propeller"uhr" nur Text anzeigen
konnte.
Infos dazu auch im Bascom Forum.
Das wäre sozusagen das klassische Hello World des I2C.
Da PWM't sich aber nix, nur die ersten 4 Leds blinken. Sollt's aber
damit gehen, ist der Rest leichter. Wenn nicht, würd ich die HW nochmal
gründlich testen. Und wenn's wieder das Pollin Board wie das mit dem LCD
ist, dann mal dringend ganz gezielt die Funktionalität der Pins PC0..1
prüfen :D
Ok das Funktioniert auch nicht. Also definitiv ein Hardwarefehler. Ich
werde nochmal alle Verbindungen messen, ob die richtig sind und alles
kontrollieren.
also ich habe jetzt alles kontrolliert und durch gemessen und es ist
alles so wie es soll. Keine ungewollten Verbindungen oder irgendwas
anderes.Und alles ist richtig angeschlossen.
Hi
Nur zu Bestätigung: Pull-Up-Widerstände sind an SDA und SCL vorhanden?
Vielleicht hättest du dir für die ersten Gehversuche einen einfacheren
IC aussuchen sollen.
MfG Spess
4,7kohm widerstände sind von 5v zu sda und scl geschaltet.
Was wäre denn zum Einstieg ein einfaches IC?
Werden die nicht gleich angesteuert? Also register werden beschrieben,
manche haben mehr oder weniger register.
Oder ist der TLC Baustein besonders anfällig gegen äußere Einflüsse?
> also ich habe jetzt alles kontrolliert und durch gemessen und es ist> alles so wie es soll. Keine ungewollten Verbindungen oder irgendwas> anderes.Und alles ist richtig angeschlossen.
Ich dachte da mehr an ein kleines Programm, das die Pins mit z.B. 10 Hz
toggelt und dann mit 'ner Led überprüfen. So als Test wenn kein Oszi
oder LA vorhanden ist. Denn daß letzthin Dein Display auf PortC nicht
ging, aber auf einem anderen Port schon, macht das doch höchst
verdächtig.
> Oder ist der TLC Baustein besonders anfällig gegen äußere Einflüsse?
Wenn die äußeren Einflüsse Programmierer heißen... :D
Hier mal ein Proggy zum ansteuern eines PCF 8583 RTC:
vielleicht kannst du durch lesen des Datenblattes auf deinen Fehler
schliessen.
Im übrigen ist diese Anweisung aus deinem code zunächst mal unsinnig:
Config Twi = 400000 ' TWI Takt
Twcr = &H04 'TWEN Setzen
im TWCR Register
Meines Erachten nach machst du Unfug mit den ACK und NACK
Gruss Klaus
ps.:
sowas "I2creceive " würde ich aus Erfahrung mal weglassen.
da ist bascom sehr eigen.
besser Du arbeitest mit rbyte und wbyte.. dann weisst du, was du hast
@MWS: Also Portc.0 und Portc.1 kann ich in den verschiedensten
Frequenzen blinken lassen. Und wenn ich das Programm von dir aufspiele
und Config Scl = Portc.0
Config Sda = Portc.1 weglasse, dann kann ich die LED's auch ein wenig
flackern sehen und SCL ist ein ganz wenig dunkler als SDA.
@ Klaus De lisson: Bei Conrad gibt es den PCF 8583 RTC nicht und ich
möchte nicht irgendwo bestellen, wenn ich eh bei Conrad vorbei komme.
Gibt es nicht noch andere Bausteine?
> Im übrigen ist diese Anweisung aus deinem code zunächst mal unsinnig:> Config Twi = 400000 ' TWI Takt> Twcr = &H04 'TWEN Setzen> im TWCR Register
Was ist denn daran unsinnig? Ich muss doch dem µC sagen, welchen TWI
takt ich haben möchte und TWI noch einschalten.
Und ACK und NACK und I2creceive habe ich schon rausgenommen.
Hi
>Bei Conrad gibt es den PCF 8583 RTC nicht und ich>möchte nicht irgendwo bestellen, wenn ich eh bei Conrad vorbei komme.>Gibt es nicht noch andere Bausteine?
Dann nimm einen PCF8574.
MfG Spess
> Config Sda = Portc.1 weglasse, dann kann ich die LED's auch ein wenig> flackern sehen und SCL ist ein ganz wenig dunkler als SDA.
Das ist eigenartig, denn das darf keinen Unterschied machen da SDA auf
eben diesem Portpin liegt. Der ist in meinem Code nur zur Sicherheit
definiert. Welche Bascom Version verwendest Du ?
Probier' mal das Hex im Anhang, das ist auf meiner Bascom Version
1.12.0.0 compilierte Testcode und auch das Ergebnis im AVR-Studio sieht
gut aus.
TWCR.TWEN musst Du im Übrigen nicht manuell setzen, das macht Bascom von
sich aus beim Befehl I2CStart.
Ich habe die Version 1.11.9.0.
Bei dem Programm tut sich auch nichts. Es gibt jedoch einen Unterschied.
Die LED's an SDA und SCL blinken immer kurz und schwach in einem 1
Sekunden Takt.
@ Killerawft
wieso LED an SDA und SCL ?
diese Led haben ja Kapazität und könnten das Signal verfälschen.
.. und es scheint so, als hätte ich dich durch meinen Beitrag
bezüglich RTC verwirrt.
warum suchst du jetzt, wo es die gibt ?
Wolltest du nicht einfach einen LED Treiber ansteuern ?
Mein Beitrag war ja nur als Beispiel für TWI gedacht, da dieses
funktioniert.
Durch "Rük -Durchlesen" im datenblatt hättest du evt. deinen Fehler
finden können.
Also verzeih.. ich wollte keine Verwirrung stiften.
Wie lang sind denn deine SDA UND SCL Leitungen ?
Im datenblatt deines TLC59116 sehe ich unter "Timing requirements" auch
was von verschiedenen I2C Bus Modi. Wenn nun der Startupwert der
"Standard Mode " wäre , dann darfst zu zur Begrüssung wohl auch nur
maximal
100khz fahren.
Zudem sehe ich etwas von "Bus Timeout feature"
evt. solltest du wirklich ertmal etwas weniger komplexes am i2c
ausprobieren. Halt so eine RTC oder noch einfacher einen Port-expander
http://www.mikrocontroller.net/articles/Port-Expander_PCF8574
Gruss Klaus
Die SDA und SCL Leitungen sind aller höchstens von µC zum IC 20cm lang.
Und den Port-Expander gibt es leider nicht bei Conrad oder andere Online
Shops ,ohne Mindestbestellwert, die ich kenne.
Ich hab auch mal den Takt auf 100khz gestellt und die LED's entfernt,
hat sich aber nichts getan.
Und wo siehst du was von dem Bus Timeout Feature? Im Datenblatt habe ich
das nicht gefunden.
Mir ist aufgefallen, daß der TLC hinter den letzten I2Cwrites in der
Do/Loop noch ein I2CStop haben will. Das hab' ich vergessen.
Schreib' das mal dazu und versuch's nochmal. Das Ergebnis würde dann so
aussehen wie im Screenshot, so läuft's aktuell hier auf 'nem ATM32.
Hallo Killerawft,
anbei zunächst mal die Bilder aus dem datenblatt.
soll ich Dir mal einen schicken ? .. so einen Portexpander ?
in einem Brief ? .. kostet mich ne Marke
Im Gegenzug bist Du dann später bereit, mir mit Bestellungen bei
Reichelt auszuhelfen.
Die verlangen ja für France richtig Mindestbestellwert und viel Porto.
Vielleicht bekommst du es ja damit dann hin.
Ich erinnere mich auch, dass es zu Anfang nervend ist,
da man nix weiss, was da abläuft. Am Ende stellt man jedoch wirklich
fest, dass es kein Hexenwerk ist.
Vielleicht berichtest du aber auch einmal über deine Situation.
Bist Du wirklich ein Newcomer ?
Hast Du ein vernünfites Netzteil ?
und so weiter und weiter.
Gruss Klaus
@ Klaus De lisson:
Also es wäre nett wenn du mir so einen schicken könntest. Ich würde dir
auch EINE Bestellung von dir bei Reichelt bestellen und zu dir schicken,
wenn du das Geld von dir aus überweist. Ich bezahle dann das Porto von
mir zu dir.
Und nun zu meiner Situation.
Ich bin in der µC Welt recht neu. Ich habe schon mit Tastern und LED's
rum gespielt und auch eine LED Matrix habe ich aufgebaut. Ein LCD habe
ich auch zum laufen bekommen und den ADC habe ich zur Temperaturmessung
mit einem NTC benutzt.
Ich benutze zum Testen der schaltungen und zum Programmieren das ATMEL
Evaluations-Board V2.0.1 von Pollin. Das Erweiterungs board mit dem LCD
und den 8 Tastern habe ich auch.
Um den TLC59116 anzusteuern habe ich mir von Conrad die
Multiadapterplatine gekauft und dort den Baustein aufgelötet. Das ganze
habe ich mit einer Stiftleiste auf eine Lochrasterplatine gelötet und
mit dem Evaluations-Board über den J4 verbunden.
Ich habe noch ein NT, das bis 30 Volt gleichstrom und 5 A regelbar ist
und das VC150 Multimeter von Voltcraft.
@MWS:
Das ist mir schon vorher aufgefallen, dass das da nicht steht und ich
hatte das einfach mal dazu geschrieben, tut sich aber nichts. leider.
Hab' mir nochmal das Pollin Board angesehen, PortC0..1 gehen über Jumper
JP9 & JP10 auf IC5 und zwei Widerstände. IC5 ist nicht gesteckt und die
Jumper auch nicht ? Da geht's sonst noch auf zwei Widerstände, dann
hättest Du ingesamt 6 Stück auf dem I2C Bus, Deine 2 x 4,7k, die
internen ~20k des µC und 2 x 10k vom Pollin Board. Wobei der 59116 das
immer noch ziehen können sollte.
Hier wäre auch noch Bascom Code für den 59116, Autor ist Synvox:
http://www.ledstyles.de/ftopic4849-4.html
Ansonsten wären evtl. ein paar gute Fotos Deines Aufbaus hilfreich.
Also ich habe nur die Jumper für die drei taster und die zwei LED's
gesteckt, sonst keine.
Ich glaube das ist nicht nötig. Das Pollin board habe ich fertig gelötet
gekauft und auf meinem selbst gemachten erweiterungsboard habe ich die
Bauteile aufgelötet und dann die einzelnen Pins an Buchsenleisten
gelötet und mit Draht verbunden.
Also den Code von deinem Link habe ich mir angeschaut und noch den Reset
eingebaut vor der Initialisierung. Die Initialisierung aus dem Programm
aus dem Link brachte einen error hervor also habe ich wieder die
genommen, die mir hier schon gesagt wurde.
Des weiteren habe ich mir nochmal das Datenblatt angeschaut und nach dem
Reset gesucht, um mir das auch zu erklären, was da geschrieben wurde.
Dabei habe ich unter dem Abschnitt "Open-Circuit Detection" etwas
interessantes gefunden. Ich habe ja NUR an OUT0 eine LED, die anderen
habe ich nirgends dran. In dem Abschnitt steht, dass dann der TLC einen
Error hat. Vielleicht macht er deswegen nichts. Morgen werde ich mal
schauen ob ich 16 LED's zusammenbekomme. Oder kann ich die einfach auf
Masse legen?
> Also ich habe nur die Jumper für die drei taster und die zwei LED's> gesteckt, sonst keine.> Ich glaube das ist nicht nötig.
Diese Jumper sollen eben nicht gesteckt sein, das war eine Frage um auch
das auszuschließen. Ich kann mich erinnern, daß jemand Probleme mit den
ADCs hatte, nur weil er vergessen hatte JP11&12 zu ziehen.
> In dem Abschnitt steht, dass dann der TLC einen Error hat.
In dem Abschnitt steht, daß er Errorflags setzen kann, das führt aber
nicht zum Shutdown, nur bei Übertemperatur würde er abschalten.
Würde Dir aber trotzdem mal raten, nur den Ausgangstreiber zu aktivieren
an dem auch eine Led dran ist. Wie groß ist übrigens REXT ?
Du könntest auch versuchen, etwas aus einer Zelle zu lesen, um zu sehen
ob der Baustein nur nix anzeigt, aber man dafür wenigstens mit ihm reden
kann.
Sollte so funktionieren, auf diese Art und Weise ist's recht verbreitet:
1
I2cstart
2
I2cwbyte Tlc1 ' Chip adressieren
3
I2cwbyte Ledout0 ' Register ansprechen
4
I2cstart ' Restart des des I2C ohne vorheriges Stop
So Ich habe mal jetzt LEDOUT0 auf H02 gesetzt und dann den Wert
abgefragt. Das gibt mir den wert 2 zurück.
Dann habe ich PWM0 mal auf 255 gesetzt und danach ausgelesen und da kam
der wert 255 auch zurück. Die Komunikation funktioniert also würde ich
sagen.
Rext sind 2kohm groß.
> Dann habe ich PWM0 mal auf 255 gesetzt und danach ausgelesen und da kam> der wert 255 auch zurück. Die Komunikation funktioniert also würde ich> sagen.
Sieht doch schon mal gut aus.
> Rext sind 2kohm groß.sind ? Das ist jetzt nur ein Verschreiber ?
Es gibt nur einen REXT zur Stromvoreinstellung, und bei 2k und
unverändertem Output Gain Control Register würden ca. 10mA rauskommen
pro Led.
Ich würde einen der Werte nehmen die im Datenblatt stehen, z.B. 720. Die
nächstliegenden Werte aus der E12 Reihe wären 680 oder 820 Ohm, 28mA,
resp. 23mA.
Und ich würde verschiedene Ausgangspins am 59116 durchprobieren, nicht
daß es gerade an einem Pin den Treiber erledigt hat.
Sind eigentlich alle GNDs des Bausteins angeschlossen ?
Also ich hab 860 Ohm an Rext gemacht, da ich nur zwei 430 ohm
Widerstände hier hatte, mit denen ich annähernd da ran komme.
Ich habe dann die LEDOUT 0 bis 3 eingeschaltet und die PWM's 0 bis 3 auf
255 gestellt und alle vier durchprobiert, jedoch ohne Erfolg. Ich habe
die LED an Plus geschaltet und den Minus Pol an den Treiber. Das ist ja
so richtig oder?
Es sind auch alle GND an Masse angeschlossen.
> Ich habe die LED an Plus geschaltet und den Minus Pol an den Treiber. Das> ist ja so richtig oder?
Ja, ist richtig.
> Also ich hab 860 Ohm an Rext gemacht,
Andere Seite des Widerstands an GND ?
Abblock C 100nF am 59111 GND/VCC ? Stützkondensator 100µF wären auch
nicht schlecht. Wobei letzterer eigentlich jetzt keine Auswirkung haben
sollte, erst wenn Last drauf käme.
Schau mal im Roboternetz nach dem Pdf zur besagten Propellerclock. Da
ist ein Schaltplan mit drin. Kontrollier' damit Deine Schaltung.
Und sonst, wie schon geschrieben, mach' ein Foto oder leg' die Platine
mit dem 59116 auf den Scanner. Evtl. entdecken mehr Augen einfach mehr.
Also das mit dem Rext ist schon mal gut, der war die ganze zeit auf
Plus. Jetzt ist er auf Masse und die beiden Kondensatoren sind auch dran
wie bei der Propeller uhr.
Ich hatte jetzt auch die Möglichkeit vernünftige Fotos zu machen.
4MB pro Bild, da wirst Du Dir hier keine Freunde machen...
Vor allem da die Bildinformation auch schon bei 2-300k locker
rübergekommen wäre.
Dachte da könnte man mehr erkennen, aber das ist ein bisserl sehr
artistisch verkabelt.
Warum besorgst Du Dir kein Steckbrett ? Kostet nicht die Welt und wär'
für so etwas ideal geeignet.
> der war die ganze zeit auf Plus
ned so gut.
Nächste woche müsste die platine kommen, wo ich die tlc's dann auflöte.
Dann kann ich das nochmal mit den neuen tlc's probieren. Vielleicht hat
der jetztige schon einen weg.
Und ein steckbrett kostet 24€. Und das würde ich nur hier brauchen weil
ich alle Projekte vorher mit dem pollin board testen konnte.
> Nächste woche müsste die platine kommen, wo ich die tlc's dann auflöte.> Dann kann ich das nochmal mit den neuen tlc's probieren. Vielleicht hat> der jetztige schon einen weg.
Der Baustein hat eine interne Spannungsreferenz die über REXT einen
Referenzstrom erzeugt. Die Referenz hätte selbst Spannung geliefert und
Du hast sie dagegen mit Strom versorgt, keine Ahnung, ob ihn das gekillt
hat. Aber wenn's etwas beschädigt hat, dann war das im direkten
Zusammenhang mit den Stromquellen für die Leds, gibt ein Blockschaltbild
im DB, da ist das gut zu sehen.
Da Du kommunizieren konntest, nahm ich an daß aus irgendeinem Grund die
Stromquellen nicht einschalten, 'ne defekte Referenz wäre so etwas.
> Und ein steckbrett kostet 24€. Und das würde ich nur hier brauchen weil> ich alle Projekte vorher mit dem pollin board testen konnte.
Die kleinsten Steckbretter gibt's ab 4-5 Euro, eines mit 950 Kontakten
hab' ich für 9€ gesehen, wenn Du noch mehr machen möchtest als die Sache
hier, ist's sicher keine falsche Investition.
Also die Platine ist nun da und die Leiste ist auch soweit fertig
gelötet. Nun habe ich noch ein wenig Bedenken zu RExt. Unzwar habe ich
SuperFlux 6-Pin RGB-LED's genommen, die ich mit dem TLC ansteuern
möchte. Da ist es so, dass im Datenblatt alle LED's 20mA bekommen,
jedoch verschiedene Spannungen. Rot braucht 1,7 Volt und Blau und Grün
2,8 Volt. Muss dann nicht für Grün und Blau ein anderer, niedrigerer
widerstand gewählt werden als für Rot? oder reicht es, mit den 820 Ohm,
den Strom auf ca 20mA zu begrenzen?