ROBOTC.net forums
http://robotc.net/forums/

Translate program from NXT to EV3
http://robotc.net/forums/viewtopic.php?f=41&t=11271
Page 1 of 1

Author:  CyD [ Fri May 22, 2015 5:38 am ]
Post subject:  Translate program from NXT to EV3

I'm trying to adapt a program nxt to ev3. But there are some instructions or variables,i don t know replace . If there is a place to look for equivalences.

instructions:
nI2CStatus
sendI2CMsg
readI2CReply

variables:
STAT_COMM_PENDING

Author:  mightor [ Fri May 22, 2015 5:58 am ]
Post subject:  Re: Translate program from NXT to EV3

Hi there,

Take a look at common.h in my driver suite for copious examples of usage of those functions and variables.

https://github.com/botbench/robotcdriversuite

= Xander

Author:  CyD [ Fri May 22, 2015 6:59 am ]
Post subject:  Re: Translate program from NXT to EV3

Thanks

It has solved some problems but there are two errors that not, I put the program and errors giving to see if you can solve the doubt.
Code:
#pragma config(Sensor, S1,     IRSensor,       sensorEV3_GenericI2C)
#pragma config(Motor,  motorA,           ,             tmotorEV3_Large, openLoop, encoder)
#pragma config(Motor,  motorB,           ,             tmotorEV3_Large, openLoop, encoder)
#pragma config(Motor,  motorC,           ,             tmotorEV3_Large, openLoop, encoder)
//*!!Code automatically generated by 'ROBOTC' configuration wizard               !!*//

