Forum: Mikrocontroller und Digitale Elektronik TWI MUX per SW an einem Port


von Helmut S. (heansch)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.