Forum: Mikrocontroller und Digitale Elektronik Konzept: Datenverlust bei potentiell paralleler Kommunikation verhindern?


von Tobias S. (x12z34)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich bin bei meinem aktuellen Projekt (einem kleinen Roboter) in der 
Konzeptionsphase auf ein Problem gestoßen, zu dem ich Eure Hilfe 
brauche:

Wie gehe ich damit um, wenn mehrere Kommunikationsformen potentiell 
gleichzeitig stattfinden können? Wie vermeide ich Datenverlust?

Schaut Euch mal die Zeichnung im Anhang an:

Ein Zentraler Master empfängt seine Anweisungen von einem PC über ein 
RF-Modul, das mit der Zentrale via UART kommuniziert.
Diese Anweisungen werden dekodiert und dementsprechend diverse Aktoren 
(Motoren, Ventile, Status-LEDs etc.) angesteuert, Sensoren eingelesen 
und Daten im Flash gespeichert bzw. daraus gelesen.
Der größte Teil der "Hardware" wird per GPIO  PWM  ADC angesteuert, 
aber es gibt eben auch ein paar ICs, die per SPI angesprochen werden 
("Lightworks", "Waterworks", "Position" und der Flash-Speicher)

Da die Zentrale bei allen SPI-Ports der Master ist, also festlegen kann, 
wann, wie häufig und in welcher Reihenfolge Daten ausgetauscht werden 
sollen, macht mir das keine Probleme. Diese Kommunikation kann der 
Master schön hintereinander ausführen...

Auch die Tatsache, dass das RF-Modul dazu asynchron läuft und evtl. 
plötzlich Daten senden will, macht nicht allzugroße Probleme: Denn das 
Modul (ERA900TRS) verfügt dankenswerterweise über eine 4-Draht-UART 
Schnittstelle mit RX/TX/CTS/RTS. Solange der Master seine CTS-Leitung 
ruhig hält, also keine Empfangsbereitschaft signalisiert, wird das 
RF-Modul nicht senden. Ist das so richtig?



Viel mehr Sorgen macht mir jedoch die separate Platine "Position": Auf 
dieser befinden sich ein Beschleunigungssensor, ein Gyroskop und ein GPS 
Modul (jaja, Overkill ;-) ), um dem Roboter genau sagen zu können, wo er 
genau ist.
Hier kommuniziert ein weiterer IC, der "Submaster", per SPI mit dem 
Gyroskop, wobei der Submaster hier der Master in dieser Beziehung ist. 
Mit dem GPS-System wird der 2-Leitungs-UART kommuniziert, wobei das GPS 
eben auch ungefragt Daten sendet. Der Submaster kommuniziert mit dem 
Zentralen Master wiederrum über SPI.

Den Submaster habe ich eingefügt, weil der 100pin Zentrale Master kaum 
mehr freie Pins hat und weil ich die Daten der Sensoren und des GPS 
vorher etwas aufbereiten will, sodass sich der zentrale Master nicht 
mehr darum kümmern muss.

Wie verhindere ich jetzt, dass es zum Datenverlust bzw. ungültiger 
Kommunikation kommt?
Beispiel 1: Der Submaster empängt gerade Daten vom Gyroskop, wenn der 
zentrale Master die genaue Position des Roboters wissen will...
Beispiel 2: Der Submaster redet gerade mit dem zentralen Master, wenn 
sich das GPS-Modul meldet und seine Daten sendet...

Klar kann ich den einen Kommunikationsversuch ignorieren, z.B. einfach 
nicht auf den UART Buffer-voll Interrupt reagieren, wenn GPS und der 
zentrale Master gleichzeitig senden. Oder ich deaktiviere die SPI 
Schnittstelle, während ich das NMEA-Protokoll vom GPS empfange... Aber 
dann gehen mir zwangsweise Daten verloren...

Die einzige Möglichkeit, die mir momentan einfällt, ist, eine 
GPIO-Leitung zusätzlich vom Submaster zum zentralen Master zu legen, mit 
der der Submaster der Zentrale signalisiert "Stör' mich grad nicht, ich 
lese meine Sensoren ein".
Das vermeidet Kollisionen bei der Kommunikation mit dem zentralen 
Master, das aber hilft mir nicht, wenn das GPS Modul ungefragt seine 
Daten sendet, wenn der Submaster gerade in einer anderen Kommunikation 
steckt...

Habt Ihr Ideen, wie ich damit umgehen kann?

