INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
auslagern von Funktion aus der void loop?
22.06.2015, 18:52 (Dieser Beitrag wurde zuletzt bearbeitet: 22.06.2015 18:55 von HaWe.)
Beitrag #17
RE: auslagern von Funktion aus der void loop?
dann hast du 3 Möglichkeiten:
1.) Versuch es ganz ohne Multlitasking
2.) Quäl dich mit halbherzigen Lösungen herum
3.) Kauf dir nen Due und du gewinnst Zeit und du hast dafür einen schnelleren Erfolg.

zu 3.: behalt die Megas für einfache Steuerungen oder Multiplexer-Erweiterungen - oder verklopp sie (wenigstens teilweise) bei Ebay. Anspruchsvollere Anwendungen brauchen einfach Multitasking. Genau deshalb haben sie die ARMs auch von Haus aus, und seit 2011 sind sie sogar allgemeiner Standard in C (allerdings noch nicht so vollständig in Arduino-Sketch-C).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.06.2015, 19:00
Beitrag #18
RE: auslagern von Funktion aus der void loop?
naja.... ich will ja eigentlich nur ein paar Lampen/LEDs steuern.... dann versuche ich mal Variante 1 und versuche das ganze mal mit Sinn und Verstand zu machen.... und dafür habt ihr mich ja schon mal ein ganzes Stück weiter gebracht.... :-D
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.06.2015, 19:38
Beitrag #19
RE: auslagern von Funktion aus der void loop?
Hi,

lass Dich nicht verrückt machen. Wenn man's mal verstanden hat, dann geht "Multitasking" per Arduino ganz einfach. Man muss nur das "delay-Denken" auf den Kopf stellen.

Ein Prinzip hast Du ja schon gezeigt. Man ruft eine Funktion immer wieder auf, die je nach abgelaufener Zeit irgendwas macht. Dein Sinus-Blinken könntest Du z.B. in eine eigene Funktion packen, die dann von loop aus immer wieder aufgerufen wird. Wenn Du jetzt noch so etwas ähnliches machen würdest, z.B. mit einer Sägezahn-Funktion, dann könntest Du beide Funktionen immer wieder aus loop heraus aufrufen. Das würde dann so aussehen, als ob beide Prozesse gleichzeitig nebeneinander ablaufen.

Wenn man jetzt andere Geschichten machen will, wie z.B. Ein- und Ausfaden und dabei noch auf irgendwelche Eingänge achten, dann geht das so:
Schreibe für jeden Ablauf eine eigene Funktion. Diese Funktion merkt sich (z.B. mit static Variablen) den momentanen Zustand und die Zeit, wann dieser Zustand eingetreten ist. (Bei "Blink" wäre der Zustand, ob die LED gerade an oder aus ist. Die "letzte" Zeit wäre die Zeit, als die LED das letzte Mal an- bzw. ausgeschaltet wurde.)
Jedesmal, wenn die Funktion aufgerufen wird, prüft sie (mit millis()), ob schon genug Zeit vergangen ist. Wenn ja, dann in den nächsten Zustand wechseln und die "Wechselzeit" auf "jetzt" setzen.
Solche Funktionen kann man einige in einen Sketch packen. Bis halt der Programmspeicher voll ist oder die ganzen static-Variablen einen das SRAM sprengen.
Alle diese Funktionen ruft man dann einfach hintereinander in loop auf. Das war's.

Im Prinzip kann man damit alles "parallelisieren". Man muss nur dafür sorgen, dass die Funktionen schnell genug fertig sind. Also niemals ein delay einbauen.

Eine "fade"-Funktion würde dann z.B. so aussehen:
Code:
void fadeTo(byte target, int speed) { // Speed: je groesser desto langsam
   static byte zustand = 0;
   static unsigned long last = 0;  
   unsigned long now = millis();

   if(now - last < speed)  return;  // noch nicht
   last = now;   // wir tun _jetzt_ etwas
   if(target < zustand) {
     zustand--;
   } else if(target > zustand) {
     zustand++;
   }
   analogWrite(ledPin, zustand);    
}
Das Teil würde man dann so aufrufen:
Code:
fadeTo(35,50);
...und zwar immer wieder. Das würde dann dafür sorgen, dass die LED (oder was auch immer) auf den Wert 35 zufährt, und zwar mit einem Schritt alle 50ms. Voraussetzung ist nur, dass die Funktion mindestens alle 50ms aufgerufen wird.
Wenn der Zustand beim "Soll" angekommen ist, dann wird natürlich weiterhin alle 50ms ein analogRead abgesetzt, aber das könnte man auch noch abstellen, wenn gewünscht.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.06.2015, 20:38
Beitrag #20
RE: auslagern von Funktion aus der void loop?
Ui, Thorsten, das ist ein Ansatz, den ich zumindest schon mal logisch nachvollziehen kann.... da setze ich mich mal ran und probiere was....

(aber erst mal muss ich die Gitarren-Taschen und den Schulranzen für meine Tochter fertig nähen... sie wird langsam ungeduldig... ;-) )
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Question Webserver, Client, Loop Marc2014 6 369 29.07.2016 21:04
Letzter Beitrag: Marc2014
  Funktion mit Parameterübergabe - u8g torsten_156 8 401 22.06.2016 18:53
Letzter Beitrag: Pit
  Funktion in Loop einmalig ausführen Haustechno 4 646 09.03.2016 22:43
Letzter Beitrag: Haustechno
  HC-05 Modul auf Funktion prüfen. arduinofan 2 365 03.02.2016 19:18
Letzter Beitrag: arduinofan
  Eine Funktion vorher definieren ? arduinofan 23 2.027 30.12.2015 08:42
Letzter Beitrag: amithlon
  Loop reset Atwist 27 1.905 10.12.2015 16:58
Letzter Beitrag: hotsystems
  Funktion/Methode mit mehr als einem Ausgangswert Marduino_UNO 18 1.266 20.10.2015 10:30
Letzter Beitrag: Marduino_UNO
  Unterprogram, loop, while Marc2014 1 808 27.08.2015 19:11
Letzter Beitrag: hotsystems
  PulseIn-Funktion unklar alpenpower 6 1.287 24.07.2015 10:05
Letzter Beitrag: Scherheinz
  AnalogRead aus Loop-Schleife auskoppeln dna5544 7 1.479 16.07.2015 12:31
Letzter Beitrag: dna5544

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste