Forum: Mikrocontroller und Digitale Elektronik PIC: I²C Hardware-Slave und Software-Master gleichzeitig


von M1k3y (Gast)


Lesenswert?

Hallo zusammen,

Ich beschäftige mich seit kurzem für ein Projekt mit den PICs 
(PIC16F1823).
Ich habe schon einige Erfahrung mit AVRs, bin was die PICs angeht aber 
noch blutiger Anfänger.

Meine Fragen:

1. ist es möglich die IOs weiterhin direkt anzusteuern, auch wenn das 
I²C Modul aktiviert ist?

2. Wenn ja, wäre es möglich einen Master in Software zu implementieren, 
der direkt auf die I²C Leitungen "schreibt", während das Hardware-Modul 
empfängt?

Das Ziel davon ist, dass bei einer Kollision auf dem Bus trotzdem keine 
Daten verloren gehen, auch nicht für den Master der die Arbitrierung 
"verloren" hat.

Deshalb 3. Gibt es eine möglichkeit nur mit dem Hardware-Modul Daten zu 
senden, bei einer Kollision aber trotzdem den gesamten Datensatz zu 
erhalten?

Ich freue mich auf jede Unterstützung.

[Neuling] M1k3y

von Stefan F. (Gast)


Lesenswert?

> Das Ziel davon ist, dass bei einer Kollision auf dem Bus
> trotzdem keine Daten verloren gehen

Gleichzeitig Master und Slave zu sein ist quatsch. Dann kann der Chip 
nur mit sich selbst reden. Wozu soll das gut sein?

Wechselweise die Rolle von Master und Slave zu haben ist problemlos 
möglich. Ich bin sicher, dass du den Modus der HW jederzeit schnell 
umschalten kannst.

Bei Kollision sind Datenverluste unvermeidbar. Das I2C Protokoll hat 
keinen Schutz dagegen. Du must da schon einen Software Layer oben drüber 
packen, der diese Kollisionen erkennt und repariert oder von vorne 
herein verhindert.

von Tobias E. (m1k3y)


Lesenswert?

> Gleichzeitig Master und Slave zu sein ist quatsch. Dann kann der Chip
> nur mit sich selbst reden. Wozu soll das gut sein?

Nicht unbedingt.

Der Punkt ist das in meiner Anwendung Kollisionen nicht nur möglich 
sondern sogar wahrscheinlich sind. Es werden potentiell bis zu 100 
Teilnehmer auf dem Bus kommunizieren.

Ich muss Sicherstellen, dass bei einer Kollision  trotzdem alle 
Teilnehmer alle Daten erhalten, da häufiger Daten als "Broadcast" 
versendet werden.

[edit]
Ich möchte mit dem doppelten System den Master vom Slave trennen. Somit 
könnte ich gleichzeitig die Daten für den Fall einer Kollision 
empfangen.

M1k3y [jetzt mit Account]

: Bearbeitet durch User
von google (Gast)


Lesenswert?

Tobias E. schrieb:
> Der Punkt ist das in meiner Anwendung Kollisionen nicht nur möglich
> sondern sogar wahrscheinlich sind. Es werden potentiell bis zu 100
> Teilnehmer auf dem Bus kommunizieren.
>
> Ich muss Sicherstellen, dass bei einer Kollision  trotzdem alle
> Teilnehmer alle Daten erhalten, da häufiger Daten als "Broadcast"
> versendet werden.

Bist Du sicher, dass Du I2C nehmen willst?

von -.-.- (Gast)


Lesenswert?

Tobias E. schrieb:
>> Gleichzeitig Master und Slave zu sein ist quatsch. Dann kann der
> Chip
>> nur mit sich selbst reden. Wozu soll das gut sein?
>
> Nicht unbedingt.
>
> Der Punkt ist das in meiner Anwendung Kollisionen nicht nur möglich
> sondern sogar wahrscheinlich sind. Es werden potentiell bis zu 100
> Teilnehmer auf dem Bus kommunizieren.
>
> Ich muss Sicherstellen, dass bei einer Kollision  trotzdem alle
> Teilnehmer alle Daten erhalten, da häufiger Daten als "Broadcast"
> versendet werden.
>
> [edit]
> Ich möchte mit dem doppelten System den Master vom Slave trennen. Somit
> könnte ich gleichzeitig die Daten für den Fall einer Kollision
> empfangen.
>
> M1k3y [jetzt mit Account]

