PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : kommunikationsproblem



Mk1.12.91
25.04.2010, 13:50
hallo
ich möchtemeinem asuro beibringen je nach taste auf der tastaur einen anderen modus auszuführen also ein anderes programm ab zu spielen
die inzelnen programme habe ich auch zusammenkopiert nur leider speichert sich die gedrückte taste nicht in der variable daten

--später will ich das noch mit vb ergänzen
aber erstmal sollte es mit ht funktionieren ....

ich hoffe ihr könnt mir helfen ...
hier der quellcode:


# include "asuro.h"
# define sin_d(x) (sin((x)*M_PI/180))
int main(void)
{
Init();


char Ende=1;
char DatenEmpfangen=1;
int r=100;
int l=100;
int g=45;
int h;
int helligkeit=100;
int u=150;
int v=100;
int i;
const int DAUERGELB1=500;
const int DAUERGELB2=1000;
const int DAUERGRUEN=5000;
const int DAUERROT=3000;

unsigned char LINIE='1';
unsigned char ABGRUND='2';
unsigned char AMPEL='3';
unsigned char KREIS='4';
unsigned char ECK='5';
unsigned char FF='6';
unsigned char STOPP='0';

unsigned char Winkel;
unsigned char Geschwindigkeit=100;
unsigned char Distanz;
unsigned char Radius=100;
unsigned char p;
unsigned int n[1];
unsigned char N;
unsigned char daten[1];
unsigned int info;
unsigned int data[2];
unsigned int end[1];
unsigned char E;

EncoderInit();
LineData(data);


while(1)
{
beginn:
if(DatenEmpfangen == 1 && Ende == 1)
{
SerRead(&daten, 1, 0);
info = daten;
Ende=0;
StatusLED(YELLOW);
if(info == '1')
{
SerWrite("Zeichen empfangen !!\r\n",25);
}
}
else if(Ende == 0)
{
//Linie:L
if(info == LINIE)
{
while(Ende == 0)
{
LineData(data);
StatusLED(GREEN);

if(data[0]<data[1])
{
BackLED(OFF,ON);
r=r+g;
l=l-g;
MotorDir(FWD, FWD);
MotorSpeed(l, r);
}

if(data[1]<data[0])
{
BackLED(ON,OFF);
l=l+g;
r=r-g;
MotorDir(FWD, FWD);
MotorSpeed(l, r);
}

if(data[1]=data[0])
{
MotorDir(FWD, FWD);
MotorSpeed(l, r);
}
l=100;
r=100;
SerRead (&end, 1, 1);
E=end[0];
if(E == STOPP)//STOPP
{
Ende=1;
DatenEmpfangen=1;
}
}
}

//Abgrund:G
else if(info == ABGRUND)
{
while(Ende == 0)
{
LineData(data);
StatusLED(GREEN);


if((data[0]>helligkeit && data[1]>helligkeit) || Ende == 1)
{
StatusLED(RED);
Msleep(1);
MotorDir(FWD, FWD);
MotorSpeed(BREAK, BREAK);
}
else
{
StatusLED(GREEN);
MotorDir(FWD, FWD);
MotorSpeed(u, u);
}
SerRead (&end, 1, 1);
E=end[0];
if(E == STOPP)//STOPP
{
Ende=1;
DatenEmpfangen=1;
}
}

}

//Ampel:A
else if(info == AMPEL)
{
while(Ende == 0)
{
StatusLED(GREEN);
for(i = 1; i<=40; i++) //Initialisierung; Bedingung; Reinitialisierung
{
StatusLED(RED);
Msleep (DAUERROT);
StatusLED (YELLOW);
Msleep (DAUERGELB1);
StatusLED (GREEN);
Msleep (DAUERGRUEN);
StatusLED (YELLOW);
Msleep (DAUERGELB2);

}

BackLED(OFF, OFF);
StatusLED(GREEN);
Ende=1;
DatenEmpfangen=1;
}
}

//Kreis:K
else if(info == KREIS)
{
while(Ende == 0)
{
StatusLED(GREEN);
MotorDir(FWD, FWD);
MotorSpeed(200, 100);
Msleep(6000);
SerRead (&end, 1, 1);
E=end[0];
if(E == STOPP)//STOPP
{
Ende=1;
DatenEmpfangen=1;
}
}
Ende=1;
DatenEmpfangen=1;
}

//n-Eck:N
else if(info == ECK)
{
StatusLED(YELLOW);
SerRead(&n, 1, 1);
N=n[0];
Winkel=(N-2)+180;
p=N;
Distanz=(sin(Winkel))*Radius;
StatusLED(GREEN);
for(p; p<N;p++)
{
GoTurn(Distanz, Winkel, Geschwindigkeit);
}
SerRead (&end, 1, 1);
E=end[0];
if(E == STOPP)//STOPP
{
Ende=1;
DatenEmpfangen=1;
}
}

//Feuerwehr:F
else if(info == FF)
{
p=0;
StatusLED(GREEN);
for(p; p<100; p++)
{
StatusLED(RED);
BackLED(OFF, ON);
MotorDir(FWD, FWD);
MotorSpeed(200, 200);
Msleep(300);
BackLED(ON, OFF);
MotorSpeed(200, 200);
SerRead (&end, 1, 1);
E=end[0];
if(E == STOPP)//STOPP
{
Ende=1;
DatenEmpfangen=1;
MotorSpeed(0, 0);
StatusLED(OFF);
BackLED(OFF, OFF);
}
}
MotorSpeed(0, 0);
StatusLED(OFF);
BackLED(OFF, OFF);
Ende=1;
DatenEmpfangen=1;
}
else
{
}
}
else
{
goto beginn;
}
}

while(1);
return(0);
}

