sebroos
03.01.2011, 23:17
hi
ich habe mal zum test ein programm geschrieben. Dabei soll der Roboter auf händeklatschen reagieren. beim ersten klatschen sollen zwei LEDs blinken und beim 2ten mal klatschen soll der bot sich hin und her drehen. damit er beim ausführen der aktionen auch weiterhin seinen MIC eingang beobachtet habe ich hierzu Multithreading angewendet.
nun habe ich aber ein problem, da wenn ich 2 mal in die hände geklatscht habe dann bewegt sich der bot kaum von der stelle. und beim nächsten mal klatschen bewegt er sich wieder ein stück obwohl er dann komplett ewieder in ruhestellung fahren sollte. ich habe das gefühl das durch die akustische signalisierung der trtead erst wieder angestoßen wird... aber deim thread Licht klappt alle wunderbar.... könnt ihr mir helfen?
im anhang habe ich den Quelltext....
danke im vorraus..
//************************************************** ************
//
// Wackeln
// Erstes Programm 30.12.2010
// Probot lauscht:
// beim ersten klatschen -> Blinken
// zweitem klatschen -> Tanzen
// dritten klatschen -> Ruhe
//
//************************************************** ************
#define LLF 16
#define RLF 17
#define LLB 18
#define RLB 19
#define MIC 43
word x; // globale variablen erstellt
int count;
void main(void)
{
DRIVE_INIT(); // Drive initalisieren siehe PRO-BOT128_Lib
count=0; // setzte den KLatschzähler auf 0
Port_DataDirBit(LLF,1);
Port_DataDirBit(RLF,1); // initaliesiere die LEDs
Port_DataDirBit(LLB,1);
Port_DataDirBit(RLB,1);
Thread_Delay(100); //Konfiguriere die ports als ausgänge und warte ne sekund
Port_WriteBit(LLF,0);
Port_WriteBit(RLF,0);
Port_WriteBit(LLB,0);
Port_WriteBit(RLB,0);
Thread_Delay(50);
Port_WriteBit(LLF,1); //LEDs aufblinken lassen zum signalisieren das es jetzt los gehen kann
Port_WriteBit(RLF,1);
Port_WriteBit(LLB,1);
Port_WriteBit(RLB,1);
while(1==1) //endlosschleife
{
x=GetADC(3); //schreibe den Wert vom MIC in x
if (x>600) //wenn x größer 600...
{
count++; //...zähle hoch
Thread_Delay(10);
}
switch(count)
{
case 0: break; //counter = 0 nix
case 1: Thread_Start(1,Light);count++;break; //counter = 1mal geklatscht -> Thread Light starten. counter eins hoch zählen damit der thread nicht immer gestartet wird.
case 2: break;
case 3: Thread_Start(2,Fahr)/*Fahr()*/;count++;break; //counter =3 -> 2mal geklatscht. Thread Fahr
case 4: break;
default:
count=0;
Thread_Kill(1);
Thread_Kill(2); //wenn counter größer als 4 oder undefiniert dann schliße
Port_WriteBit(15,0); // beide threads und schalte alle LEDs aus
Port_WriteBit(LLF,1); //EN ausgang für motoren wird abgeschaltet
Port_WriteBit(RLF,1);
Port_WriteBit(LLB,1);
Port_WriteBit(RLB,1);
}
}
}
word GetADC(int adr) //ließt wert aus ADC eingang aus
{
ADC_Set(ADC_VREF_BG,adr);
return ADC_Read();
}
void Light(void) //Light funzt... aber LEDs sind vertauscht.... ?!
{
while(1)
{
// Port_WriteBit(LLF,1);
// Port_WriteBit(RLF,1);
Port_WriteBit(LLB,1);
Port_WriteBit(RLB,1);
Thread_Delay(250);
// Port_WriteBit(LLF,1);
// Port_WriteBit(RLF,1);
Port_WriteBit(LLB,0);
Port_WriteBit(RLB,0);
Thread_Delay(250);
}
}
void Fahr(void) //funktioniert nicht.... :(
{
Port_WriteBit(15,1); //setzte EN eingang der Motoren
while(1) //endlosschleife
{
DRIVE(1,255); //dreh dich 2,5s in eine richtung
Thread_Delay(250);
DRIVE(128,128); //bleib stehen
Thread_Delay(250);
DRIVE(255,1); //fahr in die andere richtung
Thread_Delay(250);
DRIVE(128,128); //bleib stehen
Thread_Delay(250);
}
}
ich habe mal zum test ein programm geschrieben. Dabei soll der Roboter auf händeklatschen reagieren. beim ersten klatschen sollen zwei LEDs blinken und beim 2ten mal klatschen soll der bot sich hin und her drehen. damit er beim ausführen der aktionen auch weiterhin seinen MIC eingang beobachtet habe ich hierzu Multithreading angewendet.
nun habe ich aber ein problem, da wenn ich 2 mal in die hände geklatscht habe dann bewegt sich der bot kaum von der stelle. und beim nächsten mal klatschen bewegt er sich wieder ein stück obwohl er dann komplett ewieder in ruhestellung fahren sollte. ich habe das gefühl das durch die akustische signalisierung der trtead erst wieder angestoßen wird... aber deim thread Licht klappt alle wunderbar.... könnt ihr mir helfen?
im anhang habe ich den Quelltext....
danke im vorraus..
//************************************************** ************
//
// Wackeln
// Erstes Programm 30.12.2010
// Probot lauscht:
// beim ersten klatschen -> Blinken
// zweitem klatschen -> Tanzen
// dritten klatschen -> Ruhe
//
//************************************************** ************
#define LLF 16
#define RLF 17
#define LLB 18
#define RLB 19
#define MIC 43
word x; // globale variablen erstellt
int count;
void main(void)
{
DRIVE_INIT(); // Drive initalisieren siehe PRO-BOT128_Lib
count=0; // setzte den KLatschzähler auf 0
Port_DataDirBit(LLF,1);
Port_DataDirBit(RLF,1); // initaliesiere die LEDs
Port_DataDirBit(LLB,1);
Port_DataDirBit(RLB,1);
Thread_Delay(100); //Konfiguriere die ports als ausgänge und warte ne sekund
Port_WriteBit(LLF,0);
Port_WriteBit(RLF,0);
Port_WriteBit(LLB,0);
Port_WriteBit(RLB,0);
Thread_Delay(50);
Port_WriteBit(LLF,1); //LEDs aufblinken lassen zum signalisieren das es jetzt los gehen kann
Port_WriteBit(RLF,1);
Port_WriteBit(LLB,1);
Port_WriteBit(RLB,1);
while(1==1) //endlosschleife
{
x=GetADC(3); //schreibe den Wert vom MIC in x
if (x>600) //wenn x größer 600...
{
count++; //...zähle hoch
Thread_Delay(10);
}
switch(count)
{
case 0: break; //counter = 0 nix
case 1: Thread_Start(1,Light);count++;break; //counter = 1mal geklatscht -> Thread Light starten. counter eins hoch zählen damit der thread nicht immer gestartet wird.
case 2: break;
case 3: Thread_Start(2,Fahr)/*Fahr()*/;count++;break; //counter =3 -> 2mal geklatscht. Thread Fahr
case 4: break;
default:
count=0;
Thread_Kill(1);
Thread_Kill(2); //wenn counter größer als 4 oder undefiniert dann schliße
Port_WriteBit(15,0); // beide threads und schalte alle LEDs aus
Port_WriteBit(LLF,1); //EN ausgang für motoren wird abgeschaltet
Port_WriteBit(RLF,1);
Port_WriteBit(LLB,1);
Port_WriteBit(RLB,1);
}
}
}
word GetADC(int adr) //ließt wert aus ADC eingang aus
{
ADC_Set(ADC_VREF_BG,adr);
return ADC_Read();
}
void Light(void) //Light funzt... aber LEDs sind vertauscht.... ?!
{
while(1)
{
// Port_WriteBit(LLF,1);
// Port_WriteBit(RLF,1);
Port_WriteBit(LLB,1);
Port_WriteBit(RLB,1);
Thread_Delay(250);
// Port_WriteBit(LLF,1);
// Port_WriteBit(RLF,1);
Port_WriteBit(LLB,0);
Port_WriteBit(RLB,0);
Thread_Delay(250);
}
}
void Fahr(void) //funktioniert nicht.... :(
{
Port_WriteBit(15,1); //setzte EN eingang der Motoren
while(1) //endlosschleife
{
DRIVE(1,255); //dreh dich 2,5s in eine richtung
Thread_Delay(250);
DRIVE(128,128); //bleib stehen
Thread_Delay(250);
DRIVE(255,1); //fahr in die andere richtung
Thread_Delay(250);
DRIVE(128,128); //bleib stehen
Thread_Delay(250);
}
}