So, ich habe die Lösung. Nicht das Multithreading ist das Problem, sondern das Eigengeräusch des Antriebs. Es löst nämlich sofort wieder ein count++; aus, was zur Deaktivierung nach wenigen Millisekunden führt. Deshalb fährt der Antrieb nur wenige Millimeter.
Lass in Thread 2 mal irgendetwas Geräuschloses ausführen bspw. wie in Thread 1 ein LED-Blinken. Dann funktioniert es wunderbar.
Hier mein bereinigter Code, der beim ersten Mal Fingerschnippen die vorderen zwei LEDs blinken lässt (Thread 1), beim zweiten Mal Schnippen kommen die hinteren beiden LEDs hinzu (Thread 2). Das dritte Mal deaktiviert beendet beide Threads und man kann mit erneutem Schnippen von vorne beginnen.
Code:
word x;
int count;
void main(void)
{
PRO_BOT128_INIT();
count = 0;
while(1)
{
x = GetADC(3);
if (x > 700)
{
count++;
Msg_WriteInt(count);
Msg_WriteChar(13);
Thread_Delay(10);
switch(count)
{
case 1:
Thread_Start(1, Light);
break;
case 2:
Thread_Start(2, Fahr);
break;
case 3:
count = 0;
Thread_Kill(1);
Thread_Kill(2);
// DRIVE_OFF();
FLL_OFF();
FLR_OFF();
BLL_OFF();
BLR_OFF();
break;
}
}
}
}
word GetADC(int adr)
{
ADC_Set(ADC_VREF_BG, adr);
return ADC_Read();
}
void Light(void)
{
while(1)
{
Port_ToggleBit(FLL);
Port_ToggleBit(FLR);
Thread_Delay(50);
}
}
void Fahr(void)
{
while(1)
{
Port_ToggleBit(BLL);
Port_ToggleBit(BLR);
Thread_Delay(50);
}
}
Zudem siehst Du im Ausgabefenster den aktuellen Wert von count.
Ich habe den switch-Baum in die if-Anweisung zur Mikroabfrage verfrachtet, dann kannst Du Dir nämlich die umständliche Zwischenerhöhung von count sparen, damit Dir nicht derselbe Thread mehrfach gestartet wird.
So wird die switch-Verzweigung nur durchlaufen, wenn der Schallpegel am Mikro auch ausreicht. Ich denke 700 ist ein guter Wert. Mir war 600 etwas zu empfindlich.
Um jetzt beim zweiten Schnippen doch den Antrieb laufen zu lassen, musst Du Dir was überlegen, damit das Mikro nicht versehentlich durch das Getriebegeräusch auslöst. Entweder noch ein bisschen mit dem x-Wert spielen oder den "Hörbereich" des Mikros mit einer Art Papiertrichter eingrenzen. Vielleicht funktioniert das.
Vielen Dank, denn ich habe auch etwas über Multithreading bei der Sache gelernt.
Lesezeichen