Multitasking (Quelle: Roboterclub-Freiburg)
PHP-Code:
//*******************************************************************
//
// Multitasking ohne Betriebsystem
//
// Beispiel fr ASURO Roboter
//
// In diesem Programm laufen mehrere Programmteile quasi "gleichzeitig"
// Oft ist es bei der Roboterprogrammierung notwendig, dass mehrere
// Aufgaben zur gleichen Zeit durchgefhrt werden sollen.
// Die Hauptschleife wird mit 1/10 Sekunde durchlaufen, daher können
// Reaktionszeiten von 0,1 Sekunden erreicht werden.
//
// Die Front-Led blinkt unabh?gig von den Rckwärtsleds
// Gleichzeitg werden die Motoren gestartet, wenn der Zeitgeber der
// RückwertsLED's einen bestimmten Wert errreicht.
//
// 17.5.2007 ch
//
//*******************************************************************
#include "asuro.h"
int main(void)
{
uint32_t nextzeit=100; // Zeitgebervariable mit 32 Bit
uint16_t funktion1_zeit=0; // Zeitgebervariable fr 1.Funktion
uint16_t funktion2_zeit=0; // Zeitgebervariable fr 2.Funktion
uint16_t funktion3_zeit=20; // Zeitgebervariable fr 3.Funktion
Init();
while(1)
{
//*******************************************************************
// Funktion1: Statusleuchtdiode blinken lassen
//*******************************************************************
if (funktion1_zeit==0)
{
StatusLED(GREEN);
}
if (funktion1_zeit==10) // Nach 1 Sekunde auf Rot umschalten
{
StatusLED(RED);
}
funktion1_zeit++;
if (funktion1_zeit>20) funktion1_zeit=0;
//*******************************************************************
// Funktion1: Ende
//*******************************************************************
//*******************************************************************
// Funktion2: Rckwärtige Leuchtdioden abwechselnd schalten
//*******************************************************************
if (funktion2_zeit==0)
{
BackLED(OFF,ON);
}
if (funktion2_zeit==15) // Nach 1,5 Sekunde auf Rot umschalten
{
BackLED(ON,OFF);
}
if (funktion2_zeit==49)
{
funktion3_zeit=0; // hiermit wird die Funktion3 gestartet
}
funktion2_zeit++;
if (funktion2_zeit>50) funktion2_zeit=0; // 3 Sekunden
//*******************************************************************
// Funktion2: Ende
//*******************************************************************
//*******************************************************************
// Funktion3: Motoren benutzen
// Diese Funktion wird gestartet, wenn die Variable
// function3_zeit auf 0 gesetzt wird
//*******************************************************************
if (funktion3_zeit==0)
{
MotorSpeed(255,255);
MotorDir(FWD,FWD); // Motoren vorwäts
}
if (funktion3_zeit==5) // 0,5 Sekunden
{
MotorSpeed(255,255);
MotorDir(RWD,FWD);
}
if (funktion3_zeit==10) // 0,5 Sekunden
{
MotorSpeed(0,0);
}
if (funktion3_zeit<15) funktion3_zeit++; // Funktion beenden, wenn 15 erreicht
//*******************************************************************
// Funktion3: Ende
//*******************************************************************
// Schleifendurchlauf auf 0,1 Sekunden synchronisieren
while(Gettime()<nextzeit); // warten, bis Zielzeit erreicht
nextzeit=Gettime()+100; // Zeitgeber auf 100 Millisekunden= 0,1 Sekunde stellen
}
}
Lesezeichen