Ich danke dir Rabenauge für die Hilfe bis jetzt...
Ich konnte den Fehler weiter eingrenzen und habe nun eine stark abgespeckte Version des Quellcodes.
Der Fehler muss an der Kombination von StartSwitch ( Tasterabfrage im Interrupbetrieb) und PollSwitch ( Tasterabfrage im Polling-Betrieb) liegen. Sobald PollSwitch() nach StartSwitch() aufgerufen wird, um zu prüfen welcher Taster gedrückt wurde, funktioniert StartSwitch() nach dem ersten Aufruf nicht mehr. Selbst wenn ich switched = false setze.
Hier die zwei Codeschnippsel mit erläuterung, die eindeutig beweisen, dass der Fehler an der Kombination der beiden Funktionen liegt:
Code:
#include "asuro.h"
#include "myasuro.h"
#define SPEED 200
int main(void)
{
Init();
while(1)
{
MotorDir(FWD, FWD);
MotorSpeed(SPEED, SPEED);
StartSwitch();
while(!switched);
MotorDir(RWD, RWD);
Msleep(1000);
switched = FALSE;
}
return 0;
}
Hier funktioniert der Code einwandfrei: Der Asuro fährt unendlich lange geradeaus, bis irgendein Taster berührt wird. Dann fährt er 1 sek. zurück, um dann einfach wieder geradeaus zu fahren. Das ganze wiederhohlt sich und er reagiert auch immer wieder auf einen Tastendruck.
Hier der fehlerhafte Code:
Code:
#include "asuro.h"
#include "myasuro.h"
#define SPEED 200
int main(void)
{
unsigned char t1;
Init();
while(1)
{
MotorDir(FWD, FWD);
MotorSpeed(SPEED, SPEED);
StartSwitch();
while(!switched);
t1 = PollSwitch();
MotorDir(RWD, RWD);
Msleep(1000);
switched = FALSE;
}
return 0;
}
Dies ist fast der selbe Code, bis auf einen Funktionsaufruf von PollSwitch() nach StartSwitch(), dessen Rückgabewert nur zu Testzwecken in t1 hinterlegt wird. Mit dem Wert an sich wird nicht gemacht. Aber:
Asuro fährt hier solange geradeaus, bis irgentein Taster gedrückt wird. Dann fährt er zurück. Aber nicht wie es sein soll für 1 sek, um dann wieder egradeaus zu fahren, sondern er fährt unendlich lange zurück. Das kann also nur Passieren, wenn StartSwitch() wieder switched = TRUE setzt. Aber halt ohne das ein Taster gedrüclt worden ist.
Und dies übersteigt nun meine fähigkeiten in der Microcontrollerprogrammierung, da sich die beiden Funktionen StartSwitch() und PollSwitch() in der LOW-Level programmierung anscheinend stören. Vielleicht liegt auch ein fehler in der lib vor...
Natürlich könnte ich auf StartSwitch() verzichten. Jedoch müsste ich dann mit wohlmöglich 3 abfragen von PollSwitch() arbeiten, um ein richtiges Tasterergebnis zu bekommen und das macht den Quellcode dann natürlich unschön. Auf die Kombination von beiden muss ich dann bei einer genauen Abfrage verzichten.
Ich fände es jedoch sehr interessant, wenn einer das Problem kennt und es mir schildern könnte.
Ansonsten funktioniert jetzt mein Kollisionsprogramm ohne Probleme.
Danke für die Hilfe,
Max
Lesezeichen