Hallo Leute, ich habe ein Problem und mir fällt gerade keine elegante Möglichkeit ein, dass zu lösen. Ich habe zwei verschachtelte For-Schleifen um x und y Verschiebung eines Messtisches zu ermöglichen. Das wird genutzt, um ein Raster zu vermessen. Jetzt würde ich gerne die Möglichkeit haben, diese Messung zu pausieren und später dort weiter zu machen. Auch soll vorgesehen werden, die Messung abbrechen zu können. Die Steuerung erfolgt über CAN. Das Einlsen der Botschaft per Interrupt. Das Decodieren der CAN Matrix und somit die Auswertung des Befehls aber außerhalb des Interrupts. Daher bräuchte ich sowas wie einen Interrupt für meine verschachtelten For-Schleifen. Kriege ich einen Interrupt durch die Can Botschaft, soll wenn die Botschaft komplett ist, in die Auswertung der Botschaft gesprungen werden und danach zurück in die aktuelle Position der For-Schleife, um ggf. dort mit dem ausgewerteten Kommando was tun zu können. Wie kann man sowas lösen? Mir fällt jetzt nur ein, die aktuellen Positionen der For-Schleifen zu speichern, komplett die Schleifen zu verlassen. Die Auswertung zu machen und die Schleifen neu zu starten mit den zuletzt gespeicherten Werten. Dabei muss ich dann aber wieder Sonderfälle für die Initialisierung des Messequipment berücksichtigen, weshalb das erstmal nicht so schön wäre. Gruß und Danke, Sebastian
Möglichkeit 1: Bau dir einen eigenen Interrupt Möglichkeit 2: Nutze ein RTOS Möglichkeit 3: fällt vielleicht jemand anderes ein
Möglichkeit 3: Benutze keine verschachtelte For-Schleifen.
1 | move to start position |
2 | loop: |
3 | check CAN signals |
4 | if CAN says stop: |
5 | save current position |
6 | exit loop |
7 | |
8 | measure at current postion |
9 | |
10 | step x |
11 | if x is at end: |
12 | move x to start pos |
13 | step y |
14 | if y is at end: |
15 | exit loop |
Sebastian schrieb: > Daher > bräuchte ich sowas wie einen Interrupt für meine verschachtelten > For-Schleifen. Kriege ich einen Interrupt durch die Can Botschaft, soll > wenn die Botschaft komplett ist, in die Auswertung der Botschaft > gesprungen werden und danach zurück in die aktuelle Position der > For-Schleife, Das kann man doch durch polling innerhalb der inneren Schleife machen. Oder ist das zu lahm?
Sebastian schrieb: > Dabei muss ich dann aber wieder > Sonderfälle für die Initialisierung des Messequipment berücksichtigen, > weshalb das erstmal nicht so schön wäre. Statemachine
Sebastian schrieb: > Daher > bräuchte ich sowas wie einen Interrupt für meine verschachtelten > For-Schleifen. Nein. Du musst nur programmieren lernen. Deine Programm-Huptschleife, nennen wir sie loop, zählt einfach in 2 Dimensionen:
1 | loop() |
2 | {
|
3 | // mache was auf Zelle x,y
|
4 | x++; if(x>maxx) { x=0; y++; if(y>maxy) y=0; |
5 | // bearbeite ev. Neupositionierung die per CAN reinkam
|
6 | }
|
Man schreibt die Schleife nicht als Schleife, sondern als Funktion, die je Aufruf nur eine Iteration macht. Die Variablen definiert man static, somit bleiben sie erhalten. Über Argumente bestimmt man, ob sie fortsetzen soll oder neu starten. Nun ruft man diese Funktion im Wechsel mit der CAN-Funktion in der Mainloop auf.
Man setzt in der unteren Ebene der verschachtelten FORs einfach einen checkForInterruptDataAndProcessIt(); ein
Was soll denn am Ende der for-Schleife passieren, wenn sie ohne Interrupt durchlaufen sein sollte? Ist das folglich überhaupt das richtige Mittel der Wahl oder braucht man nicht eine ganz andere Umsetzung?
Man könnte die Berechnungen in einem niederprioren Interrupt ausführen und das Flag für Aktivieren dieses Interrupts wahlweise manchmal ausschalten.
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.