Wo ist die Funktion PollSwitch(), bekommst du von dort die richtige Variable für Taste?
Druckbare Version
Wo ist die Funktion PollSwitch(), bekommst du von dort die richtige Variable für Taste?
Das Problem wird sein, dass du am Anfang zwar PollSwitch aufrufst, aber da wahrscheinlich noch kein Taster betätigt ist. Wenn er in die while Schleife kommt, wird der Wert von Taste nicht wieder aktualisiert. Das heißt er kommt weder in den if noch in den else if Zweig. Was mich wundert, ist allerdings warum er nicht losfährt, denn das machst du ja schon am Anfang.
Vielleicht solltest du die Ziele erst mal nicht so hoch stecken und den Inhalt der Zweige eher klein halten.
zB
Und das Fahren erst später einbauen.Code:while(1)
{
taste = PollSwitch();
if (taste == 1)
{
StatusLED(RED);
FrontLED(ON);
BackLED(OFF,OFF);
}
else if (taste == 2)
{
StatusLED(RED);
FrontLED(OFF);
BackLED(OFF,OFF);
}
else if (taste == 4)
{
StatusLED(GREEN);
FrontLED(ON);
BackLED(OFF,OFF);
}
else if (taste == 8)
{
StatusLED(GREEN);
FrontLED(OFF);
BackLED(OFF,OFF);
}
else if (taste == 16)
{
StatusLED(RED);
FrontLED(ON);
BackLED(ON,ON);
}
else if (taste == 32)
{
StatusLED(RED);
FrontLED(OFF);
BackLED(ON,ON);
}
}
Das wüste Verwenden von Funktionen bringt da nicht viel. StartSwitch und StopSwitch ergeben nach dem was ich gerade im asurowiki gelesen habe nicht wirklich Sinn.
Ich habe zwar keinen Asuro, aber könnte mir vorstellen, dass auch mal mehr als ein Taster zur gleichen Zeit angesprochen wird. Das wird natürlich durch solche Abfragen nicht abgefangen.
sast
Da hätten wir auch drauf kommen können ](*,)Zitat:
Das Problem wird sein, dass du am Anfang zwar PollSwitch aufrufst, aber da wahrscheinlich noch kein Taster betätigt ist. Wenn er in die while Schleife kommt, wird der Wert von Taste nicht wieder aktualisiert. Das heißt er kommt weder in den if noch in den else if Zweig. Was mich wundert, ist allerdings warum er nicht losfährt, denn das machst du ja schon am Anfang.
Aber so sollte es dann Funktionieren.[/quote]
Code:#include "asuro.h"
int main(void)
{
Init();
int zeit;
unsigned char taste;
MotorDir(FWD,FWD);
MotorSpeed(120,124);
StatusLED(GREEN);
FrontLED(ON);
while (1){
taste=PollSwitch;
if (taste==1 || taste==2 || taste==4)
{
MotorSpeed(0,0);
StatusLED(RED);
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(150,152);
for(zeit=0;zeit<1000;zeit++){
Sleep(72);}
BackLED(OFF,OFF);
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(180,0);
for (zeit=0; zeit<500; zeit++){
Sleep(72);}
MotorSpeed(120,124);
for(zeit=0;zeit<500;zeit++){
Sleep(72);}
BackLED(OFF,OFF);
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(0,180);
for (zeit=0; zeit<500; zeit++){
Sleep(72);}
MotorSpeed(120,121);
}
else if (taste==8 || taste==16 || taste==32)
{
MotorSpeed(0,0);
StatusLED(RED);
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(150,152);
for(zeit=0;zeit<1000;zeit++){
Sleep(72);}
BackLED(OFF,OFF);
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(0,180);
for (zeit=0; zeit<500; zeit++){
Sleep(72);}
MotorSpeed(120,124);
for(zeit=0;zeit<500;zeit++){
Sleep(72);}
BackLED(OFF,OFF);
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(180,0);
for (zeit=0; zeit<500; zeit++){
Sleep(72);}
MotorSpeed(120,121);
}
}
while(1);
return(0);
}
Also ich habe das jetzt so gemacht, wie ihr geschrieben habt, der Erfolg ist schon mal: Er fährt.Zitat:
Das Problem wird sein, dass du am Anfang zwar PollSwitch aufrufst, aber da wahrscheinlich noch kein Taster betätigt ist. Wenn er in die while Schleife kommt, wird der Wert von Taste nicht wieder aktualisiert. Das heißt er kommt weder in den if noch in den else if Zweig. Was mich wundert, ist allerdings warum er nicht losfährt, denn das machst du ja schon am Anfang.
Aber sonst passiert nichts hier noch mal der Code von dem Ursprungsprogramm, nachdem habt ihr ja gefragt.
Code:#include "asuro.h"
int main(void)
{
Init();
int zeit;
MotorDir(FWD,FWD);
MotorSpeed(120,124);
StatusLED(GREEN);
FrontLED(ON);
while (1){
while (PollSwitch()==0) {
SerWrite("Hallo",5);
}
MotorSpeed(0,0);
StatusLED(RED);
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(150,152);
for(zeit=0;zeit<1000;zeit++){
Sleep(72);}
BackLED(OFF,OFF);
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(0,180);
for (zeit=0; zeit<500; zeit++){
Sleep(72);}
MotorSpeed(120,124);
for(zeit=0;zeit<500;zeit++){
Sleep(72);}
BackLED(OFF,OFF);
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(180,0);
for (zeit=0; zeit<500; zeit++){
Sleep(72);}
MotorSpeed(120,121);
}
}
Das liegt an PollSwitch, dass ist eine Funktion die du da aufruhfst, deshalb muss dasheißen.Zitat:
tast = PollSwitch();
Code:#include "asuro.h"
int main(void)
{
Init();
int zeit;
unsigned char taste;
MotorDir(FWD,FWD);
MotorSpeed(120,124);
StatusLED(GREEN);
FrontLED(ON);
while (1){
taste=PollSwitch();
if (taste==1 || taste==2 || taste==4)
{
MotorSpeed(0,0);
StatusLED(RED);
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(150,152);
for(zeit=0;zeit<1000;zeit++){
Sleep(72);}
BackLED(OFF,OFF);
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(180,0);
for (zeit=0; zeit<500; zeit++){
Sleep(72);}
MotorSpeed(120,124);
for(zeit=0;zeit<500;zeit++){
Sleep(72);}
BackLED(OFF,OFF);
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(0,180);
for (zeit=0; zeit<500; zeit++){
Sleep(72);}
MotorSpeed(120,121);
}
else if (taste==8 || taste==16 || taste==32)
{
MotorSpeed(0,0);
StatusLED(RED);
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(150,152);
for(zeit=0;zeit<1000;zeit++){
Sleep(72);}
BackLED(OFF,OFF);
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(0,180);
for (zeit=0; zeit<500; zeit++){
Sleep(72);}
MotorSpeed(120,124);
for(zeit=0;zeit<500;zeit++){
Sleep(72);}
BackLED(OFF,OFF);
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(180,0);
for (zeit=0; zeit<500; zeit++){
Sleep(72);}
MotorSpeed(120,121);
}
}
while(1);
return(0);
}
Man könnte jetzt so in etwa sagen, dass es funktioniert, aber asuro macht das alles jetzt öfters ohne, dass ein Taster gedrückt wurde.
Muss man da PollSwitch() nicht öfters aufrufen.
Ich glaube, dazu stand was in "Mehr Spass mit Asuro Band 1".
Edit: Ich weiß aber nicht wie man, dass da einbauen könnte.
Was hat es mit dem letztenauf sich?Code:while(1);
Oder was soll das bewirken?
Dein Programm läuft bis hierherDas was nachher kommt wird nie aufgerufen.Code:#include "asuro.h"
int main(void)
{
Init();
int zeit;
unsigned char taste;
MotorDir(FWD,FWD);
MotorSpeed(120,124);
StatusLED(GREEN);
FrontLED(ON);
while (1){
taste=PollSwitch();
if (taste==1 || taste==2 || taste==4)
{
Ich habe mir diese Programmwurst nicht genau angeschaut, aber die Schleife sollte schon bis ans Ende gehen. Das while am Ende ist, wie schon erwähnt, überflüssig.
Mit dem while(1) wollte ich eigentlich nur die Vorgaben aus der Anleitung erfüllen.
Da steht, dass wenn keine Endlosschleife am Schluss manchmal Programmteile aus alten Programmen hervortreten können.
@Hubert
Warum sollte dort das Programm schon zu Ende sein?
Die Klammer geht doch auf und nicht zu.
@Asuroneuling
Versuch einmal PollSwitch() 2x auszulesen, wegen dem C7 Kondensator.