Gast
#105559
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