Hallo zusammen, bisher habe ich bei meinen AVR-Projekten I²C (bzw. halt TWI) immer das "Glück" gehabt, dass die Slave-Bausteine (LED-Treiber, EEPROM,...) einstellbare Adressen hatten. Jetzt kenne ich 3 Möglichkeiten, die alle verständlich sind: 1) Adresse kann mit mehreren (z.B. 3) herausgeführten Pins eingestellt werden 2) Adresse kann mit 1 Pin (über analoge Spannung) eingestellt werden (z.B. SAA1064) 3) Adresse ist fix, aber es gibt verschiedene Varianten (mit unterschiedlichen Bestellnummern) Was mache ich aber, wenn ich mit einem Mega8 mehrere (hier 3) Bausteine ansprechen muss, bei denen nur eine Adresse ausgeliefert wird und die zudem auch nicht verändert werden kann? Es handelt sich hierbei um die Bausteine "MCP4018" von microchip. Das sind digitale Potis mit 100kOhm und 6 Pins (siehe Device.gif). Die Spec (zu finden unter http://ww1.microchip.com/downloads/en/DeviceDoc/22147a.pdf) habe ich nicht mit angehängt, da 3MB groß; aber der wichtige Teil steht auf Seite 36 und das habe ich mal als "AddrInfo.gif" angehängt. Die blöden Dinger haben alle die gleiche Adresse :-( Zuerst dachte ich mir: Kein Problem, hänge ich die ganzen Clock-Eingänge der Potis an die Ausgänge von UND-Gattern und die Eingänge beschalte ich so, wie im Anhang beschrieben (siehe "KeineGuteIdee.gif) Ich glaube, dass es bei dieser "Lösung" nur bedingt funktionieren würde, weil - Kann der Slave über "Festhalten einer Leitung (SCL(?)) nicht dem Master mitteilen, dass er zu schnell ist? Das ginge dann so nämlich nicht mehr. Aber wie macht man sowas jetzt wirklich? Das müsste doch fast sowas wie ein Standardproblem sein, oder? Wie immer würde ich mich über ernstgemeinte Hilfe freuen :-) Vielen Dank und viele Grüße, Michael
3 x I2C-Bus aufbauen, anders geht es nicht. Oder den Bus multiplexen.
Oder so machen wie Grundig. SDA, SCL und I2CS. I2CS schaltet einen HEF4053 um, welcher SDA und SCL beim Senden umschaltet. Jeder Bus benötigt eigene Pullups.
Oder ein adressierbares Poti verwenden? Gibts da welche?
Servus, ich bin mir sicher, dass das nicht in Frage kommt, aber ich würde den Prozessor wechseln. Der Atxmega128a1 kann vier TWI bedienen! Und das funktioniert hervorragend. Für gute 10 Euro ist der Prozessor + SMD Adapterplatine für TQFP 100 zuhaben. http://shop.embedit.de/browse_030009010_188__.php. Das Löten von SMD-Bausteinen ist Voraussetzung !!! Oder eine fertiges Board http://shop.embedded-projects.net/index.php?module=artikel&action=gruppe&id=12 für 16 Euro. Der Code ist nicht aufwendiger als bei den alten Atmegas. TWI-Code gibt es mittlerweile auch im Internet. Oder mit dem Atmel "TWI-Tool" ist die Sache gleich erledigt. Gruß GG
Mach einfach SW-I2C, ist nicht aufwendiger als HW-I2C und Du kannst beliebig viele Busse ansteuern. Es reicht auch, nur die SDA-Leitung umzuschalten. Dazu schreibt man die I2C-SW so um, daß mit einem Maskenbyte der SDA-Pin ausgewählt wird. Damit lassen sich dann 9 I2C-Busse realisieren. Das HW-I2C braucht man eigentlich nur für Slave- oder Multimaster-I2C. Peter
Aber bißchen dämlich isses doch schon, dass das Poti nicht adressierbar ist, oder? Meist hab ich doch in einer Anwendung nicht nur 1 Poti, und ein 8-beiner, der dann 4 Adressen erlauben würde, wäre sicher möglich.
Ja, ist sogar sehr blöd; aber was soll ich machen? Die Teile gibt es ohnehin nicht wie Sand am Meer - zumindest für Mr. Privat - und wenn ich die Teile dann vor der Nase habe, muss ich halt das Beste draus machen. Aber das mit dem SW-TWI oder dem Atxmega128a1 muss ich mir mal anschauen; vielleicht ist das wirklich die bessere Alternative. BTW: Hat jemand eine Idee, wie ich mit (mehreren) digitalen 50kOhm und 100kOhm ein 250kOhm-Poti nachbauen kann? Der "Eingang" soll dabei immer mit 250kOhm "belastet" werden, der Ausgang soll von 0 - 250kOhm einstellbar sein UND die Schleifer sollten nicht irgendwie umgeschaltet werden müssen (also von einem zum nächsten Poti), da ein Audiosignal von vielleicht gerade mal 30mVss über das Poti geregelt werden soll. Ein Umschalten würde sicherlich zu einem lauten Knacken im Lautsprecher führen (denke ich zumindest) Gibt's da brauchbare Ideen? Die aktuelle Lösung sieht 3x100kOhm und 2x50kOhm vor... Bisschen unschön :-(
Schon mal bei Maxim nachgesehen? http://www.maxim-ic.com/products/digi_pot/ Da gibt es normale und NV Potis mit 32, 64, 128, 256 und 1024 tabs Auflösung sowie in SPI und I²C. Grüße Michelle
Hi, mir "müssen" halt die reichen, die ich habe. Und selbst wenn ich bei Maxim bestellen könnte, was sicherlich nicht geht, haben die anscheinend auch keine mit 250kOhm. Daher wäre das wohl auch keine Verbesserung...
Habe z.Zt selbst ein problem mit einem poti von Intersil X9118 und mich nach alternativen umgesehen.Sieht man sich aber die specs der Anderen an hat jedes gegenüber dem X9118 einen Nachteil.Übrigens gibt es von Maxim(dallas)kein 1024 taps pot mit i2c sondern nur mit spi!)Erst wenn man einige Erfahrung mit dig.potis gesammelt hat ,lernt man diese features zu schaetzen : non-volatil,und zwar automatisch beim abschalten der versorgunsspannung,beliebig oft (analog Dev nur bis zu 50 x)vier solche Speicher,d.h. es bleiben noch drei zur eigenen Verfuegung frei,(spart mir in meiner Anwendung mit zwei potis ein ganzes eeprom)dig.Spannungsbereich 2,7 -5,5V ,kann also direct mit LPC-arms betrieben werden,und das Beste: der Analog - Spannungsbereich +- 5V d.h. man kann es in analog Schaltungen mit +- 5V betreiben. Habe diese potis schon seit 2006 mit bascom im Einsatz. Jetzt kommt aber mein Problem: Die programmierung.Diese nicht ganz i2c konforme sequenz (erklärt auch warum Maxim das 1024 pot nur mit spi anbietet)macht probleme, wenn man den eingebauten HW i2c controller verwendet.dies gilt gleichermassen fuer atmega128 als auch den LPC2138.Beschreibt auch intersil in einer AN 91. Es bleibt einem also nur einen SW i2c treiber zu schreiben übrig,mit der HW loesung kan man die potis nur beschreiben,aber die Werte nicht mehr zurecklesen! Mit der bascomAVR SW-version funzt es einwandfrei,aber eben nur fuer AVR's. Die Befehlsfolge ist naemlich die: 1.start Mit deviceadresse und R/W bit 0 od 1 2. Write eines "opcodes" damit das pot weiss,welches Register. --und hier ist jetzt auch die crux -der HW i2c Kontroller laesst sich nicht ueberreden ,bei gesetztem R/W bit fuer Lesen, hier zu schreiben. 3 lesen des MSB- byte 4.Lesen des LSB bytes 5.stop Vom MSB byte sind nur die beiden lsb-bits relevant (fuer die 10 bit daten) den inhalt davor muss man eben eliminieren. ZZT lauft von mir eine Anfrage bei NXP,ob man den LPC2138 doch noch dazu bringen kann,zu Schreiben auch wenn das Lesebit gesetzt ist.Gibts da keine Antwort,bleibt nur die SW loesung. Da hat auch ein Hein vonne Werft hier mal ein iic.c gepostet. Es wuerde mir aber viel Arbeit ersparen,wenn dazu auch ein C-beispiel mit den verwendeten funktionen dabei waere.Habs mal selbst versucht,aber das lief elende langsam und die gelesenen Daten waren auch Hausnummern. Sollte Interesse bestehen,es gibt neben dem code auch Bilder (jpg) mit den zugehoerigen Oszillogrammen gruss gfk
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.