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
@ 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
