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
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
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
}
ich glaube 10 mal ist etwas übertieben, 2-3 mal müssten genügen
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!)
Der grund warum ein button öfters ausgeführt werden muss ist der, weil der Kondensator einwenig braucht bis er volläuft richtig?=
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
^^ 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]
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...
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.