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

Thema: neuer Eventhandler

  1. #1

    neuer Eventhandler

    Anzeige

    Praxistest und DIY Projekte
    Ich gebe dem RP6 über die Kommunikationsschnittstelle einen Rotate-Befehl und möchte diesen unterbrechen können, wenn ich ihm den nächsten Befehl "stop" sende. Ist das möglich?
    Zur Zeit bekommt er den "stop"-Befehl erst, wenn der Rotate-Befehl komplett abgearbeitet ist. Kann man irgendwie einen neuen Eventhandler einbauen oder gibt es einen anderen Weg zur Lösung?
    Hier ist der Code:
    Code:
    #define MOVE_SPEED 100
    #define TURN_SPEED 40
    
    uint16_t tENCL_min_l_time = 0;
    uint16_t tENCL_min_h_time = 0;
    uint16_t tENCL_max_l_time = 0;
    uint16_t tENCL_max_h_time = 0;
    
    uint16_t tENCR_min_l_time = 0;
    uint16_t tENCR_min_h_time = 0;
    uint16_t tENCR_max_l_time = 0;
    uint16_t tENCR_max_h_time = 0;
    
    void runRobot(void)
    {
    	
    
    	uint16_t pwm_tmp = 0;
    	uint16_t pwm = 0;
    	uint8_t turn_direction = LEFT;
    	uint8_t move_direction = FWD;
    	uint8_t move_or_rotate = 0;
    
    	powerON();
    	setMotorDir(FWD,FWD);
    	moveAtSpeed(0,0);
    	startStopwatch1();
    	startStopwatch2();
    	setMotorPower(pwm,pwm);
    	mSleep(500);
    	writeString("runRobot\n");
    	clearReceptionBuffer();
    	while(true)
    	{
    		
    		if(getInputLine())
    		{
    			if(strcmp(receiveBuffer,"end")==0 || strcmp(receiveBuffer,"x")==0)
    			{
    			    writeString_P("\nEND\n");
    				break;
    			}
    			else if(strcmp(receiveBuffer,"fwd")==0)
    			{
    			    writeString_P("\nACK\n");
    				writeString_P("\nChange direction: FWD\n");
    				setMotorDir(FWD,FWD);
    				move_direction = FWD;
    				move_or_rotate = 1;
    			}
    			else if(strcmp(receiveBuffer,"bwd")==0)
    			{
    			    writeString_P("\nACK\n");
    				writeString_P("\nChange direction: BWD\n");
    				setMotorDir(BWD,BWD);
    				move_direction = BWD;
    				move_or_rotate = 1;
    			}
    			else if(strcmp(receiveBuffer,"l")==0)
    			{
    			    writeString_P("\nACK\n");
    				writeString_P("\nChange direction: Left\n");
    				setMotorDir(BWD,FWD);
    				turn_direction=LEFT;
    				move_or_rotate = 2;
    			}
    			else if(strcmp(receiveBuffer,"r")==0)
    			{
    			    writeString_P("\nACK\n");
    				writeString_P("\nChange direction: Right\n");
    				setMotorDir(FWD,BWD);
    				turn_direction=RIGHT;
    				move_or_rotate = 2;
    			}
       //******************************************************//
       //**********hier kommt stop und sollte rotate beenden*********//
    			
                            else if(strcmp(receiveBuffer,"stop")==0)
    			{
    			    writeString_P("\nStop all wheels\n");
    				move(0, FWD, DIST_MM(0), BLOCKING);
    				move_or_rotate = 0;
    			}
    			else if(strcmp(receiveBuffer,"bat")==0)
    			{
    			   writeString_P("\nBat:");
    			   printUBat(adcBat);
    			   writeChar('\n');
    			}
    			else
    			{
    				if(move_or_rotate == 0)
    				{
    					writeString_P("\nSelect a direction first\n");
    				} 
    				else
    				{
    					pwm_tmp = atoi(receiveBuffer);
    					if(pwm_tmp == 0)
    					{
    						uint8_t not_a_number = 0;
    						int8_t i;
    						for(i = strlen(receiveBuffer)-1; i >= 0 ; i--)
    							if((receiveBuffer[i] < '0') || (receiveBuffer[i] > '9'))
    							{
    								not_a_number = 1;
    								writeString_P("\n### NOT A NUMBER! ###\n");
    								break;
    							}
    						if(not_a_number)
    							pwm_tmp = pwm;	
    					}
    					else if(pwm_tmp < 0) {pwm_tmp = 0;}
    					pwm = pwm_tmp;
    					
    					if(move_or_rotate == 1)
    					{
    						writeString_P("\nDrive now ");
    						writeInteger(pwm_tmp,DEC);
    						writeChar('\n');
       //******************************************************//
       //**********BLOCKING oder NON_BLOCKING?*********//
    						move(MOVE_SPEED, move_direction, DIST_MM(pwm), BLOCKING);
    						writeString_P("\nACK\n");
    						pwm = 0;
    					}
    					else if(move_or_rotate == 2)
    					{
    						writeString_P("\nrotate now ");
    						writeInteger(pwm_tmp,DEC);
    						writeChar('\n');
       //******************************************************//
       //**********BLOCKING oder NON_BLOCKING?*********//
    						rotate(TURN_SPEED, turn_direction, pwm, BLOCKING);
    						writeString_P("\nACK\n");
    						pwm = 0;
    					}
    					else
    					{
    						writeString_P("\nundefined error please send again\n");
    					}
    					
    					
    				}
    				
    			
    			}
    		}
    
    		
    		
    		
    		task_ADC();
    	}
    	stopStopwatch1();
    	stopStopwatch2();
    	mSleep(500);
    	setMotorPower(0,0);
    	setMotorDir(FWD,FWD);
    	powerOFF();
    	
    }
    Wenn ich bei dem Rotate-Befehl das "BLOCKING" auf "NON_BLOCKING" setze, dreht er sich nicht und fährt auch nicht. Woran könnte das liegen?
    Außerdem weiß ich nicht, wie man einen neuen Eventhandler implementiert in C, kann mir da jemand helfen?
    Vielen Dank.

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    25.12.2008
    Ort
    Dortmund
    Alter
    32
    Beiträge
    13
    Hey

    So die Lösung ist wenn ich mich nicht ganz teusche erstmal nen task_RP6System(); in die Hauptschleife rein zu setzen!

    Danach funktionieren die Befehle auch ohne BLOCKING!
    Und dann funktioniert es auch das du ein stop ausführen kannst wo du willst und es wird dann gestoppt ^^

    mfg-AD

  3. #3
    Hey Danke, das hat mir auf jeden Fall schon mal super weitergeholfen!!!
    =D>

    mfg Radi

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress