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


von justus (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.