Habe vergessen wie man "Unterprogramme" macht

Hallo ich habe vergessen wie man "Unterprogramme" macht
also z.b. man muss ein Rechteck laufen dann sagt man

  1. gehe vor
  2. dreh dich
  3. gehe vor
  4. dreh dich
  5. gehe vor
  6. dreh dich
  7. gehe vor
  8. dreh dich
    ich möchte es aber einmal am Anfang schreiben und als Rechteck deklarieren sodass
    wenn ich
  9. Rechteck
    schreibe er die schritte oben 1-8 ausführt

Sorry das das so umständlich erklärt ist, habt bitte Verständnis
MFG Hauke

Entweder als Klasse oder Funktion:

void funktion1(int paramteter1,int parameter2) {
//Mache hier etwas
}
//Oder mit Rüchgabetyp:
int addiere(int a,in b) {
return a+b;
}
//Aufgerufen wird das dann z.B. so:
funktion1(5,9);
int c = addiere(3,3)

Diese Funktionsdeklarationen müssen dann außerhalb des setup() oder loop() liegen.
Oder als Klasse:

class Rechteck {
public:
    void zeichne(int a,int b) {
    //Zeichne etwas
     }
};
//Und so wird es aufgerufen
Rechteck rechteck;
rechteck.zeichne(5,5);

Habe den Code allerdings aus dem Kopf geschrieben -> Keine Garantie für Funktion

Addi

Ein Problem / Missverständnis zwischen Addi und Hauke ist eventuell der Begriff "Programm"

Eine Funktion wie Addi sie beschrieben hat, ist sofort fertig und muss nicht wirklich unterbrochen werden, bis das Rechteck gezeichnet ist.
(Na gut, im Hintergrund laufen noch Zähler und Interrupts können erfasst werden, aber das soll hier jetzt nicht interessieren)

Ein Programm von Hauke ist eher das, was z.B. in einer Waschmaschine als Programm abläuft und nach vielleicht einer Stunde fertig ist.
Auch die einzelnen Unterprogramm-Schritte brauchen richtig Zeit.

Beim Programmieren eines Arduino hat man Addis Programm-Konzept zur Verfügung, will aber Haukes Programm realisieren.
Im ersten Ansatz ist alles ziemlich einfach, dafür gibt es delay() und while(analogRead(Temp) < Soll) { Heizen(); } und ähnliche Konstruktionen.

Mit etwas Glück kriegt man sogar ein Programm hin, das nach einer gewissen Zeit fertig ist und die gewünschte Arbeit gemacht hat. ( 1s LED an, 1s LED aus )
Die Frage ist dann, was macht ein Arduino, wenn das Programm fertig ist.
Es sollte klar sein, dass das was in loop() Programmzeile für Zeile abläuft und was man mit Addis Programmiertechnik realisiert, eigentlich auf einer ganz anderen Ebene existiert (oder zumindest sollte), als Haukes "Programm".


Tschuldigung, wenn das alles off-topic ist und Addi Haukes Frage perfekt beantwortet hat.
Ist mir nur mal so, am Beispiel von Haukes Programm-Beschreibung aufgefallen.

Ich denke Funktion ist schon das richtige hier.

Mal in Pseudocode

int y=0;  // globale definition

void setup(){
//whatever
}

void loop(){
rechteck(123);  // du kannst auch variabeln übergeben z.b. Geschwindigkeit
y=summe(1,3); // y ernthält die summe (ergebnis von der variabeln) du kannst die Funtion summe auch merhmals aufrufen
}

byte summe(int x,int y){   // mit dem byte vor der funktion definierst du das format der zurückegebenen Variabeln also auch int,long
byte ergebnis; 
ergebniss=x+y;    // zusammenrechenen der übergebenen Variabeln
return ergebnis; // damit schickst du das ergebniss zurück in die loop
}

void rechteck(int x){   // Jetzt steht in x die 123 aus dem Programm z.B. Geschwindigkeit void heisst das du nix zurückbekommst
// hier kannst du jetzt irgenwas mit x machen aber auch nur innerhalb dieser Funktion in der Loop kannst du dieses x nicht sehen sie ist hier lokal definiert
gehe vor;
dreh dich;
gehe vor;
dreh dich;
gehe vor;
dreh dich;
gehe vor;
dreh dich;
 }

Jedesmal wenn du rechteck() im Programm aufrufst unter welchen Konditionen auch immer kannst werden die Funktionen die in dem void rechteck() ausgeführt.
Hoffe nicht in die komplett falsche richtig unterwegs zu sein.
Gruß
Der Dani

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.

Grüße Uwe

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!

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
  } 
}

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.

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!

uwefed:
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.

8bit:
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.