mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Gerüst für Programm


Autor: justus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Ich habe mir überlegt, wie ich das Hauptgerüst meines auf einem
Butterfly (ATMega169) laufenden Messsystems machen soll und wäre, da
ich  ein uC Neuling bin, um Kommentare froh:

Es geht mir nicht darum, dass ihr Euch die Mühe macht, herauszufieseln,
was das Programm nun im Detail macht, sondern darum, ob dies eine gute
Methode ist, eine Timerinterrupt-gesteuerte State Machine zu
implementieren.

Interrupt Routine, wird durch einen Timerinterrupt ausgelöst und ca.
alle 2ms angesprungen; die Idee ist, dass in der Interrupt Routine nur
Flags gesetzt werden, welche Aufgaben dann im Hauptprogramm
abgearbeitet werden sollen.

2ms:
  sichere alle Register
  inkrementiere 2ms-zähler
  falls 2ms-zähler < 500 jmp ende
second:
  clear 2ms-zähler
  inkerementiere sec-zähler
  setze flags für alle tasks, die jede Sekunde gemacht werden
  falls sec-zähler < 60 jmp ende
minute:
  clear sec-zähler
  inkrementiere min-zähler
  setze flags für alle tasks, die jede Minute gemacht werden
     (z.B. windgeschwindigkeitsmessung = 1,
           windrichtungsmessung = 1)
  falls minute < 10 jmp ende
10minuten:
  clear min-zähler
  inkrementiere 10min-zähler
  setze flags für alle tasks, die alle 10Min gemacht werden
     (z.B. sendedaten = 1,
           rotatedatenlogs = 1)
  falls 10min-zähler < 6 jmp ende
stunde:
  clear 10min-zähler
  inkrementiere h-zähler
  setze h-tasks
  falls h-zähler < 24 jmp ende
  clear h-zähler
ende
  hole alle register
  return from interrupt

Im Hauptprogramm werden dann die verschiedenen Tasks auch ausgeführt.
Es sähe dann etwa wie folgt aus:

loop:
2ms-tasks:
  falls windgeschwindigkeitsmessung = 0 jmp to s-tasks
  falls messung-läuft = 0 jmp to s-tasks
  lies windgeschwindigkeit und entprelle
s-tasks:
  falls messung-läuft = 0 jmpt to m-tasks
  dekrementiere messdauer-zähler
  falls messdauer-zähler > 0 jmp weitermessen
  messung-läuft = 0
  messgate = 0
weitermessen:
m-tasks:
  falls windgeschwindigkeitsmessung = 0 jmp to 10m-tasks
  messung-läuft = 1 ; start der Messung
  messgate = 1 ; öffnen des Messgates
  messdauer-zähler = 4 ; während 4s messen
10m-tasks:
  falls sendedaten = 0 jmp to h-tasks
  falls messung-läuft=1 jmp to h-tasks ; kein senden von Daten während
einer Messung
  sende alle daten (dies ist dann ein grösserer Brocken der hier rein
kommt
h-tasks:
  ..
  ..
d-tasks:
  ..
  ..
  jmp to loop

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.