Bisschen träge dieser Thread, dann werd ich mal meinen Senf dazu geben.
Also: den Vorschlag mit der Statemachine finde ich in deinem Fall am günstigsten. Du hast keine Zeitkritischen Dinge zu erledigen und extra AVRX zu verwenden finde ich da übertrieben.
Ich versuche mal Deinen code einfach mal was mit ein paar Kommentaren in eine Statemachine zu übersetzen
Code:
char SignalTimeIstUp=0; // soll nach 1000ms im Interrupt gesetzt werden
ISR (TIMER0_COMP_vect)
{
// irgendwie immer nach 1000ms setzen, könnte auch einmal/ms sein und dann ein Zähler sein der bis 1000 zählt,
// dann könnte man auch kleinere Wartezeiten wie die 30ms realisieren
SignalTimeIstUp=1;
}
// die Zeitroutine (ist nur ein Beispiel geht auch schöner)
char Time_is_over(void)
{
if( SignalTimeIstUp )
{
// Zeit ist um, Signal zurücksetzen
SignalTimeIstUp=0;
return 1;
}
return 0; // Zeit ist noch nicht um
}
int main()
{
// Init alles was du brauchst
char ZustandLCD=0; // Zustand der Statemachine
char SignalAusgabe=0; // Eventhändler zum steuern des Ablaufs!!!
while(1)
{
// Statemachine LCD
switch(ZustandLCD)
{
case 0:
if( Time_is_over() )
{
lcd_clear();
lcd_pos(2,0);
lcd_text("Step 1!");
ZustandLCD=1;
};
break;
case 1: // wieder warten bis 1000ms abgelaufen
if( Time_is_over() )
{
SignalAusgabe=1;
ZustandLCD=2;
};
break;
case 2:
if( Time_is_over() )
{
lcd_pos(2,0);
lcd_text("Step 2!");
ZustandLCD=3;
};
break;
case 3:
if( Time_is_over() )
{
LCD_Ausg(); // da in LCD_Ausg noch gewartet wird könnte man diesen in verschiede Zustände (States) aufteilen
ZustandLCD=0; // wieder vorne anfangen
};
break;
}
// Blinken
// hier bitte blinken je nach SignalAusgabe und Zeitpunkt, dies könnte auch eine weitere Statemachine sein
}
}
Lesezeichen