100 Teilnehmer und jeder kann wahlfrei senden? Da ist I2C aber gar keine 
so gute Idee.
Was ich mich da gleich noch frage: Wie lang ist dein Bus?

von Oliver R. (orb)


Lesenswert?

Tobias E. schrieb:
> Es werden potentiell bis zu 100
> Teilnehmer auf dem Bus kommunizieren.
>
> [...] da häufiger Daten als "Broadcast"
> versendet werden.

I2C funktioniert anders.

von Tobias E. (m1k3y)


Lesenswert?

@google

> Bist Du sicher, dass Du I2C nehmen willst?

I²C ist der einzige Bus der alle vorraussetzungen erfüllt. Ich brauche 
keine hohen Datenraten. Aber Multimaster und die Möglichkeit zur 
Kollisionserkennung.

@-.-.-

> 100 Teilnehmer und jeder kann wahlfrei senden? Da ist I2C aber gar keine
> so gute Idee.

Die Teilnehmer senden nur bei Events. Allerdings können diese zeitlich 
sehr nah (bis zeitgleich) auftreten. Die Datenrate wird sicherlich kein 
Problem darstellen. Der Datenverlust für einen Master der bei einer 
Kollision die Arbitrierung verliert ist das einzige Problem das noch 
besteht.

> Was ich mich da gleich noch frage: Wie lang ist dein Bus?

In der Theorie mehrere Meter. Allerdings elektronisch in Abschnitte von 
<1m unterteilt. Reflektionen, Übersprechen und Buskapazität als 
Fehlerquellen sind gelöst.

von Tobias E. (m1k3y)


Lesenswert?

Oliver R. schrieb:
>> Es werden potentiell bis zu 100
>> Teilnehmer auf dem Bus kommunizieren.
>>
>> [...] da häufiger Daten als "Broadcast"
>> versendet werden.
>
> I2C funktioniert anders.

Jein. Ich benutze die General Call Adresse für einige Daten. Das 
entspricht in etwa einem broadcast.

von google (Gast)


Lesenswert?

Um mit der Forenempfehlung zu antworten: dafür nimmt man besser CAN.

Ich weiß nicht, ob das auf dem PIC geht, was Du vorhast, aber es gibt 
jede Menge PIC, die CAN eingebaut haben.

fchk oder Volker werden Dir bestimmt gleich schreiben, welche. ;-)

von Tobias E. (m1k3y)


Lesenswert?

google schrieb:
> Um mit der Forenempfehlung zu antworten: dafür nimmt man besser CAN.

Ist in meinem Fall leider keine Option. Für CAN brauche ich (nach meinem 
Kenntnissstand) einen zusätzlichen Transceiver. Meine Anwendung zielt 
aber darauf ab, dass der einzelene Node so klein, einfach und vor allem 
günstig wie möglich ist.

M1k3y

von Georg G. (df2au)


Lesenswert?

Tobias E. schrieb:
> Der Datenverlust für einen Master der bei einer
> Kollision die Arbitrierung verliert ist das einzige Problem das noch
> besteht.

Das merkt der Verlierer aber. Warum kann er dann nicht einfach seine 
Sendung wiederholen?

Aber ganz allgemein halte auch ich den I2C Bus in deinem Fall für die 
falsche Wahl.

von -.-.- (Gast)


Lesenswert?

Tobias E. schrieb:
> google schrieb:
>> Um mit der Forenempfehlung zu antworten: dafür nimmt man besser CAN.
>
> Ist in meinem Fall leider keine Option. Für CAN brauche ich (nach meinem
> Kenntnissstand) einen zusätzlichen Transceiver. Meine Anwendung zielt
> aber darauf ab, dass der einzelene Node so klein, einfach und vor allem
> günstig wie möglich ist.
>
> M1k3y

Ich kenn mich zwar mit PICs nicht aus, bin aber sicher, dass es PICs 
gibt mit komplett fertigen CAN inkl. Transceiver etc.
Da nur noch CAN_L und CAN_H anschließen und ballern.
Für deinen beschriebenen Einsatz eignet sich I2C nicht sehr gut, da ist 
CAN so viel besser!

von Tobias E. (m1k3y)


Lesenswert?

Georg G. schrieb:
> Tobias E. schrieb:
>> Der Datenverlust für einen Master der bei einer
>> Kollision die Arbitrierung verliert ist das einzige Problem das noch
>> besteht.
>
> Das merkt der Verlierer aber. Warum kann er dann nicht einfach seine
> Sendung wiederholen?