Thund3r
25.04.2010, 14:34
Hallo

Ich mach das in der main methode inetwa so:


...
while(1)
{
int b,c;
if(c==0) // Wenn Zählvariabel noch nicht übernommen wurde s.u.
{
if(PollSwitch()==2 && PollSwitch()==2) b++; //Drücke diese Taste erhöhe Variabel
if(PollSwitch()==4 && PollSwitch()==4) b--; //Drücke diese Taste verkleiner Variabel
if(b<=1) b=1; // damit die Variabel nicht kleiner als 1 wird
if(PollSwitch()==8 && PollSwitch()==8) c=b; // Wenn die Taste gedrückt wird wir die Variable zur Auswahl übernommen
Sleep(200);Sleep(200);Sleep(200);Sleep(200);Sleep( 200);
}
if(PollSwitch()==16 && PollSwitch()==16) {b=1;c=0;} //Beende Methode bzw setze wieder alles auf 0
if(c==1) Methode1(); // Wenn zB Zahl 1 ausgewählt wurde
if(c==2) Methode2(); // Wenn zB Zahl 2 ausgewählt wurde
if(c==3) Methode3(); // Wenn zB Zahl 3 ausgewählt wurde
...
}
...

Kurz : Wenn man zB 3 mal den 2er Taster drückt und dann mit dem 8ter Taster bestätigt wird das (vorher bestimmte zu der Zahl zugeordnete) Programm ausgeführt. Mit dem 16er Taster wird wieder alles zum Ursprung gebracht. 2er Taster um Variabel zu erhöhen und 4er Taster um zu verkleiner (nicht <1 möglich)

(Benutze ich so bei meinem RP6 beim Asuro noch nicht getestet)

Gruß Thund3r

Mk1.12.91
25.04.2010, 14:54
danke für den vorschlag aber eig meinte ich eie taste auf der tastatur ...

Thund3r
25.04.2010, 15:03
Hallo

Kannst du ja auch für die Tastatur Taster umschreiben^^

Gruß Thund3r