Auserdem das, wurde seiner VORWERTS, LINKS und RECHTS defines nicht besser mit funktionen gemacht? Weil die #define nur tekst erganzungen sein vordem das eigentliche compilation prozess anfangt.
Druckbare Version
Auserdem das, wurde seiner VORWERTS, LINKS und RECHTS defines nicht besser mit funktionen gemacht? Weil die #define nur tekst erganzungen sein vordem das eigentliche compilation prozess anfangt.
Leider sind das die Befehle, die ich bis jetzt kenne und weis wie anwenden.
Den char Befehl kenne ich nicht und weis auch nicht was er bewirkt.
Wen ich das Programm durchsehe, habe ich einige Fragen.
Wo werden die k5,k6 und k65 definiert was sie sind? In der asuro.h?
t1 und t2= PollSwitch(); wieso benötigen diese keine werte?
Hoffe es sind nicht allzu einfache Fragen. :-#
char ist kein befehl, sondern eine deklaration einer variable vom TYP character (8bit groß)Zitat:
Den char Befehl kenne ich nicht und weis auch nicht was er bewirkt.
was meinst du mit "benötigt keine werte" ???
PollSwitch() ist eine funktion die einen wert zurückliefert, der über das gleichheitszeichen den variablen t1 und t2 zugewiesen wird!
die defines für k5 und k6 stehen doch oben unter dem #include
t1 und t2 sind im übrigen variablen, d.h. zur laufzeit des programms können sie viele interschiedliche werte annehmen ...
mit deinen defines für k6 usw. erzeugst du eine temporäre variabel, du rufst die funktion pollswitch auf, die funktion liefert einen wert zurück, der prozessor merkt sich den wert in einer temporären variable und vergleicht dann diese variable mit der zahl, die du hinter dem vergleich geschrieben hast ... deine lösung ist zu aufwändig, da immer wieder die funktion pollswitch benutz wird, radbruchs lösung hingegen ruft den wert ab, speichert ihn in einer definierten variable und vergleicht den wert der variable mit dem wert der im define steht
#define wird vom so genannten pre-compiler verarbeitet, bevor aus deinem programm ein maschienencode für den asuro wird, geht er über den gesamten text, sucht nach der zeichenkette "k6" zum beispiel und ersetzt diese durch die zeichenkette "PollSwitch()==1" in deinem beispiel
hallo Bongo1st
zu deinen Fragen:
k5, k6, k65 werden am anfang definiert:
ähnlich wie bei dirCode:#define k6 taste==1
#define k5 taste==2
#define k65 taste==3
char ist ein datentyp, genauso wie int (unsigned int), float,... aber ich glaube das steht sogar in der anleitung
char besteht aus 8 bit, kann also zahlen von 0-255 speicher.
das genügt in diesem fall, da die funktion PollSwitch() als rückgabetyp auch char hat.
ich hoffe, das beantwortet deine fragen, bei der letzten weiß ich jedoch nicht genau was du meinst
Genau, das meinte ich.Zitat:
Zitat von Ceos
So. Hab auch mal ne Frage hierzu.
Hier mein Code (Asuro kann hierbei halt noch ne Vierteldrehung, wenn ein äußerer Taster gedrückt wird, das ist das RECHTS2 bzw. LINKS2, sonst isses ziemlich gleich, Tasterkombinationen finde ich erstmal überflüssig, da das meiner Meinung nach sehr sehr selten zustandekommt):
Alles funktioniert super und passt auch, ABER nach einer Weile (manchmal 30s, manchmal auch 2-3 min) "hängt" der sich irgendwie auf. Der macht einmal gar nichts (nur grüne StatusLed leuchtet) oder fährt endlos im Kreis usw.Code:#include "asuro.h"
#define k6 taste==1
#define k5 taste==2
#define k4 taste==4
#define k3 taste==8
#define k2 taste==16
#define k1 taste==32
#define WARTEN1 for (i=0; i<500; i++) {Sleep(72);} //warten
#define WARTEN2 for (i=0; i<250; i++) {Sleep(72);} //warten
#define WARTEN3 for (i=0; i<125; i++) {Sleep(72);} //warten
#define VORWERTS BackLED(OFF,OFF); StatusLED(GREEN); MotorDir(FWD,FWD); MotorSpeed(180,180); FrontLED(ON);
#define RECHTS1 StatusLED(YELLOW); FrontLED(OFF); BackLED(ON,ON); MotorDir(RWD,RWD); MotorSpeed(200,200); WARTEN1; BackLED(ON,OFF); MotorDir(RWD,FWD); WARTEN2;
#define LINKS1 StatusLED(YELLOW); FrontLED(OFF); BackLED(ON,ON); MotorDir(RWD,RWD); MotorSpeed(200,200); WARTEN1; BackLED(OFF,ON); MotorDir(FWD,RWD); WARTEN2;
#define RECHTS2 StatusLED(RED); FrontLED(OFF); BackLED(ON,ON); MotorDir (RWD,RWD); MotorSpeed(200,200); WARTEN1; BackLED(ON,OFF); MotorDir(RWD,FWD); WARTEN3;
#define LINKS2 StatusLED(RED); FrontLED(OFF); BackLED(ON,ON); MotorDir(RWD,RWD); MotorSpeed(200,200); WARTEN1; BackLED(OFF,ON); MotorDir(FWD,RWD); WARTEN3;
int main(void)
{
char t1, t2, taste;
unsigned int i;
Init();
while(1)
{
t1=PollSwitch();
t2=PollSwitch();
if (t1 && (t1==t2))
{
taste=t1;
if(k6)
{RECHTS2}
else if (k5)
{RECHTS1}
else if (k4)
{RECHTS1}
else if (k3)
{LINKS1}
else if (k2)
{LINKS1}
else if (k1)
{LINKS2}
}
else VORWERTS;
}
return(0);
}
Ich bin noch ziemlich neu auf diesem Gebiet und wollte mal fragen, was da nicht passt. :-k
Ich habe mir nochmals zeitgenommen und das Programm überarbeitet. Jedoch leuchtet nun nur noch die StatusLED grün auf, ansonsten passiert nichts.
@Wrex
Ich denke es ist nicht ideal mein Programm als Vorlage zu nehmen, da ich meinen Asuro erst ne Woche habe. Jedoch ist es natürlich ein Lob =D>
Code:#include "asuro.h"
//Tasten
#define K6 taste==1 //Taste 6
#define K5 taste==2 //Taste 5
#define K4 taste==4 //Taste 4
#define K3 taste==8 //Taste 3
#define K2 taste==16 //Taste 2
#define K1 taste==32 //Taste 1
//Tasten Kombinationen
#define K65 taste==3 //Taste 6+5
#define K54 taste==6 //Taste 5+4
#define K43 taste==12 //Taste 4+3
#define K32 taste==24 //Taste 3+2
#define K21 taste==48 //Taste 2+1
#define K52 taste==18 //Taste 5+2
#define K5432 taste==30 //Taste 5+4+3+2
//Warten
#define WAIT1 for (i=0; i<1000; i++) {Sleep(72);} //1 Sekunde
#define WAIT2 for (i=0; i<400; i++) {Sleep(72);} //90 Grad-Kurve
//Fahrten
unsigned int i;
char t1,t2, taste;
void vorwerts (void)
{StatusLED (GREEN);
BackLED (ON,ON);
MotorDir (FWD,FWD);
MotorSpeed (124,120);}
void links (void)
{StatusLED (YELLOW);
BackLED (OFF,ON);
MotorDir (RWD,RWD);
MotorSpeed (124,120);
WAIT1;
MotorDir (FWD,RWD);
WAIT2;
MotorSpeed(0,0);
WAIT1; }
void rechts (void)
{StatusLED (RED);
BackLED (ON,OFF);
MotorDir (RWD,RWD);
MotorSpeed (124,120);
WAIT1;
MotorDir (RWD,FWD);
WAIT2;
MotorSpeed (0,0);
WAIT1;}
//Start
int main(void)
{
Init();
while (1)
{
t1 = PollSwitch();
t2 = PollSwitch();
if (t1 && (t1=t2))
{
taste=t1;
if (K6) {rechts;}
else if (K1) {links;}
}
else {vorwerts;}
}
return (0);
}
Vermutung: Dein asuro stürzt ab weil man Funktionen mit Klammern aufrufen muss:Zitat:
Jedoch leuchtet nun nur noch die StatusLED grün auf, ansonsten passiert nichts.
Code:if (K6) {rechts();}
else if (K1) {links();}
}
else {vorwerts();}
Das direkte Umschalten der Motordrehrichtung bei hoher MotorSpeed erzeugt möglicherweise Impulse die den asuro reseten. Oder Akkus leer/Wackler in der Spannungsversorgung (Ein/Aus-Schalter). Auf die Dauer ist es für den asuro eher ungesund immer gegen die Wand zu knallen! Ich habe sogar schon von rausgeschleuderten Mega8s gelesen....Zitat:
Alles funktioniert super und passt auch, ABER nach einer Weile (manchmal 30s, manchmal auch 2-3 min) "hängt" der sich irgendwie auf.
Gruß
mic
SUPER
Danke für die Hilfe, funkt jetzt einwandfrei. Habe die () übersehen ](*,)
Versuche nun das Program noch zu erweitern. Werde dann das vollendete Programm einstellen.
Ich werd mal ein wenig rumtesten. Bis jetzt is noch nichts raus- bzw. abgefallen! =P~ :)
Ich will mich mal net zu arg hier beteiligen, da ich doch noch wenig Ahnung hab, aber kann es sein, dass der Teil hier:
so sein muss?Code:if (t1 && (t1=t2))
Code:if (t1 && (t1==t2))