PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kollisionsprogramm



Couterfly
07.04.2008, 14:20
Hallo Programmiergemeinde

ich habe seit 1 woche mit dem programmieren des asuros begonnen und wollte heute ein programm entwerfen

der asuro soll vorwärts fahren bis er anstößt und dann etwa 2 sec rückwärts fahren um dann erneut nach vorne zu fahren

das programm von mir sieht so aus


#include "asuro.h"

void warten(unsigned char zeit);

int main(void)
{
//unsigned int i;
unsigned char taste;
unsigned int asd = 0;

Init();
MotorDir(FWD,FWD);
MotorSpeed(150,150);
warten(250);
while(1)
{

taste = PollSwitch();

if (taste!=0)
{
StatusLED(YELLOW);
warten(100);
asd = 1;
}

if(asd == 1)
{
StatusLED(GREEN);
MotorDir(RWD,RWD);
MotorSpeed(150,150);
warten(500);
MotorSpeed(0,0);
asd = 0;
}
else
{
StatusLED(RED);
MotorDir(FWD,FWD);
MotorSpeed(150,150);
}
}
return(0);
}

void warten(unsigned char zeit)
{
unsigned int i;
for (i = 0; i < zeit; i++)
{
Sleep(255);
}
}

jedoch der asuro fährt nach vorne und beginnt dann nur noch rücktwärts zufahren und das compilieren zeigt keine weitern fehler mehr an

mfg

jeffrey
07.04.2008, 15:16
hallo,
eigentlich sieht das ganz gut aus, ka woran das liegt. aber warum machst du 2 if abfragen? waum nicht den inhalt vov if asd==1 direkt da hin schreiben, wo asd=1 gesetzt wiird, und das else,zum ersten if.
mfg jeffrey

sloti
07.04.2008, 16:46
Probier mal aus dem if(asd == 1), else if (...) zu machen. Vielleicht liegt es daran.

mfg
Erik

Couterfly
07.04.2008, 17:46
danke
@jeffrey das 2 mal if war nur dazu da um die led direkt zu testen

ok und ich werd das ganze mal morgen durchgehen im praktikum

:-) cout

. . . . .
07.04.2008, 18:28
den fehler kenn ich du musst Pollswitch ungefähr 10 mal hintereinander in einer schleife abspielen und die ergebnisse speichern
und wenn sie alle gleich sind erst den befehl zum ausweichen geben

. . . . .
07.04.2008, 18:30
so in etwa:

for(i=0;i<10;i++)
taste[i]=PollSwitch();

if(taste[0] > 0 && taste[1] > 0 && taste[2] > 0 && taste[3] > 0 && taste[3] > 0 && taste[4] > 0 && taste[5] > 0 && taste[6] > 0 && taste[7] > 0 && taste[8] > 0 && taste[9] > 0){
... Source Code
}

hai1991
07.04.2008, 18:43
ich glaube 10 mal ist etwas übertieben, 2-3 mal müssten genügen

listner
07.04.2008, 18:50
anstatt:


taste = PollSwitch();

