-
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;
}
-
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
-
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 ??
-
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
-
Ahhh ...
Danke für deine Erklärung ... ich glaub ich habs verstanden
Werd dann nochmal posten wenn ich das probiert habe.
-
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;
}
-
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
-
Vielen Dank für deine Hilfe ... ich glaub jetzt hab ich das verstanden ...