PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro fährt fast immer mit 255



Problem
16.12.2010, 20:43
Hallo

Irgendwas wiederspricht sich da


#include <stdbool.h>
#include <stdio.h>
#include <asuro.h>
int main(void)
{
Init();
char aC[2];


bool tanzen = true;
bool B = true;//(Beschleunigung)

int LANG = 0,z = 0,y = 0,t = 0,gas = 0,a = 50;
/************************************************** *****************************************/
while( 1 )
{
LANG=LANG+2;
gas=gas+1;



if (tanzen == true)
{
MotorSpeed(120,120);
if((gas > 0) && (gas < 5 ))
MotorDir(FWD,RWD);
if((gas > 5) && (gas < 15))
MotorDir(RWD,FWD);
if((gas > 15) && (gas < 20))
MotorDir(FWD,RWD);
if((gas > 20) && (gas < 30))
MotorDir(FWD,FWD);
if((gas > 30) && (gas < 35))
MotorDir(RWD,FWD);
if((gas > 35) && (gas < 45))
MotorDir(FWD,RWD);
if((gas > 45) && (gas < 50))
MotorDir(RWD,FWD);
if((gas > 50) && (gas < 60))
MotorDir(RWD,RWD);
if (gas > 60)
gas=0;
}

if (tanzen == false)
MotorSpeed(0,0);
/************************************/

if(B == true)
{
MotorDir(FWD,FREE);
MotorSpeed(a,0);
a=a+5;
if(a > 255)
a = 255;
}

if(B == false)
MotorDir(FREE,FREE);




utoa (z, aC, 10); //Übertragen
SerWrite(aC, 2); //Übertragen
SerWrite (" z\n\r", 5); //Übertragen
for (t=0; t< 120; t++) //Übertragen
{ //Übertragen
Sleep (72); //Übertragen
} //Übertragen

utoa (a, aC, 10); //Übertragen
SerWrite( aC, 12); //Übertragen
SerWrite (" a\n\r", 8); //Übertragen
for (t=0; t< 120; t++) //Übertragen
{ //Übertragen
Sleep (72); //Übertragen
} //Übertragen


y++;
if (y > 5)
z++;
if (y > 5)
y=0;


if ((z > 0) && (z < 8))

tanzen = true;

if ((z > 8) && (z < 12))
B = true;


if (z > 15)
z=0;


}
return 0;
}



Er beschleunigt auf 255 hält die geschw immer auch wenn lang > 30 (also es wieder bei 0 beginnt)ist fährt er noch mit 255) // km/h O:)


Könnt ihr mir da helfen?

Lg O:)

shedepe
16.12.2010, 21:25
Ich vermute, dass dein Programm so schnell ausgeführt wird, dass die Motoren nicht hinterherkommen und das Ansteuerungssignal die meiste Zeit 255 beträgt.
Au0erdem fragst du die Variable LANG doch nirgends im Programm ab, wie soll er darauf reagieren können.

TobiKa
16.12.2010, 21:26
Habs nur kurz überflogen...
a gibt die Geschwindigkeit an und wird mit a=a+5 hochgezählt und durch if(a > 255) a = 255; auf 255 begrenzt, aber an keiner Stelle im Programm wieder aus Null gesetzt.

Valen
16.12.2010, 23:36
Habs nur kurz überflogen...
a gibt die Geschwindigkeit an und wird mit a=a+5 hochgezählt und durch if(a > 255) a = 255; auf 255 begrenzt, aber an keiner Stelle im Programm wieder aus Null gesetzt.Ich stimme zu. "a" wird nirgends in dein Programm wieder kleiner.

Das war einfach zu finden in dein Programm. Aber du verwendest 5 Zahler die durcheinander erhöht werden. Verstehst du noch was das alles macht und in welcher folge das geht? Ich nicht mehr! Könntest du das nicht vereinfachen?

Problem
17.12.2010, 18:46
Ja

Ich habe es jetzt so geändert


