Ich habe da folgende Vorgehensweise:
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....
}
}
aber viele Wege führen zum Ziel, da hat sicher jeder eine andere Lösung...
Siro
Lesezeichen