Archiv verlassen und diese Seite im Standarddesign anzeigen : Aktion für best. Zeit
Hallo alle zusammen,
ich hab da mal ne Frage zu ASUROs Programmierung ich möch te, dass der ASURO eine Linie langfährt, und für eine bestimmte Zeitauf der linie zurück fährt, dann wieder Vorwärts usw.
Kann mir einer sagen, wie das mit der bestimmten Zeit klappt??? Mit der for-Schleife geht das ja nicht... Das mit der Linie und der Kollision klappt ja alles :cheesy: :cheesy: :cheesy: , aber dann... ](*,)
Vielen Dank schon im Voraus,
C-3PO
Linie = gerade Linie oder meinst du ein eine "geschwungene" und der Asuro soll mittels Linienfolge nachfahren?
Falls es nur um gerade vor oder zurück geht, mach es mit Sleep();
Ansonsten gehts glaube ich nicht, ausser vielleicht über die Odometrie (indem du gewisse Schwarz-Weiss Counts bei einer gewissen Geschwindigkeit zählst und (natürlich vorher kalibiriert) so die Zeit bestimmen kannst.
Natürlich geht das.
Du musst dafür nur einen Timer entsprechend konfigurieren, den Timer beim Start der Rückwärtsfahrt anschmeißen und bei einem Output Compare Match die Rückwärtsfahrt stoppen. Wenn das jetzt böhmische Dörfer für Dich sind, lies Dir mal im AVR-Datenblatt das Kapitel über Timer bzw. die Artikel dazu im Wiki durch. Timer gehören zur wichtigsten Peripherie, die ein µC zu bieten hat.
Gruß,
askazo
Hallo alle zusammen,
vielen Dank erstmal für eure Hilfe. Wie schon von askazo gesagt:
Wenn das jetzt böhmische Dörfer für Dich sind
habe ich keine Ahnung was er da meint, sonst hätte ich ja auch nicht gefragt :cheesy: :cheesy: :cheesy: . Ich werde mir den Link so schnell wie möglich anschauen.
Danke noch einmal und Gruß,
C-3PO
luckylukas92
03.12.2008, 21:08
wenn du wirklich KEINE ahnung hast was er meint würde ich erstma klein anfangen und das ganze mit nem sleep() realisieren ich hab auch ein linienverfolgungsprogramm bei dem er an ner bestimmten stelle zurückfahren muss...
mit:
timewait(unsigned int t) // millisekundenwert als t eingeben
{
unsigned int pause;
for (pause=0; pause<t; pause++) // 1 millisekunde Pause
{ Sleep (72);
}
}
funktioniert das eigentlich ganz gut...
mfg lukas
Danke askazo, wieder etwas gelernt. Keine Ahnung weshalb, aber ich war der festen Überzeugung uCs können keine "Threads" bzw. andere Dinge parallel zu nem Programm abfragen/vergleichen/zählen.
Hallo alle zusammen,
ich versuche, das Problem nun anders (und auch wesentlich sinnvoller) zu lösen, indem ich mit der odometrie arbeite. Mein Ziel ist nämlich, das der asuro eine linie lang fährt, dann auf ein Hinderniss trifft, einige Zentimeter zurück fährt und dann um das Hinderniss herum fährt, um schließlich wieder auf die Linie zurückzukehren.(Ich wollte mit der Zeiteinstellung die Odometrie erst umgehen). Mit dem Prog. binn ich bis jetzt soweit, dass der Asuro die linie entlang fährt, auf das Hinderniss trifft und (eigentlich) ca. eine Reifenumdrehung zurückfahren soll. Nur tut er letzteres nicht. Er fährt die Linie lang und wenn man die Tater drückt, tut er, solange man sie gedrückt hält, gar nichts. Ich verwende Folgendes Programm:
#include "asuro.h" //P//LINIENVERFOLGUNG
#define LINIENWERT //D//
//folgende werte müssen ggf.
//verändert werden!!!
#define SCHWELLENWERT 600 //D//GRENZE ZWISCHEN HELL UND DUNKEL FESTLEGEN
#define HYSTERSIS 10 //D//WERT ZUR VORBEUGUNG VON STÖRUNGEN
//die hier nicht mehr!!!
#define LOW 0 //D//-}\WERTE ZUR ÜBERPRÜFUNG, OB SCHON EIN
#define HIGH 1 //D//-}/WECHSEL STATTGEFUNDEN HAT, FESTLEGEN
int main(void) //V//PROZESSOR IN GRUNDZUSTAND VERSETZEN
{
unsigned int status[2]={0,0}; //V//SPEICHER FÜR "HAT WECHSEL STSTTGEFUNDEN?"
unsigned int odata[2]; //V//SPEICHER FÜR GEBERSCHEIBENZUSTAND
unsigned int counter[2]={0,0}; //V//SPEICHER ZUM ZÄHLEN DER GEBERSCHEIBEN-IMPULSE
unsigned int ldata[2]; //V//SPEICHER FÜR LINIENFOLGE BEREITSTELLEN
unsigned char t1; //V//SPEICHER FÜR KOLLISIONSTASTER BEREITSTELLEN
unsigned char t2; //V//VERGLEICHSSPEICHER FÜR KOLLISIONSTASTER BEREITSTELLEN
Init(); //S//START DES PROGRAMMS
FrontLED(ON); //A//LINIENFOLGE-LED AN
MotorDir(FWD,FWD); //A//MOTOREN AUF VOR
while(1) //E//ENDLOSSCHLEIFE:
{
t1=PollSwitch(); //A//TASTENABFRAGE
t2=PollSwitch(); //A//VERGLEICHSTASTENABFRAGE
if(t1==t2&&t1==0) //?//WENN KEINE TASTE GEDRÜCKT
{ //!//(MIT VERGLEICH MIT t2 ZUR SICHERSTELLUNG DER RICHTIGKEIT t2s)
LineData(ldata); //://LINIENFOLGE-DATEN EINLESEN
if(ldata[0]>ldata[1]) //:?/WENN LINKS HELLER ALS RECHTS,
{MotorDir(FWD,FWD); //://BEIDE MOTOREN AUF VORWÄRTS
MotorSpeed(150,0); //://LINKS MEHR GAS
StatusLED(RED);} //://UND STATUS LED ROT;
else //:?/SONST:
{MotorDir(FWD,FWD); //://BEIDE MOTOREN AUF VORWÄRTS
MotorSpeed(0,150); //://RECHTS MEHR GAS
StatusLED(GREEN);} //://UND STATUS LED GRÜN
} //://KOLLISIONANWEISUNG SCHLIEßEN
else{ //!?/wENN KOLLISION
MotorSpeed(0,0); //!//MOTOREN ANHALTEN
MotorDir(RWD,RWD); //!//MOTOREN AUF RÜCKWÄRTS
LineData(ldata); //!//LINIENFOLGE-DATEN EINLESEN
while(counter<40) //!//SOLANGE DURCHFÜHREN,BIS COUNTER 40 IMPULSE
{ //!// 40 IMPULSE ANALOG 1REIFENUMDREHUNG ERREICHT HAT
OdometrieData(odata); //!//ODOMETRIEWERTE EINLESEN
if(status[0]==LOW&&odata[0]>SCHWELLENWERT+HYSTERSIS)
//!//HAT WECHSEL DER GEBERSCHEIBENFARBE
{ //!//VON SCHWARZ AUF WEIß STATTGEFUNDEN ???
counter[0]++; //!//ZÄHLER EINEN IMPULS HOCHSETZEN
if(ldata[0]>ldata[1]) //!?/WENN LINKS HELLER ALS RECHTS,
{MotorSpeed(0,150); //!//LINKS MEHR GAS (RÜCKWÄRTS)
BackLED(OFF,OFF); //!//VORIGEN ZUSTAND DER BACK_LED`S ZURÜCKSETZEN
BackLED(ON,OFF);} //!//UND LINKE BACK-LED AN;
else //!?//SONST:
{MotorSpeed(150,0); //!/RECHTS MEHR GAS (RÜCKWÄRTS)
BackLED(OFF,OFF); //!//VORIGEN ZUSTAND DER BACK_LED`S ZURÜCKSETZEN
BackLED(OFF,ON);} //!//UND RECHTE BACK-LED AN;
} //!//WECHSEL?-ANWEISUNG SCHLIEßEN
if(status[0]==HIGH&&odata[0]<SCHWELLENWERT-HYSTERSIS)
//!//HAT WECHSEL DER GEBERSCHEIBENFARBE
{ //!//VON WEIß AUF SCHWARZ STATTGEFUNDEN ???
counter[0]++; //!//ZÄHLER EINEN IMPULS HOCHSETZEN
if(ldata[0]>ldata[1]) //!?/WENN LINKS HELLER ALS RECHTS,
{MotorSpeed(0,150); //!//LINKS MEHR GAS (RÜCKWÄRTS)
BackLED(OFF,OFF); //!//VORIGEN ZUSTAND DER BACK_LED`S ZURÜCKSETZEN
BackLED(ON,OFF);} //!//UND LINKE BACK-LED AN;
else //!?//SONST:
{MotorSpeed(150,0); //!/RECHTS MEHR GAS (RÜCKWÄRTS)
BackLED(OFF,OFF); //!//VORIGEN ZUSTAND DER BACK_LED`S ZURÜCKSETZEN
BackLED(OFF,ON);} //!//UND RECHTE BACK-LED AN;
} //!//WECHSEL?-ANWEISUNG SCHLIEßEN
} //!//counter-anweisung geschlossen, wenn counter<40 ist,
//!//kehre zu while(counter<40) zurück, ansonsten mache
//!// in Reihenfolge weiter
} //!//WENN KOLLISION-ANWEISUNG ZU ENDE
} ////Wieder von vorne, ENDE ENDLOSSCHLEIFE
return 0; ////return(0)
} ////PROGRAMM ENDE
Über schnelle Antwort würde ich mich freuen!!!
Viele Grüße,
C-3PO
radbruch
12.12.2008, 17:13
Hallo
Beim Kompilien erhalte ich folgende Meldung:
temp.c: In function `main':
temp.c:45: warning: comparison between pointer and integer
In Zeile 45 steht folgendes:
while(counter<40) //!//SOLANGE DURCHFÜHREN,BIS COUNTER 40 IMPULSE
Hier sollte wohl besser counter[0] stehen.
In der Zählschleife wird status[0] nicht gesetzt/getoggelt:
...
counter[0]++;
if(status[0]==HIGH) status[0]=LOW; else status[0]=HIGH;
...
Vor
OdometrieData(odata);
sollte man die BackLEDs ausschalten und kurz warten/zweimal einlesen um die OdoLEDs einzuschalten und "vorzuglühen":
BackLED(OFF,OFF);
OdometrieData(odata);
OdometrieData(odata);
Da ich die Rangfolge der Operatoren (kann man googlen (http://www.google.com/search?hl=en&safe=off&q=c+rangfolge+der+operatoren)) nicht sicher auswendig weiß setze ich lieber Klammern (die überflüssigen streicht der Kompiller selbständig):
if((status[0]==LOW) && (odata[0] > (SCHWELLENWERT+HYSTERSIS)))
Gruß
mic
Hallo radbruch,
vielen dank erstmal für die schnelle Antwort.
Leider hat dein Verbesserungsvorschlag nicht geklappt, er hatte nur den Nebeneffekt zur Folge, das die Front und Status LED ab und zu nach dem Start rot aufleuchten und gar nichts mehr geht. Aber um auf das mit dem counter[0] zurückzukommen, ich musste auch schon countrer mit [2] als Variable festlegen, sonst wurden mir Fehler ausgegeben.
Gruß,
C-3PO
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.