#include <stdbool.h>
#include <stdio.h>
#include <asuro.h>
int main(void)
{
Init();
char aC[2];


bool tanzen = true;
bool B = true;//(Beschleunigung)

int z = 0,y = 0,t = 0,gas = 0,a = 50;
/************************************************** *****************************************/
while( 1 )
{

gas=gas+1;



if (tanzen == true)
{
MotorSpeed(120,120);
if((gas > 0) && (gas < 5 ))
MotorDir(FWD,RWD);
if((gas > 5) && (gas < 15))
MotorDir(RWD,FWD);
if((gas > 15) && (gas < 20))
MotorDir(FWD,RWD);
if((gas > 20) && (gas < 30))
MotorDir(FWD,FWD);
if((gas > 30) && (gas < 35))
MotorDir(RWD,FWD);
if((gas > 35) && (gas < 45)) // gas
MotorDir(FWD,RWD);
if((gas > 45) && (gas < 50))
MotorDir(RWD,FWD);
if((gas > 50) && (gas < 60))
MotorDir(RWD,RWD);
if (gas > 60)
gas=0;
}

if (tanzen == false)
MotorSpeed(0,0);
/************************************/

if(B == true)
{
MotorDir(FWD,FREE);
MotorSpeed(a,0);
a=a+5;
if(a > 255) //zähler a
a = 255;
}

if(B == false)
MotorDir(FREE,FREE);

/************************************/


utoa (z, aC, 10); //Übertragen
SerWrite(aC, 2); //Übertragen
SerWrite (" z\n\r", 5); //Übertragen
for (t=0; t< 120; t++) //Übertragen
{ //Übertragen
Sleep (72); //Übertragen
} //Übertragen Zähler t

utoa (a, aC, 10); //Übertragen
SerWrite( aC, 12); //Übertragen
SerWrite (" a\n\r", 8); //Übertragen
for (t=0; t< 120; t++) //Übertragen
{ //Übertragen
Sleep (72); //Übertragen
} //Übertragen
/************************************************** *****************/

y++;
if (y > 5)
z++;
if (y > 5)
y=0;


if ((z > 0) && (z < 8))

tanzen = true; //Zähler y und z

if ((z > 8) && (z < 12))
B = true;


if (z > 15)
z=0;


}
return 0;
a = 0;
}


Alles gleich geblieben

Lg

shedepe
17.12.2010, 19:09
Dein Problem mit a bleibt aber bestehen, da B = true ist

radbruch
17.12.2010, 19:49
Hallo

Ich war mal so frei und habe deinen Code umformatiert. Ich kann das einfach nicht ertragen wie du uns hier quälst. Selbstverständlich darf jeder so programmieren wie er will und mein Stil ist sicher auch nicht der vorbildlichste. Die Bools habe ich wieder rausgeschmissen, weil sie dir offensichtlich nicht weiterhelfen und du sie auch nicht verstanden hast. Wichtigstes neues Hilfsmittel ist die if ... else if- Anwendung:


#include <stdio.h>
#include <asuro.h>

#define false 0 // quick&dirty!
#define true 1

int main(void)
{
Init();
char aC[2];

unsigned char tanzen = true;
unsigned char Beschleunigung = true;

int z = 0, y = 0, t = 0, gas = 0, a = 50;

while( 1 )
{
gas=gas+1;

if (tanzen)
{
MotorSpeed(120,120);

if(gas < 5 )
MotorDir(FWD,RWD);
else if(gas < 15)
MotorDir(RWD,FWD);
else if(gas < 20)
MotorDir(FWD,RWD);
else if(gas < 30)
MotorDir(FWD,FWD);
else if(gas < 35)
MotorDir(RWD,FWD);
else if(gas < 45)
MotorDir(FWD,RWD);
else if(gas < 50)
MotorDir(RWD,FWD);
else if(gas < 60)
MotorDir(RWD,RWD);
else gas=0;
}
else MotorSpeed(0,0);

if(Beschleunigung)
{
MotorDir(FWD,FREE);
MotorSpeed(a,0);
a=a+5;
if(a > 255)
a = 255;
}
else MotorDir(FREE,FREE);

utoa (z, aC, 10);
SerWrite(aC, 2);
SerWrite (" z\n\r", 5);
for (t=0; t< 120; t++)
Sleep (72);

utoa (a, aC, 10);
SerWrite(aC, 12);
SerWrite (" a\n\r", 8);
for (t=0; t< 120; t++)
Sleep (72);

if (z < 8)
tanzen = true;
else if (z < 12)
Beschleunigung = true;

y++;
if (y > 5)
{
y=0;
z++;
if (z > 15)
z=0;
}
}
return 0;
a = 0; // ???
}


Wenn ich beim Editieren (1,5Std!) keinen Fehler gemacht habe, sollte es wieder (fast) genau die selbe Funktion haben wie dein aktueller Code. Zur Übung könnest du hier mal erklärende Kommentare einfügen und die oben gemachten Änderungsvorschläge einbauen.

Gruß

mic

Problem
18.12.2010, 08:43
Danke

Aber wo soll ich jetzt a auf null stellen weil er macht das gleiche wie bei meinen Programm

Valen
18.12.2010, 11:31
"return 0;" soll das Allerletzte Befehl in den Funktion main sein. Danach a auf 0 stellen hat gar keinen Sinn. Es soll jedenfals innerhalb der while-Schleife stehen. Aber wo genau ist abhängig von dein Wunsch in welcher Situation. Da haben wir keinen Ahnung von. Wir haben bis jetzt noch gar keinen Beschreibung bekommen was dein Asuro tun soll. Nur das es Beschleunigt.

Problem
19.12.2010, 10:19
Ja

Also er soll zuerst "tanzen" und wenn er damit fertig ist soll er auf einen rad beschleunigen.

Lg