if (taste!=0)
{
StatusLED(YELLOW);
warten(100);
asd = 1;


würde ich so machen:



taste = PollSwitch();

if (taste!=0) && (PollSwitch()!=0))
{
StatusLED(YELLOW);
warten(100);
asd = 1;


da du die pollswitch funktion öfters aufrufen solltest!!!

so sollte es funktionieren!!



EDIT:
da war wohl hail schneller :P JA, 2 - 3 mal sollte reichen!! (bei 3 mal. einfach eine weitere Variable deklarieren, sie mit pollswitch gleichstellen und in der IF-Bedingung auffähren!)

Hardest
09.04.2008, 15:01
Der grund warum ein button öfters ausgeführt werden muss ist der, weil der Kondensator einwenig braucht bis er volläuft richtig?=

hai1991
09.04.2008, 15:37
hallo Hardest

ob der Kondensator auch eine so wichtige Rolle spielt weiß ich nicht, aber in einem anderen Tread (weiß leider nicht mehr welchem), steht, dass es hauptsächlich durch Spannungsspitzen, die von den Motoren verursacht werden, zu diesen falschen Werten bei PollSwitch() kommt

mfg hai1991

listner
09.04.2008, 18:54
^^ wie hai schon sagt

ein "asuro pro" hat meines wissens nach geschrieben, das es die mgl. gibt die kondensatoren einfach auslöten.. bzw abzwicken..

damaltor
09.04.2008, 21:48
ich habe den kondensaoter der parallel zu den tastern liegt (c6?c7? schaltplan!) entfernt. seitdem sind die ergebnisse besser.

allerdings muss nicht der taster öfter ausgelöst werden, sondern die funktion pollswitch öfter ausgeführt werden.

wölkchen
15.04.2008, 23:51
Hallo & Hilfe !
Ich bin noch ziemlich Neu auf diesem Gebiet und hab da mal ne Frage:
Was gibt mir PollSwitch eigentlich aus, wenn überhauptkeine Taste gedrückt ist? 0 ? Oder 1024 ? ...
Wenn ich die verschiedenen Schalter einzeln abfragen will, kann ich dann nicht schreiben


/*** Funktion Vorwaerts ***/
void MotorFwd(void)
{
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
Sleep(200);
}

/*** Funktion Motor Stop ***/
void MotorStop(void)
{
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
Sleep(200);
}


int main(void)
{
uint8_t t1, t2; //Variablen für PollSwitch
Init(); //Initialisieren
EncoderInit(); //Encoder initialisieren

while(1)
{
t1=0;
t2=0;

/*** Keine Taste -> Vorwärts fahren ***/
while (t1 == 0 && t2 == 0)
{
MotorFwd();
FrontLED(ON);
BackLED(OFF,OFF);
t1=PollSwitch;
t2=PollSwitch;
}

MotorStop();
Go(-40,speed);

/*** Fall 1 (Wand vorne rechts) ***/
if (t1 == t2 && t1 & 0x01)
{
Turn(-45,speed);
}

/*** Fall 2 (Wand vorne links ***/
else if (t1 == t2 && t1 & 0x1F)
{
Turn(45,speed);
}
...

Vielleicht kann mir einer helfen...

[/code]

Buggie
16.04.2008, 08:09
Hallo wölkchen,
schau mal genau auf die Warnings, wenn Du Dein Programm compilierst.
Da sollte irgendwas in der Art von
main.c:25: warning: initialization makes integer from pointer without a cast vorkommen.
Du weist nämlich an t1 und t2 die Adresse der Funktion PollSwitch() zu und nicht den Rückgabewert der Funktion.
In C/C++ sind die Klammern eines parameterlosen Funktionsaufrufes nicht optional. Ich glaube bei Basic geht sowas.
In C bekommst Du in diesem Fall einen Zeiger auf die Funktion, also ihre Adresse. Und die ist definitiv nicht 0 und wird auch über die gesamte Programmlaufzeit immer den gleichen Wert haben.
Es müsste also heissen:

...
BackLED(OFF,OFF);
// t1=PollSwitch; <-- das sind Zeiger auf die Funktion
// t2=PollSwitch; <-- ändern in die folgenden Zeilen
t1 = PollSwitch();
t2 = PollSwitch();
}

MotorStop();
...
Dann liefert Dir PollSwitch() auch wie gewünscht eine 0, wenn keine Taste gedrückt ist.

Couterfly
16.04.2008, 20:35
also in meinem programm was jetzt schon funktioniert gibt der pollswitch dann 1 aus wenn er gedrückt wird ansonsten 0

ich hab jedoch drei mal abfragen müssen dann klappts wunderbar und läuft wies soll

wölkchen
26.04.2008, 11:53
Hallo

Danke erst mal für die schnelle Antwort!
Ich hab meinen Code jetzt geändert, nur funktioniert das ganze immer noch nicht...

Also Dr.Asuro zeigt eigentlich den richtigen Wert, eine hohe Spannung (über 4V) und den Dezimalwert 1022 bzw. 1023.
Kann ich nicht irgendwie direkt auf diese Zahlen zuzugreifen ?
Ich muss nämlich gestehen, dass mir die Rechnung aus dem asuro.c ein Rätsel ist...

Gruß wölkchen

damaltor
29.04.2008, 21:58
zeig deinen aktuellen code nochmal her...