Forum: Mikrocontroller und Digitale Elektronik Kommunikation zwischen Mikrocontrollern mittels I2C


von manitou (Gast)


Lesenswert?

Hi,

ich bin gerade in der Planungsphase von einem meiner ersten Projekte. 
Meine Fragen berufen sicherlich darauf, dass ich noch keine Erfahrungen 
im Umgang mit I2C (oder anderen Bus-Systemen wie SPI) gesammelt habe.

Ich habe eine vereinfacht gesagt eine Anzeigetafel mit einer 
entsprechenden Steuerplatine.

Über I2C sollen nun diverse Platinen bzw. Mikrocontroller angeschlossen 
werden, welche zusätzliche Informationen liefern, die angezeigt werden 
können. Unter anderem soll so z.B. ein Controller angebunden werden, 
welcher die aktuelle Uhrzeit zur Verfügung stellen soll. Diese soll er 
über DCF77 empfangen und in einer RTC vorhalten. Aus Gründen der 
Modularisierung möchte ich diese Funktionalität nicht in der 
"Haupt-Platine" implementieren.

Nun bin ich auf der Suche nach RTC-Bausteinen darauf aufmerksam 
geworden, dass diese i.d.R. auch über I2C angeschlossen werden.

Mir stellt sich nun folgende Frage: Wie "kapsele" ich diese zwei 
Komponenten richtig voneinander ab? Die "Haupt-Platine" soll weder etwas 
von der RTC auf der "Uhren-Platine" wissen, noch sollen sich die beiden 
in die Quere kommen. Idealerweise würde die "Haupt-Platine" einfach jede 
Sekunde registrierte Geräte fragen, ob diese Daten zum Anzeigen vorrätig 
haben, und diese ggf. abfragen. Das würde garantieren, dass man 
zusätzliche Peripherie nach dem Motto "Plug and Play" einfach nur 
anschließen muss. Eine ordentliche Schnittstelle mal vorausgesetzt.

Lässt sich das irgendwie geschickt lösen? Spontan fällt mir nur eine 
Lösung ein, welche darauf hinausläuft, dass man I2C in Software 
nachbildet und somit zwei getrennte I2C Busse hat. Das kommt mir aber 
weder besonders geschickt vor, noch weiß ich, ob bzw. wie einfach sich 
so etwas realisieren lassen würde. Prinzipiell würde ich schon gern das 
in Hardware zur Verfügung gestellte Two-Wire-Interface nutzen.

Ich könnte vermutlich auch RTCs finden, welche nicht über I2C 
angesprochen werden, aber das Problem ist ja von grundsätzlicher Natur.

Ich hoffe, dass ich das Problem wenigstens halbwegs vernünftig erklären 
konnte, und der Text nicht allzu lang ist ;).

Mit freundlichen Grüßen,
manitou

von R. F. (inet_surfer88)


Lesenswert?

Hallo,

warum nicht den "Uhrencontroller" über I2C verbinden und die 
Kommunikation der restlichen Platinen über einen anderen Bus, z.B. UART.

von (prx) A. K. (prx)


Lesenswert?

Hast du dich bereits auf Controller festgelegt, die nur eine 
I2C-Schnittstelle besitzen? Es gibt auch welche mit zweien.

von TWI (Gast)


Lesenswert?

Du kannst an den I2C Bus bis zu 112 (8bit) bzw. 1136 (10bit) Teilnehmer 
anschliessen.

Jeder Teilnehmer bekommt eine eigene Adresse unter der er ansprechbar 
ist.

Im Single Master Modus könnte der Master dann die bekannten Slaves 
abfragen und in regelmässigen Abständen nach neuen Teilnehmern auf dem 
Bus suchen.

Gruß

von TWI (Gast)


Lesenswert?

Achja, I2C kann man auch ohne Hardware I2C mit nicht sooo viel Aufwand 
implementieren, somit bist Du von der uC Hardware etwas flexibler.

Gruß

von EGS_TI (Gast)


Lesenswert?

Wieso genau willst bzw. brauchst du zwei getrennte I2C-Busse?

