- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
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 Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    903
    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 14:06 Uhr)

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    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 |

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    903
    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 15:14 Uhr)

  4. #4
    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...
      }
    }

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.210
    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..

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Code:
    https://www.arduino.cc/en/tutorial/BlinkWithoutDelay
    Code:
    https://forum.arduino.cc/index.php?topic=423688.0
    MfG

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Ich habe da folgende Vorgehensweise:

    Code:
    typedef unsigned int TTimeValue;   // ich nehme 16 Bit Werte für die Millisekunden Zeiten */
    
    typedef volatile struct         // in dieser Struktur werden alle Zeitwerte verwaltet
    {
      TTimeValue Led1BlinkTime;
      TTimeValue Led2BlinkTime;
      TTimeValue KeyTime;
     
      /* hier kann man beliebig erweitern */
    } TimerStruct;
    
    volatile TimerStruct Timers;   // das ist die gesamte Timerstruktur (die Instanz)
    
    //----------------------------------------------------------------
    // der 1 Millisekunden Timer Interrupt:
    // hier wird jeder Zeitwert, solange er noch nicht 0 ist, um eins erniedrigt
    
    void TIMER0_IRQHandler (void)
    { int i;
      TTimeValue *p = (TTimeValue*) &Timers;     /* initialize p to startaddress of the structure */
    
      for (i=0; i< (sizeof(Timers) / sizeof(TTimeValue)); i++)
      {
        if (*p)     /* if current addressed counter value is greater zero then */
          --*p;     /* decrement the counter value by one */
        p++;        /* p points now to the next counter value */
      }
    }
    //----------------------------------------------------------------
    // Jetzt kommen diverse Funktionen die ausgeführt werden sollen:
    
    void DoLed1(void)
    { static char BlinkPhase;
    
      if (Timers.Led1BlinkTime) return; // es gibt noch nichts zu tun, Zähler noch nicht 0
      if (BlinkPhase)
      {
    //     Led1On();
       Timers.Led1BlinkTime = 250;  // 250 ms ein
      } else 
      {
    //    Led1Off();
        Timers.Led1BlinkTime = 100;  // 100 ms aus
      }
      BlinkPhase = ! BlinkPhase;  // BlinkPhase umdrehen
    }
    
    
    void DoLed2(void)
    { static char BlinkPhase;
    
      if (Timers.Led2BlinkTime) return; // es gibt noch nichts zu tun, Zähler noch nicht 0
      if (BlinkPhase)
      {
    // Led2On();
       Timers.Led1BlinkTime = 500;  // 500 ms ein
      } else 
      {
    //  Led2Off();
        Timers.Led1BlinkTime = 250;  // 250 ms aus
      }
      BlinkPhase = ! BlinkPhase;  // BlinkPhase umdrehen
    }
    
    void DoKeys(void)
    { 
      if (Timers.KeyTime) return;  // noch nix zu tun
      Timers.KeyTime = 20;         // nächste Abfrage in 20ms
    
      //  Tastenstatus auswerten usw.....
    }
    
    void main(void)   // Hauptprogramm:
    {
      while (1)
      {
        DoLed1();
        DoLed2();
        DoKeys();
        // ....usw....
      }
    }
    aber viele Wege führen zum Ziel, da hat sicher jeder eine andere Lösung...

    Siro

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    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: 05.08.2013, 23:17
  2. Loop unterbrechen
    Von bomberman_z im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 02.11.2008, 21:29
  3. Zeiten ohne Delay
    Von Spongebob85 im Forum C - Programmierung (GCC u.a.)
    Antworten: 21
    Letzter Beitrag: 22.10.2007, 00: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, 15:57
  5. Do Loop
    Von christian87 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 28.01.2005, 11:32

Stichworte

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress