Forum: Mikrocontroller und Digitale Elektronik SPI / I2C mit Übertragung in beide Richtungen, initiiert von beiden Seiten


von Lars H. (demoniacmilk)


Lesenswert?

Hallo µCs!


Ich habe zur Zeit ein Problem, für welches ich keine Antwort finden 
konnte.
Eventuell ist es einfach eine seltene oder gar irrsinige Sache die ich 
Versuche..

Anwendungsbeispiel:
- Verbinde zwei Mikrocontroller über eine serielle Schnittstelle
- Beide verfügen über einen Button
- Druck auf den Button sendet ein Signal an den Partner
- Partner toggled LED

Bedeutet:
- Auf Knopfdruck muss der entsprechende µC ein Signal an seinen Partner 
senden

Problem:
- Slaves können nicht einfach an einen Master senden, sondern müssen 
dazu aufgefordert werden. Der master weiß natürlich nichts vom 
Knopfdruck.

Lösungsansätze:
- Unschön!: Zusätzliche Leitung zwischen Slave und Master, welche bei 
Knopfdruck am Slave ein Interrupt am Master auslöst, so dass dieser nach 
Daten fragt
- Unmöglich?: Beide im Slave Modus halten (kein Master vorhanden), bei 
Knopfdruck wird in den Master umgeschaltet (eventuell warten falls grade 
empfangen wird), die Kommunikation wird gestartet, anschließend wieder 
alle im Slave Modus.
- Verwendung asynchroner Übertragung anstelle von I2C, SPI


Für jegliche Arten von Lösungsansätzen wäre ich sehr dankbar!

Grüße,
Lars

: Bearbeitet durch User
von holger (Gast)


Lesenswert?

>Für jegliche Arten von Lösungsansätzen wäre ich sehr dankbar!

Nimm einen UART. Dann sind alle deine Probleme gelöst.

von Amateur (Gast)


Lesenswert?

Mach den einen zum Master.

Dieser fragt zyklisch seinen Gegenüber ab.

Bei dieser Gelegenheit kann er auch gleich den eigenen Status 
übermitteln.

von Jobst Q. (joquis)


Lesenswert?

I2C ist eigentlich ein Multimastersytem. Eigentlich, weil nicht jede 
Mastersoftware die Regeln kennt, mit anderen Mastern umzugehen.

von Jobst Q. (joquis)


Lesenswert?

Bei Mikrokontrollern kannst du den I2C-Modus ja umschalten zwischen 
Slave und Master. Im Wartezustand nimmst du den Slavemodus, bis die 
Taste gedrückt wird. Dann schaltest du auf Master, siehst aber vorher 
auf den Zustand der Leitungen. Wenn die Leitung frei ist, wird gesendet, 
ansonsten wird erst als Slave empfangen und dann als Master gesendet.

von Mike (Gast)


Lesenswert?

Lars H. schrieb:
> - Unschön!: Zusätzliche Leitung zwischen Slave und Master, welche bei
> Knopfdruck am Slave ein Interrupt am Master auslöst, so dass dieser nach
> Daten fragt

Dann nimm 1-Wire. Die gegenüber I2C/SPI eingesparte Clock-Leitung kannst 
du für den Interrupt verwenden.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Lars H. schrieb:
> - Verwendung asynchroner Übertragung anstelle von I2C, SPI

 USART und Multi-processor Communication Mode.

von Lars H. (demoniacmilk)


Lesenswert?

Danke für die Antworten!

holger schrieb:
> Nimm einen UART. Dann sind alle deine Probleme gelöst.

ich bin mir allerdings nciht ganz sicher, wie ich dann verhindere, dass 
die beiden sich beim Senden nicht in die Quere kommen.

Jobst Quis schrieb:
> Bei Mikrokontrollern kannst du den I2C-Modus ja umschalten zwischen
> Slave und Master. Im Wartezustand nimmst du den Slavemodus, bis die
> Taste gedrückt wird. Dann schaltest du auf Master, siehst aber vorher
> auf den Zustand der Leitungen. Wenn die Leitung frei ist, wird gesendet,
> ansonsten wird erst als Slave empfangen und dann als Master gesendet.

Ja sowas in der Richtung hatte ich gedacht. Werde ich dann mal probieren 
ob das funktioniert. Ich weiß halt nicht was mit der Clockleictung 
passiert, wenn es keinen Master mehr gibt.

Mike schrieb:
> Dann nimm 1-Wire.

Was ist damit gemeint? Also, nur eine Leitung (Übersetzen hab ich 
hinbekommen), aber was steckt dahinter? Auch in asynchroner Ansatz?

von Jobst Q. (joquis)


Lesenswert?

Lars H. schrieb:
> Ich weiß halt nicht was mit der Clockleictung
> passiert, wenn es keinen Master mehr gibt.

Dann ist die Leitung im Ruhezustand, also über die Pullup-Widerstände 
auf H.

Eine gute Erklärung des I2C gibt es zB hier:

http://www.timmermann.org/ralph/index.htm?http://www.ralph.timmermann.org/elektronik/i2c.htm