Was meinst du mit abkoppeln? Außer, dass die Module über I2C miteinander 
verbunden sind, "berühren" die sich doch nicht.

von EGS_TI (Gast)


Lesenswert?

Achso, bei nochmaligem Durchlesen hab ich jetzt erkannt, wo das Problem 
ist.

Gibt es keine RTC mit SPI?

von Max D. (max_d)


Lesenswert?

1. Es gibts auch 1-wire RTCs
2. Ein AVR mit externem Uhrenquarz (bei eigtl. allen Megas möglich) ist 
zwar nicht ganz so stromsparend wie ein RTC-Chip sollte an einer CR2032 
Lithium-Batterie aber locker 5 Jahre durchhalten (eine exzessive 
anwedung von sleep vorausgesetzt), er muss Ja im "Backup-Modus" nur 1x 
pro Sekunde den Core aufwecken (32768 kHz / 128 (prescale) / 256 
(Timer2) = 1 Hz) und die Zeit incrementieren, dadurch sparst du eine 
externe RTC.

EDIT: Das is z.B. ein 1-wire RTC-Chip: 
http://www.maxim-ic.com/datasheet/index.mvp/id/2911

von EGS_TI (Gast)


Lesenswert?

Du könntest deine Hauptplatine bspw. nur bestimmte Adressen abfragen 
lassen. Also einen bestimmten Adressbereich z.B. . Entweder du bekommst 
dann eine Antwort oder nicht.

von manitou (Gast)


Lesenswert?

Hi,

vielen Dank schon einmal für eure Antworten.

R. F. schrieb:
> warum nicht den "Uhrencontroller" über I2C verbinden und die
> Kommunikation der restlichen Platinen über einen anderen Bus, z.B. UART.
Ehrlich gesagt wusste ich bisher nur über zwei mögliche Bus-Systeme 
Bescheid: SPI und I2C. Aufgrund des geringeren Verdrahtungsaufwandes hat 
mir I2C dann mehr zugesagt.

Ich sehe spontan auch nicht wie man mittels UART mehrere Controller 
miteinander kommunizieren lassen könnte, ich dachte das wäre eine Lösung 
für nur 2 Teilnehmer.

A. K. schrieb:
> Hast du dich bereits auf Controller festgelegt, die nur eine
> I2C-Schnittstelle besitzen? Es gibt auch welche mit zweien.
Nein, ich bin noch in der Konzept-Phase. Die "Haupt-Platine" ist zwar 
größtenteils schon fertig, aber um die weiteren Bausteine habe ich mich 
noch nicht gekümmert. Gibt es solche Controller auch von Atmel? Es ist 
nämlich gar nicht so einfach nach "Two Two-Wire-Interface" zu suchen 
bzw. etwas brauchbares zu finden ;). Ein Uhren-Controller muss ja 
prinzipiell nicht viel Funktionalität bereit stellen und könnte 
dementsprechend klein ausfallen. Ich bezweifle jetzt einfach mal, dass 
es "kleine" AVRs gibt, welche zwei TWIs bereit stellen. Irre ich mich?

TWI schrieb:
> Du kannst an den I2C Bus bis zu 112 (8bit) bzw. 1136 (10bit) Teilnehmer
> anschliessen.
Das habe ich schon mitbekommen. Ich wollte es halt nur aus Gründen der 
Einfachheit so gestalten, dass jeder angeschlossene Teilnehmer wirklich 
etwas brauchbares liefert. Ansonsten müsste ich mir noch Gedanken über 
eine vernünftige Adresseaufteilung machen und das ggf. in den 
Schnittstellen berücksichtigen. Wie gesagt ich habe noch keinerlei 
Erfahrung mit I2C, aber solche Lösungen scheinen das Ganze zumindest auf 
den ersten Blick nicht einfacher zu machen. Insbesondere können sich die 
beiden Controller ja dann in die Quere kommen.

TWI schrieb:
> Achja, I2C kann man auch ohne Hardware I2C mit nicht sooo viel Aufwand
> implementieren, somit bist Du von der uC Hardware etwas flexibler.
Ok, das ist schon einmal gut zu wissen. Dennoch wäre natürlich echte 
Hardware I2C schöner ;).

