PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programmfehler?



D1K0
27.01.2008, 10:55
Ich hab hier ein einfaches Programm geschrieben:
Der Asuro soll solange vorwärts fahren, bis ein Taster gedrückt wird, danach ~1s rückwärts und danach wieder vorwärts.^^ Ja, ist ein bisschen sinnlos, weil er immer wieder gegen die Wand knallt, aber ich wollte nur mal ein bisschen rumprobieren, wie das mit dem Programmieren beim Asuro so funktioniert.


#include "asuro.h"

int main(void)
{
while(1)
{
int Zaehler;
Init();
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(120,120);
if (PollSwitch() > 0)
{
MotorDir(RWD,RWD);
for (Zaehler = 0; Zaehler < 334; Zaehler++)
{
Sleep(216);
}
}
MotorDir(FWD,FWD);
}
return 0;
}

(Das MotorDir(FWD,FWD) ist vll nichtmal notwendig, aber:)

Wenn ich den Asuro einschalte, fährt er die ganze Zeit nur rückwarts.

LuZ
27.01.2008, 14:55
hi, ich hab dein programm mal getestet und mein asuro fährt auch rückwärts.
Auf den ersten blick hab ich keinen fehler gefunden und deswegen mal selbst versucht so ein programm zu schreiben, aber es tritt immer das selbe phänomen auf. Wenn man allerdings die for-schleife und die sleepfunktion weglässt, fährt er nur dann rückwärts, wenn tatsächlich ein Taster gedrückt ist. Also vermute ich dass es de for-schleife bzw. die sleepfunktion die pollswitch werte irgendwie beeinflusst. Warum weiß ich allerdings auch nicht. :(

mfg LuZ

Hansi41
27.01.2008, 15:00
hallo,
das liegt daran, dass du die poll-switch funktion wahrwscheinlich falsch programmiert hast,
du müsstest eine eigene variable deklarieren, z.B.
[unsigned char taste=0;]
und dann die funktion PollSwitch aufrufen:
[Init();
PollSwitch();
Sleep(255);
PollSwitch();
Sleep(255);]
dann die variable mit pollswitch verknüpfen:
[PollSwitch()=taste]
und dann schreibst du einfach:
[if (taste == 0) {
MotorDir(FWD,FWD);
MotorSpeed(250,250);}
else {MotorDir(RWD,RWD);
MotorSpeed(250,250);]

das ist ejtzt ein ganz einfaches programm, natürlicvh kannst du das noch verbessern uind dso, aber damit müsste das funktionieren
schau hier mal nach, da hab ich es glaube ic hschon einmal so in etwa erklärt:
https://www.roboternetz.de/phpBB2/viewtopic.php?p=347359#347359
naja ich hoffe ich konnte dir helfen
mfg hans[/code]

damaltor
27.01.2008, 15:32
nimm mal init(); und int Zaehler(); aus der while(1) schleife raus und schreib sie davor. hilft das?

hansi41: Bitte benutze den code-button!

Hansi41
27.01.2008, 15:46
das habe ich jetzt wirklich versucht!
ich habe zum Beispiel geschrieben:
[Init();]
aber es hat nicht funktioniert, was soll ich denn machen, ich bekommd as einfach nicht hin^^

damaltor
27.01.2008, 20:15
das ist ja auch nciht das ziel.... o0
schreibe VOR den GANZEN code-block:

[ code] (ohne das leerzeichen)
und hinter den ganzen code-block schreibst du

[ /code] (ebenfalls ohne das leerzeichen.

Hansi41
27.01.2008, 20:53
ah ok jetzt ists klar, ich versreche ich werde mich jetzt dran halten

LuZ
28.01.2008, 11:49
danke und wieder was dazugelernt :-)

D1K0
28.01.2008, 20:28
Sorry, aber ich konnte eure Ratschläge noch nicht ausprobieren, da mein Asuro im Moment irgendwie nicht richtig funktioniert und ich in den letzten 1,5 Tagen auch keine Zeit dafür hatte.^^
Die nächsten paar Tage wird das auch noch so sein. Ich wollte euch das nur mitteilen, damit ihr euch nicht wundert, warum ich nicht antworte.^^
Ich werde also wahrscheinlich erst Ende der Woche an dem Programm weiterbasteln können.

D1K0
01.02.2008, 20:55
Ok, das Problem ist gelöst.
Ich habe die PollSwitch()-Funktion mehrmals aufgerufen (wie hier (https://www.roboternetz.de/phpBB2/viewtopic.php?p=347359#347359) beschrieben).

Das sieht dann so aus (und es funktioniert perfekt^^):



#include "asuro.h"

int main(void)
{
Init();
while(1)
{
int zaehler;
unsigned char taster;
unsigned char vergleich;
taster = PollSwitch();
vergleich = PollSwitch();
MotorDir(FWD,FWD);
MotorSpeed(120,120);
if ((taster == vergleich)&&(vergleich > 0))
{
MotorDir(RWD,RWD);
for (zaehler = 0; zaehler < 334; zaehler++)
{
Sleep(216);
}

}
}
return 0;
}


Danke für die Tipps.