- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 4 von 6 ErsteErste ... 23456 LetzteLetzte
Ergebnis 31 bis 40 von 53

Thema: erweiterte ASURO Bibliothek

  1. #31
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Anzeige

    Praxistest und DIY Projekte
    Hallo zusammen,

    @vogon: um aus asuro. c eine Bibliothek zu machen probier mal

    avr-ar -rv asuro.a asuro.o
    Es bringt aber wohl nichts, das Programm wird dadurch nicht kürzer.

    @maniac: Ich hatte schon mal vor einiger Zeit damit begonnen, die Asuro Bibliothek zu kommentieren. Dazu habe ich doxygen verwendet.

    http://www.stack.nl/~dimitri/doxygen/

    Das vorläufige Ergebnis ist auf meiner Asuro Wiki Page zu finden unter Programmierung.

    http://asuro.pytalhost.de/pmwiki/pmw...Programmierung

    Die neuen Funktionen sind allerdings auch noch nicht kommentiert.

    Gruß Peter

  2. #32
    Neuer Benutzer Öfters hier
    Registriert seit
    12.12.2005
    Ort
    Bremen
    Alter
    41
    Beiträge
    11

    Schwierigkeiten mit den Interrupts

    Hallo zusammen,

    ich verwende ebenfalls die erweiterte Lib (an dieser Stelle einmal vielen Dank dafür, dass ihr die zur Verfügung stellt) und habe dabei folgendes Problem:

    Da ich zur sauberen Geradeausfahrt den Encoder nutze, muss ich auch die Kollisionsabfrage über Interrupts durchführen (mit einefachen PollSwitch()-Aufrufen gehen mir Encoderticks verloren und der Asuro fährt unkontrollierte Kurven).

    Daher prüfe ich bei der Geradeausfahrt, ob switched gesetzt ist. Ist dies der Fall, so kann ich einfach zurücksetzen, drehen und weiterfahren (nach dem Zurücksetzen setze ich auch switched wieder auf 0 und führe StartSwitch() aus, damit es beim nächsten Mal wieder funktioniert). Soweit so gut - bis dahin läuft alles wie gewünscht.

    Kritisch wird es, wenn ich die Drehrichtung anhand der Taster auswählen möchte. Da die Interruptbehandlung nur das switched Flag setzt, muss ich den gedrückten Taster also explizit herausfinden. Dazu nutze ich der Einfachheit halber PollSwitch() - wenn der Asuro ohnehin angehalten hat, ist diese Funktion ja nicht mehr zeitkritisch und ich kann bequem die langsame AD-Konversion ausführen.

    Leider tritt hierbei das Problem auf, dass ab diesem Moment permanent Interrupts bei den Schaltern auftreten - sprich: sobald der Asuro fertig gedreht hat, stellt er fest, dass er schon wieder kollidiert ist (auch wenn das nicht der Fall ist).
    Ich habe zu diesem Problem schon eine ganze Weile im Datenblatt geblättert, muss aber etwas übersehen haben. Vielleicht hat ja jemand von euch dieselben Schwierigkeiten und einen Tipp parat, woran das liegen könnte (?). Wenn ja, würde ich mich über eine Antwort hier freuen.

    Gruß

    Ole

    P.S.: Zum Besseren Verständnis (und vielleicht selbst ausprobieren), füge ich hier mal meinen Code an.
    Code:
    /*******************************************************************************
     * File: drive.c
     * Project: Asuro
     * 
     * ------------
     * Description:
     * ------------
     * Implements a simple drive-behavior.
     * 
     * Features: - Move straight forward.
     *           - Step back, if we bump against an obstacle.
     *           - Turn left or right to aviod the obstacle.
     * -----------------------------------------------------------------------------
     * 
     * --------
     * History:
     * --------
     * Version |     Author     |    Date    |             Comments
     * --------+----------------+------------+--------------------------------------
     * 0.1     | Jan Ole Berndt | 11.12.2005 | Initial version.
     * 
     ******************************************************************************/
    
    #include "asuro.h"
    
    #define FORWARD 1
    #define STEP_BACK 2
    #define TURN_LEFT 4
    #define TURN_RIGHT 8
    
    #define BASE_SPEED 150
    
    int driveState = FORWARD;
    int turnDirection = TURN_LEFT;
    
    /*
     * Determines whether we have to stop the current move.
     */
    int Interrupted(void)
    {
    	return switched;
    }
    
    /*
     * Moves the robot straight forward.
     * This function is based on the Go()-function from the extended
     * asuro-library.
     */
    char Forward(int distance, int speed)
    {
    	int enc_count = 0;
    	int tot_count = 0;
    	int diff = 0;
    	int l_speed = speed, r_speed = speed;
    	enc_count=abs(distance);
    	
    	Encoder_Set(0,0);		// reset encoder
    
    	MotorSpeed(l_speed,r_speed);
    	MotorDir(FWD,FWD);
    
    	//As long, as we haven't moved as far as we should and are not forced
    	//to stop:
    	while(tot_count<enc_count && !Interrupted()) {
    		tot_count += encoder[LEFT];
    		diff = encoder[LEFT] - encoder[RIGHT];
    		if (diff > 0) { //Left faster than right
    			if ((l_speed > speed) || (r_speed > 244)) l_speed -= 10;
    			else r_speed += 10;
    		}
    		if (diff < 0) { //Right faster than left
    			if ((r_speed > speed) || (l_speed > 244)) r_speed -= 10;
    			else l_speed += 10;
    		}
    	Encoder_Set(0,0);		// reset encoder
    	MotorSpeed(l_speed,r_speed);
    	Msleep(1);
    	}
    	//If we are forced to stop:
    	if(Interrupted()){
    		MotorDir(BREAK,BREAK);
    		Msleep(200);
    	}
    	
    	return 0;
    }
    
    /*
     * Moves the robot in backward direction.
     */
    char StepBack()
    {
    	unsigned char switches = PollSwitch();
    	switches &= PollSwitch();
    	switches &= PollSwitch();
    	switches &= PollSwitch();
    	switches &= PollSwitch();
    	switches &= PollSwitch();
    	switches &= PollSwitch();
    	switches &= PollSwitch();
    	if(switches & 0x07)
    		turnDirection = TURN_LEFT;
    	else
    		turnDirection = TURN_RIGHT;
    	
    	Encoder_Init();
    	Go(-50,150);
    	switched = 0;
    	StartSwitch();
    	return 0;
    }
    
    /*
     * Turns the robot to the left.
     */
    char TurnLeft()
    {
    	Turn(-100,BASE_SPEED);
    	return 0;
    }
    
    /*
     * Turns the robot to the right.
     */
    char TurnRight()
    {
    	Turn(100,BASE_SPEED);
    	return 0;
    }
    
    /*
     * Returns the next state of the robot.
     */
    int NextState()
    {
    	if(driveState & STEP_BACK)
    		return turnDirection;
    	else if(Interrupted())
    		return STEP_BACK;
    	else
    		return FORWARD;
    }
    
    /*
     * Main function.
     * Determines the next state of the robot and calls the corresponding function.
     */
    int main(void)
    {
    	Init();
    	driveState = FORWARD;
    	Encoder_Init(); //Start Interrupt-handling for odometry.
    	StartSwitch(); //Start Interrupt-handling for switches.
    	while(1){
    		driveState = NextState();
    		switch(driveState){
    			case FORWARD:
    				Forward(500,BASE_SPEED);
    				break;
    			case STEP_BACK:
    				StepBack();
    				break;
    			case TURN_LEFT:
    				TurnLeft();
    				break;
    			case TURN_RIGHT:
    				TurnRight();
    				break;	
    		}
    	}
    	//if any error occures and we leave the loop above,
    	//stop the motors and enter stable state (do nothing).
    	MotorSpeed(0,0);
    	MotorDir(BREAK,BREAK);
    	StopSwitch();
    	Encoder_Stop();
    	while(1);
    	return 0;
    }

  3. #33
    Benutzer Stammmitglied
    Registriert seit
    01.12.2004
    Ort
    Buxtehude
    Beiträge
    70
    @Elendil

    Beim Übersetzten Deines Codes sind die Funktionen "Go" und "Turn" nicht definiert . Kannst Du die bitte noch nachliefern?
    Danke
    Weja

  4. #34
    Benutzer Stammmitglied
    Registriert seit
    01.12.2004
    Ort
    Buxtehude
    Beiträge
    70
    Ich glaub, ich hab das Problem schon vor längerer Zeit gelöst.
    Hier die meine modifizierte Start_Switch() Funktion, die den Spannungslevel für die Messung korrekt einstellt. Hier wird auch die Variable switched immer auf FALSE gesetzt. Das ist nun im Programm nicht mehr nötig.

    /* for working with Interrupt */
    void StartSwitch(void)
    {
    switched=0;
    DDRD |= SWITCHES; // Switches as Output
    SWITCH_ON; // Output HIGH for measurement
    Sleep(10); // Load high level
    SWITCH_OFF;
    DDRD &= ~SWITCHES; // Switches as Input => ext. Int 1
    MCUCR &= ~((1 << ISC11) | (1 << ISC10)); // Low level generates interrupt
    GICR |= (1 << INT1); // Enable external Interrupt 1
    }

    Bitte ersetze den Teil in der asuro.c
    Gruß
    Weja

  5. #35
    Benutzer Stammmitglied
    Registriert seit
    01.12.2004
    Ort
    Buxtehude
    Beiträge
    70
    Hallo roborookie,
    irgendwie hab Dein wichtiges posting verpasst und erst jetzt (nach 3 Monaten) gelesen, was mir wirklich leid tut.

    Die Asuro-Programmierung Lego-like zu machen ist ein bisschen schwierig.
    Die Kinder programmieren am Anfang LegoBots mit der Lego-Software.
    Wenn man nun darauf achtet, dass einzelne Steuerbefehle und nicht die vorgefertigten Makros verwendet werden, fällt dann der Umstieg nach NQC
    (C übersetzer fur Lego Firmware) oder Interactive C (eigene Firmware) nicht sehr schwer. Mit diesem Wissen gehts zum Asuro.
    Für den Asuro habe ich die Programmierumgebung für PN , mit Hilfe von Batch-Dateien so eingestellt, dass mit einem Mausklick das Programm compiliert, und wenn fehlerfrei, zum Asuro geschickt wird. Alle nicht mehr benötigten Dateien werden automatisch gelöscht. Für die Programme kann man beliebige Dateinamen verwenden. Die Make Datei wird im Hintergrund erzeugt.

    Gruß
    Weja

  6. #36
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    12.06.2005
    Ort
    Südwestdeutschland
    Beiträge
    1.142
    Blog-Einträge
    3
    Hallo weja,
    Turn und Go findet man normalerweise auf der Seite von m.a.r.v.i.n

    asuro.pytalhost.de/

    Dort kann man auch sehr schön verfolgen, wie sich Deine Lib weiterverändert hat. Irgendwie scheint die Seite aber gerade offline zu sein.

    Gruss,
    stochri

  7. #37
    Neuer Benutzer Öfters hier
    Registriert seit
    12.12.2005
    Ort
    Bremen
    Alter
    41
    Beiträge
    11
    @stochri: Jepp, genau von dort habe ich die Quellen auch.

    @weja: Vielen Dank. Das war der Missing Link, den ich noch brauchte.

    Werde mal schauen, vielleicht kann ich ja auch ein paar Dinge der Lib hinzufügen, wenn ich etwas weiter gekommen bin - aber als nächstes folgt jetzt erstmal die Sache mit der IR-Schnittstelle...

    Gruß

    Ole

  8. #38
    Neuer Benutzer
    Registriert seit
    03.12.2005
    Ort
    Kreuzlingen
    Alter
    58
    Beiträge
    2

    Asuro interuptfähige PollSwitch() fnk

    Ich habe mich ausgiebig mit der PollSwitch fnk auseinander gesetzt. Das Ergebnis ist eine interuptfähige PollSwitch() fnk. Meine Frage nun, wer ist der Maintainer dieser lib, gibt es einen Subversion/cvs Server?
    Weitere Anfrage: Warum habt ihr den TimerCounter von 72 auf 36 KHZ umgestellt?
    Ich bin zuerst von der orginal asuro lib ausgegangen und habe diverse änderungen selbst angebracht.
    Angehängte Dateien Angehängte Dateien

  9. #39
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    12.06.2005
    Ort
    Südwestdeutschland
    Beiträge
    1.142
    Blog-Einträge
    3
    Hallo Achill,
    eigentlich gibt es keinen richtigen Maintainer dieser Lib. M.a.r.v.i.n hat mal angefangen, das ganze etwas schöner zu dukumentieren.
    Es wäre nicht schlecht, wenn man eine zentrale Stelle finden könnte. Sourceforge vielleicht ? Wie man das ganze angeht weiss ich aber leider nicht. Ich habe noch nie mit CVS gearbeitet.
    Es wäre schon interessant, in die Lib ein wenig mehr Ordnung zu bringen und als Open Source Projekt irgendwo zu hosten.

    Gruss,
    stochri

  10. #40
    Benutzer Stammmitglied
    Registriert seit
    01.12.2004
    Ort
    Buxtehude
    Beiträge
    70
    Hallo Achill, Stochri,
    ich würde es auch prima finden, wenn in die ganze Sache mal ein bisschen Ordnung käme. Die Seite von M.a.r.v.i.n ist scheinbar nicht erreichbar und in meiner Version ist der Timer noch auf 72khz. Ich hab auch noch nie ein CVS benutzt. Wer kann das in die Hände nehmen ?

    Gruss Weja

Seite 4 von 6 ErsteErste ... 23456 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress