Code:
#include "asuro.h"
int main (void)
{
Init();
int x, c, n, r, k = 0, o;
int degree;
int distance;
int speed;
int speedd;
int sl, sr;
unsigned char speedl;
unsigned char speedr;
char emfangene_daten [1];
degree = 90;
distance = 500;
speed = 200;
o = 25;
do
{
for (x=0;x<50;x++)
{
r = x * 10;
c = PollSwitch();
sr = speed;
sl = speed;
switch (c)
{
// Tasten um zum ermitteln der Werte bestimmte Werte einzugeben.
// Problem mit unsigned char und int ???
case 1: SerPrint ("X (49 = Ende) Erste Zahl: \n\r: ");
SerRead (emfangene_daten, 1, 0);
x = emfangene_daten [0] * 10;
SerPrint ("X (49 = Ende) Zweite Zahl: \n\r: ");
SerRead (emfangene_daten, 1, 0);
x = x + emfangene_daten [0];
break;
case 2: SerPrint ("R (Winkelkalibrierung) Erste Zahl: \n\r: ");
SerRead (emfangene_daten, 1, 0);
r = emfangene_daten [0] * 10;
SerPrint ("R (Winkelkalibrierung) Zweite Zahl: \n\r: ");
SerRead (emfangene_daten, 1, 0);
r = r + emfangene_daten [0];
break;
case 4: SerPrint ("O (Streckenkalibrierung (~25)) Erste Zahl: \n\r: ");
SerRead (emfangene_daten, 1, 0);
o = emfangene_daten [0] * 10;
SerPrint ("O (Streckenkalibrierung (~25)) Zweite Zahl: \n\r: ");
SerRead (emfangene_daten, 1, 0);
o = o + emfangene_daten [0];
break;
case 8: SerPrint ("Winkel Erste Zahl: \n\r: ");
SerRead (emfangene_daten, 1, 0);
degree = emfangene_daten [0] * 10;
SerPrint ("Winkel Zweite Zahl: \n\r: ");
SerRead (emfangene_daten, 1, 0);
degree = degree + emfangene_daten [0];
break;
case 16:SerPrint ("Strecke Erste Zahl: \n\r: ");
SerRead (emfangene_daten, 1, 0);
distance = emfangene_daten [0] * 10;
SerPrint ("Strecke Zweite Zahl: \n\r: ");
SerRead (emfangene_daten, 1, 0);
distance = 10 * (distance + emfangene_daten [0]);
break;
case 32:SerPrint ("Geschwindigkeit Erste Zahl: \n\r: ");
SerRead (emfangene_daten, 1, 0);
sr = emfangene_daten [0] * 100;
SerPrint ("Geschwindigkeit Zweite Zahl: \n\r: ");
SerRead (emfangene_daten, 1, 0);
sl = emfangene_daten [0] * 10;
SerPrint ("Geschwindigkeit Dritte Zahl: \n\r: ");
SerRead (emfangene_daten, 1, 0);
speed = emfangene_daten [0] + sl + sr;
break;
}
sr = speed;
sl = speed;
r = x * 10;
if (speed > 255)
{
speed = 255;
}
if (speed < 0)
{
speed = 0;
}
if (distance >= 0)
{
MotorDir (FWD,FWD);
k = 1;
}
if (distance < 0)
{
MotorDir (RWD,RWD);
k = 2;
}
if (degree < 0)
{
speedd = degree * r / distance;
sl = speed + speedd;
sr = speed - speedd;
}
if (degree > 0)
{
speedd = degree * r / distance;
sl = speed - speedd;
sr = speed + speedd;
}
if (speedl > 255)
{
speedd = sl - 255;
sr = 255 - speedd;
sl = 255;
}
if (speedr > 255)
{
speedd = sr - 255;
sl = 255 - speedd;
sr = 255;
}
SerPrint ("\n\rX: ");
PrintInt (x);
SerPrint ("\n\rWinkel: ");
PrintInt (degree);
SerPrint ("\n\rWeg: ");
PrintInt (distance);
SerPrint ("\n\rGeschwindigkeit: ");
PrintInt (speed);
SerPrint ("\n\rGeschwindigkeit Rechts: ");
PrintInt (speedr);
SerPrint ("\n\rGeschwindigkeit Links: ");
PrintInt (speedl);
SerPrint ("\n\rC: ");
PrintInt (c);
SerPrint ("\n\rO: ");
PrintInt (o);
SerPrint ("\n\rR (Winkelkalibrierung): ");
PrintInt (r);
SerPrint ("\n");
if (c > 0) {Msleep (10000);}
speedr = sr;
speedl = sl;
n = distance * o / speed;
Msleep (200);
MotorSpeed (speedl,speedr);
for (c=0;c<n;c++) {Msleep (30);}
MotorSpeed (0,0);
Msleep (200);
if (k == 1)
{MotorDir (RWD,RWD);}
if (k == 2)
{MotorDir (FWD,FWD);}
MotorSpeed (speedl,speedr);
for (c=0;c<n;c++) {Msleep (30);}
MotorSpeed (0,0);
}
}
while (1);
return 1;
BackLED (ON,ON);
}
Ich hab die Zeit, also für die Distanz, auch in eine Schleife gesetzt, da es jetzt nicht bei einer bestimmten Zahl abbricht und wieso würdest du fload statt int nehmen? Ich hab das Problem, dass mein einer Motor schneller als der andere läuft und deshalb müsste noch eine Odemerie-messung mit eingebaut werden, oder man kann es im Programm am anfang Kallibrieren. Hat jemand eine Idee?
Lesezeichen