PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie lass ich die Motoren langsam anfahren?



raptor_79
18.02.2008, 00:31
hallo.
gleich vorweg, ich fang mit c grad an, und darum hab ich nicht so den peil.
sonst hab ich avrs mit bascom geproggt.
den asuro hab ich mir mal wegen c gekauft. und jetzt ein kleines problem.

ich will daß er langsam anfährt. leider geht das nicht so wie ich mir das vorstellt. es funktioniert so halb. leider "pulst" er die motoren.

hier mal das programm, damit ihr mir meinen fehler sagen könnt,

danke!!




#include "asuro.h"

unsigned int spd;

int main(void){

Init();

//------- Programmschleife --------
while (1){
if (PollSwitch()>0) {
MotorSpeed(0,0);
StatusLED(RED);
MotorDir(RWD,RWD);
spd=90;
MotorSpeed(spd,spd);
}

else {

//------ Kein Hindernis -------
StatusLED(GREEN);
if (spd<255) {
MotorDir(FWD,FWD);
for (spd=1; spd<=255; spd=spd+1) {
MotorSpeed(spd,spd);
Sleep(100);
}
}
else {
}
}
}

while (1);
return 0;


}


hab schon einiges geändert und umgebastelt. leider alles mit dem ähnlichen ergebnis.

wenn mir da mal einer bitte meinen fehler erklären könnte.... DANKE!!

harry3
18.02.2008, 02:04
Wenn kein Hindernis erkannt wird geht das Programm in die for Schleife, erhöht die Geschwindigkeit, und verlässt danach die for Schleife mit Geschwindigkeit=255. Beim nächsten Durchlauf der while Schleife wird wieder kein Hindernis erkannt - es wird wieder in die for Schleife gesprungen, die mit spd=1 initialisiert wird. Was passiert? Asuro wird abgebremst, langsam erhöht sich die Geschwindigkeit wieder auf 255.

Lass die for Schleife weg, und platziere das Sleep außerhalb aller if/else Abfragen.

H3llGhost
18.02.2008, 21:21
Hallo raptor_79,

hier dein modifiziertes Programm:



#include "asuro.h"

unsigned int spd;

int main(void){

Init();

//------- Programmschleife --------
while (1){
if (PollSwitch()>0) {
if (PollSwitch()>0)
{
MotorSpeed(0,0);
StatusLED(RED);
MotorDir(RWD,RWD);
spd=90;
MotorSpeed(spd,spd);
msleep(1500); //1,5 sekunden rückwärts
MotorSpeed(0,0);
}
}

else {

//------ Kein Hindernis -------
StatusLED(GREEN);
MotorDir(FWD,FWD);
if (spd<255) {
spd++;
}
else {
spd = 1;
}
MotorSpeed(spd, spd);
}
}

return 0;

}


Ich hoffe das hilft dir weiter.
Bei Fragen einfach melden ... ;)

harry3
18.02.2008, 21:42
@H3llGhost: Eine Zeitverzögerung fehlt(im else Zweig), sonst laufen die Motoren schlagartig wieder mit Vollgas.

radbruch
18.02.2008, 22:01
StatusLED(GREEN);
MotorDir(FWD,FWD);
if (spd<255) {
spd++;
}
else {
spd = 1;
}
MotorSpeed(spd, spd);

Und das funktioniert? Bei 8MHz jagt spd auf 255 und startet dann wieder bei 1?

Diese verschachtelten PollSwitch() sind doch Unsinn! Wirklich richtig ist nur das mehrfache Einlesen und Vergleichen der Tastenwerte:


unsigned char t1,t2;
t1=PollSwitch();
t2=PollSwitch();
if ((t1 == t2) && ( t1 > 0)) {


msleep(1500); //1,5 sekunden rückwärts
Wir sollten für Einsteiger erstmal bei der orginalen Library bleiben:

unsigned int i;
for(i=0; i<500; i++) Sleep(72); // 1/2 Sekunde Verzögerung

Gruß

mic

H3llGhost
18.02.2008, 23:03
Hallo radbruch,

eigentlich wollte ich das auch mit dem Vergleichen der Tastenwerte machen, aber irgendwie kam ich nicht auf die Idee von dir ...
Das hatten wir erst am Donnerstag in der Schule ... :D

Stimmt ...
Der 8MHz ist ja relativ schnell ...
Habe ich nicht dran gedacht ... xD
Bin ja bis jetzt auch noch ein Anfänger würde ich sagen ... ;)

harry3
18.02.2008, 23:29
Man kann auch eine Funktion für die Kollissionstaster verwenden, die einem die richtigen Werte zurückliefert.


unsigned char fkt_taster(void)
{
unsigned char taster=0;

taster=PollSwitch();

if(taster==PollSwitch() && taster!=0)
return taster;
else
return 0;
}

radbruch
19.02.2008, 01:04
Hallo


Bin ja bis jetzt auch noch ein Anfänger würde ich sagen ...
Schon klar, aber gerade als Anfänger würde ich nie ungeprüften (= auf dem eigenen asuro getestet) Code abliefern. Obwohl ich mich inzwischen seit über einem Jahr mit dem asuro beschäftige mache ich das auch nur sehr selten (und es geht auch meist schief).

Natürlich kann man auch eine Funktion basteln oder die Tasten als Menu mit Case auswerten:


#include "asuro.h"

unsigned char t1, t2;
int main(void){
Init();
while(1)
{
t1=PollSwitch();
t2=PollSwitch();
if (t1 == t2) switch(t1){
case 1: BackLED(OFF,ON); break;
case 32: BackLED(ON,OFF); break;
case 4: StatusLED(YELLOW); break;
case 8: StatusLED(GREEN); break;
case 2: MotorSpeed(0,150); break;
case 16: MotorSpeed(150,0); break;
case 18: FrontLED(ON); MotorSpeed(150,150); break;
default: BackLED(OFF,OFF); FrontLED(OFF); \
StatusLED(RED); MotorSpeed(0,0); break;
} // Ende if/switch
} // Ende Main
return 0;
}

Oje, wir driften wieder ins OffTopic..


#include "asuro.h"

unsigned char t1, t2;
unsigned int loop_count;

int main(void){
Init();
loop_count = 0;
while(1)
{
t1 = PollSwitch();
t2 = PollSwitch();
if (t1 && (t1 == t2))
{
MotorDir(RWD,RWD);
MotorSpeed(100,200);
for(t1=255; t1; t1--) Sleep(127);
MotorSpeed(0,0);
MotorDir(FWD,FWD);
loop_count=0;
}
if (loop_count < 2000)
{
loop_count = loop_count + 1;
MotorSpeed(loop_count/10,loop_count/10);
}
} // Ende Mainloop
return 0;
}

... und sind wieder drin *grins*

Gruß

mic

raptor_79
19.02.2008, 20:55
DANKE leute!!!!

macht einfach spaß dieses forum... wegen den leuten...

werd das mal testen. leider ist meine zeite gerade etwas knapp.

werd dann morgen oder übermorgen mal ein ergebnis abliefern.

war mit einer variante des programms sooo knapp vor der lösung. hatte es auch fast so.

also, danke noch mal.