EGS_TI schrieb:
> Gibt es keine RTC mit SPI?
Sind mir jedenfalls noch nicht über den Weg gekommen. Wie erwähnt gibt 
es noch 1-wire Lösungen. Ich wollte allerdings ganz prinzipiell wissen, 
wie man so etwas "geschickt" löst. Ganz unabhängig von der RTC.

EGS_TI schrieb:
> Du könntest deine Hauptplatine bspw. nur bestimmte Adressen abfragen
> lassen. Also einen bestimmten Adressbereich z.B. . Entweder du bekommst
> dann eine Antwort oder nicht.
Ja, das wäre eine Lösung. Siehe oben. Mir gefällt halt nur nicht die 
Vorstellung, dass eine Kommunikation zwischen Uhren-Controller und RTC 
den ganzen Bus "lahmlegt". Klar, in der Praxis dürfte das kaum eine 
Rolle spielen. Da ich aber zur Zeit noch in der Entwurfsphase bin, würde 
ich das Ganze gerne so sauber wie nur möglich gestalten.

Mit freundlichen Grüßen,
manitou

von spess53 (Gast)


Lesenswert?

Hi

>> Gibt es keine RTC mit SPI?
>Sind mir jedenfalls noch nicht über den Weg gekommen.

Selbstverständlich gigt es RTCs mit SPI:

http://para.maxim-ic.com/en/search.mvp?fam=rtc&374=SPI&tree=timers

MfG Spess

von Wolfgang (Gast)


Lesenswert?

manitou schrieb:
> Ja, das wäre eine Lösung. Siehe oben. Mir gefällt halt nur nicht die
> Vorstellung, dass eine Kommunikation zwischen Uhren-Controller und RTC
> den ganzen Bus "lahmlegt".

Was willst du denn mit deiner Uhr alles kommunizieren. Die brauchst du 
doch eigentlich nur zur Stromausfallüberbrückung, damit dein System dann 
nicht zeitlos dasteht.

von (prx) A. K. (prx)


Lesenswert?

manitou schrieb:

> Gibt es solche Controller auch von Atmel? Es ist
> nämlich gar nicht so einfach nach "Two Two-Wire-Interface" zu suchen

Es gibt auch bei Atmel eine parametrische Suche, in der man auf 
mindestens 2 TWIs einschränken kann. Die klassischen Mega/Tiny Serien 
sind da aber so gut wie draussen.

von manitou (Gast)


Lesenswert?

spess53 schrieb:
> Selbstverständlich gigt es RTCs mit SPI:
Ok. Das ist natürlich gut zu wissen und eine Lösung für mein Problem mit 
der RTC. Wobei ich natürlich in erster Linie an einer allgemeinen Lösung 
interessiert bin. Insofern würde mir ein Atmel AVR mit zwei 
Two-Wire-Interfaces bisher wohl am Besten gefallen ;). Gibt es denn 
solche auch? Wie finde ich diese?

Wolfgang schrieb:
> Was willst du denn mit deiner Uhr alles kommunizieren. Die brauchst du
> doch eigentlich nur zur Stromausfallüberbrückung, damit dein System dann
> nicht zeitlos dasteht.
Naja, der "Uhren-Controller" würde ja regelmäßig das DCF-Signal 
empfangen und es in die RTC schieben. Über das Intervall kann man wohl 
streiten (vermutlich reicht sogar einmal am Tag). Trotzdem gefällt mir 
ein Design nicht sonderlich, bei welchem die Kommunikation zwischen 
"Uhren-Controller" und RTC (welche ich als "sekundär" bezeichnen würde) 
den gesamten Bus lahmlegt, über welchen ggf. "wichtigere" Daten (welche 
ich als "primär" bezeichnen würde) transportiert werden könnten.

Wie gesagt: Ich bin noch in der Entwurfsphase und sammle Ideen. 
Verständlicherweise will man zunächst ein "perfektes" System entwerfen 
;).