Das ist nicht der Punkt. Der Verlierer wiederholt selbstverständlich 
seine Nachricht.

Es geht darum dass der Verlierer die aktuelle Übertragung des Gewinners 
vollständig erhält.

> Aber ganz allgemein halte auch ich den I2C Bus in deinem Fall für die
> falsche Wahl.

Die alternative ist im Moment ein selbstentwickelter Bus, den ich 
basierend auf I²C gebastelt habe. Ich möchte aber wenn möglich lieber 
etwas bewährtes nehmen.

von Thomas E. (picalic)


Lesenswert?

Du kannst natürlich die Logik-Pegel an den Pins per Software einlesen, 
auch, wenn sie auf Ausgang geschaltet sind oder durch das MSSP-Modul 
kontrolliert werden. So kannst Du ggf. einen "Software-Slave" parallel 
zum MSSP mitlaufen lassen, der die Kommunikation überwacht. Auch die 
Port-Change Interrupts müssten wie erwartet funktionieren, so daß die 
Software gezielt bei einer Flanke an CLK in Aktion treten kann und nicht 
ständig pollen muss.

Wenn Dein Software-Slave allerdings auch Signale treiben können muss 
(Daten oder ACK senden), muss das Hardware-Modul dafür allerdings 
deaktiviert werden. Oder vielleicht hast Du noch zwei Portleitungen 
frei, dann könnten diese parallel zur Datenleitung angeschlossen werden. 
Dann kann das MSSP-Modul auch eingeschaltet bleiben und Du hast 
praktisch zwei unabhängige I2C-Module.

von Tobias E. (m1k3y)


Lesenswert?

Thomas E. schrieb:
> Du kannst natürlich die Logik-Pegel an den Pins per Software einlesen,
> auch, wenn sie auf Ausgang geschaltet sind oder durch das MSSP-Modul
> kontrolliert werden. So kannst Du ggf. einen "Software-Slave" parallel
> zum MSSP mitlaufen lassen [...]

Hätte ich auch selber drauf kommen können das ganze umzudrehen. Danke 
dafür.

> Wenn Dein Software-Slave allerdings auch Signale treiben können muss
> (Daten oder ACK senden) [...]

Muss er zum Glück nicht. ACKs brauch ich nicht und es werden keine READ 
Aktionen auf dem Bus durchgeführt.

Ich denke damit wäre dieses letzte Problem auch gelöst.

Allen hier danke für die schnelle und äuserst kompetente Hilfe.

M1k3y

von Peter D. (peda)


Lesenswert?

Stefan U. schrieb:
> Gleichzeitig Master und Slave zu sein ist quatsch. Dann kann der Chip
> nur mit sich selbst reden. Wozu soll das gut sein?

Kein Quatsch, nennt sich Multimaster, ist in der I2C-Spezifikation 
ausdrücklich vorgesehen.
Bei den 8051/AVR ist dafür der Status 0x68 vorgesehen:
"Arbitration lost in SLA+R/W as Master; own SLA+W has been received; ACK 
has been returned".

Es kann allerdings sein, daß dieser PIC keine vollständige 
I2C-Implementation enthält.

von Georg G. (df2au)


Lesenswert?

Tobias E. schrieb:
> Es geht darum dass der Verlierer die aktuelle Übertragung des Gewinners
> vollständig erhält.

Wo ist das Problem? Kollision wird erkannt und du schaltest auf Empfang 
um. Alles, was auf dem Bus bis zu diesem Zeitpunkt gelaufen ist, ist 
bekannt. Als kannst du nahtlos aufsetzen. Es sollte aber ein 
Soft-Empfänger sein. Das HW Modul ist dazu nicht flexibel genug (vermute 
ich).

von Stefan F. (Gast)


Lesenswert?

> Alles, was auf dem Bus bis zu diesem Zeitpunkt gelaufen ist,
> ist bekannt.

Nein. Wenn mehrere Busteilnehmer zugleich die CLK Leitung ansteuern, 
wird ihr Signal verzerrt und dadurch werden auch die Daten verfälscht.

Um einen cleveren Retry Mechanismus kommt man nicht herum.

Übrigens sind 100 Teilnehmer für normale I2C Bausteine viel zu viel. 
Doch du willst ja sogar ohne Treiber auskommen!

von Won K. (Firma: Outside the Asylum) (the_sane)


Lesenswert?

