Go Down

Topic: Habe vergessen wie man "Unterprogramme" macht (Read 1 time) previous topic - next topic

8bit

Hallo,
so würde ich das machen - im Prinzip. Habs nicht getestet, im Groben müsste es aber funktionieren...
Eine Funktion fürs gehen,
eine Funktion fürs drehen,
und eine Funktion mit dem gehen / drehen Ablauf fürs komplette Rechteck, die dann aufgerufen wird.

Beste Grüße!

Code: [Select]


int motorPinLinks = 9;   
int motorPinRechts = 8; 


void setup()  {
  digitalWrite(motorPinLinks, LOW);
  digitalWrite(motorPinRechts, LOW);
}

void loop()  {
  rechteckGehen();
  delay (1000);
}

// Funktion - damit sich beide Räder drehen mit der Variable dauer für die Fahrtzeit
void gehen(int dauer){
  digitalWrite(motorPinLinks, HIGH);
  digitalWrite(motorPinRechts, HIGH);     
  delay(dauer);
  digitalWrite(motorPinLinks, LOW);
  digitalWrite(motorPinRechts, LOW);
}
// Funktion - damit sich nur das linke Rad dreht mit der Variable dauer für die Drehzeit
void drehen(int dauer){
  digitalWrite(motorPinLinks, HIGH);
  delay(dauer);
  digitalWrite(motorPinLinks, LOW);
}
// Funktion für das Rechteck
void rechteckGehen(){
  // Schleife, um den Ablau drinnen 4 mal auszuführen
  for(int i = 1 ; i <= 4; i++) {
    gehen(1000);
    delay(10); // 10 Millisekunden warten zwischen gehen und drehen
    drehen(100);   
    delay(10); // 10 Millisekunden warten zwischen gehen und drehen
  }
}




michael_x

Ja klar geht das so, im Prinzip.

Wenn dir klar ist dass kein Rechteck rauskommt, weil Drehen nicht unbedingt 90 Grad sind. ( Ist ja nur ein Pseudo-Beispiel )
Und dass der Code in deinem Beispiel für 4,4 sec nicht unterbrechbar ist, bis das Rechteck fertig gefahren ist.

Eine Erweiterung um einen Taster oder eine gleichzeitig blinkende LED wird schwierig, bei diesem Ansatz.

8bit

Hallo michael_x,
ich weiss nicht wie umfangreich Haukes Programmierfähigkeiten sind, ich persönlich war mit den vorherigen Hilfen etwas überfordert.
Deswegen hab ich meinen einfachen Vorschlag eingebracht. Dass mein Code in dieser Form nicht unterbrechbar ist, ist mir bewusst, ich verstehe allerdings leider nicht warum die vorher genannten Beispiele unterbrechbar sind. Eine kleine Hilfe (gerne Stichpunktartig) wäre großartig, damit ich da programmiertechnisch dazulerne. Ich arbeite mich gerade etwas in die MsTimer2 Libraray ein, mit der ja, wenn ich das richtig verstehe, parallele Prozesse möglich sind ... Beste Grüße!

vieledinge


michael_x ich sehe das nicht so; eine Funkton muß nicht sofort fertig sein.
Eine Funktion ist eine Gruppierung von Funktionen und Anweisungen und Kontrollstrukturen die zusammengefaßt werden weil sie öfters gebraucht werden oder zB im Falle einer Bibliothek die Handhabung bestimmter Hardware oder Funktionalitäten vereinfachen.


Ack. Ob Du den Code am Stück runtercodest oder in Functions strukturierst, macht erst mal keinen Unterschied. Auch der Code in Functions wird erst mal Step-by-Step ausgeführt und am Schluß erst die Kontrolle an die aufrufende Stelle zurückgegeben.

vieledinge


Dass mein Code in dieser Form nicht unterbrechbar ist, ist mir bewusst, ich verstehe allerdings leider nicht warum die vorher genannten Beispiele unterbrechbar sind. Eine kleine Hilfe (gerne Stichpunktartig) wäre großartig, damit ich da programmiertechnisch dazulerne. Ich arbeite mich gerade etwas in die MsTimer2 Libraray ein, mit der ja, wenn ich das richtig verstehe, parallele Prozesse möglich sind ... Beste Grüße!


Definiere mal unterbrechbar.

Man muss dabei immer bedenken, auch welcher Zielplattform wir uns hier bewegen: Microcontroller. Echtes Multitasking ist da (noch) nicht.

Aus meiner Sicht wird Dein Code aus loop() immer unterbrochen, wenn eine Interruptroutine aufgrund eine ausgelösten Interrupts gerufen wird. Dabei ist es auch egal, ob der Code in eine Function ausgelagert wurde oder nicht.

Was Deine parallelen Prozesse angeht: Ich kenne die MsTimer2-Lib nicht, vermute aber mal, das das nur quasiparallel ist. Bestimmte Funktionen werden an einen Timer gebunden, der dann zur Auslösung den Code aus loop() unterbricht.

Go Up