Hola amigos, tengo un problema, estoy tratando de leer el valor de un sensor SRF02 que se supone trabaja igual que el SRF08, para esto utilizo un pic16f877 conectado a un lcd, la programación la estoy haciendo con HI TECH, la verdad he intentado de mil maneras, hasta el momento lo único que he conseguido es que el sensor parpadee cada vez que le mando que tome una lectura, pero observando las variables solo me encuentro con 255, lo que me indica que no estoy visualizando que fué lo que el sensor detectó.
El trozo de código donde trato mando a tomar la medición y recibirla es el siguiente:
Se supone que primero le indico al sensor que voy a mandarle un comando apuntado a la dirección 0x00, y despues para leerlo le digo que se mueva al registro 0x02 donde comienzan el resultado pero nada, he intentado de mil maneras pero no lo logro.
Por ahí encontré un pedazo de código de alguien que tenia un problema con éstos sensores en otro foro, esta persona decía que obtenía las lecturas sin problemas, su problema era distinto, pero su código es el siguiente:
Si pudiera usar esa parte de su programa siendo que dice que funciona pues perfecto, el problema es que no tengo esa librería que usa, estuve buscando librerías i2c que se suponían son para hi tech pero ninguna me compilaba, solo la que trae el hi tech en la carpeta Samples que es la que utilizo.
Si alguien me puede ayudar, se lo agradeceré muchísimo, la verdad ya estoy cansado y no hay modo que pueda hacer algo tan simple como tomar la lectura del sensor. Saludos.
Nota: Si el sensor lo utilizo con PBP funciona bien y me da las medidas correctas, el problema es que necesito usarlo con HI TECH.
El trozo de código donde trato mando a tomar la medición y recibirla es el siguiente:
Código:
i2c_Start();
i2c_WriteTo(0xE0);
i2c_PutByte(0x00);
i2c_PutByte(0x51);
i2c_Stop();
DelayMs(100); // Hasta aquí supongo que todo está bien porque el led parpadea
i2c_Start();
i2c_PutByte(0xE0); //También le puse i2c_WriteTo(0xE0);
i2c_PutByte(0x02);
i2c_Start();
i2c_ReadFrom(0xE1); // También le he puesto E0
A = i2c_ReadByte(); // También intenté con i2c_GetByte(I2C_MORE);
B = i2c_ReadByte(); // i2c_GetByte(I2C_LAST);
i2c_Stop();
Se supone que primero le indico al sensor que voy a mandarle un comando apuntado a la dirección 0x00, y despues para leerlo le digo que se mueva al registro 0x02 donde comienzan el resultado pero nada, he intentado de mil maneras pero no lo logro.
Por ahí encontré un pedazo de código de alguien que tenia un problema con éstos sensores en otro foro, esta persona decía que obtenía las lecturas sin problemas, su problema era distinto, pero su código es el siguiente:
Código:
Delay_Ms(200);
i2c_start();
i2c_write(sensor_number);
i2c_write(0x00);
i2c_write(0x51); //Nueva lectura, resultado en CM
i2c_stop();
Delay_Ms(70);
//***** FASE DE LECTURA DEL SENSOR *****
//Notificar la direccion a leer
i2c_start();
i2c_write(sensor_number);
i2c_write(0x02);
sensor_number++;//pasar a modo read
//Leer
i2c_start(); //Restart
i2c_write(sensor_number); //Enviar direccion
sensor_value_H = i2c_read(1); //Leer,con ACK para recibir siguiente
sensor_value = i2c_read(0); //Leer,con NACK pues no queremos mas datos
i2c_stop();
Si pudiera usar esa parte de su programa siendo que dice que funciona pues perfecto, el problema es que no tengo esa librería que usa, estuve buscando librerías i2c que se suponían son para hi tech pero ninguna me compilaba, solo la que trae el hi tech en la carpeta Samples que es la que utilizo.
Si alguien me puede ayudar, se lo agradeceré muchísimo, la verdad ya estoy cansado y no hay modo que pueda hacer algo tan simple como tomar la lectura del sensor. Saludos.
Nota: Si el sensor lo utilizo con PBP funciona bien y me da las medidas correctas, el problema es que necesito usarlo con HI TECH.
Código:
main:
I2CWRITE PORTC.4,PORTC.3,$E0,0,[81] ' Request start of ranging
pause 100 ' Wait for ranging to finish
I2CREAD PORTC.4,PORTC.3,$E0,2,[b1,b0] ' Get the ranging results
lcdout $fe1,2,"Range: ",#w0," " ' Display range data to the screen
PAUSE 2000
LCDOUT $FE, 1
goto main