-         

Ergebnis 1 bis 9 von 9

Thema: Aktion für best. Zeit

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    15.11.2008
    Beiträge
    16

    Aktion für best. Zeit

    Anzeige

    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 , aber dann...

    Vielen Dank schon im Voraus,
    C-3PO

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    26.09.2008
    Ort
    Wien
    Alter
    31
    Beiträge
    94
    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.
    while (!asleep()) sheep++;
    RP6 und Asuro Befehlsübersicht

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    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

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    15.11.2008
    Beiträge
    16
    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 . Ich werde mir den Link so schnell wie möglich anschauen.

    Danke noch einmal und Gruß,
    C-3PO

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    03.09.2008
    Beiträge
    21
    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

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    26.09.2008
    Ort
    Wien
    Alter
    31
    Beiträge
    94
    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.
    while (!asleep()) sheep++;
    RP6 und Asuro Befehlsübersicht

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    15.11.2008
    Beiträge
    16
    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:

    Code:
    #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

  8. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    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) 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

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    15.11.2008
    Beiträge
    16
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •