Moin zusammen !
Der absolute Arduino-Newbie macht sich grade nen Kopf über die Programmstruktur seines 1. (Arduino-) Programms.
Es soll eine (später zu erweiternde) "semi-intelligente" Schrittmotor-Steuerung werden.
Zunächst soll diese von einem PC via USB/COM mit elemntaren Daten gefüttert werden.
Da fangen meine Probs schon an ....
Ein Steuer-Kommando soll in etwa so aussehen:
- Steuer-/Initalisierungszeichen
- Befehlsnummer (danach wertet der Arduino aus)
- Nr. in Array (0 oder 1 bis 255)
- ca. 6 "Daten-Bytes" (ges. ein Array)
- Checksumme des Kommandos
In Summe also 10 Byte. Nicht weltbewegend riesig ....
Wenn ich das bisher durch eifiges Lesen richtig verstanden habe, ist der serielle Puffer lediglich 64 Byte groß.
Frage 1)
Was passiert denn, wenn der voll ist ?
Werden weitere Bytes einfach ignoriert oder werden die ersten Bytes gelöscht und neue hinen dran gehängt ?
Weil:
Neben gelegentlich (hoffentlich) zeitunkritisch geschickten Kommandos soll auch mal eine ganze Reihe von Kommandos am Stück geschickt werden.
Das wäre z.B. der Fall, wenn ich eine Steuersequenz abschicke. D.h., der Arduino bekommt eine Latte von Daten (ein ganzes Array), welche er dann selbsttätig ausführen soll - sprich der Motor bekommt einen ganzen Befehlssatz, wie oft er sich wann in welche richtung wie lange und wie schnell zu bewegen hat.
Das können mal max. 5 Kommandos sein (50 Byte, passt ja noch) oder auch 100 oder mehr. (> 500 Byte).
Auf PC-Basis habe ich da kein Probleme - mache ich für jeden KrimsKrams nen neuen Thread auf und alles läuft (quasi) parallel ohne Zeitprobleme.
Frage 2)
Um beim seriellem Empfang Datenverlust vorzubeugen müsste ich doch eine Lese- und Auswerteroutine schon als Interrupt ausführen ?
Was passiert denn dann mit der Auführung des restlichen Programms, wenn z.B. grade eine Schleife abläuft, welche das Sequenz-Array abarbeitet und darin wiederum eine Schleife läuft, welche den Motor mit Impulsen füttert ?
Was hat Vorrang ? Die Interrupt-Routine ? Gibts so was wie ne "Zeitscheibe" ala PC ?
Fängt der Motor ggf. an zu stottern ?
Nächste Quizfrage 3)
Kommt ein Interrupt auf der Seriellen bei jedem Zeichen ? Also bei einem Kommando (s.o.) 10x ?
Dann könnte ich mir ja ohne explizit nachzufragen die Anzahl der Bytes im Puffer in einer globalen VAR merken und fortlaufen BTW prüfen. Dito die Zeit seit wann das letzte Zeichen gekommen ist und selbst entscheiden "jetzt wird's Zeit, den Puffer abzufragen !"
D.h. in einer "Langsamfahrzeit" des Motors, wo kurze Störungen nicht stören oder wenn der Motor Pause hat ?!
Quizfrage 4)
Kann ich selbst so etwas wie einen eigen definierten Interrupt auslösen ?
Sprich aus einer Routine eine andere aufrufen, welche dann wie bei Seriell in einer Art Zeitscheibe abläuft und die rufende Routine nicht blockiert ?
Ich denke da an so etwas wie "PostMessage" unter Windows. (SendMessage wartet auf Rückkehr !)
Meine Abfrage stelle ich mir dann in der Art vor, wenn der Empfangspuffer >= 10 Zeichen hat:
(es wird in globales Array kopiert)
- Steuer-/Initalisierungszeichen ? (NEIN: solange weiterlesen, bis ... 1 oder mehr Kommando's nicht angekommen ! Rückfrage beim PC !)
- Befehlsnummer lesen
- Nr. in Array lesen (und dort auch eintragen)
- 6 Daten-Bytes lesen
- Checksumme prüfen (Kommando korrekt gelesen ? Falls nicht -> Rückfrage beim PC !)
Sofern der Motor sich noch in einer Steuersequenz befindet, wird diese logo erst mal abgearbeitet.
Gibt es zwischenzeitlich eine neue, wird damit "nahtlos" fortgesetzt.
Natürlich kann es Einzelbefehle wie EMERGENCY-STOP, GOTO-ZERO, RECALIBRATE uvm. an Kommandos geben.
Das ALLERWICHTIGSTE an diesem Programm / Steuerung ist, das ALLE Kommandos einwandfrei richtig "verstanden" werden MÜSSEN und keines fehlen darf !
Da auf der mechanischen Seite sehr kraftvolle Stepper arbeiten und es nur einen mechanisch begrenzten Weg gibt, könnte das fatale Folgen haben !
.... logo kommen Not- und Endschalter zum Einsatz, die der Arduino selber im Auge behalten muss.
Aber auch schon fehlende oder falsche Steuerkommandos im Sequenz-Array könnten den Stepper zu einen unbeabsichtigten Fahrweg veranlassen, was nicht passieren darf.
Ich würde mich sehr freuen, wenn die Wissenden hier auf meine Fragen antworten / dazu Stellung nehmen.
Logo ist jede weiterhelfende Antwort sehr willkommen.
Fast vergessen: Ich hab mir einen Arduino Mega2560 bestellt. Ist leider heute immer joch nicht angekommen