Forum: Mikrocontroller und Digitale Elektronik Designfrage I2C/TWI Bussystem


von Frank I. (icelase)


Lesenswert?

Hallo zusammen,

ich möchte ein kleines System bauen welches aus mehreren Modulen 
besteht.


LCD-Board       (Master/Slave?!... Mein Problem)
Mainboard       (Master)
Modul-Board-1   (Slave)
Modul-Board-2   (Slave)
Modul-Board-3   (Slave)
usw.

Jedes Board besitzt einen eigenen Atmega, welche über I2C/TWI 
miteinander kommunizieren sollen.

Der Atmega auf dem LCD Board ist nur für die Oberfläche auf dem Display 
(Menü usw) verantwortlich + Abfrage der Taster (Benutzereingaben).

Die Kommunikation zwischen Mainboard und den Modul-Boards 
(Master->Slave) stelle ich mir weniger schwierig vor.
Das Mainboard sendet einfach die Befehle zu den Slaves, bzw zum abfragen 
von Werten einfach einen Befehl und die Slaves antworten darauf.

So mein Problem das LCD-Board:
Es erhält alle X Sekunden die neusten Daten vom Mainboard (OK)
Der Nutzer könnte aber nun auch via LCD eine Einstellung "ändern".
Diese müsste dann direkt an das Mainboard gesandt werden.

Dies geht aber schlecht, da er ja ein Slave ist.....

Ich könnte nun wieder das Mainboard alle X Sekunden alle änderbaren 
Werte vom LCD-Board abfragen lassen... aber naja, scheint mir nicht 
besonders effizient zu sein.

Sollte ich eher auf einen I2C Multibus setzen? Damit das LCD Board 
direkt die Daten senden kann? Oder gibt es da noch einen anderen Trick?
Oder denk ich völlig falsch? :-)

Habe leider noch keine praktischen erfahrungen mit TWI/I2C.

Danke!

Viele Grüße,
Frank

von space (Gast)


Lesenswert?

Moin,

der I²C-Bus erlaubt mehrere Master.
Ich würde das LCD-Board, für den Fall eines Tastendrucks, als
Master laufen lassen.
Dazu muss das Mainboard aber vorher als Slave definiert werden.
Genaue Infos darüber kannst Du aus den Datenblättern Deines
ATmegas und aus den Application Notes von Atmel herauslesen.
Viel Spass
Stefan

von Magnus Müller (Gast)


Lesenswert?

Sende doch in regelmäßigen Abständen (z.B. alle 200ms) einen "general 
call" (Adresse 0000 000). Wenn eine Baugruppe neue Werte zu liefern hat, 
soll sie darauf einfach mit ihrer eigenen Adresse antworten. Dann weißt 
du, bzw dein Programm, dass dort was abzurufen/auszuwerten ist.

von Klaus 2. (klaus2m5)


Lesenswert?

Falls Daten nur von einem einzigen Slave zu erwarten sind, könnte man 
diesen auch direkt mit seiner Read-Adresse pollen. Sollte mit Nak 
antworten, wenn er nichts hat.

Wenn man nicht pollen will, kann man auch über das zusätliche INT Signal 
vom Slave erfahren, dass Daten abzuholen sind.

Multimaster zu implementieren, nur um Daten von einem Busteilnehmer 
abzuholen, wäre sehr aufwendig.

von hownottobeseen (Gast)


Lesenswert?

Hi,

oder einfach einen Interrupt-Request vom Displaymodul auslösen.
Wenn man keinen INT am Mainboard verwenden will, einfach einen Pin am 
Mainboard so lange auf High schalten, bis die Meldung ausgelesen wurde.

Theoretisch kann man damit auch Interrupts von den anderen Devices 
abfackeln, indem man alle "Interrupt"-Ausgänge parallel schaltet. Ist 
kein Interrupt am Device aktiv, liegt dieser als Eingang auf low. Hat 
das Device etwas zu melden: Pull-up für den Eingang aktivieren.

Anhand des Signals weiß dann das Mainboard, dass irgendwer irgendwas zu 
melden hat -> Devices nacheinander abklappern, solange der "Interrupt" 
auf high liegt.

von chris (Gast)


Lesenswert?

Normalerweise wird ein 6 pin Stecker verwendet, siehe hier, oder ein 
4pin.
http://www.i2cchip.com/i2c_connector.html
Einfach den int pin verwenden, wenn slaves einen Interrupt senden 
sollen.
Siehe ev. auch noch die SMB Bus Specs an, bez. SMBALERT sowie ev. 
Timeout.
Ist bei Eigenentwicklung auch recht nützlich.

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.