- SF800 Solar Speicher Tutorial         
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
    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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    903
    Zitat Zitat von frabe Beitrag anzeigen
    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?
    Die Verwendung einer Struktur hat nichts mit Größe oder Anzahl zu tun, sondern damit, die Variablen für einen Funktionsbaustein sinnvoll zusammenzuhalten und erweiterbar zu gestalten, so dass das weitermachen auch bei einem Fehlschlag oder einer neuen Anforderung noch Spaß macht! Guter Code entsteht niemals durch Zwang von Außen, sondern aus der einfachen Erkenntnis:
    Wenn es machbar ist und ein Erfolg winkt, tue ich es. Damit es machbar ist und bleibt, vermeide ich Codegräber und schreibe wartbaren Code.


    Dein Eingangsbeispiel zeigt doch schon drei Parameter auf. Mit denen funktioniert es nicht, da fehlt noch was. Das hast Du ja selber gemerkt.
    Das kannst Du jetzt mit zusätzlichen Übergabeparametern ergänzen. Nur musst Du dann auch die Variablen einzeln für die Übergabe definieren.
    Das gibt spätestens nach der 3. Änderungswelle ein heilloses, unwartbares Chaos. Bei jeder Erweiterung musst Du den aufgerufenen Funktionsrumpf ändern, alle Aufrufe anpassen und noch neue Variablen definieren.
    Mit Strukturen erweiterst Du nur den Strukturtyp, setzt die Initialwerte der Definitionen (Variablen) und kümmerst Dich um das Wesentliche - den Code in Deiner Funktion.

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Hallo Siro,

    das: "sizeof(Timers) / sizeof(TTimeValue)" würde ich aus der For-Schleife raus nehmen und das Ergebnis in eine Variable packen.

    Code:
    int irgendwas = sizeof(Timers) / sizeof(TTimeValue);

    und die Schleife dann so ändern:
    Code:
    for (i=0; i< irgendwas; i++)
    Evtl. funktioniert das ja auch noch mit "const" als Konstante, das weiß ich nicht an der Stelle.

    Es sei denn, der Compiler würde das selbst optimieren. Sonst hättest Du bei jedem Schleifendurchlauf die Berechnung drin, deren Ergebnis sich nie ändert. Mit den verlorenen Taktzyklen kann man was anderes anfangen.

    MfG


  4. #4
    HaWe
    Gast
    Zitat Zitat von Moppi Beitrag anzeigen
    Es sei denn, der Compiler würde das selbst optimieren. Sonst hättest Du bei jedem Schleifendurchlauf die Berechnung drin, deren Ergebnis sich nie ändert. Mit den verlorenen Taktzyklen kann man was anderes anfangen.
    so doof ist kein moderner C/C++-Compiler

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    @Moppi:

    Hatte ich Anfangs auch bedenken, aber wie HaWe schon schreibt, der Compiler setzt da eine Konstante ein.
    Er macht selbst die Vorrausberechnung, das habe mir im Assemblercode vei verschiedenen Compilern jeweils angesehen.
    Grade bei meinen kleinen PICs mit wenig Speicher, bin ich da immer am gucken was der Compiler für Code erzeugt,

    Siro

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Danke Siro, für die Rückmeldung!

    aber wie HaWe schon schreibt
    Der schreibt ... :
    Zitat Zitat von HaWe Beitrag anzeigen
    so doof ist kein moderner C/C++-Compiler

    MfG

    gekürzt, Manf
    Die Bermerkung ist viel zu weitreichend, wen könnte man denn hier als Vorbild nennen?
    Geändert von Manf (08.04.2020 um 09:40 Uhr)

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    Ich danke euch Allen erst einmal vielmals für die konstruktiven Antworten und Hinweisen.
    Mit diesem Bsp spiele ich derzeit - muss dann in den nächsten Tagen auf meine zukünftig mutiplen Bedürfnisse angepasst werden.
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.210
    Sag ich doch dauernd...bemüh mal die Suche hier im Forum, ich hatte neulich erst Auszüge eines Codes gepostet, den ich benutze- der basiert auf dem Beispiel, kann aber _etwas_ mehr als nur ein Lichtlein blinken lassen.

    Man muss sich aber darüber im klaren sein, dass diese Herangehensweise auch ihre Grenzen hat.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

Ä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
  •  

Solar Speicher und Akkus Tests