mikrocontroller.net

Forum: Compiler & IDEs Ereignise alle x Sekunden durchführen


Autor: Wiederholer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich habe folgendes Problem. Ich möchte bestimmte Ereignisse alle x 
Sekunden ausführen.

Zum Beispiel

Ereignis A alle x ms
Ereignis B alle y s
Ereignis C ...

Das löse ich bisher so, dass ich einen Timer habe, der in einer 32 Bit 
Variable Millisekunden hoch zählt. Anschliesend vergleiche ich in einer 
Endlosschleife:
if( ms-EreignisA >= 1000) {
   EreignisA=ms;
   ...
}

Gibt es dafür noch elegantere Lösungen?

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, für sowas bieten sich Interrupts an.

Autor: Wiederholer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich zähle die ms ja im Timer Compare Interrupt hoch.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wiederholer schrieb:

>
> if( ms-EreignisA >= 1000) {
>    EreignisA=ms;
>    ...
> }
> 
>
> Gibt es dafür noch elegantere Lösungen?

Was findest du daran unelegant?

eine Alternative wäre vielleicht noch

   performChecks = 0;
   cli();
   if( ms != ms_alt )    // ist eine Millisekunde um?
   {
     ms_alt = ms;
     performChecks = 1;
   }
   sei();

   if( performChecks )  // Zeitauswertungen nur jede volle Millisekunde
   {
     EreignisA--;
     if( EreignisA == 0 )           // ist die Zeit für A rum?
     {
       EreignisA = TIME_FOR_A;
       ....
     }


     EreignisB--;
     if( EreignisB == 0 )           // ist die Zeit für B rum?
     {
       EreignisB = TIME_FOR_B;
       ....
     }

     .....
   }

Dann werden deine Zeit-Ereignisse auch nur dann bearbeitet, wenn eine 
Millisekunde um ist und nicht ständig. Und du hast auch noch die 
Möglichkeit die Zeit für ein Ereignis auch einmal abzukürzen bzw. zu 
verlängern, indem du EreignisA direkt manipulierst.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.