Ein Arduino Due überwacht 10 Pins auf Flankenwechsel. Dies geschieht über die DueTimer.h Bibliothek per Interupt alle 50µs. Funktioniert soweit auch super.
Nun soll der Due aber gleichzeitig die Daten weiter senden. Aus den Flankenwechseln ergeben sich bestimmte Zeiten, welche übertragen werden sollen.
Die Daten sollen jede Sekunde verschickt werden.
Gesendet wird über eine Serielle Schnittstelle mit 9600 Baud.
Mein Problem:
Das senden der Daten dauert! (Laut Oszilloskop ca. 300ms)
Gibt es eine Möglichkeit diese Prozesse "quasi" parallel laufen zu lassen?
Sozusagen das Senden unterbrechen, weiter Messen usw.?
Momentan sieht es so aus, das Senden startet, nach dem ersten Buchstaben kommt der Interrupt, das Programm stoppt total und nichts pasiert mehr...
Ich bin etwas irritiert, was die Dauer der Übertragung angeht: 300 ms ist auch für 9600 Baud recht viel. Wie sieht denn dein Datenpaket aus. Kannst du uns mal deinen Code zeigen?
wie erzeugst Du das Datenpaket ? Mit vielen einzelnen Serial1.print(...) Befehlen ? Wird das schneller, wenn man das ganze Datenpaket oder zumindest die einzelnen Zeilen mit einem einzelnen sprintf erzeugt und dann den ganzen Stringbuffer am Stück mit Serial1.print ausgibt ?
Je nach dem wie Serial implementiert ist, kann die sprintf-Variante deutlich schneller sein, z.B. beim Teensy.
Übrigens erzeugt die Arduino IDE für den Due ziemlich lahmen Code, der Compiler optimiert auf Größe nicht auf Geschwindigkeit (-Os).
Wenn du nur das Wort Messwert z.b. mit MW ab kürzen würdest, könntest du jede Menge Zeichen sparen die übertragen werden müssen. Mach dein Datenpaket so klein wie möglich.
genau, scherheinz, deswegen will ich das ja genauer wissen. wenn das immer in der gleichen reihenfolge kommt, braucht er auch kein TAB, oder Pin5, dann kämen 30 int oder 30 byte, ohne krimskrams, ohne crlf oder sonstiges.
es muß für einen menschen nicht leicht lesbar sein.
Hm, Stefan, ich hatte es falsch gesehen. Das Wort Messwert wird wohl durch den eigentlichen Wert ersetzt und nicht angehängt. Das sind wohl alles nur Platzhalter
Hallo zusammen. Danke für die ganzen Antworten! Zu den Fragen:
@ArduFE
Ich erzeuge das Paket mit vielen .printf. Mit einer for schleife werden verschiedene Parameter aus einem Array ausgegeben. Die Messwerte sind dabei per tab (ASCII 9 ) voneinander getrennt, damit der Computer sie unterscheiden kann.
Der Befehl sprintf ist mir unbekannt, werde mich heute Nacht mal einlesen.
Hast du bezüglich langsamen Code noch einen Tipp für mich?
@eisebaer
Die Werte sind float Zahlen. Als solche sende ich sie auch...
Der Hinweis ist gut, mehr als zwei Nachkommastellen brauche ich nicht, also da habe ich noch Einsparpotential!
@combie
Ok, also mein Fehler war das Senden per Interrupt zu probieren?
Also den Messen Interrupt lasse ich laufen und im loop lasse ich die neuen Messwerte zyklisch raus senden?
@Scherheinz und @eisebaer
Genau, Messwert ist die Abkürzung für den jeweiligen float Wert. Sparen ließe sich aber ja durch Umwandlung in Char oder string, denn ich benötige ja nur die ersten 6 Ziffern.
@ElEspanol
Die Idee ist mir auch schon gekommen, das ist allerdings die letzte Möglichkeit die ich wahrnehmen möchte.
Danke nochmal für eure Antworten, melde mich morgen mit Ergebnissen.
Ich weiß gar nicht warum ich mir so einen Stress gemacht habe...
Läuft doch alles!
Per Interrupt aus der DueTimer.h wird nun alle 50µs gemessen.
Im loop() wird alle 1000 Millisekunden die Senderoutine aufgerufen.
Senden und Messen kommen sich nicht in die Quere.
Eigentlich hatte ich das Anfang der Woche auch schon probiert, war aber wohl zu Gehirntot um das zu schnallen.
Mit sprintf() habe ich mir einen schönen String gebastelt, in welchem die Messwerte drinne stecken.
Den gebe ich dann einfach mit print() aus.