Klasse Idee und Mathematik,
habe ich mal sofort etwas geändert und auch die Motoren mit in's Spiel genommen.
Ich bin ein Fan von blinkenden LED's
Code:
/*****************************************************************************
* zufall LED *
*****************************************************************************/
#include "asuro.h"
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
//
// uint8_t zufall ()
//
// Liefert eine 8-Bit Pseudozufallszahl zurück,
// die Zahlenfolge wiederholt sich spätestens nach 65535 Aufrufen.
//
unsigned char zufall ()
{
static unsigned int startwert = 0x0AA;
unsigned int temp;
unsigned char n;
for (n = 1; n < 8; n++)
{
temp = startwert;
startwert = startwert << 1;
temp ^= startwert;
if ((temp & 0x4000) == 0x4000)
startwert |= 1;
}
return (startwert);
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
int main (void)
{
int i; //Zähler
unsigned int data [2]; //Odo
unsigned int zuf; //Zufall
unsigned char dirlinks, dirrechts;
unsigned char speedlinks, speedrechts;
Init ();
StatusLED (OFF);
/* Zufaellige Zeit fuer "Anfangs-Zufallszahl" */
zuf = zufall ();
OdometrieData (data); // aktuelle Odometriewerte
zuf ^= data [0];
for (i = 1; i < zuf; i++)
zufall ();
while (1)
{
StatusLED (OFF);
BackLED (OFF, OFF);
/* Bereich StatusLED */
zuf = zufall (); // Zufallszahlen zw. 0 und 255
if (zuf < 25)
StatusLED (OFF); // ca. 10% aus
else if (zuf < 75)
StatusLED (YELLOW); // ca. 20% gelb
else if (zuf < 150)
StatusLED (RED); // ca. 30% rot
else
StatusLED (GREEN); // ca. 40% grün
/* Bereich BackLED */
zuf = zufall (); // Zufallszahlen zw. 0 und 255
if (zuf < 64)
BackLED (OFF, OFF); // 25% beide aus
else if (zuf < 128)
BackLED (ON, OFF); // 25% links an - rechts aus
else if (zuf < 192)
BackLED (OFF, ON); // 25% links aus - rechts an
else
BackLED (ON, ON); // 25% beide an
/* Bereich FrontLED */
zuf = zufall (); // Zufallszahlen zw. 0 und 255
if (zuf < 204)
FrontLED (OFF); // 80% aus
else
FrontLED (ON); // 20% an
/* Richtung */
zuf = zufall ();
if (zuf < 216)
dirlinks = FWD; // 85% vorwaerts
else if (zuf < 230)
dirlinks = BREAK; // 5% stop
else
dirlinks = RWD; // 10% rueckwaerts
zuf = zufall ();
if (zuf < 216)
dirrechts = FWD; // 85% vorwaerts
else if (zuf < 230)
dirrechts = BREAK; // 5% stop
else
dirrechts = RWD; // 10% rueckwaerts
MotorDir (dirlinks, dirrechts);
/* Geschwindigkeit */
zuf = zufall ();
if (zuf < 128)
speedlinks = 130; // 50% langsam
else if (zuf < 204)
speedlinks = 170; // 30% mittel
else
speedlinks = 200; // 20% schnell
zuf = zufall ();
if (zuf < 128)
speedrechts = 130; // 50% langsam
else if (zuf < 204)
speedrechts = 170; // 30% mittel
else
speedrechts = 200; // 20% schnell
MotorSpeed (speedlinks, speedrechts);
/* "gauss" dauer zwischen 0 und 2 sec mit häufung um 1 sec */
zuf = 0;
/*
for (i = 1; i <= 10; i++) // zahlen von 0 bis 2550
zuf += zufall ();
zuf *= 4; // zahlen von 0 bis 10200
zuf /= 5; // zahlen von 0 bis 2040
*/
/* "gauss" dauer zwischen 0 und 2 sec mit geringerer häufung um 1 sec */
for (i = 1; i <= 4; i++) // zahlen von 0 bis 1020
zuf += zufall ();
zuf *= 2; // zahlen von 0 bis 2040
Msleep(zuf);
}
return 0;
}
Lesezeichen