www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Designfrage I2C/TWI Bussystem


Autor: Frank I. (icelase)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: space (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus 2m5 (klaus2m5)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: hownottobeseen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.