- SF800 Solar Speicher Tutorial         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 25

Thema: Testprogramm läuft nicht

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    19.04.2009
    Beiträge
    18
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Habe jetzt mal das Beispiel EXAMPLE_02_UART_02 angeschaut.

    Mein Testprogramm habe ich auch entsprechend umgeschrieben, und es läuft:

    Code:
    #include "RP6RobotBaseLib.h"
    
    int main(void)
    {
    	initRobotBase();
    	powerON();
    	char receiveBuffer[5];
    	writeString_P("Programm gestartet!\n");
    	while(true)
    	{
    		receiveBytes(5);
    		waitUntilReceptionComplete();
    		copyReceivedBytesToBuffer(&receiveBuffer[0]);
    		if(receiveBuffer[0] == 'H' && receiveBuffer[1] == 'e' && receiveBuffer[2] == 'l' && receiveBuffer[3] == 'l' && receiveBuffer[4] == 'o')
    		{
    			writeString_P("Hi!\n");
    		}
    	}
    }
    Allerdings muss es doch eine weniger umständliche Art geben um einen eingegebenen Text mit einem anderen zu vergleichen, als jeden Buchstaben einzeln zu überprüfen?

    Gibt es vielleicht sowas wie eine String-Funktion?

  2. #12
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    40
    Beiträge
    1.516
    Habe ich ja oben schon genannt - strcmp. Und alle anderen sonstigen üblichen C Standard Funktionen gibt es natürlich auch (s. avrlibc doku)
    Du musst aber schauen ob in dem Buffer nicht noch ANDERE Zeichen reingeraten sind - also lass dir mal den Inhalt zeichen für zeichen (auch als Zahl mit writeInteger) ausgeben!

    MfG,
    SlyD

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    19.04.2009
    Beiträge
    18
    Folgender Code:

    Code:
    #include "RP6RobotBaseLib.h"
    
    int main(void)
    {
    	initRobotBase();
    	powerON();
    	setACSPwrHigh();
    	void RC5_COMMAND(RC5data_t rc5data)
    	{
    		if(rc5data.device == 10)
    		{
    			moveAtSpeed(0,0);
    		}
    	}
    	void ACS_EVENT_HANDLER(void)
    	{
    		if(obstacle_left || obstacle_right)
    		{
    			changeDirection(RIGHT);
    			writeString_P("!\n");
    			while(true)
    			{
    				if(!obstacle_left && !obstacle_right)
    				{
    					changeDirection(FWD);
    					break;
    				}
    			}
    		}
    	}
    	ACS_setStateChangedHandler(ACS_EVENT_HANDLER);
    	IRCOMM_setRC5DataReadyHandler(RC5_COMMAND);
    	moveAtSpeed(45,45);
    	task_motionControl();
    	while(true)
    	{
    		task_motionControl();
    		task_ACS();
    	}
    }
    funktioniert nicht so wie er soll.

    Der Roboter sollte wenn er auf ein Hindernis stößt rechts abbiegen und bei Druck eines beliebigen Knopfs auf der Fernbedienung stehen bleiben.

    Allerdings rollt er immer gerade weiter, egal ob ein Hindernis vor ihm ist oder ich einen Knopf auf der Fernbedienung drücke.

  4. #14
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.04.2009
    Beiträge
    523
    Wie wärs wenn du dich erst mal mit den grundlegenden Dingen der C-Syntax beschäftigst...

  5. #15
    Neuer Benutzer Öfters hier
    Registriert seit
    19.04.2009
    Beiträge
    18
    Zitat Zitat von Fabian E.
    Wie wärs wenn du dich erst mal mit den grundlegenden Dingen der C-Syntax beschäftigst...
    Den C-Crashkurs aus dem RP6-Manual habe ich durch, das sollte doch langen, oder?

  6. #16
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.04.2009
    Beiträge
    523
    Naja du könntest dir mal überlegen, wo man eigene Methoden implementiert... Jedenfalls nicht in der Main-Methode...Sondern außerhalb davon.

    Fabi

  7. #17
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    40
    Beiträge
    1.516
    Mal abgesehen von den Funktionen in einer Funktion (sowas sollte man wirklich nicht tun wenn man nicht weiss was man tut ) ist Dein Problem hier eher dass die Event Handler nicht blockieren dürfen.

    Sehr ähnlich zu diesem Verständnisproblem hier:
    https://www.roboternetz.de/phpBB2/viewtopic.php?t=48028


    Lass das mit den Event Handlern lieber erstmal bleiben und mach alles in der Hauptschleife... das ist einfacher zu überblicken.

    MfG,
    SlyD

  8. #18
    Neuer Benutzer Öfters hier
    Registriert seit
    19.04.2009
    Beiträge
    18
    Der Quellcode sieht jetzt so aus:

    Code:
    #include "RP6RobotBaseLib.h"
    
    /*void RC5_COMMAND(RC5data_t rc5data)
    {
    	if(rc5data.device == 10)
    	{
    		moveAtSpeed(0,0);
    	}
    }
    void ACS_EVENT_HANDLER(void)
    {
    	if(obstacle_left || obstacle_right)
    	{
    		changeDirection(RIGHT);
    		writeString_P("!\n");
    		while(true)
    		{
    			if(!obstacle_left && !obstacle_right)
    			{
    				changeDirection(FWD);
    				break;
    			}
    		}
    	}
    }*/
    
    int main(void)
    {
    	initRobotBase();
    	powerON();
    	setACSPwrHigh();
    	/*ACS_setStateChangedHandler(ACS_EVENT_HANDLER);
    	IRCOMM_setRC5DataReadyHandler(RC5_COMMAND);*/
    	moveAtSpeed(45,45);
    	task_motionControl();
    	while(true)
    	{
    		task_motionControl();
    		task_ACS();
    		if(rc5data.device == 10)//Wenn eine Taste auf der Fernbedienung gedrückt wird, ...
    		{
    			moveAtSpeed(0,0);//...dann hält der Robter an.
    		}
    	}
    }
    Die Event Handler sind wie man sehen kann auskommentiert.

    Allerdings spuckt der Compiler drei Errors aus:

    Test2.c:40: error: 'rc5data' undeclared (first use in this function)
    Test2.c:40: error: (Each undeclared identifier is reported only once
    Test2.c:40: error: for each function it appears in.)

    Edit: Mir fällt gerade auf, dass das ganze nur 1 Error ist, der in 3 Zeilen ausgegeben wird.

    Edit 2: Ok, das Problem habe ich mit Hilfe folgender Codezeile gelöst:

    Code:
    RC5data_t rc5data;
    Edit 3: Der Roboter reagiert trotzdem nicht auf Tastendrücke =(

  9. #19
    Neuer Benutzer Öfters hier
    Registriert seit
    19.04.2009
    Beiträge
    18
    Als ich mir den Roboter auf der Digicam angeschaut habe, ist mir aufgefallen, dass die IR-LEDs garnicht leuchten, obwohl in der Ausführungsschleife task_ACS(); drinsteht.

    Edit: Habe das Problem dank folgendem Aritkel schon selber gelöst:

    http://www.mikrocontroller.net/artic...mit_Interrupts

    Der Roboter reagiert jetzt auf die Fernbedienung.

  10. #20
    Neuer Benutzer Öfters hier
    Registriert seit
    19.04.2009
    Beiträge
    18
    Das mit dem fernsteuern funktioniert jetzt einwandfrei, allerdings funktioniert das ACS nicht.(Der Roboter reagiert überhauptnicht auf Hindernisse.)

    Hier der Quellcode:

    Code:
    #include "RP6RobotBaseLib.h"
    
    uint8_t rc5command;
    uint8_t obstrue;
    uint8_t SPEEDset;
    
    void RC5_COMMAND(RC5data_t rc5data)
    {
    	rc5command = rc5data.key_code;
    }
    /*void ACS_EVENT_HANDLER(void)
    {
    	if(obstacle_left || obstacle_right)
    	{
    		changeDirection(RIGHT);
    		writeString_P("!\n");
    		while(true)
    		{
    			if(!obstacle_left && !obstacle_right)
    			{
    				changeDirection(FWD);
    				break;
    			}
    		}
    	}
    }*/
    
    void ACS_EVENT_HANDLER(void)
    {
    	obstrue = 1;
    }
    
    int main(void)
    {
    	initRobotBase();
    	powerON();
    	setACSPwrHigh();
    	/*ACS_setStateChangedHandler(ACS_EVENT_HANDLER);*/
    	IRCOMM_setRC5DataReadyHandler(RC5_COMMAND);
    	uint8_t SPEED = 45;
    	
    	while(true)
    	{
    		task_motionControl();
    		task_ACS();
    		
    		if(rc5command > 0)
    		{
    			switch(rc5command)
    			{
    				case 32: // Vorwärtstaste
    					changeDirection(FWD); //Vorwärtsfahren
    					break;
    				case 33: //Rückwärtstaste
    					changeDirection(BWD); //Rückwärtsfahren
    					break;
    				case 17: //Volume -
    					changeDirection(LEFT);
    					break;
    				case 16: //Volume +
    					changeDirection(RIGHT);
    					break;
    				case 34: //SFI
    					if(SPEED < 160)
    					{
    						SPEED += 10; //Geschwindigkeit erhöhen
    					}
    					break;
    				case 47: //Swap
    					if(SPEED > 10)
    					{
    						SPEED -= 10; //Geschwindigkeit erniedrigen
    					}
    					break;
    				case 12: //OFF-Taste (Funktioniert noch nicht richtig)
    					SPEEDset = 0;
    					if(SPEED > 0) //Wenn Geschwindigkeit > 0
    					{
    						SPEED = 0;//setze Geschwindigkeit auf 0
    						SPEEDset = 1;
    					}
    					else if(SPEED == 0 && SPEEDset == 0)//Wenn Geschwindigkeit gleich 0
    					{
    						SPEED = 45;//Setze Geschwindigkeit auf 45
    					}
    			}
    			moveAtSpeed(SPEED,SPEED);
    			task_motionControl();
    			rc5command = 0;
    			if(obstrue == 1)
    			{
    				changeDirection(RIGHT);
    				task_motionControl();
    				mSleep(100);
    				changeDirection(FWD);
    			}
    		}
    	}
    }

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress