- fchao-Sinus-Wechselrichter AliExpress         
Seite 6 von 7 ErsteErste ... 4567 LetzteLetzte
Ergebnis 51 bis 60 von 64

Thema: Anschluss von Infrarotsensoren

  1. #51
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    Anzeige

    LiFePo4 Akku selber bauen - Video
    danke SlyD für die hilfe. jetzt hab ich mal alles so abgeändert wie du gesagt hast:
    Code:
     
    #include "RP6ControlLib.h"
    #include "RP6ControlServoLib.h"
    #include "RP6I2CmasterTWI.h"
    #include "RP6Control_I2CMasterLib.h"
    
    
    
    
    
    uint8_t move_state = 0; // Wenn nichts anderes zugewiesen ist, ist move_state =0
    
    
    
    void motionControlStateChanged(void) 
    {	if (ir_hindernis)
    	{
    		if (!(ir_ende))
    		{stopStopwatch3();		//stopwatch3 anhalten wenn ir erkannt wird und damit servobewegung anhalten
    		writeString_P("stopStopwatch3\n");}	
    
    
    	
    	
    
    			switch(move_state)
    	
    				{case 0:
    					if (getStopwatch3() <1000 || getStopwatch3() >6000)
    					{rotate(50,RIGHT,90,NON_BLOCKING); //um 90 grad rotieren wenn hindernis erkennt wird und stopwatch3 <1000 oder >6000 ist
    					move_state= 1;	// move_state den wert 1 zuweisen
    					}
    					break;
    	
    	
    					case 1:
    					if(isMovementComplete())
    					{ir_ende= true; 		//ir_ende=true, wenn bewegung abgeschlossen
    					startStopwatch3();		//stopwatch3 wieder starten und servo wieder starten
    					writeString_P("stopwatch3 starten\n");
    					}
    					break;
    					
    				}
    	
    
    			
    			
    	}
    
    }
    	
    
    	
    	
    	
    	
    
    
    
    
    
    void servoansteuerung(void)
    {if (getStopwatch3() <1000)
    	{servo3_position = 0;
    	writeString_P("LEFT Touch\n");}
    
    
    if (getStopwatch3() >1000 && getStopwatch3() <2000)
    	{servo3_position = 20;
    	writeString_P("servo position 40\n");}
    	
    if (getStopwatch3() >2000 && getStopwatch3() <3000)
    	{servo3_position = 90;}
    
    if (getStopwatch3() >3000 && getStopwatch3() <4000)
    		{servo3_position = RIGHT_TOUCH;
    		writeString_P("Servo Right touch\n");}
    		
    if (getStopwatch3() >4000 && getStopwatch3() <5000)
    	{servo3_position = 90;}
    	
    if (getStopwatch3() >5000 && getStopwatch3() <6000)
    	{servo3_position = 20;}
    		
    if (getStopwatch3() >6000 && getStopwatch3() <7000)
    	{servo3_position = 0;
    	writeString_P("LEFT Touch\n");}
    	
    if (getStopwatch3() >7000)
    	{
    	setStopwatch3(0);
    	writeString_P("stopwatch3 auf 0 zurück\n");}
    	
    }
    
    
    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();
        initSERVO(SERVO3); 
    startStopwatch3(); 
       I2CTWI_initMaster(100);  
       
       WDT_setRequestHandler(watchDogRequest); 
    	I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady);
    	
    	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
    	
    	mSleep(1500);
    	
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_ACS_POWER, ACS_PWR_MED);
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT, false);
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT_RQ, false);
    
    
       
       while(true) 
       {
    servoansteuerung();
        task_SERVO();
    
    	  infrarotkollission();
    	
    	task_checkINT0();
            task_I2CTWI();
       }
       return 0;
    }
    jetzt hab ich zumindest die meldung mit dem I²C error weg bekommen. allerdings springt mein programm auf dem mikrocontroller nach wie vor nach der abgelaufenen wartezeit (bei mir jetzt 1,5 sekunden) wieder in den standbymodus.

    es muss also nach wie irgendetwas in meinen I²C funktionen falsch sein.
    wer kann mir weiterhelfen?

    mfg andi

  2. #52
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    so, da ich die letzten tage immer noch nicht mit meinem I2C problem weitergekommen bin, habe ich jetzt mal im forum nach einem thread gesucht, der ein ähnliches problem (fahren mit RP6 mit M32 als Master) behandelt.
    leider konnte ich aber nichts finden, was mir wirklich entscheidend weitergeholfen hat. meiner meinung nach muss noch irgendetwas bei der verwendung von I²C nicht stimmen.
    da ich auf der Base das ganz normale I2C_Slave_Programm unverändert verwende, muss der fehler wohl in meinem programm auf der M32 liegen.

    wer kann mir weiterhelfen?
    das programm ist immer noch das selbe wie in meinem vorherigen post. leider ist es das erste mal, dass ich den I²C Bus so richtig verwende aber einem erfahrenem I2C Benutzer müsste doch eigentlich der fehler auffallen.

    ich bedanke mich schon mal im voraus für eure mühen mir zu helfen.

    mfg andi

  3. #53
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    40
    Beiträge
    1.516
    Reduzier das Programm doch mal auf ein MINIMUM - also alles raus!

    Dann Schritt für Schritt wieder einbauen und immer wieder testen zwischendurch.
    Weitere Ausgaben einfügen damit man genau sieht was das Programm macht.


    > aber einem erfahrenem I2C Benutzer müsste doch eigentlich
    > der fehler auffallen.

    Schon möglich, habe aber zu wenig Zeit mir jede Zeile einzeln anzuschauen.


    MfG,
    SlyD

    PS:
    Die Beispielprogramme laufen aber wie sie sollen, ja?
    Sonst kopier einfach nochmal den Code vom letzten! Beispielprogramm (erst da ist die I2C Lib vollständig ) und lösch alles raus was Du nicht brauchst.

  4. #54
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    @SlyD: Ja, die I2C Beispielprogramm auf der M32 laufen alle einwandfrei. Jetzt hab ich mal deinen Rat befolgt und habe das letzte! Beispielprogramm (RP6Control_10_Move2) komplett zerpflückt.

    das ergebnis ist leider sehr ernüchternd: obwohl ich seit gestern abend mit so gut wie nichts anderem beschäftigt war und jede menge probiert habe. ein problem ist mit unter auch, dass ich einzelne programmteile in diesem Beispielprogramm nicht richtig verstehe:



    Was hat es zum Beispiel genau damit auf sich?:
    Code:
    typedef struct {
    	uint8_t  speed_left;  // left speed (is used for rotation and 
    						  // move distance commands - if these commands are 
    						  // active, speed_right is ignored!)
    	uint8_t  speed_right; // right speed
    	unsigned dir:2;       // direction (FWD, BWD, LEFT, RIGHT)
    	unsigned move:1;      // move flag
    	unsigned rotate:1;    // rotate flag
    	uint16_t move_value;  // move value is used for distance and angle values
    	uint8_t  state;       // state of the behaviour
    } behaviour_command_t;







    ich vermute das hängt irgendwie damit zusammen, aber wie?
    Code:
    behaviour_command_t STOP = {0, 0, FWD, false, false, 0, IDLE};
    
    
    behaviour_command_t cruise = {CRUISE_SPEED_FWD, CRUISE_SPEED_FWD, FWD, 
    								false, false, 0, MOVE_FORWARDS};
    
    
    behaviour_command_t escape = {0, 0, FWD, false, false, 0, IDLE}; 
    
    
    behaviour_command_t avoid = {0, 0, FWD, false, false, 0, IDLE};
    
    
    behaviour_command_t waitForStart = {0, 0, FWD, 
    									false, false, 0, PREPARE};







    warum darf man das so schreiben:
    Code:
    escape.move = true;	//Warum kann man das hier so "escape.move" schreiben?
    
    escape.rotate = true;	//Hier das selbe, habe das noch nie gesehen





    was hat es hier mit den zeichen * und -> auf sich?
    Code:
    void moveCommand(behaviour_command_t * cmd)
    {
    	if(cmd->move_value > 0)  // move or rotate?
    	{
    		if(cmd->rotate)
    			rotate(cmd->speed_left, cmd->dir, cmd->move_value, false);



    da ich aus diesen programmteilen bisher nicht wirklich schlau geworden bin, habe ich jetzt einmal den großteil aus dem programm geworfen. zur erklärung: vorerst ist erstmal nur mein ziel, dass sich der RP6 dreht.

    das programm schaut dann so aus:

    Code:
    #include "RP6ControlLib.h" 		// The RP6 Control Library. 
    								// Always needs to be included!
    
    #include "RP6I2CmasterTWI.h"	// I2C Master Library
    
    
    /*****************************************************************************/
    /*****************************************************************************/
    // Include our new "RP6 Control I2C Master library":
    
    #include "RP6Control_I2CMasterLib.h"
    
    /*****************************************************************************/
    
    void RP6_Bewegung(void)
    {if (getStopwatch3() >3000)
    	{rotate(50,FWD,90,false);}
    }
    
    
    /**
     * Timed Watchdog display - the other heartbeat function
     * does not work in this example as we use blocked moving functions here.
     */
    void watchDogRequest(void)
    {
    	static uint8_t heartbeat2 = false;
    	if(heartbeat2)
    	{
    		clearPosLCD(1, 14, 1);
    		heartbeat2 = false;
    	}
    	else
    	{
    		setCursorPosLCD(1, 14);
    		writeStringLCD_P("#"); 
    		heartbeat2 = true;
    	}
    }
    
    /*****************************************************************************/
    // I2C Requests: 
    
    /**
     * The I2C_requestedDataReady Event Handler
     */
    void I2C_requestedDataReady(uint8_t dataRequestID)
    {
    	checkRP6Status(dataRequestID);
    }
    
    /*****************************************************************************/
    // I2C Error handler
    
    /**
     * This function gets called automatically if there was an I2C Error like
     * the slave sent a "not acknowledge" (NACK, error codes e.g. 0x20 or 0x30).
     */
    void I2C_transmissionError(uint8_t errorState)
    {
    	writeString_P("\nI2C ERROR - TWI STATE: 0x");
    	writeInteger(errorState, HEX);
    	writeChar('\n');
    }
    
    /*****************************************************************************/
    // Main function - The program starts here:
    
    int main(void)
    {
    	initRP6Control();  
    	initLCD();
        
    	writeString_P("\n\nRP6 CONTROL M32 I2C Master Example Program!\n"); 
        writeString_P("\nMoving...\n"); 
    
    	// ---------------------------------------
    	WDT_setRequestHandler(watchDogRequest); 
    	
    
    	// ---------------------------------------
    	I2CTWI_initMaster(100);  
    	I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady);
    	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
    
    	sound(180,80,25);
    	sound(220,80,25);
    
    	setLEDs(0b1111);
    
    	showScreenLCD("################", "################");
    	mSleep(500);
    	showScreenLCD("I2C-Master", "Behaviours");
    	mSleep(1000);
    	setLEDs(0b0000);
    	
    	// ---------------------------------------
    	// Setup ACS power:
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_ACS_POWER, ACS_PWR_MED);
    	// Enable Watchdog for Interrupt requests:
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT, true);
    	// Enable timed watchdog requests:
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT_RQ, true);
    
    	startStopwatch1();
    	startStopwatch2();
    	startStopwatch3();
    
    	showScreenLCD("Active Behaviour", "");
    
    	while(true) 
    	{ 
    		
    		task_checkINT0();
    	    task_I2CTWI();
    		RP6_Bewegung();
    	}
    	return 0;
    }
    auch wenn ich bisher keine erklärung dafür finde, tut das programm bisher gar nichts. nicht einmal die textmeldungen im main teil werden im terminal ausgegeben.
    zur erinnerung: das original Beispielprogramm (RP6_Control_Move2) lief einwandfrei also kann man einen I2C defekt ausschließen.

    bin für jede hilfe dankbar

    mfg andi

  5. #55
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    40
    Beiträge
    1.516
    Hi,

    > Was hat es zum Beispiel genau damit auf sich?:

    Das ist eine "struct" die hier als Typ deklariert wird (kann man dann wie z.B. uint16_t verwenden - nur hat diese "Variable" dann eben mehrere "untervariablen" um es einfach auszudrücken)

    Die * -> Zeichen: Lies Dir mal das Kapitel Pointer in einem x beliebigen C Tutorial durch.



    > tut das programm bisher gar nichts.

    Also da ich mir das nicht vorstellen konnte habe ich es gerade mal selbst getestet - es funktioniert bei mir (auch wenn er nicht rotiert sondern geradeaus fährt und nicht anhält aber das liegt am rotate(...FWD...) und der art wie die Stopwatch benutzt wird... ).

    Hast Du die Beispielprogramme mal SELBST COMPILIERT?
    Funktionieren die dann immer noch?

    Falls nicht dann baut Dein Compiler scheinbar mist (Version?) - installier den mal neu und nimm am besten eine andere Version - ÄLTER ist meistens besser.
    Der AVR-GCC Compiler wird mit der Zeit leider nicht unbedingt besser und es können auch mal Bugs drin sein...


    MfG,
    SlyD

  6. #56
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    danke SlyD für deine Hilfe. also, das beispielprogramm funktioniert noch, wenn ich es selber kompiliert habe. habe es gerade getestet.

    habe mir aber trotzdem winavr deinstalliert und eine neue version (aus dem jahr 2006) installiert. das ergebnis ist aber das selbe wie vorher. das beispielprogramm funktioniert nach dem kompilieren immer noch, aber mein testprogramm macht nach dem starten gar nichts (keine textmeldung, kein fahren).

    etwas anderes ist mir jetzt aber noch aufgefallen, muss aber nicht unbedingt etwas damit zu tun haben. wenn ich das beispielprogramm laufen lasse und ein hindernis über die bumper oder acs simulieren bleibt der RP6 auf einmal stehen und macht gar nichts mehr. egal ob ich einen taster drücke, ein hindernis simuliere oder sonst irgendwas der RP6 macht nichts mehr (das war auch schon vor der neuinstallation von winavr).
    auf der M32 leuchten dann LED2 und LED3 dauerhaft, auf der Base blinken SL2, SL3, SL5 und SL6.

    ist das normal? schaut irgendwie nach einer störmeldung aus.

    mfg andi

  7. #57
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    40
    Beiträge
    1.516
    Na 2006er ist dann doch etwas extrem alt.
    Ich meinte eher so 2007 / 2008.
    Nimm z.B. mal 20080610 mit der hab ich es hier auf dem notebook gerade getestet und damit hat es problemlos funktioniert.
    Sicher das Du die richtigen Hexfiles hochlädst wenn Du es neu kompiliert hast?
    (schau mal aufs Datum/Uhrzeit der dateien ob die wirklich verändert wurden)

    > Blinkende LEDs:

    Verwendest Du Akkus oder Batterien?
    Voll aufgeladen?
    Läuft der Selftest fehlerfrei durch?

    MfG,
    SlyD

  8. #58
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    tut mir leid SlyD, dass ich mich erst jetzt wieder melde aber ich hatte in letzter zeit einfach keine zeit für den RP6.

    mittlerweile habe ich die version 20080610 von winavr installiert. kompilieren lassen sich alle programme fehlerfrei. es werden auch neue hexfiles erzeugt (habe es über datum/uhrzeit getestet). aber irgendwas stimmt nach wie vor nicht.

    mein testprogramm tut nach wie vor nichts, also der RP6 fährt nicht wie bei dir.
    noch etwas anderes unerklärliches ist mir aufgefallen. und zwar erzeugt das winavr beim Example_10_Move2 beispielprogramm nur beim RP6Control_10_Move2_fast beispielprogramm beim kompilieren ein neues hexfile. beim RP6Control_10_Move2 geschieht dagegen gar nichts. auch nachdem ich das bereits bestehende hexfile gelöscht habe, konnte ich beim kompilieren kein neues hexfile erzeugen.

    an was kann das liegen?

    mfg andi

  9. #59
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.03.2010
    Ort
    Hamburg
    Beiträge
    333
    Schonmal an einem anderen PC Probiert?

  10. #60
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    @_|Alex|_ : nein das hab ich noch nicht. kommt aber eigentlich auch nicht in frage, da ich keinen zweiten besitze.

    nachdem ich heute gefühlte 10 mal winavr neuinstalliert habe, bin ich immer noch nicht weitergekommen. hexfiles werden bei meinem testprogramm auf jeden fall neue erzeugt. darum denke ich, dass das problem nicht an einem falsch funktionierenden winavr liegt. um so mehr verwundert es mich, dass das programm bei mir und SlyD auf dem RP6 unterschiedlich funktioniert.

    vielleicht kann ja noch jemand anderes mein testprogramm bei mir auf der M32 testen und schauen was es bei ihm macht:


    Code:
    #include "RP6ControlLib.h"       // The RP6 Control Library.
                            // Always needs to be included!
    
    #include "RP6I2CmasterTWI.h"   // I2C Master Library
    
    
    /*****************************************************************************/
    /*****************************************************************************/
    // Include our new "RP6 Control I2C Master library":
    
    #include "RP6Control_I2CMasterLib.h"
    
    /*****************************************************************************/
    
    void RP6_Bewegung(void)
    {if (getStopwatch3() >3000)
       {rotate(50,FWD,90,false);}
    }
    
    
    /**
     * Timed Watchdog display - the other heartbeat function
     * does not work in this example as we use blocked moving functions here.
     */
    void watchDogRequest(void)
    {
       static uint8_t heartbeat2 = false;
       if(heartbeat2)
       {
          clearPosLCD(1, 14, 1);
          heartbeat2 = false;
       }
       else
       {
          setCursorPosLCD(1, 14);
          writeStringLCD_P("#");
          heartbeat2 = true;
       }
    }
    
    /*****************************************************************************/
    // I2C Requests:
    
    /**
     * The I2C_requestedDataReady Event Handler
     */
    void I2C_requestedDataReady(uint8_t dataRequestID)
    {
       checkRP6Status(dataRequestID);
    }
    
    /*****************************************************************************/
    // I2C Error handler
    
    /**
     * This function gets called automatically if there was an I2C Error like
     * the slave sent a "not acknowledge" (NACK, error codes e.g. 0x20 or 0x30).
     */
    void I2C_transmissionError(uint8_t errorState)
    {
       writeString_P("\nI2C ERROR - TWI STATE: 0x");
       writeInteger(errorState, HEX);
       writeChar('\n');
    }
    
    /*****************************************************************************/
    // Main function - The program starts here:
    
    int main(void)
    {
       initRP6Control(); 
       initLCD();
       
       writeString_P("\n\nRP6 CONTROL M32 I2C Master Example Program!\n");
        writeString_P("\nMoving...\n");
    
       // ---------------------------------------
       WDT_setRequestHandler(watchDogRequest);
       
    
       // ---------------------------------------
       I2CTWI_initMaster(100); 
       I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady);
       I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
    
       sound(180,80,25);
       sound(220,80,25);
    
       setLEDs(0b1111);
    
       showScreenLCD("################", "################");
       mSleep(500);
       showScreenLCD("I2C-Master", "Behaviours");
       mSleep(1000);
       setLEDs(0b0000);
       
       // ---------------------------------------
       // Setup ACS power:
      I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_ACS_POWER, ACS_PWR_MED);
       // Enable Watchdog for Interrupt requests:
       I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT, true);
       // Enable timed watchdog requests:
       I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT_RQ, true);
    
       startStopwatch1();
       startStopwatch2();
       startStopwatch3();
    
       showScreenLCD("Active Behaviour", "");
    
       while(true)
       {
          
          task_checkINT0();
           task_I2CTWI();
          RP6_Bewegung();
       }
       return 0;
    }
    die hexdatei hat bei mir 19KB speicherplatz.

    wär echt dankbar, wenn das mal jemand bei sich selber ausprobieren würde. das würde die problemsuche erhelblich erleichtern.

    mfg andi

Seite 6 von 7 ErsteErste ... 4567 LetzteLetzte

Berechtigungen

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

12V Akku bauen