Daher danke ich euch bereits jetzt vielmals für euren Input!

von manitou (Gast)


Lesenswert?

A. K. schrieb:
> Es gibt auch bei Atmel eine parametrische Suche
Dürfte ich denn um einen Link zu dem Ganzen bitten? Ich war schon immer 
auf der Suche nach so etwas. Habe zwar Inoffizielle Varianten gefunden, 
diese waren aber entweder nicht (mehr) aktuell, oder überhaupt recht 
eingeschränkt.

Mit freundlichen Grüßen,
manitou

von (prx) A. K. (prx)


Lesenswert?

manitou schrieb:

> Dürfte ich denn um einen Link zu dem Ganzen bitten?

www.atmel.com
Products - By Device - Microcontrollers
links unten Parametric Table - Find

War das jetzt sooo schwierig?

von usuru (Gast)


Lesenswert?

bei Microchip erreichst Du das "Product Selector Tool" über 
http://www.microchip.com/productselector/MCUProductSelector.html

von usuru (Gast)


Lesenswert?

> bei Microchip erreichst Du das "Product Selector Tool" über
> http://www.microchip.com/productselector/MCUProduc...

reichen 88 µCs mit 2 MSSP-Modulen (die können I2C) allein bei den 
8-bit-Typen ?

von manitou (Gast)


Lesenswert?

usuru schrieb:
>> bei Microchip erreichst Du das "Product Selector Tool" über
>> http://www.microchip.com/productselector/MCUProduc...
>
> reichen 88 µCs mit 2 MSSP-Modulen (die können I2C) allein bei den
> 8-bit-Typen ?

Ich würde schon ganz gern bei Atmel bzw. AVR bleiben. Dafür habe ich 
bereits das nötige Equipment zum Programmieren sowie Erfahrung. Wird 
wohl in diesem Fall darauf hinauslaufen, dass ich eine RTC mit SPI 
verwenden werde und hoffen muss, dass auch eventuell in der Zukunft 
verwendete Bausteine immer in einer SPI Variante verfügbar sein werden 
;).

Mit freundlichen Grüßen,
manitou

von quak (Gast)


Lesenswert?

manitou schrieb:
> über welchen ggf. "wichtigere" Daten (welche
> ich als "primär" bezeichnen würde) transportiert werden könnten.

Da klingelts bei mir: Schau doch mal nach dem CAN Bussystem.

manitou schrieb:
> Naja, der "Uhren-Controller" würde ja regelmäßig das DCF-Signal
> empfangen und es in die RTC schieben. Über das Intervall kann man wohl
> streiten (vermutlich reicht sogar einmal am Tag). Trotzdem gefällt mir
> ein Design nicht sonderlich, bei welchem die Kommunikation zwischen
> "Uhren-Controller" und RTC (welche ich als "sekundär" bezeichnen würde)
> den gesamten Bus lahmlegt, über welchen ggf. "wichtigere" Daten (welche
> ich als "primär" bezeichnen würde) transportiert werden könnten.

Naja, was genau soll das werden. Eine eierlegende Wollmilchsau, die dann 
am Ende 1 mal Pro Tag eine LED blinken lässt ?

von Max D. (max_d)


Lesenswert?

Mach doch einfach den Uhr-Controller zur RTC (wie oben bereits gesagt) 
das ist billiger als irgendein exotischer SPI-RTC-Baustein und so schwer 
is das mit dem Sleep auch ned, du kannst ja ne Art "Wake-Up Pin" 
vorsehen der hängt an nem Interrupt eingang und reagiert auf die 
Rising-Edge der 5V Versorgungsschiene (mit nem 10k Pulldown (pullup im 
Avr unbedingt ausmachen) an derselben is das recht zuverlässig)....

von manitou (Gast)


Lesenswert?

quak schrieb:
> Da klingelts bei mir: Schau doch mal nach dem CAN Bussystem.
Danke für den Hinweis. Wobei das schon ein wenig komplexer aussieht. 
Werde ich mich erst einmal vernünftig einlesen müssen.

