but what about this line:
Code: Select all
if(!I2CBytes(link, sendMsg, msgLen, replyMsg)) return 0;
Code: Select all
if(!I2CBytes(link, sendMsg, msgLen, replyMsg)) return 0;
Code: Select all
long GetTXMotorCounter(byte NXTport, byte TXmotor)
{
byte devAddr;
const byte msgLen = 4;
byte sendMsg[];
byte replyMsg[];
byte encStartReg;
devAddr = (TXmotor+2)&14;
if ((TXmotor%2)==0) encStartReg = 0x4C;
else encStartReg = 0x50;
ArrayBuild(sendMsg, devAddr, encStartReg);
// ArrayBuild(sendMsg, DGPS_I2C_ADDR, START_OF_ENCODER_REGISTER); // Only -one- register, the first one, is requested
while ((I2CCheckStatus(NXTport) == STAT_COMM_PENDING) && (I2CCheckStatus(NXTport) != NO_ERR)) Wait(1);
/* deleted */
// Reassemble the messages, depending on their expected size.
return replyMsg[3] + (replyMsg[2] << 8) + (replyMsg[1] << 16) + (replyMsg[0] << 24);
}
Code: Select all
#define printf5( _x, _y, _format1,_format2,_format3,_format4,_format5,_value1,_value2,_value3,_value4,_value5) { \
string sval1 = FormatNum(_format1, _value1); \
string sval2 = FormatNum(_format2, _value2); \
string sval3 = FormatNum(_format3, _value3); \
string sval4 = FormatNum(_format4, _value4); \
string sval5 = FormatNum(_format5, _value5); \
string s =sval1+sval2+sval3+sval4+sval5; \
TextOut(_x, _y, s); \
}
#define printf2( _x, _y, _format1, _format2, _value1, _value2) { \
string sval1 = FormatNum(_format1, _value1); \
string sval2 = FormatNum(_format2, _value2); \
string s =sval1+sval2; \
TextOut(_x, _y, s); \
}
void TXMotorOn(byte NXTport, byte TXmotor, char percentage)
{
byte retLen = 0;
char modeMsg[];
char powerMsg[];
byte devAddr, modeReg, powerReg;
char IOresult;
// addresses and registers
devAddr = (TXmotor+2)&14;
modeReg = 0x44 + (TXmotor % 2)*3;
powerReg= 0x45 + (TXmotor % 2);
ArrayBuild(modeMsg, devAddr, modeReg, 0);
ArrayBuild(powerMsg, devAddr, powerReg, percentage);
// Send the first message as soon as the bus is ready
TextOut(0,56,"M Rg md pow error");
while ((I2CCheckStatus(NXTport) == STAT_COMM_PENDING) && (I2CCheckStatus(NXTport) != NO_ERR)) Wait(1);
IOresult=I2CWrite(NXTport, retLen, modeMsg);
if (IOresult != NO_ERR)
{ printf5(0,48-(8*TXmotor),"%d","%3d","%2d","%5d","%4d",TXmotor,modeMsg[1],modeMsg[2],powerMsg[2],IOresult);
return; } // for Error debug
printf5(0,48-(8*TXmotor),"%d","%3d","%2d","%5d","%4d",TXmotor,modeMsg[1],modeMsg[2],powerMsg[2],IOresult);
// Send the second message when the first one is done
ArrayBuild(powerMsg, devAddr, powerReg, percentage);
while ((I2CCheckStatus(NXTport) == STAT_COMM_PENDING) && (I2CCheckStatus(NXTport) != NO_ERR)) Wait(1);
IOresult=I2CWrite(NXTport, retLen, powerMsg);
if (IOresult != NO_ERR)
{ printf5(0,48-(8*TXmotor),"%d","%3d","%2d","%5d","%4d",TXmotor,modeMsg[1],modeMsg[2],powerMsg[2],IOresult);
return; } // for Error debug
printf5(0,48-(8*TXmotor),"%d","%3d","%2d","%5d","%4d",TXmotor,modeMsg[1],modeMsg[2],powerMsg[2],IOresult);
}
long GetTXMotorCounter(byte NXTport, byte TXmotor)
{
byte devAddr;
const byte msgLen = 4;
byte sendMsg[];
byte replyMsg[];
byte encStartReg;
devAddr = (TXmotor+2)&14;
if (TXmotor==0) encStartReg = 0x4C;
else
if (TXmotor==1) encStartReg = 0x50;
ArrayBuild(sendMsg, devAddr, encStartReg);
// ArrayBuild(sendMsg, DGPS_I2C_ADDR, START_OF_ENCODER_REGISTER); // Only -one- register, the first one, is requested
while ((I2CCheckStatus(NXTport) == STAT_COMM_PENDING) && (I2CCheckStatus(NXTport) != NO_ERR)) Wait(1);
/* deleted */
// Reassemble the messages, depending on their expected size.
return replyMsg[3] + (replyMsg[2] << 8) + (replyMsg[1] << 16) + (replyMsg[0] << 24);
}
task main(){
long encoder;
SetSensorType(S1, SENSOR_TYPE_LOWSPEED);
ResetSensor(S1);
Wait(20);
encoder= GetTXMotorCounter(0, 0);
printf("%7d", encoder);
TXMotorOn(0, 0, 50);
TXMotorOn(0, 1, 20);
Wait(2000);
encoder= GetTXMotorCounter(0, 0);
printf("%7d", encoder);
TXMotorOn(0, 0, 0); // brake
TXMotorOn(0, 1, 0); // brake
Wait(2000);
encoder= GetTXMotorCounter(0, 0);
printf("%7d", encoder);
TXMotorOn(0, 0, -50);
TXMotorOn(0, 1, -20);
Wait(2000);
encoder= GetTXMotorCounter(0, 0);
printf("%7d", encoder);
TXMotorOn(0, 0, 0); // coast
TXMotorOn(0, 1, -128); // brake
Wait(2000);
encoder= GetTXMotorCounter(0, 0);
printf("%7d", encoder);
while (true);
}
Code: Select all
!I2CBytes(...)
Code: Select all
#define printf5( _x, _y, _format1,_format2,_format3,_format4,_format5,_value1,_value2,_value3,_value4,_value5) { \
string sval1 = FormatNum(_format1, _value1); \
string sval2 = FormatNum(_format2, _value2); \
string sval3 = FormatNum(_format3, _value3); \
string sval4 = FormatNum(_format4, _value4); \
string sval5 = FormatNum(_format5, _value5); \
string s =sval1+sval2+sval3+sval4+sval5; \
TextOut(_x, _y, s); \
}
#define printf2( _x, _y, _format1, _format2, _value1, _value2) { \
string sval1 = FormatNum(_format1, _value1); \
string sval2 = FormatNum(_format2, _value2); \
string s =sval1+sval2; \
TextOut(_x, _y, s); \
}
#define printf1( _x, _y, _format1, _value1) { \
string sval1 = FormatNum(_format1, _value1); \
TextOut(_x, _y, sval1); \
}
void TXMotorOn(byte NXTport, byte TXmotor, char percentage)
{
byte retLen = 0;
char modeMsg[];
char powerMsg[];
byte devAddr, modeReg, powerReg;
char IOresult;
// addresses and registers
devAddr = (TXmotor+2)&14;
modeReg = 0x44 + (TXmotor % 2)*3;
powerReg= 0x45 + (TXmotor % 2);
ArrayBuild(modeMsg, devAddr, modeReg, 0);
ArrayBuild(powerMsg, devAddr, powerReg, percentage);
// Send the first message as soon as the bus is ready
TextOut(0,56,"M Rg md pow error");
while ((I2CCheckStatus(NXTport) == STAT_COMM_PENDING) && (I2CCheckStatus(NXTport) != NO_ERR)) Wait(1);
IOresult=I2CWrite(NXTport, retLen, modeMsg);
if (IOresult != NO_ERR)
{ printf5(0,48-(8*TXmotor),"%d","%3d","%2d","%5d","%4d",TXmotor,modeMsg[1],modeMsg[2],powerMsg[2],IOresult);
return; } // for Error debug
printf5(0,48-(8*TXmotor),"%d","%3d","%2d","%5d","%4d",TXmotor,modeMsg[1],modeMsg[2],powerMsg[2],IOresult);
// Send the second message when the first one is done
ArrayBuild(powerMsg, devAddr, powerReg, percentage);
while ((I2CCheckStatus(NXTport) == STAT_COMM_PENDING) && (I2CCheckStatus(NXTport) != NO_ERR)) Wait(1);
IOresult=I2CWrite(NXTport, retLen, powerMsg);
if (IOresult != NO_ERR)
{ printf5(0,48-(8*TXmotor),"%d","%3d","%2d","%5d","%4d",TXmotor,modeMsg[1],modeMsg[2],powerMsg[2],IOresult);
return; } // for Error debug
printf5(0,48-(8*TXmotor),"%d","%3d","%2d","%5d","%4d",TXmotor,modeMsg[1],modeMsg[2],powerMsg[2],IOresult);
}
long GetTXMotorCounter(byte NXTport, byte TXmotor)
{
byte devAddr;
const byte msgLen = 4;
byte sendMsg[];
byte replyMsg[];
byte encStartReg;
devAddr = (TXmotor+2)&14;
if (TXmotor==0) encStartReg = 0x4C;
else
if (TXmotor==1) encStartReg = 0x50;
ArrayBuild(sendMsg, devAddr, encStartReg);
// ArrayBuild(sendMsg, DGPS_I2C_ADDR, START_OF_ENCODER_REGISTER); // Only -one- register, the first one, is requested
while ((I2CCheckStatus(NXTport) == STAT_COMM_PENDING) && (I2CCheckStatus(NXTport) != NO_ERR)) Wait(1);
if(!I2CBytes(NXTport, sendMsg, msgLen, replyMsg))
return 0;
//I2CBytes(NXTport, sendMsg, msgLen, replyMsg);
// Reassemble the messages, depending on their expected size.
return replyMsg[3] + (replyMsg[2] << 8) + (replyMsg[1] << 16) + (replyMsg[0] << 24);
}
task main(){
long encoder;
SetSensorType(S1, SENSOR_TYPE_LOWSPEED);
ResetSensor(S1);
Wait(20);
encoder= GetTXMotorCounter(0, 0);
printf1(0,8,"M1=%7d", encoder);
TXMotorOn(0, 0, 50);
TXMotorOn(0, 1, 20);
Wait(2000);
encoder= GetTXMotorCounter(0, 0);
printf1(0,8,"M1=%7d", encoder);
TXMotorOn(0, 0, 0); // brake
TXMotorOn(0, 1, 0); // brake
Wait(2000);
encoder= GetTXMotorCounter(0, 0);
printf1(0,8,"M1=%7d", encoder);
TXMotorOn(0, 0, -50);
TXMotorOn(0, 1, -20);
Wait(2000);
encoder= GetTXMotorCounter(0, 0);
printf1(0,8,"M1=%7d", encoder);
TXMotorOn(0, 0, 0); // coast
TXMotorOn(0, 1, -128); // brake
Wait(2000);
encoder= GetTXMotorCounter(0, 0);
printf1(0,8,"M1=%7d", encoder);
Wait(2000);
encoder= GetTXMotorCounter(0, 0);
printf1(0,8,"M1=%7d", encoder);
while (true);
}
Code: Select all
...while(!I2CBytes(NXTport, sendMsg, msgLen, replyMsg));
Code: Select all
void ResetTXMotorCounter(byte NXTport, byte TXmotor)
{
byte retLen = 0;
char modeMsg[];
byte devAddr, modeReg;
char IOresult;
// addresses and registers
devAddr = (TXmotor+2)&14;
modeReg = 0x44 + (TXmotor % 2)*3;
ArrayBuild(modeMsg, devAddr, modeReg, 3); // 3 = reset enc value
// Send the reset message as soon as the bus is ready
while ((I2CCheckStatus(NXTport) == STAT_COMM_PENDING) && (I2CCheckStatus(NXTport) != NO_ERR)) Wait(1);
IOresult=I2CWrite(NXTport, retLen, modeMsg);
if (IOresult != NO_ERR) { return; };
}
Code: Select all
// program Tetrix_Motor_Driver ver. 0.14
#define printf5( _x, _y, _format1,_format2,_format3,_format4,_format5,_value1,_value2,_value3,_value4,_value5) { \
string sval1 = FormatNum(_format1, _value1); \
string sval2 = FormatNum(_format2, _value2); \
string sval3 = FormatNum(_format3, _value3); \
string sval4 = FormatNum(_format4, _value4); \
string sval5 = FormatNum(_format5, _value5); \
string s =sval1+sval2+sval3+sval4+sval5; \
TextOut(_x, _y, s); \
}
#define printf2( _x, _y, _format1, _format2, _value1, _value2) { \
string sval1 = FormatNum(_format1, _value1); \
string sval2 = FormatNum(_format2, _value2); \
string s =sval1+sval2; \
TextOut(_x, _y, s); \
}
#define printf1( _x, _y, _format1, _value1) { \
string sval1 = FormatNum(_format1, _value1); \
TextOut(_x, _y, sval1); \
}
void TXMotorOn(byte NXTport, byte TXmotor, char percentage)
{
byte retLen = 0;
char modeMsg[];
char powerMsg[];
byte devAddr, modeReg, powerReg;
char IOresult;
// addresses and registers
devAddr = (TXmotor+2)&14;
modeReg = 0x44 + (TXmotor % 2)*3;
powerReg= 0x45 + (TXmotor % 2);
ArrayBuild(modeMsg, devAddr, modeReg, 0); // 0= PWM percentage mode
ArrayBuild(powerMsg, devAddr, powerReg, percentage);
// Send the first message as soon as the bus is ready
while ((I2CCheckStatus(NXTport) == STAT_COMM_PENDING) && (I2CCheckStatus(NXTport) != NO_ERR)) Wait(1);
IOresult=I2CWrite(NXTport, retLen, modeMsg);
if (IOresult != NO_ERR)
{ printf5(0,48-(8*TXmotor),"%d","%3d","%2d","%5d","%4d",TXmotor,modeMsg[1],modeMsg[2],powerMsg[2],IOresult);
return; }
printf5(0,48-(8*TXmotor),"%d","%3d","%2d","%5d","%4d",TXmotor,modeMsg[1],modeMsg[2],powerMsg[2],IOresult);
Wait(1);
// Send the second message when the first one is done
ArrayBuild(powerMsg, devAddr, powerReg, percentage);
while ((I2CCheckStatus(NXTport) == STAT_COMM_PENDING) && (I2CCheckStatus(NXTport) != NO_ERR)) Wait(1);
IOresult=I2CWrite(NXTport, retLen, powerMsg);
if (IOresult != NO_ERR)
{ printf5(0,48-(8*TXmotor),"%d","%3d","%2d","%5d","%4d",TXmotor,modeMsg[1],modeMsg[2],powerMsg[2],IOresult);
return; }
printf5(0,48-(8*TXmotor),"%d","%3d","%2d","%5d","%4d",TXmotor,modeMsg[1],modeMsg[2],powerMsg[2],IOresult);
Wait(1);
}
void ResetTXMotorCounter(byte NXTport, byte TXmotor)
{
byte retLen = 0;
char modeMsg[];
byte devAddr, modeReg;
char IOresult;
// addresses and registers
devAddr = (TXmotor+2)&14;
modeReg = 0x44 + (TXmotor % 2)*3;
ArrayBuild(modeMsg, devAddr, modeReg, 3); // 3 = reset enc value
// Send the reset message as soon as the bus is ready
while ((I2CCheckStatus(NXTport) == STAT_COMM_PENDING) && (I2CCheckStatus(NXTport) != NO_ERR)) Wait(1);
IOresult=I2CWrite(NXTport, retLen, modeMsg);
if (IOresult != NO_ERR) { return; };
Wait(10);
}
long GetTXMotorCounter(byte NXTport, byte TXmotor)
{
byte devAddr;
const byte msgLen = 4;
byte sendMsg[];
byte replyMsg[];
byte encStartReg;
devAddr = (TXmotor+2)&14;
if (TXmotor==0) encStartReg = 0x4C;
else
if (TXmotor==1) encStartReg = 0x50;
ArrayBuild(sendMsg, devAddr, encStartReg);
// ArrayBuild(sendMsg, DGPS_I2C_ADDR, START_OF_ENCODER_REGISTER); // Only -one- register, the first one, is requested
while ((I2CCheckStatus(NXTport) == STAT_COMM_PENDING) && (I2CCheckStatus(NXTport) != NO_ERR)) Wait(1);
// if(!I2CBytes(NXTport, sendMsg, msgLen, replyMsg)) return ;
if(I2CBytes(NXTport, sendMsg, msgLen, replyMsg)) {
return replyMsg[3] + (replyMsg[2] << 8) + (replyMsg[1] << 16) + (replyMsg[0] << 24);
}
}
task showValues() {
long encoder0, encoder1;
while(1) {
encoder0= GetTXMotorCounter(0, 0);
encoder1= GetTXMotorCounter(0, 1);
Wait(10);
printf1(0,8,"M1=%7d", encoder0);
printf1(0,0,"M2=%7d", encoder1);
}
}
task main(){
TextOut(0,56,"M Rg md pow error");
SetSensorType(S1, SENSOR_TYPE_LOWSPEED);
Wait(20);
ResetSensor(S1);
Wait(50);
StartTask(showValues);
while (true) { // test loop
TXMotorOn(0, 0, 50);
TXMotorOn(0, 1, 20);
Wait(2000);
TXMotorOn(0, 0, 0); // brake
TXMotorOn(0, 1, 0); // brake
Wait(2000);
TXMotorOn(0, 0, -50);
TXMotorOn(0, 1, -20);
Wait(2000);
TXMotorOn(0, 0, 0); // brake
TXMotorOn(0, 1, -128); // coast
Wait(2000);
ResetTXMotorCounter(0,0);
ResetTXMotorCounter(0,1);
Wait(2000);
}
}
Code: Select all
void TXMotorOn(byte NXTport, byte TXmotor, char percentage)
{
byte retLen = 0;
char modeMsg[];
char powerMsg[];
byte devAddr, modeReg, powerReg;
char IOresult;
// addresses and registers
devAddr = (TXmotor+2)&14;
modeReg = 0x44 + (TXmotor % 2)*3;
powerReg= 0x45 + (TXmotor % 2);
ArrayBuild(modeMsg, devAddr, modeReg, 0); // 0= PWM percentage mode
ArrayBuild(powerMsg, devAddr, powerReg, percentage);
// Send the first message as soon as the bus is ready
while ((I2CCheckStatus(NXTport) == STAT_COMM_PENDING) && (I2CCheckStatus(NXTport) != NO_ERR)) Wait(1);
IOresult=I2CWrite(NXTport, retLen, modeMsg);
if (IOresult != NO_ERR)
{ printf5(0,48-(8*TXmotor),"%d","%3d","%2d","%5d","%4d",TXmotor,modeMsg[1],modeMsg[2],powerMsg[2],IOresult);
return; }
printf5(0,48-(8*TXmotor),"%d","%3d","%2d","%5d","%4d",TXmotor,modeMsg[1],modeMsg[2],powerMsg[2],IOresult);
Wait(1);
// Send the second message when the first one is done
ArrayBuild(powerMsg, devAddr, powerReg, percentage);
while ((I2CCheckStatus(NXTport) == STAT_COMM_PENDING) && (I2CCheckStatus(NXTport) != NO_ERR)) Wait(1);
IOresult=I2CWrite(NXTport, retLen, powerMsg);
if (IOresult != NO_ERR)
{ printf5(0,48-(8*TXmotor),"%d","%3d","%2d","%5d","%4d",TXmotor,modeMsg[1],modeMsg[2],powerMsg[2],IOresult);
return; }
printf5(0,48-(8*TXmotor),"%d","%3d","%2d","%5d","%4d",TXmotor,modeMsg[1],modeMsg[2],powerMsg[2],IOresult);
Wait(1);
}
Xander, shall I send you the controller and motors/encoders?mightor wrote:I wish I had one of each of these controllers so I could test this code. It would make debugging this a lot easier.
- Xander
Users browsing this forum: No registered users and 12 guests