- Labornetzteil AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 18 von 18

Thema: RP6 I2C

  1. #11
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.11.2009
    Alter
    32
    Beiträge
    188
    Anzeige

    Powerstation Test
    Im Rest liegt ja nicht das Problem ...

    BASE:
    Code:
      
      #include"RP6RobotBaseLib.h"
      #include "RP6I2CslaveTWI.h"
      
      int main(void)
    
      {
      
       initRobotBase(); 
       
       powerON();
       
       setACSPwrOff();
       
       uint8_t i;
    	
    	I2CTWI_initSlave(10);
    	
    	while (true)
    	{	
    	
    	i=I2CTWI_readBytes(10);
    		
    	switch (i)
    		{
    			case 1:	task_motionControl();
    					move(30,FWD,DIST_MM(50),false);
    					break;
    			case 2:	task_motionControl();
    					move(30,BWD,DIST_MM(50),false);
    					break;
    			case 3:	task_motionControl();
    					rotate(30,LEFT,20,false);
    					break;
    			case 4:	task_motionControl();
    					rotate(30,RIGHT,20,false);
    					break;
    		}
    	
    	
       
       }
       
       
       
       while (true)
       {
       writeString_P("\n In Endlosschleife\n");
       }
       return 0;
       
       
       
      }
    M32
    Code:
      #include "RP6ControlLib.h" 
      #include "RP6I2CmasterTWI.h"
    
    int main(void)
    {
    	initRP6Control();
    	initLCD(); 
    	
    	I2CTWI_initMaster(50);
    	
    	int key;
    	
    	while(true)
    	{
    	
    	key=0;
    	
    	do
    	{
    	
    	showScreenLCD("Bitte Taster","druecken");	
    	key=getPressedKeyNumber();
    	
    	}
    	while (key==0);
    	
    	switch(key)
    	{
    		case 1:	//T1 - vorwärts
    				showScreenLCD("Daten werden","uebertragen");
    				I2CTWI_transmitByte(10,1);
    				showScreenLCD("...erfolgreich","");
    				break;
    		case 2:	//T2 - rückwärts
    				showScreenLCD("Daten werden","uebertragen");
    				I2CTWI_transmitByte(10,2);
    				showScreenLCD("...erfolgreich","");
    				break;
    		case 3:	//T3 - 20° rechts
    				showScreenLCD("Daten werden","uebertragen");
    				I2CTWI_transmitByte(10,3);
    				showScreenLCD("...erfolgreich","");
    				break;
    		case 4: //T4 - 20° links
    				showScreenLCD("Daten werden","uebertragen");
    				I2CTWI_transmitByte(10,4);
    				showScreenLCD("...erfolgreich","");
    				break;
    	}
    	
    	showScreenLCD("","Bitte warten");
    	mSleep(200);
    	
    	}
    	
    	
    	while(true) 
    	{
    		showScreenLCD("Endlosschleife", "");
    	}
    	return 0;
    }

  2. #12
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo Xandi11,

    das hier im Slave: i=I2CTWI_readBytes(10);
    ... kann nicht funktionieren, weil:
    1. Der Befehl unvollständig ist (zu wenig Parameter müßte der Compiler sagen) und ...
    2. der Befehl nur für Master funktioniert.

    Sieh dir für den Slave mal das Beispielprogramm in der Anleitung S. 106 an.

    Gruß Dirk

  3. #13
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.11.2009
    Alter
    32
    Beiträge
    188
    Danke für deine schnelle Antwort Dirk.

    Laut der Beschreibung müsste ich ja
    i=I2CTWI_writeRegisters[0]
    schreiben.

    Stimmt das so oder ist das falsch ??

  4. #14
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Nein, das stimmt schon so.

    Um zu erkennen, ob überhaupt ein Byte bzw. Befehl gesendet wurde, müßtest du die 0 vermeiden (also 0 nicht senden!) und im Slave auch so testen wie in dem Beispiel:
    Code:
    if(I2CTWI_writeRegisters[0] && !I2CTWI_writeBusy)
    {
    // Register speichern:
    i = I2CTWI_writeRegisters[0];
    I2CTWI_writeRegisters[0] = 0;
    }
    Gruß Dirk

  5. #15
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.11.2009
    Alter
    32
    Beiträge
    188
    Ahhh ...

    Danke für deine Erklärung ... ich glaub ich habs verstanden

    Werd dann nochmal posten wenn ich das probiert habe.

  6. #16
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.11.2009
    Alter
    32
    Beiträge
    188
    Ich hab das Ganze nun probiert, hat aber leider nicht funktioniert.

    Mein Code sieht jetzt so aus:

    M32 - Master:
    Code:
      #include "RP6ControlLib.h" 
      #include "RP6I2CmasterTWI.h"
    
    int main(void)
    {
    	initRP6Control();
    	initLCD(); 
    	
    	I2CTWI_initMaster(50);
    	
    	int key;
    	
    	while(true)
    	{
    	
    	key=0;
    	
    	showScreenLCD("Bitte Taster","druecken");
    	
    	do
    	{
    	
    	key=getPressedKeyNumber();
    	I2CTWI_transmitByte(10,0);
    	
    	}
    	while (key==0);
    	
    	switch(key)
    	{
    		case 1:	//T1 - vorwärts
    				showScreenLCD("Daten werden","uebertragen");
    				I2CTWI_transmitByte(10,1);
    				showScreenLCD("...erfolgreich","");
    				break;
    		case 2:	//T2 - rückwärts
    				showScreenLCD("Daten werden","uebertragen");
    				I2CTWI_transmitByte(10,2);
    				showScreenLCD("...erfolgreich","");
    				break;
    		case 3:	//T3 - 20° rechts
    				showScreenLCD("Daten werden","uebertragen");
    				I2CTWI_transmitByte(10,3);
    				showScreenLCD("...erfolgreich","");
    				break;
    		case 4: //T4 - 20° links
    				showScreenLCD("Daten werden","uebertragen");
    				I2CTWI_transmitByte(10,4);
    				showScreenLCD("...erfolgreich","");
    				break;
    		default: I2CTWI_transmitByte(10,0);
    			     break;
    	}
    	
    	showScreenLCD("","Bitte warten");
    	mSleep(200);
    	
    	key=0;
    	
    	}
    	
    	
    	while(true) 
    	{
    		showScreenLCD("Endlosschleife", "");
    	}
    	return 0;
    }
    Base - Slave:
    Code:
    #include"RP6RobotBaseLib.h"
      #include "RP6I2CslaveTWI.h"
      
      int main(void)
    
      {
      
       initRobotBase(); 
       
       powerON();
       
       setACSPwrOff();
       
       uint8_t i;
    	
    	I2CTWI_initSlave(10);
    	
    	while (true)
    	{	
    	
    	if(I2CTWI_writeRegisters[0] && !I2CTWI_writeBusy)
        {
        // Register speichern:
    	i = I2CTWI_writeRegisters[0];
    	I2CTWI_writeRegisters[0] = 0;
    	}
    
    		
    	switch (i)
    		{
    			case 1:	task_motionControl();
    					move(30,FWD,DIST_MM(50),false);
    					break;
    			case 2:	task_motionControl();
    					move(30,BWD,DIST_MM(50),false);
    					break;
    			case 3:	task_motionControl();
    					rotate(30,LEFT,20,false);
    					break;
    			case 4:	task_motionControl();
    					rotate(30,RIGHT,20,false);
    					break;
    			default: setLEDs(0b111111);
    					 mSleep(200);
    					 setLEDs(0b000000);
    					 break;
    		}
    	
    	
       
       }
       
       
       
       while (true)
       {
       writeString_P("\n In Endlosschleife\n");
       }
       return 0;
       
       
       
      }

  7. #17
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo Xandi11,

    probier's mal so:

    M32 - Master:
    Code:
    #include "RP6ControlLib.h" 
    #include "RP6I2CmasterTWI.h" 
    
    uint8_t buffer[2];
    
    int main(void) 
    { 
    	initRP6Control(); 
    	initLCD(); 
    
    	I2CTWI_initMaster(100); 
    
    	uint8_t key; 
        
    	while(true) 
    	{ 
    
    		showScreenLCD("Bitte Taster", "druecken"); 
        
    		do 
    		{ 
    			key = getPressedKeyNumber(); 
    		} 
    		while (key == 0); 
        
    		showScreenLCD("Daten werden", "uebertragen"); 
    		mSleep(500); 
    
    		buffer[0] = 0;
    		buffer[1] = key;
    		if (!I2CTWI_isBusy()) {
    			I2CTWI_transmitBytes(10, buffer, 2);
    		}
    
    		showScreenLCD("...erfolgreich", ""); 
    		mSleep(500); 
    	} 
       
    	return 0; 
    }
    Base - Slave:
    Code:
    #include"RP6RobotBaseLib.h" 
    #include "RP6I2CslaveTWI.h" 
      
    int main(void) 
    { 
    
    	initRobotBase(); 
    
    	powerON(); 
    
    	setACSPwrOff(); 
        
    	uint8_t i; 
    
    	I2CTWI_initSlave(10); 
        
    	while (true) 
    	{    
    
    		if(I2CTWI_writeRegisters[0] && !I2CTWI_writeBusy) 
    		{ 
    			// Register speichern: 
    			i = I2CTWI_writeRegisters[0]; 
    			I2CTWI_writeRegisters[0] = 0; 
           
    			switch (i) 
    			{ 
    				case 1:
    					setLEDs(0b000001); 
    					mSleep(500); 
    					setLEDs(0b000000); 
    //					task_motionControl(); 
    //              	move(30,FWD,DIST_MM(50),false); 
    				break; 
    				case 2:
    					setLEDs(0b000011); 
    					mSleep(500); 
    					setLEDs(0b000000); 
    //					task_motionControl(); 
    //              	move(30,BWD,DIST_MM(50),false); 
    				break; 
    				case 3:
    					setLEDs(0b000111); 
    					mSleep(500); 
    					setLEDs(0b000000); 
    //					task_motionControl(); 
    //              	rotate(30,LEFT,20,false); 
    				break; 
    				case 4:
    					setLEDs(0b001111); 
    					mSleep(500); 
    					setLEDs(0b000000); 
    //					task_motionControl(); 
    //              	rotate(30,RIGHT,20,false); 
    				break; 
    				default:
    					setLEDs(0b111111); 
    					mSleep(500); 
    					setLEDs(0b000000); 
    			} 
    		}
    	} 
    }
    Viel Erfolg!

    Gruß Dirk

  8. #18
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.11.2009
    Alter
    32
    Beiträge
    188
    Vielen Dank für deine Hilfe ... ich glaub jetzt hab ich das verstanden ...

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

Solar Speicher und Akkus Tests