Ich habe wegen "vieler" I2C Temperatur Sensoren >14 Stück auch an einen I2C Hardware Mux gedacht. Ich habe solche Bausteine sogar über einen Freund, beschaffen können (sind/waren bei CCTools nicht zu bekommen). Nachdem mein Code nicht mehr in einen Atmega 32 gepasst hat habe ich ein ATmega 128 Board gekauft und hatte Ports "übrig". Das und die Erfahrung mit B-Control (http://www.nettypes.de/b-control/index.htm Martin Kaupp - leider ist der nicht mehr erreichbar, besonders schade weil er Boards und HW zu günstigen Preisen im Shop angeboten hat. Wenn jemand Kontakt zu ihm aufbauen kann bitte Mail an mich.) habe ich einen 4 Kanal Mux per Software programmiert. Das macht das HW MUX Board entbehrlich. Man kann die SW SCL Frequenz pro Kanal einstellen und damit die Übertragung auch bei längeren Leitungen - bei mir Telefonleitungen bis ca. 20m) ermöglichen. Ich habe viel durch die Beiträge in microcontroller.net gelernt. Vielen Dank, an alle, die hier publizieren (z. B Tutorials, ...) Deshalb möchte ich den Code hier zur Verfügung stellen. Zuvor jedoch noch einige Erklärungen: 1. Für Kommunikation innerhalb meines Gerätes benutze ich einen HW TWI Kanal des ATMEGA 128. Zu den Remote TWI Geräten benutze ich im Code den SW MUX. 2. Ich habe die Zugriffe auf die "Geräte" gekapselt. - DS1631 Temp Sensor (mit Platine bei CCTools beschfft) - PCF8574 8 bit I/O (mit Platine bei CCTools beschfft) - PCF8583 Real Time Cloch (mit Platine bei CCTools beschfft) - usw. Die TWI Master nach Slave Kommunikation läuft immer nach dem gleichen Muster ab: Erst Adresse senden, dann ggf. 1 oder mehrere Datenbytes senden, dann ggf. Bytes empfangen. Ich habe "nur" den Master -> Slave Betrieb implementiert. Die logischen Adressen habe ich wie folgt aufgebaut: TCCVVVBBB --Addresse für die Geräte, gespeichert im EEPROM des ATmega * BBB: Bit Address of PCF from 000 to 111 * VVV: Chip Variable TWI Address from 000 to 111 * CC: Channel 00, 01, 10, 11 * T: 1==SW-TWI; 0== HW-TWI Die Geräte Basis-Adressen werden erst in in den Geräte spezifischen Funktionen für die Übertragung an die spezifischen Geräte verwendet. 3. Es gibt einen Error Buffer, d.h. wenn sich ein angesprochenes TWI Gerät nicht wie erwartet meldet, dann wird ein Fehlereintrag in ein RAM array gemacht. Der Eintrag wird gelöscht, wenn sich das Gerät wieder richtig meldet. 4. bei den Temperatur Sensoren wird das "start convert commando" an den Sensor gesendet, wenn der gelesene Temperaturwert erkennen lässt, dass der Sensor nicht aktiv ist. 5. Bei den PCF8574 I/O ist eine Funktion vorhanden, um gezielt ein Bit zu setzen. Dies kann logisch global invertiert werden mit einem Umschalter, damit der externen Beschaltung leicht Rechnung getragen werden kann, un im Code konsequent mit positiver Logik kodieren zu können. 6. Die TWI Übertragungsfrequenz kann pro Kanal sowohl für HW TWI und auch SW TWI eingestellt werden. 7. Es gibt ein RAM Simulations-Array mit dem der Code im AVR Studio geprüft werden kann. Umschalter Simulation aktiv muss dann gesetzt werden mit: #define SIMULATION 9. In der Struktur „twi1“ werden die globalen Variablen für die Schnittstellen verwaltet. Ich benutze AVR Studio 4, HAPSIM von Helmut Wallner (Tastatur, LCD, RS232 Simulator in Verbindung mit AVR Studio) und habe von den Code Beispielen von Peter Fleury viel gelernt.
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.