von Lars H. (demoniacmilk)


Lesenswert?

Jobst Quis schrieb:
> also über die Pullup-Widerstände

Ah, die hab ich glatt vergessen! Dachte die Leitung hinge dann eifnach 
in der Luft :D

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Lars H. schrieb:
> ich bin mir allerdings nciht ganz sicher, wie ich dann verhindere, dass
> die beiden sich beim Senden nicht in die Quere kommen.

 Kann nicht passieren, Leitungen sind gekreuzt, also stören die beiden
 sich nicht gegenseitig. Gilt auch für SPI, allerdings muß da einer
 Master sein.

: Bearbeitet durch User
von Klaus (Gast)


Lesenswert?

Lars H. schrieb:
> Lösungsansätze:
> - Unschön!: Zusätzliche Leitung zwischen Slave und Master, welche bei
> Knopfdruck am Slave ein Interrupt am Master auslöst, so dass dieser nach
> Daten fragt

Das nennt sich dann SMBus.

Andere Lösung: der Slave merkt sich die Taste und wenn er regelmäßig 
alle 100ms (oder 200ms oder wie schnell es immer nötig ist) gefragt 
wird, meldet er den Tastendruck und möglicherweise auch wie lange er 
gedrückt wurde.

MfG Klaus

von holger (Gast)


Lesenswert?

>holger schrieb:
>> Nimm einen UART. Dann sind alle deine Probleme gelöst.
>
>ich bin mir allerdings nciht ganz sicher, wie ich dann verhindere, dass
>die beiden sich beim Senden nicht in die Quere kommen.

Die können sich nicht in die Quere kommen.
Das ist ja das gute am Uart. Jede Seite kann einfach
senden wann es ihr beliebt. Dazu muss keinerlei
Rücksicht auf die Gegenseite genommen werden.

Den Rest von dem rumgeposte hier kannst du vergessen.
Wenn du eine Sache nicht willst, dann ist es ein
I2C Multimaster System;)

von Karol B. (johnpatcher)


Lesenswert?

Lars H. schrieb:
> Mike schrieb:
>> Dann nimm 1-Wire.
>
> Was ist damit gemeint? Also, nur eine Leitung (Übersetzen hab ich
> hinbekommen), aber was steckt dahinter? Auch in asynchroner Ansatz?

Siehe: https://de.wikipedia.org/wiki/1-Wire

Mit freundlichen Grüßen,
Karol Babioch

von holger (Gast)


Lesenswert?

>Siehe: https://de.wikipedia.org/wiki/1-Wire
>
>Mit freundlichen Grüßen,
>Karol Babioch

Was soll er jetzt mit diesem Schwachsinn?

von Mike (Gast)


Lesenswert?

holger schrieb:
> Was soll er jetzt mit diesem Schwachsinn?

Eine Antwort auf die Frage "Was ist damit gemeint?" finden?

Bei Maxim Integrated, die die Dallas Semiconductor, den Erfinder vom 
1-Wire Bus gekauft haben, gibt es in der Application Note 126 natürlich 
auch auch einige Infos und Anregungen zum 1-Wire Bus
http://www.maximintegrated.com/en/app-notes/index.mvp/id/126

von holger (Gast)


Lesenswert?

>> Was soll er jetzt mit diesem Schwachsinn?
>
>Eine Antwort auf die Frage "Was ist damit gemeint?" finden?

Er will kein 1-Wire. Den Schrott kann man sich sonstwohin stecken.

von Karol B. (johnpatcher)


Lesenswert?

holger schrieb:
> Er will kein 1-Wire. Den Schrott kann man sich sonstwohin stecken.

Schön, dass du jetzt schon für andere entscheidest was sie wollen. Ich 
hingegen wollte nur der Vollständigkeit halber eine Referenz auf das 
1-Wire Protokoll liefern, und damit aufzeigen, dass es sich um ein 
standardisiertes Protokoll handelt. Ob und inwiefern das für den 
konkreten Anwendungsfall geeignet ist, steht dabei im Hintergrund.

Und ja, ich denke auch, dass UART die bisher beste vorgeschlagene Option 
ist.

Mit freundlichen Grüßen,
Karol Babioch

von Lars H. (demoniacmilk)


Lesenswert?

Marc Vesely schrieb:
> Kann nicht passieren, Leitungen sind gekreuzt

hm, ... ja eigentlich klar, wie auch sonst :D

Karol Babioch schrieb:
> Siehe: https://de.wikipedia.org/wiki/1-Wire

Jo danke. Interessante Idee mit der Stromversorgung etc, aber wohl nicht 
wonach ich suche.

Klaus schrieb:
> Andere Lösung: der Slave merkt sich die Taste und wenn er regelmäßig
> alle 100ms (oder 200ms oder wie schnell es immer nötig ist) gefragt
> wird, meldet er den Tastendruck und möglicherweise auch wie lange er
> gedrückt wurde.

Das ginge, aber sowas wollte ich vermeiden.

---

Ich werde mich morgen mal damit beschäftigen, das über UART umzusetzen. 
Danke für die Hilfe und Anregungen.

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.