//No deberia ser del tipo: const tSensors IRSensor  = (tSensors) S1;
#include "C:\Program Files (x86)\Robomatter Inc\ROBOTC Development Environment 4.X\Sample Programs\EV3\3rd Party Driver Library\include\common.h"
task main() {

int dir, ir1, ir2, ir3, ir4;

//Variables para el braitenberg
int matrix_prox[2][4] =   {{-8,-4,2,4},   {5,3,-5,-9,}};
int potential[2];
int ir[4];
int s,m;

//Creamos una estructura en la que ponemos el tamaño del mensaje que vamos a enviar,
//la dirección del dispositivo 0x90
//y la dirección donde vamos a empezar a leer los datos,
//que en este caso nos interesa que sea la 0x44 porque es el primer registro que queremos leer
typedef struct{
byte TamMsj;
byte DirDispositivo;
byte DirInicio;
} SalidaI2C;


//Creamos un vector de 1 bytes en el que se escribirán los registros leídos,
//que en este caso solo el 0x44, si quisieramos leer más registros,
//tendríamos crear un vector con más posiciones
byte replyMessage[6];

//Función de robotC para I2C en la que inicializamos los Bytes preparados del puerto S1 a 0*/
nI2CBytesReady[S1]=0;

//Función de robotC que nos indica el estado del Bus.
//Aquí nos dedicamos a esperar mientras el Bus esté ocupado
while(nI2CStatus[S1]== i2cStatusPending)
   wait1Msec(2);

//Inicializamos nuestra estructura con los valores que nos interesen //Y QUE VALORES SON ESOS???
SalidaI2C Salida;

Salida.TamMsj = 2;
Salida.DirDispositivo = 0x90;   //LA DIRECCION ES SIEMPRE LA MISMA??? QUE PASA SI PONGO 8 SENSORES
Salida.DirInicio = 0x44;        //ES SIMEPRE LA MISMA???

//Salida.DirDispositivo = 0x0;   //LA DIRECCION ES SIEMPRE LA MISMA??? QUE PASA SI PONGO 8 SENSORES
//Salida.DirInicio = 0x0;        //ES SIMEPRE LA MISMA???


//Funcion de robotC en la que mandamos un mensaje al puerto S1 con el tamaño
//que hemos indicado a una de memoria
while(true) {
   nI2CBytesReady[S1]=0;
   sendI2CMsg(S1,Salida.TamMsj,5);

   //Esperamos a que el bus deje de estar ocupado del mismo modo que antes //SIEMPRE HAY QUE HACERLO ASI, EVENTOS???
   while (nI2CStatus[S1]==i2cStatusPending)
      wait1Msec(2);

   //Si no se ha producido ningún error en el bus
   if (nI2CStatus[S1]==i2cStatusNoError) {

      //Leemos la respuesta del puerto S1 y la escribimos en el vector que hemos creado
      readI2CReply(S1, replyMessage[0], 5);

      //MIO
      dir = (int)replyMessage[0];    // Indica la direccion

      for (s = 0; s < 4; s++) {
        ir[s] = (int)replyMessage[s+1];

        if(ir[s] == -1) {
          ir[s] = 0;
        } else {
          ir[s] = (0x00FF & ir[s]);
        }

        if(ir[s] < 55) { // Umbral para el Braitenberg
          ir[s] = 0;
        }
      }

      for (m = 0; m < 2; m++) {
        potential[m] = 0;
        for (s = 0; s < 4; s++) {
          potential[m] += (matrix_prox[m][s]*ir[s]);
        }
        potential[m] = potential[m]/8 + 50; // pot/scale + basic speed;

      }

      motor[motorA] = potential[0];
    motor[motorB] = potential[1];

      //END MIO

       /*
      dir = (int)replyMessage[0];    // Indica la direccion
      ir1 = (int)replyMessage[1];    //Fuerza en la zona 1
      ir2 = (int)replyMessage[2];    //Fuerza en la zona 2
      ir3 = (int)replyMessage[3];    //Fuerza en la zona 3
      ir4 = (int)replyMessage[4];    //Fuerza en la zona 4

      if ( replyMessage[1] == -1 ) { // -1 reservado para errores //QUE TIPO DE ERRORES???
         ir1 = 0; // cambio a 0
      } else {
         ir1 = ( 0x00FF & replyMessage[1] );
      }

      if ( replyMessage[2] == -1 ) { // -1 reservado para errores
         ir2 = 0; // cambio a 0
      } else {
         ir2 = ( 0x00FF & replyMessage[2] );
      }
      if ( replyMessage[3] == -1 ) { // -1 reservado para errores
         ir3 = 0; // cambio a 0
      } else{
         ir3 = ( 0x00FF & replyMessage[3] );
      }

      if ( replyMessage[4] == -1 ) { // -1 reservado para errores
         ir4 = 0; // cambio a 0
      } else {
         ir4 = ( 0x00FF & replyMessage[4] );
      }
      */

      //Convertimos los Bytes en el tipo que nos interese
      //Y los escribimos en la pantalla del NXT
      displayTextLine(0, "       UPV");
      displayTextLine(1, "Lab. de robotica");
      displayTextLine(3, "    Sensor IR");
      displayTextLine(4, "Lectura: %d", ir1);
      displayTextLine(5, "Lectura: %d", ir2);
      displayTextLine(6, "Lectura: %d", ir3);
      displayTextLine(7, "Lectura: %d", ir4);

      } else {
         // Si se ha producimo algún error, lo mostramos por la pantalla de NXT
         displayTextLine(3, "i2c err %d", nI2CStatus[S1]);
      }
   }
}


Code:
**Error**:Expression does not fit parameter. Call to 'sendI2CMsg'. Parameter: 'char * pSendMsg' is 'Salida.TamMsj' of type 'byte'.
**Error**:'*' Indirection levels mismatch. Call to 'readI2CReply'. Parameter: 'char * pReplyBytes' is 'replyMessage[0]' of type 'byte'.

Author:  mightor [ Fri May 22, 2015 7:05 am ]
Post subject:  Re: Translate program from NXT to EV3

You could also just include "hitechnic-irseeker-v2.h" from my driver suite to do all this work for you :) Take a look at the hitechnic-irseeker* files in the examples folder.

= Xander

Author:  mightor [ Fri May 22, 2015 7:06 am ]
Post subject:  Re: Translate program from NXT to EV3

I removed your duplicate posts in this thread.

Page 1 of 1 All times are UTC - 5 hours [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/