mikrocontroller.net

Forum: Compiler & IDEs Periodische Vorgänge ausführen - wie am besten?


Autor: Markus _neu (markush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leutz,

ich habe ein Testsystem gebastelt mit einer DCF Uhr und LCD auf einem 
Mega32. Das ganze funktioniert alles soweit. Rauskommen soll dabei mal 
eine Heizungs-Zusatzsteuerung für Holzvergaser/Solar. Das ganze wird in 
C realisiert.
Nun frag ich mich wie ich am besten periodische Vorgänge z. B. im 
Minutenbereich auf dem AVR realisiere. Zum Beispiel möchte alle 5 
Minuten die Außentemperatur messen, oder alle 2 Minuten die Tempertur im 
Pufferspeicher ermitteln. In drei Variablen hab ich ja Stunden, Minuten 
und Sekunden von der DCF Uhr. Nun könnt ich ja in einer Schleife diese 
Variablen auf die entsprechenden Änderungen prüfen - gefällt mir aber 
gar nicht. Kann man bei Änderung eines Variableninhalts ein Ereignis 
auslösen (lassen)? Gibts da nen anderen Ansatz? Wie würdet ihr das 
realisieren?

Gruß - Markus

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if (uptime() - letzte_messung >= 2 Stunden) {
    neue Messung
    letzte_messung = uptime();
}

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Markus _neu (markush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Andreas: Kannst du das mir das mal ausdeutschen? Ich brauch auch keinen 
fertigen Code, mir reicht die theoretische Ausführung wie du das machen 
würdest.

@Peter: Danke für den Link, kannte ich noch nicht. Werd ich mir heut 
abend mal ansehen bzw. testen.

Markus

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

Bewertung
0 lesenswert
nicht lesenswert
Markus _neu wrote:
> @Andreas: Kannst du das mir das mal ausdeutschen? Ich brauch auch keinen
> fertigen Code, mir reicht die theoretische Ausführung wie du das machen
> würdest.

Das ist im Prinzip genau das, was du in deinem Eröffnungsposting
angedeutet hast.

Du vergleichst ständig den Zeitpunkt der letzten Messung
mit der aktuellen Uhrzeit. Ist die Messung länger als x
Zeiteinheiten zurück, machst du eine neue Messung und merkst
dir den aktuellen Zeitpunkt als den Zeitpunkt der letzten Messung.

So wie du das auch im täglichen Leben machen würdest. Die Klofrau
schreibt auf den Zettel an der Tür, wann sie zuletzt da war.
Der Manager geht regelmässig alle Klos durch und sieht nach,
ob die Klofrau schon länger als 2 Stunden nicht da war. Dazu
benutzt er seine Armbanduhr die die aktuelle Zeit anzeigt. Ist
die letzte Reinigung schon länger als 2 Stunden her, dann scheucht
er sie hinein. Die macht sauber und notiert den Zeitpunkt wieder
am Zettel. etc. etc.
Der einzige Unterschied: Dein 'Manager' kann in einer Sekunde
mehrere Tausend Klos ein paar hundert mal durchsehen.

Man kann sich aus dem täglichen Leben eine Menge abschauen, wie
Dinge gemacht werden :-)

Man kann das ganze auch umgekehrt machen: Die Klofrau schreibt auf
den Zettel, wann sie das nächste mal Putzen kommen müsste und der
Manager benachrichtigt sie gegebenenfalls auf seinem Rundgang, dass
es an der Zeit wäre ...

Autor: Frank Jonischkies (frajo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da wo Du die Minuten zählst, kannst Du noch eine weitere globale 
Variable hochzählen lassen. In der Hauptschleife prüfst Du ob diese 
Variable schon >= 5 ist. Wenn ja, setzt Du die Variable auf 0 und 
erledigst Deinen 5 Minuten Job.

Autor: Markus _neu (markush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Karl Heinz, für das "schöne" Beispiel. Ich werd mir die 
Manager-Sache mal durch den Kopf gehen lassen ;) !

@Frank: Hört sich auch nicht schlecht, vor allem weil es ohne viel 
zusätzlichen Code umzusetzen ist, das meiste ist ja schon vorhanden.

Markus

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.