Valen
19.12.2010, 12:03
Also wieder verzögern ist nicht nötig? Dann ist es kein Problem das a gleich bleibt an 255.

radbruch
19.12.2010, 12:38
Ungetestet:

#include <stdio.h>
#include <asuro.h>

#define false 0 // quick&dirty!
#define true 1

int main(void)
{
Init();
char aC[2];

unsigned char tanzen = false;
unsigned char Beschleunigung = false;

int z = 0, y = 0, t = 0, gas = 0, a = 50;

while( 1 )
{
if (z < 8) // Tanzen?
{
tanzen = true;
Beschleunigung = false;
}
else if (z < 12) // oder beschleunigen?
{
tanzen = false;
Beschleunigung = true;
}
else // oder nixtun?
{
tanzen = false;
Beschleunigung = false;
}

if (tanzen) // Wir tanzen den Gastanz
{
MotorSpeed(120,120);
if(gas < 5 )
MotorDir(FWD,RWD);
else if(gas < 15)
MotorDir(RWD,FWD);
else if(gas < 20)
MotorDir(FWD,RWD);
else if(gas < 30)
MotorDir(FWD,FWD);
else if(gas < 35)
MotorDir(RWD,FWD);
else if(gas < 45)
MotorDir(FWD,RWD);
else if(gas < 50)
MotorDir(RWD,FWD);
else if(gas < 60)
MotorDir(RWD,RWD);
else gas=0;
gas=gas+1;
}

if(Beschleunigung) // Linker Antrieb bis 255 beschleunigen
{
MotorDir(FWD,FREE);
MotorSpeed(a,0);
a=a+5;
if(a > 255)
a = 255;
}
else // keine Beschleunigung
{
MotorDir(FREE,FREE); // bedeutet bremsen
a=50; // und a auf Startwert setzen
}

utoa (z, aC, 10); // debugen
SerWrite(aC, 2);
SerWrite (" z\n\r", 5);
for (t=0; t< 120; t++)
Sleep (72);

utoa (a, aC, 10);
SerWrite(aC, 12);
SerWrite (" a\n\r", 8);
for (t=0; t< 120; t++)
Sleep (72);

y++; // Zähler weiterschalten
if (y > 5)
{
z++;
y=0;
if (z > 15)
z=0;
}
}
return 0;
}


So könnte ich mir die Funktion des Programms vorstellen.

Gruß

mic

Problem
20.12.2010, 20:42
Danke

Ich habe das jetzt getestet aber a ist immer 50

Lg

Problem
20.12.2010, 21:07
Hallo

Hier eine spanende Frage:

Mein Code:


if ((z > 0) && (z < 8))

B = true;


if ((z > 8) && (z < 12))

tanzen = true;
a = 0;

Wenn ich das Programm so teste ist motorspeed auch von [0 - 8] 0 aber es steht ja nur bei [8-12]

Wieso?

Wenn ich a = 0 weglase ist es von [0-8] nicht 0
Lg

radbruch
20.12.2010, 21:08
Bist du sicher dass a immer 50 ist? Bei 48 Runden "tanzen" (z=0 bis z=7 jeweils y von 0 bis 5) sollten 48 mal die 50 für a am Terminal ausgegeben werden. Dann erst folgt die Beschleunigung mit 24 Runden, wieder gefolgt von 24 mal 50 in der Pause. Dann startet der Zyklus erneut.

Valen
20.12.2010, 21:13
Hallo

Hier eine spanende Frage:

Mein Code:


if ((z > 0) && (z < 8))

B = true;


if ((z > 8) && (z < 12))

tanzen = true;
a = 0;

Wenn ich das Programm so teste ist motorspeed auch von [0 - 8] 0 aber es steht ja nur bei [8-12]

Wieso?

Wenn ich a = 0 weglase ist es von [0-8] nicht 0
LgDas Befehl "a=0;" gehört nicht zu den if-Befehl das oben es steht. Es ist ein 'Einzelgänger'. Und macht a immer gleich an 0. Damit a=0 wird wann z>8 UND z<12 ist solltest du die befehlen danach zwischen {} klammern schreiben.


if ((z > 0) && (z < 8)) B = true;


if ((z > 8) && (z < 12))
{ tanzen = true;
a = 0;
}

Problem
21.12.2010, 13:39
Ach ich bin ein .................

Ist klar wenn ich die Klammer nicht mache gilt es nur für den nächsten befehl und der ist mit ; zu ende

Ist mir schon klar

Dann werde ich weiter progen und versuchen es hinzubekommen

Danke

Problem
21.12.2010, 16:36
So das funkt jetzt
Noch eine Frage


if ((z > 0) && (z < 8))

B = true;


if ((z > 8) && (z < 12))

{tanzen = true;
a = 0;}

kann es sein das er wegen a = 0 die motoren auch von [8-12] auf 0 schaltet obwohl ich oben bei if tanzen .. true MotorSpeed(120,120); angegeben habe ???

Lg