hallo,
ich verwende ich ähnliches, wie oben dargestelltes Prinzip:
In einer Hauptschleife werden Status-Bytes auf ihren Zustand abgefragt und entsprechende Programmverzweigungen "angesprungen". z.B. Motor-Status hat sich geändert, verzeigen in die
Motor-Routine, dort Ports/PWM einstellen und nach wenigen µs zurück zur Hauptschleife. Dieses Status-Byte wird dann bei erreichen des Ziels durch Interrrupt (Rotary-Encoder/Compare_Match_Int)
wieder zurückgesetzt. Innerhalb der Hauptschleife gibt es den Aufruf einer Programm-Routine, falls ein Programm ausgeführt werden soll (wird beim Start durch Abfragen einer Dip-Schalterbank
erkannt) wird in dieses Routine verzweigt. Aus einer 2-dim Tabelle nimmt sich diese state machine den nächsten "Auftrag" (1. dim = Programm-Nr.), setzt bestimmte Status-Bytes und kehrt wieder
in die Hauptschleife zurück zur Abarbeitung dieser und inzwischen anderer angefallener Aufgaben. Ist die durch die state machine gestellte Aufgabe erledigt, wird ein flag task_ready gesetzt und
der pointer auf die Aufgabentabelle erhöht. Am Ende jeder Tabellenzeile steht ein LOOP, die state machine setzt dann den pointer wieder auf den Anfang der Zeile. Um "regelmässige" Aufgaben
zu erledigen läuft ausserdem im Hintergrund ein 10ms-timer, der u.a. alle 1min ein flag setzt, das die Hauptschleife bei "Untätigkeit" veranlasst, eine Routine zur Batteriekontrolle aufzurufen.
mfg
Achim
Lesezeichen