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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.