Georg G. schrieb:
> Kollision wird erkannt und du schaltest auf Empfang um.

Mit dem Auftreten der Kollision ist der Datenblock eh zerstört und muß 
neu gesendet werden. Dann kann man sich den ganzen Kram sparen und 
arbeitet mit einem vernünftigen Handshake.
Broadcasts kann man so nur nutzen, wenn man mit Datenverlusten leben 
kann.

von Peter D. (peda)


Lesenswert?

Won K. schrieb:
> Mit dem Auftreten der Kollision ist der Datenblock eh zerstört und muß
> neu gesendet werden.

Nö, nur der unterlegene Master muß erneut senden. Der gewinnende Master 
kann seinen Transfer fortsetzen. Er merkt nichtmal, daß ein 2. Master 
parallel gesendet hat.

von Peter D. (peda)


Lesenswert?

Stefan U. schrieb:
> Wenn mehrere Busteilnehmer zugleich die CLK Leitung ansteuern,
> wird ihr Signal verzerrt und dadurch werden auch die Daten verfälscht.

Auch das ist falsch. Jeder Teilnehmer darf den Clock stretchen, auch ein 
Slave. Der/die aktiven Master warten solange mit dem nächsten Bit, bis 
SCL = high ist.

von Thomas E. (picalic)


Lesenswert?

Stefan U. schrieb:
> Übrigens sind 100 Teilnehmer für normale I2C Bausteine viel zu viel.
> Doch du willst ja sogar ohne Treiber auskommen!

Wieso? Das gibt auch bloß eine Kapazität im einstelligen 
Nanofarad-Bereich, und die Eingänge sind alles Schmitt-Trigger. Er wird 
ja wohl nicht jeden Teilnehmer mit 1k Pull-Up ausstatten. Ich denke, das 
funktioniert schon...

von WehOhWeh (Gast)


Lesenswert?

Thomas E. schrieb:
> Stefan U. schrieb:
>> Übrigens sind 100 Teilnehmer für normale I2C Bausteine viel zu viel.
>> Doch du willst ja sogar ohne Treiber auskommen!
>
> Wieso? Das gibt auch bloß eine Kapazität im einstelligen
> Nanofarad-Bereich, und die Eingänge sind alles Schmitt-Trigger. Er wird
> ja wohl nicht jeden Teilnehmer mit 1k Pull-Up ausstatten. Ich denke, das
> funktioniert schon...

Ja, das denkt man. Nicht denken, rechnen sollte man. 10nF 1k sind schon 
10µs Zeitkonstante. Wie soll man da halbwegs ordentlich 100kHz 
Minimaltakt erreichen, hmm?

Der arme Master, der zusätzlich zu dem Strom aus dem 1k noch die xnF 
zeitnahe entleeren muss muss ;-)

Elektrisch klappt das nie gescheit.

Aber Abhilfe ist mögich:
http://www.nxp.com/products/interface-and-connectivity/interface-and-system-management/i2c/i2c-multiplexers-switches:MC_41851

von Heiner (Gast)


Lesenswert?

Peter D. schrieb:
> Auch das ist falsch. Jeder Teilnehmer darf den Clock stretchen, auch ein
> Slave. Der/die aktiven Master warten solange mit dem nächsten Bit, bis
> SCL = high ist.

Macht der Herr Sonnenschein mal wieder eins auf Oberklug?

lg Heiner

von Harald (Gast)


Lesenswert?

Die Aufgabe ist doch geradezu prädestiniert für den LPC11C24 mit 
integriertem CAN-Transceiver. Der kostet unter 2€, mit dem Transceiver 
auf Basis des TJF1051 kann der ca. 100 Teilnehmer - wobei die Anzahl von 
CAN Nodes schon grenzwertig ist. Wenn man es vernünftig aufbauen möchte 
nimmt man einen Master mit 2 CANs und teilt dann auf.
Der I2C ist selbst mit der bei einer angenommenen Stecke von 30..50cm 
zwischen den Nodes absolut fehl am Platz, ganz zu schweigen von der zu 
treibenden kapazitiven Last. Weiterhin die nicht symmetrische 
Übertragung von Clock und Data auf dieser Strecke. Und dann noch die 
geplante Master/Slave Konzeption führen die Idee I2C ad absurdum.

Mag sein, dass man es "irgendwie" mit I2C lauffähig bekommt. Eine 
"vernünftige" Elektronikentwicklung ist das aber nicht.

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.