PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro soll im Quadrat fahren



HyperGumba
16.06.2009, 21:50
Sorry falls falsches Forum,bin neu hier O:)

Wollte hier malnachfragen,ob das Prog,das asuro im quadrat fahren lassen soll,bei euch funktioniert,da mein Flasher im Augenblick defekt ist. Wollte ein kleines Feedbackhören,ob es funktioniert und falls nein,irgendwelche Problemlösungen bestehen. Ich will mich dabei aberauf Standards beschränken und möglicherweise auch Odometrie verwenden,wollte immer schon wissen wie esmt der funktioniert. Naja,hier jedenfalls das Prog,schaut es euch an und probiert es bitte aus:


#include "asuro.h"

void MotorBoth (void)
{
unsigned int i;
unsigned char j;
unsigned int speed;

MotorDir(FWD,FWD); //beide motoren geben gas

for (speed = 0; speed < 0xFF; speed ++) //schleife zur erhöhung der motorgeschwindigkeit
{
for (i = 0; i < 0x1FFF; i++) //schleifen damit zeit vergeht, ggf hexadezimale zahlen(0x1FFF und 0x1F) verringern um zeit zu verkürzen
for (j = 0; j < 0x1F; j++);
MotorSpeed(speed,speed);
}
}

void MotorRight (void)
{
unsigned int i;
unsigned char j;
unsigned int speed;

MotorDir(BREAK,FWD); //linker motor stoppt, rechter dreht vorwärts --> linkskurve

for (speed = 0; speed < 0xFF; speed ++) //schleife zur erhöhung der motorgeschwindigkeit
{
for (i = 0; i < 0x1FFF; i++) //schleifen damit zeit vergeht, ggf hexadezimale zahlen(0x1FFF und 0x1F) verringern um zeit zu verkürzen
for (j = 0; j < 0x1F; j++);
MotorSpeed(0,speed);
}
}

int main (void)
{
MotorBoth();
MotorRight();
MotorBoth();
MotorRight();
MotorBoth();
MotorRight();
MotorBoth();

return 0;
}


Bitte um Feedback,wäre schön,wenn es funktioniert wenn der neue Flasher hier ankommt :D[/code]

Sternthaler
01.07.2009, 19:27
Hallo HyperGumba,

erst einmal ein "Willkommen im Forum".

Dein Programm wird aus mehreren Gründen leider nicht funktionieren.

1) In deinem main() ist keine 'Endlosschleife' vorhanden.
Mindestens vor dem "return 0;" ein while(1); einbauen.

2) In beiden MotorXXX()-Funktionen erhöhst du die Geschwindigkeit von 0 an bis 0xFF.
Im Prinzip ist das OK, aber da die Motoren keinesfalls bei speed-Werten unter ca. 100 anfangen zu drehen, ist das 'hochfahren' von speed gefährlich solange die Motoren nicht schon drehen.
Vor allem wird ein Motor als erster drehen. Dann fährt der Asuro hübsch im Kreis bis endlich auch der andere Motor wirklich dreht. Dann aber ist die Richtung schon nicht mehr geradeaus und somit: "Wird nix mit Rechteck"
In der MotorRight()-Funktion wird das nicht auffallen, da ja sowiso nur ein Motor fahren soll.

3) In MotorRight() hast du keine richtige Kontrolle darüber, wie lange der Motor drehen wird (siehe bei 2). Somit hast du keine wirkliche Möglichkeit vorrauszubestimmen um wieviel sich der Asuro drehen wird.
90 Grad werden es wahrscheinlich nicht so schnell werden ;-(

4) Wenn du noch ganz viel Pech hast, dann wird dir der Compiler z.B. den Code
for (i = 0; i < 0x1FFF; i++)
for (j = 0; j < 0x1F; j++);
MotorSpeed(0,speed);komplett löschen, da absolut nichts passiert. Der Compile ist recht gut, wenn es darum geht zu optimieren.
Du kannst dies aber über eine Option im Makefile abschalten.


Mach dir nichts aus dieser Kritik. Ist ja schliesslich nicht an dir, sondern nur am Code ;-).

Gruß Sternthaler

P.S.: Tipps, um das besser zu machen, wirst du mit der Suchen-Funktion oben aus dem Kopf dieser Forumsseite ganz bestimmt finden können.