quak schrieb:
> Naja, was genau soll das werden. Eine eierlegende Wollmilchsau, die dann
> am Ende 1 mal Pro Tag eine LED blinken lässt ?
So ungefähr ;). Klar, meine Konstruktion wird nicht den Weltfrieden 
sichern. Aber es macht doch Spaß etwas von Grund auf vernünftig zu 
planen.

Max D. schrieb:
> Mach doch einfach den Uhr-Controller zur RTC (wie oben bereits gesagt)
> das ist billiger als irgendein exotischer SPI-RTC-Baustein und so schwer
> is das mit dem Sleep auch ned,
Das kommt wohl ganz drauf an wie man Kosten definiert. Selbst ein 
solcher exotischer SPI-RTC Baustein ist für unter 5 Euro zu haben. Wenn 
man das Ganze selber implementiert ist man sicherlich etliche Stunden 
drüber.

Wobei es ja aus Lernzwecken durchaus seinen Reiz haben kann. Könntest du 
deine Ausführung oben vielleicht etwas genauer beschreiben? Wofür 
braucht es den Wake-Up-Pin bzw. wie hängt dieser mit der 
Batterieversorgung zusammen (Eine RTC macht ja nur in Verbindung mit 
einer "Notfall-"Batterieversorgung Sinn)? Wofür braucht es denn 
Pull-Down Widerstand? Wenn keine Strom-Versorgung angeschlossen ist, 
wohin soll dann "gezogen" werden? GND ist ja dann i.A. auch nirgends 
angeschlossen? Vielleicht fehlt mir gerade das nötige 
Vorstellungsvermögen, aber so ganz weiß ich nicht was du mir sagen 
willst ;).

von Max D. (max_d)


Lesenswert?

Dein Mega läuft, wenn das Modul Stromlos ist, mit (meist abgeschaltetem) 
internem RC-Oszilator, wenn der  Timer2 (von dem an den "Quarz-Pins" 
angeschlossenem Uhrenquarz getaktet und mit 128 gepsrescaled) überläuft, 
dann weckt er den mega der läuft mit 8 MHz los und erhöht die Uhrzeit 
(in der Timer2 ISR), danach legt er sich wieder schlafen. Wenn du dein 
Modul an eine externe Versorgung (in der Schaltung) hängst, dann muss 
der Mega das ja merken, deswegen fragst du entweder jede sekunde nach, 
ob das so ist, dann kanns bis zu einer Sekunde dauern bis der Mega an 
dem Bus "erscheint" oder du verbindest einen Interrupt-Pin mit der 
Versorgung der weckt dann deinen Mega einfach so auf. Der Pulldown bzw. 
der Pullup (je nach art der Verbindung) is jedoch immer nötig um den Pin 
in ein "sicheres" Low/High zu kriegen damit die eingangsbuffer nich 
mittendrin rumhängen und zusätzlich strom wegsaufen. Der mega wird dann 
der Einfachheit halber über ne (Schottky-)Diode aus der Batterie 
gepuffert (bei nem Mega88v kann man mit dem clkpr-register den takt 
runterteilen -> läuft auch bei 1,8 V noch) und läuft immer (der oszi 
wird aber oft abgeschalten). Wenn er aus der Schltung (auch per diode) 
Strom kriegt, dann hat er hald 5V zur Verfügung und skaliert evtl. 
seinen Takt auf die 8 MHz hoch). Die Verwendung eines Interruptes zur 
Clock-umschaltung hat den vorteil, dass man mit ner Schottky aus den 5V 
seinen Saft zieht und wenn die dann abfallen sich kurz aus dem 
obligatorischen elko auf dem modul (100 µF reichen be richtigem design) 
ernährt und den Takt wieder auf "Batterie-betrieb" umstellt und sich 
schlafen legt.
Das sollte in C mit etwas Erfahrung in etwa einem Tag gut zu proggen 
sein, ausserdem lernt man viel über die AVRs...

von Max D. (max_d)


Lesenswert?

Max D. schrieb:
> der läuft mit 8 MHz los

meinte natürlich 4 MHz, sry

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.