Ich habe da folgende Vorgehensweise:
aber viele Wege führen zum Ziel, da hat sicher jeder eine andere Lösung...Code:typedef unsigned int TTimeValue; // ich nehme 16 Bit Werte für die Millisekunden Zeiten */ typedef volatile struct // in dieser Struktur werden alle Zeitwerte verwaltet { TTimeValue Led1BlinkTime; TTimeValue Led2BlinkTime; TTimeValue KeyTime; /* hier kann man beliebig erweitern */ } TimerStruct; volatile TimerStruct Timers; // das ist die gesamte Timerstruktur (die Instanz) //---------------------------------------------------------------- // der 1 Millisekunden Timer Interrupt: // hier wird jeder Zeitwert, solange er noch nicht 0 ist, um eins erniedrigt void TIMER0_IRQHandler (void) { int i; TTimeValue *p = (TTimeValue*) &Timers; /* initialize p to startaddress of the structure */ for (i=0; i< (sizeof(Timers) / sizeof(TTimeValue)); i++) { if (*p) /* if current addressed counter value is greater zero then */ --*p; /* decrement the counter value by one */ p++; /* p points now to the next counter value */ } } //---------------------------------------------------------------- // Jetzt kommen diverse Funktionen die ausgeführt werden sollen: void DoLed1(void) { static char BlinkPhase; if (Timers.Led1BlinkTime) return; // es gibt noch nichts zu tun, Zähler noch nicht 0 if (BlinkPhase) { // Led1On(); Timers.Led1BlinkTime = 250; // 250 ms ein } else { // Led1Off(); Timers.Led1BlinkTime = 100; // 100 ms aus } BlinkPhase = ! BlinkPhase; // BlinkPhase umdrehen } void DoLed2(void) { static char BlinkPhase; if (Timers.Led2BlinkTime) return; // es gibt noch nichts zu tun, Zähler noch nicht 0 if (BlinkPhase) { // Led2On(); Timers.Led1BlinkTime = 500; // 500 ms ein } else { // Led2Off(); Timers.Led1BlinkTime = 250; // 250 ms aus } BlinkPhase = ! BlinkPhase; // BlinkPhase umdrehen } void DoKeys(void) { if (Timers.KeyTime) return; // noch nix zu tun Timers.KeyTime = 20; // nächste Abfrage in 20ms // Tastenstatus auswerten usw..... } void main(void) // Hauptprogramm: { while (1) { DoLed1(); DoLed2(); DoKeys(); // ....usw.... } }
Siro







Zitieren


Lesezeichen