Habe ich (trotz Suche) einen Thread übersehen, in dem das schon 
abgehandelt worden ist? Ein Link darauf wäre nett ;-)

Danke schonmal vorab für Euren Gehirnschmalz

von Falk B. (falk)


Lesenswert?

@ Tobias S. (x12z34)

>Wie gehe ich damit um, wenn mehrere Kommunikationsformen potentiell
>gleichzeitig stattfinden können? Wie vermeide ich Datenverlust?

Mit Puffern in Form von FIFOs.

>Auch die Tatsache, dass das RF-Modul dazu asynchron läuft und evtl.
>plötzlich Daten senden will, macht nicht allzugroße Probleme: Denn das
>Modul (ERA900TRS) verfügt dankenswerterweise über eine 4-Draht-UART
>Schnittstelle mit RX/TX/CTS/RTS. Solange der Master seine CTS-Leitung
>ruhig hält, also keine Empfangsbereitschaft signalisiert, wird das
>RF-Modul nicht senden. Ist das so richtig?

Ja. Aber auch ohne diese Leitungen geht das. Mit Interrupt und 
Multitasking.

>Hier kommuniziert ein weiterer IC, der "Submaster", per SPI mit dem
>Gyroskop, wobei der Submaster hier der Master in dieser Beziehung ist.
>Mit dem GPS-System wird der 2-Leitungs-UART kommuniziert, wobei das GPS
>eben auch ungefragt Daten sendet. Der Submaster kommuniziert mit dem
>Zentralen Master wiederrum über SPI.

Kann man machen. Kann aber auch deine Zentral mit abfrühstücken. SOOO 
viel ist das nicht. Der Aufwand für die Kommunikation Master-Submaster 
(heiß das nicht subcommander? ;-) ist fast soviel wie die 
Direktkommunikation.

>Den Submaster habe ich eingefügt, weil der 100pin Zentrale Master kaum
>mehr freie Pins hat und weil ich die Daten der Sensoren und des GPS
>vorher etwas aufbereiten will, sodass sich der zentrale Master nicht
>mehr darum kümmern muss.

Warum? Es reicht EIN weiter Pin für das Chip Select zum Gyriskop und EIN 
UART, wahrscheinlich reicht die RX-Leitung. An einem SPI können mehrere 
Slaves dranhängen, es ist ein Bus.

>Wie verhindere ich jetzt, dass es zum Datenverlust bzw. ungültiger
>Kommunikation kommt?

Siehe oben.

>Beispiel 1: Der Submaster empängt gerade Daten vom Gyroskop, wenn der
>zentrale Master die genaue Position des Roboters wissen will...

Dann unterbricht dieser seine aktuelle Abfrage und sendet den letzten, 
vollständig gespeicherten Datensatz.
Oder er beginnt erst nach der Anfrage des Masters mit dem Auslesen des 
Gyro.

>Beispiel 2: Der Submaster redet gerade mit dem zentralen Master, wenn
>sich das GPS-Modul meldet und seine Daten sendet...

Dafür gibt es Interrupts.

>zentrale Master gleichzeitig senden. Oder ich deaktiviere die SPI
>Schnittstelle, während ich das NMEA-Protokoll vom GPS empfange...

Das ist die Weichei-Methode.

> Aber
>dann gehen mir zwangsweise Daten verloren...

Eben.

>Die einzige Möglichkeit, die mir momentan einfällt, ist, eine
>GPIO-Leitung zusätzlich vom Submaster zum zentralen Master zu legen, mit
>der der Submaster der Zentrale signalisiert "Stör' mich grad nicht, ich
>lese meine Sensoren ein".

Kann man machen, ist aber nicht so toll.
Besser ist ein Befehl per SPI. "HEy, Sensordaten, aber zackig". Dann 
erst liest dieser die Daten aus. Der Master wartet ein paar ms und sagt 
dan, "Sensordaten her", worauf der Submaster diese liefert.

von Sebastian W. (wangnick)


Lesenswert?

Tobias S. schrieb:
> Wie gehe ich damit um, wenn mehrere Kommunikationsformen potentiell
> gleichzeitig stattfinden können? Wie vermeide ich Datenverlust?

Und alle Kommunikation mit CRC o.ä. absichern, und alle 
Kommunikation so aufbauen, dass Aussetzer vorkommen dürfen, z.B. durch 
zyklische Wiederholung oder so.

LG, Sebastian

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.