Forum: Mikrocontroller und Digitale Elektronik UART Datenaustausch im Hintergrund bei Arduino DUE


von Mike Litoris (Gast)


Lesenswert?

Hi!

Kurz zu meinem Setup:

Ich habe zwei Arduino DUE, die über UART miteinander verbunden sind.
Auf beiden DUE läuft eine recht zeitkritische Regelungsaufgabe 
(Positionsregelung eines Objektes) und ziemlich die selbe Software. Die 
Loop wird von der DUE Timer lib mit 200-400Hz  wiederholt (natürlich 
immer gleiche Frequenz!), und hat eine Laufzeit von ca. 1ms.

In der Loop passiert folgendes: Es werden diverse Sensoren ausgelesen, 
bisschen was gerechnet und anschließend die neue Stellgröße über CAN 
ausgegeben. Manchmal werden noch Daten über UART rausgeschaufelt, aber 
das dauert dank Puffer auch nicht lange.
Alles was für die Regelung driekt nötig ist, findet uf einem Controller 
statt.

Jetzt muss ich aber noch Daten wie Temperaturwerte, Ströme, etc. 
bidirektional zwischen den beiden Controllern übertragen können. Daten 
insgesamt max. 100byte je Zyklus. Wichtig ist hierfür, dass die 
Ausführung der Regelschleife nicht unterbrochen wird und das ganze "im 
Hintergrund" passiert.

Es wird auch nicht funktionieren, dass der Master die Daten beim Slave 
anfragt, da die beiden Loops nicht synchron laufen und beide Controller 
deshalb zu unterschiedlichen Zeiten beschäftigt sind.

Wie würdet ihr das lösen? Ist DMA die richtige Lösung? Wenn ich das 
richtig verstanden habe, kann ich damit direkt von einem µC auf den 
Speicher des anderen zugreifen?

Viele Grüße und Danke,
Mike

von Einer K. (Gast)


Lesenswert?

Mike Litoris schrieb:
> Wenn ich das
> richtig verstanden habe, kann ich damit direkt von einem µC auf den
> Speicher des anderen zugreifen?

Da ist wohl der Wunsch, die Mutter der Wahrnehmung.

Tipp:
Einfach nochmal das Kapitel zum DMA aufmerksam lesen.

von Horst (Gast)


Lesenswert?

Wenn das ganze zeitkritisch ist, solltest Du Dich vom Arduinoframework 
trennen und alles selber schreiben. Nur dann kannst Du wirklich sagen, 
was noch im Hintergrund passiert und hast selbst die Kontrolle über Alle 
Timer und die Interupts.
Dann hast Du warscheinlich nebenbei reichlich Zeit die Daten hin und her 
zu schieben.

von Wolfgang (Gast)


Lesenswert?

Horst schrieb:
> Dann hast Du warscheinlich nebenbei reichlich Zeit die Daten hin und her
> zu schieben.

Falls die Regelung direkt an der Ardino-Loop hängt, also mit 200..400Hz 
läuft und nicht durch einen eigenen Timer angestoßen wird, langweilt 
sich bei (max.) 100 Byte pro Zyklus die serielle Schnittstelle nicht so 
richtig - das wäre eine Mindestbaudrate von 200 .. 400 kBd bei 
Dauerfeuer auf der Schnittstelle oder alle 25..50µs ein Zeichen.
Da würde ich noch mal über das Konzept nachdenken.

von Falk B. (falk)


Lesenswert?

@Mike Litoris (Gast)

>Loop wird von der DUE Timer lib mit 200-400Hz  wiederholt (natürlich
>immer gleiche Frequenz!), und hat eine Laufzeit von ca. 1ms.

Easy.

>Jetzt muss ich aber noch Daten wie Temperaturwerte, Ströme, etc.
>bidirektional zwischen den beiden Controllern übertragen können. Daten
>insgesamt max. 100byte je Zyklus. Wichtig ist hierfür, dass die
>Ausführung der Regelschleife nicht unterbrochen wird und das ganze "im
>Hintergrund" passiert.

Siehe Multitasking. GGf. braucht man noch ein FIFO in Software.

>Wie würdet ihr das lösen? Ist DMA die richtige Lösung?

Kann man machen, geht aber auch ohne.

> Wenn ich das
>richtig verstanden habe, kann ich damit direkt von einem µC auf den
>Speicher des anderen zugreifen?

Nein, siehe DMA.

von Mike Litoris (Gast)


Lesenswert?

Hi!

danke schon einmal für die vielen Antworten!

Wolfgang schrieb:
> Falls die Regelung direkt an der Ardino-Loop hängt, also mit 200..400Hz
> läuft und nicht durch einen eigenen Timer angestoßen wird, langweilt
> sich bei (max.) 100 Byte pro Zyklus die serielle Schnittstelle nicht so
> richtig - das wäre eine Mindestbaudrate von 200 .. 400 kBd bei
> Dauerfeuer auf der Schnittstelle oder alle 25..50µs ein Zeichen.
> Da würde ich noch mal über das Konzept nachdenken.

Oops. Habe vergessen zu erwähnen, dass die Seriellen Daten nur mit ca. 
40Hz gesendet werden müssen. Also eher so 40kbaud @ 100% Auslastung. Das 
sollte wirklich machbar sein.

Anscheinend ist also das DMA nicht so wirklich das richtige.

Der Arduino hat ja 128Byte Puffer für RX und TX.
Wenn ich jetzt in jedem Zyklus im Master den TX Buffer fülle, finde ich 
das ja kurz später im RX Buffer des Slaves und kann es dann wenn ich 
Zeit habe bearbeiten, richtig?

Das klingt eigentlich genau nach dem, was ich brauche. Überlaufen, etc. 
muss man halt verhindern.

Grüße,
Mike

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.