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.