- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 8 von 8

Thema: Rp6 - Fährt nicht ?!?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    27.07.2010
    Ort
    Aachen ---- NRW
    Beiträge
    251
    Okay, das fahren klappt jetzt super! Danke Dirk!

    Aber der Servo bewegt sich nicht:

    Code:
    #include "RP6ControlLib.h" 	
    #include "RP6I2CmasterTWI.h"
    #include "RP6Control_I2CMasterLib.h"
    #include "RP6ControlServoLib.h" 
    
    void watchDogRequest(void)
    {
    	static uint8_t heartbeat2 = false;
    	if(heartbeat2)
    	{
    		clearPosLCD(0, 14, 1);
    		heartbeat2 = false;
    	}
    	else
    	{
    		setCursorPosLCD(0, 14);
    		writeStringLCD_P("#"); 
    		heartbeat2 = true;
    	}
    }
    
    
    void I2C_requestedDataReady(uint8_t dataRequestID)
    {
    	checkRP6Status(dataRequestID);
    }
    
    void I2C_transmissionError(uint8_t errorState)
    {
    	writeString_P("\nI2C ERROR - TWI STATE: 0x");
    	writeInteger(errorState, HEX);
    	writeChar('\n');
    }
    
    int main(void)
    {
    	initRP6Control();  
    	initLCD();
    	initSERVO(SERVO1); 
    
    	WDT_setRequestHandler(watchDogRequest); 
    	
    
    	I2CTWI_initMaster(100);  
    	I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady);
    	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
    
    	sound(180,80,25);
    	sound(220,80,25);
    
    	setLEDs(0b1111);
    
    	mSleep(500);
    
    	setLEDs(0b1111);
    
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_ACS_POWER, ACS_PWR_MED);
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT, true);
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT_RQ, true);
    
    	while(true) 
    	{ 
    		
    		 servo1_position = 50;
    		
    		move(60, FWD, DIST_CM(30), BLOCKING);
    		
    		servo1_position = 140;
    	    
    task_SERVO(); 
    	}
    	return 0;
    }
    Der zuckt nur kurz und dann fährt der Rp6 weiter.
    Am Servo liegt es nicht, da er in einem anderen Programm klappt.


    mfG
    Philip

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    @Philip:
    ... der Servo bewegt sich nicht
    Das liegt daran, dass die move-Funktion die while(true)-Schleife so lange blockiert, bis die Bewegung abgeschlossen ist.
    Die task_SERVO() braucht aber eine while(true)-Schleife, die permanent durchläuft und nur wenige ms dauert.

    Eine Lösung wäre, die move-Funktion nicht BLOCKING zu machen (also: move(60, FWD, DIST_CM(30), NON_BLOCKING) ) und direkt hinter der move-Funktion einzufügen:
    Code:
     while(!isMovementComplete()) 
     {
      task_checkINT0();
      task_I2CTWI();
      task_SERVO();
     }
    Damit wird in der Schleife auch gewartet, bis die Bewegung beendet ist, aber trotzdem werden die 3 wichtigen Tasks aufgerufen.
    Nicht getestet! Schlag mich nicht, wenn's nicht geht!
    Gruß
    Dirk

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    27.07.2010
    Ort
    Aachen ---- NRW
    Beiträge
    251
    Funktioniert aber (siehe code):
    Code:
    	while(true) 
    	{ 
    		
    			    servo1_position = 40;
    				move(60, FWD, DIST_CM(30), NON_BLOCKING); //wenn der Rp6 30cm gefahren soll der servo1 auf 150
    				 while(!isMovementComplete()) 
     {
      task_checkINT0();
      task_I2CTWI();
      task_SERVO();
     }
    	   	}
    	return 0;
    }
    Kannst du mir auch sagen wie das geht?


    mfG
    Philip

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    @Philip:
    Kannst du mir auch sagen wie das geht?
    Mit dem while-Block mache ich genau das Selbe, was in der Funktion move mit Parameter BLOCKING gemacht würde.

    Sieh dir die Funktion move oder rotate in der RP6Control_I2CMasterLib.c an!
    Am Ende dieser Funktionen findest du einen ganz ähnlichen while-Block, der nur dann aktiv ist, wenn man den BLOCKING Parameter benutzt hat. Er bewirkt, dass während die Funktion auf das Ende der Bewegung wartet, die wichtigen Tasks abgearbeitet werden.

    Genau das mache ich dann in deinem Hauptprogramm und habe noch die task_SERVO() in den while-Block aufgenommen.
    Gruß
    Dirk

Ähnliche Themen

  1. Asuru fährt nicht
    Von Fleix im Forum Asuro
    Antworten: 6
    Letzter Beitrag: 03.10.2010, 12:42
  2. RP6 fährt nicht gerade
    Von RP6 Noob im Forum Robby RP6
    Antworten: 11
    Letzter Beitrag: 04.07.2009, 06:31
  3. Asuro fährt nicht
    Von michaela w. im Forum Asuro
    Antworten: 5
    Letzter Beitrag: 22.10.2008, 16:32
  4. Robby fährt nicht!
    Von xythobuz im Forum Robby CCRP5
    Antworten: 10
    Letzter Beitrag: 28.02.2007, 19:14
  5. [ERLEDIGT] RP5 fährt nicht rückwärts
    Von Gast im Forum Robby CCRP5
    Antworten: 3
    Letzter Beitrag: 06.03.2004, 04:19

Berechtigungen

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

12V Akku bauen