Offline
Jr. Member
Karma: 0
Posts: 91
|
 |
« on: January 07, 2013, 11:26:33 am » |
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 1. 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
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 3
Posts: 186
|
 |
« Reply #1 on: January 07, 2013, 11:46:59 am » |
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
|
|
|
|
« Last Edit: January 07, 2013, 11:50:30 am by Addi »
|
Logged
|
/ \ _| _| o /--\ (_| (_| |
|
|
|
|
Germany
Offline
Edison Member
Karma: 27
Posts: 1486
|
 |
« Reply #2 on: January 07, 2013, 12:39:54 pm » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
AREA COLOGNE
Offline
God Member
Karma: 12
Posts: 807
I am 1 of 10 who understands binary
|
 |
« Reply #3 on: January 07, 2013, 02:10:41 pm » |
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
|
|
|
|
|
Logged
|
Eine Glatze ist wohl die AUSGEFALLENste Frisur von allen.
|
|
|
|
Forum Moderator
BZ (I)
Offline
Brattain Member
Karma: 160
Posts: 15641
+39 349 2158303
|
 |
« Reply #4 on: January 07, 2013, 02:24:37 pm » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 6
|
 |
« Reply #5 on: January 08, 2013, 07:58:21 am » |
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 } }
|
|
|
|
|
Logged
|
|
|
|
|
Germany
Offline
Edison Member
Karma: 27
Posts: 1486
|
 |
« Reply #6 on: January 09, 2013, 04:28:00 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 6
|
 |
« Reply #7 on: January 24, 2013, 07:18:08 am » |
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!
|
|
|
|
|
Logged
|
|
|
|
|
Chemnitz/Saxony/Germany
Offline
Jr. Member
Karma: 0
Posts: 89
|
 |
« Reply #8 on: January 24, 2013, 07:31:31 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Chemnitz/Saxony/Germany
Offline
Jr. Member
Karma: 0
Posts: 89
|
 |
« Reply #9 on: January 24, 2013, 07:43:32 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
|