- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 18

Thema: delay-Ersatz ohne loop-Bremse

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    146

    delay-Ersatz ohne loop-Bremse

    Hallo zusammen.

    ( Dieses Bsp ist nur ein Teilschritte zur späteren Tastenentprellung (mehrerer Tasten über Interrupt) ohne delay(),
    daher bitte NUR schrittweise (Konzept)Hinweise, und KEINE fertigen Lösunge, sonst lerne ich das nie... )

    1. Primär geht es mir darum, Zeitberechnungen in eine Funktion auszulagern, ohne den loop() mit delay() etc. zu Bremsen!
    2. Mehrer parallele Zeitberechnungen möglich.
    3. Möglichst nur eine Zeitberechnungs-Funktion für alle Anwendungen, auf die Jeder, zu jeder Zeit zugreifen kann.

    Bsp:
    loop(){
    //kein delay()
    //kein while()
    ...macht irgend etwas
    Start: LED1, ein, für 20ms, danach aus für 1000ms
    ...macht irgend etwas
    Start: LED2, ein, für 100ms, danach aus für 100ms
    ...macht irgend etwas
    }
    Alle loop()-Schritte sind unabhängig voneinander.
    Eine Funktion(), Bsp.Ausg() als "EierLegendeWollMilchSau". Problem ist hierbei, dass ich nur eine "volatile long msStart=0;" zur Verfügung habe.


    Mein (falscher) Ansatz, ohne delay();
    HTML-Code:
    void loop() {
    ...
    Ausg(LED1Pin, 1, 20);
    ...
    Ausg(LED1Pin, 0, 1000);
    ...
    Ausg(LED2Pin, 1, 100);
    ...
    Ausg(LED2Pin, 0, 100);
    ...
    }
    
    void Ausg(int Pin, int OnOff, long Dauer)  {  // Dauer=0...dauerhaft, ohne Zeitlimit
      if(Dauer != 0)  {
        if(msStart == 0)  {
          msStart = millis();
        }
        if(millis() <= msStart + Dauer) {
          digitalWrite(Pin, OnOff); 
        }
        else  {
          digitalWrite(Pin, !OnOff);
          msStart = 0;
        }
      }
      else  {
        digitalWrite(Pin, OnOff);
      }
    }
    PS: Besser kann ich meine Gedanken gerade nicht formulieren. Daher bitte Fragen, wenn euch irgend eine Info fehlt.

    - - - Aktualisiert - - -

    PS:
    Für jeden Ein/Ausgang eine eigene Funktion?
    ... mit eigenem Zähler?
    ... und eigener volatile long Variablen?
    Sollte das eine gute Lösung sein?
    Statt dessen würde ich gerne alles in kleine und kleinste Funktionsblöcke unterteilen.
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    898
    Beispiel:
    PortBit // Parameter (Bitnummer)
    OffTime // Parameter (in millis)
    OnTime // Parameter (in millis)
    InitialState // Parameter (On/Off)
    *Callback // Parameter (ggf. aufzurufender Funktionszeiger, wenn mehr als der Port getoggelt werden soll)
    State //Puffer (aktuell On/Off)
    Start //Puffer (letzter Flankenwechsel-millis)

    So etwas kannst Du Dir als Strukturtyp definieren und für jeden Ausgang instanziieren. Die Parameter definiert (setzt) man beim Applikationsstart einmalig. Die Puffervariablen werden im loop-Durchlauf gebraucht.

    Anstelle der einzelnen Infos steckt man dann einfach einen Zeiger auf die Strukturinstanz in die Ausg(…)-Funktion.

    In C++ geht's komfortabler mit Klassen (wobei ich nicht glaube, dass Du die Objektorientierung schneller verstehst als Strukturen).
    Geändert von Holomino (07.04.2020 um 15:06 Uhr)

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    146
    Danke erst einmal für Rü

    Zitat Zitat von Holomino Beitrag anzeigen
    Beispiel:
    In C++ geht's komfortabler mit Klassen (wobei ich nicht glaube, dass Du die Objektorientierung schneller verstehst als Strukturen).
    Tatsächlich gehts mir um universelle Funktionen, vorallem aber Einfachheit. Damit ich die nach 1/2 Nichtstun schnell rein komme.

    Zitat Zitat von Holomino Beitrag anzeigen
    Beispiel:
    So etwas kannst Du Dir als Strukturtyp definieren und für jeden Ausgang instanziieren. Die Parameter definiert (setzt) man beim Applikationsstart einmalig. Die Puffervariablen werden im loop-Durchlauf gebraucht.
    Klingt erst einmal kompliziert!
    Wenn das dennoch ein einfacher Weg ist, werde mich mit dem Thema "Struktur" und "Funktionszeiger" beschäftigen.
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    898
    Sieh es einmal so:
    Was Du gelernt hast, hast Du im Sack.
    Programmiersprachenentwickler bauen keine Features, um etwas zu verkomplizieren, sondern um es zu vereinfachen, d.h. nach jeder neu gelernten syntaktischen Feinheit geht es Dir besser, weil Du Sachen im Code einfacher, schneller, kürzer und damit auch verständlicher ausdrücken kannst.


    (P.S.: Natürlich hauen Programmiersprachenentwickler auch manchmal daneben, aber nach knapp 50 Jahren kannst Du davon ausgehen, dass das Konstrukt "Struktur" ausgereift ist.
    C++ ist syntaktisch nicht komplizierter, aber umfangreicher)
    Geändert von Holomino (07.04.2020 um 16:14 Uhr)

  5. #5
    HaWe
    Gast
    am einfachsten könnte man dazu mit elapsedMillis() beginnen:
    https://playground.arduino.cc/Code/ElapsedMillis/
    https://github.com/pfeerick/elapsedM...ive/master.zip



    Code:
    /*  
      Simple demo of using all the timing helpers elapsedMillis makes available.
    
      Either attach LEDs with series resistors to the indicated pins, or a
      six led / six bit 'Chartreuse' module plugged into pins 8 through GND. 
      
      Wired up in order, the leds have a nice walking/counting effect.
      
      This example code is in the public domain.
    */
    
    #include <elapsedMillis.h>
    
    //declare these global if you don't want them reset every time loop runs
    elapsedMicros LED1micro;
    elapsedMicros LED2micro;
    elapsedMillis LED3millis;
    elapsedMillis LED4millis;
    elapsedSeconds LED5seconds;
    elapsedSeconds LED6seconds;
    
    const int LED1 = 8;
    const int LED2 = 9;
    const int LED3 = 10;
    const int LED4 = 11;
    const int LED5 = 12;
    const int LED6 = 13;
    
    // delay between blinks of the LED
    unsigned long LED1_Interval = 62500;
    unsigned long LED2_Interval = 125000;
    unsigned int LED3_Interval = 250;
    unsigned int LED4_Interval = 500;
    unsigned int LED5_Interval = 1;
    unsigned int LED6_Interval = 2;
    
    void setup()
    {
      // initialize the LED pins as outputs
      pinMode(LED1, OUTPUT);
      pinMode(LED2, OUTPUT);
      pinMode(LED3, OUTPUT);
      pinMode(LED4, OUTPUT);
      pinMode(LED5, OUTPUT);
      pinMode(LED6, OUTPUT);
    }
    
    void loop()
    {
      if (LED1micro >= LED1_Interval)
      {
        digitalWrite(LED1, !(digitalRead(LED1))); // toggle the LED state
        LED1micro = 0;                            // reset the counter to 0 so the counting starts over...
      }
    
      if (LED2micro >= LED2_Interval)
      {
        digitalWrite(LED2, !(digitalRead(LED2))); // toggle the LED state
        LED2micro = 0;                            // reset the counter to 0 so the counting starts over...
      }
    
      if (LED3millis >= LED3_Interval)
      {
        digitalWrite(LED3, !(digitalRead(LED3))); // toggle the LED state
        LED3millis = 0;                           // reset the counter to 0 so the counting starts over...
      }
    
      if (LED4millis >= LED4_Interval)
      {
        digitalWrite(LED4, !(digitalRead(LED4))); // toggle the LED state
        LED4millis = 0;                           // reset the counter to 0 so the counting starts over...
      }
    
      if (LED5seconds >= LED5_Interval)
      {
        digitalWrite(LED5, !(digitalRead(LED5))); // toggle the LED state
        LED5seconds = 0;                          // reset the counter to 0 so the counting starts over...
      }
    
      if (LED6seconds >= LED6_Interval)
      {
        digitalWrite(LED6, !(digitalRead(LED6))); // toggle the LED state
        LED6seconds = 0;                          // reset the counter to 0 so the counting starts over...
      }
    }

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    55
    Beiträge
    2.208
    Viel einfacher: das mitgelieferte Beispielprogramm "blinkWithoutDelay" ansehen und verstehen-das enthält alles, was man braucht.
    Keine Extra-Lib's, keine Zaubertricks.
    Auf diesem einfachen Beispiel basieren meine Timer, die ich in letzter Zeit ja schon einige Male erwähnt hatte..und die funktionieren prächtig, wenn man sie richtig einsetzt.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    146
    struktur in c
    Weitestgehend Verstanden!
    Macht bei großen, zusammenhängenden Datenvariablen (Bsp: Adressbuch) Sinn.

    Aber was hat das mit meinem Bsp. "parallele Zeitberechnungen" zu tun?
    Sind da nicht eher static-Variablen und Referenzen (&Variable) gefragt?
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

Ähnliche Themen

  1. Servo-Dauerlauf ohne delay();
    Von KoQ im Forum Arduino -Plattform
    Antworten: 11
    Letzter Beitrag: 06.08.2013, 00:17
  2. Loop unterbrechen
    Von bomberman_z im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 02.11.2008, 22:29
  3. Zeiten ohne Delay
    Von Spongebob85 im Forum C - Programmierung (GCC u.a.)
    Antworten: 21
    Letzter Beitrag: 22.10.2007, 01:22
  4. [Frage?] die Delay TIme nicht stimmt mit <util/delay.h>
    Von PaMan im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 03.08.2007, 16:57
  5. Do Loop
    Von christian87 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 28.01.2005, 12:32

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests