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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Mike Litoris (Gast)


Bewertung
0 lesenswert
nicht 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 Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht 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.

: Bearbeitet durch User
von Horst (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.