Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Hola a todos, me encuentro tras leer mucha documentación dando cabezazos a las paredes, estoy utilizando Mplab y C18 integrado, lo que quiero conseguir es simplemente leer por I2C la distancia que mide el SRF02, nada complejo, pero no lo consigo, aparentemente realiza la medición ya que el Led del dispositivo parpadea tal y como informa la documentación, pero al leer la variable X que uso siempre tiene un valor de 0xFF ; incluso si leo el registro (0x02) el cual debería en lectura siempre devolver 0x80, creo por tanto que lo que leo es que la señal esta en alto y por eso leo 0xFF.
Este es el código, agradecería cualquier ayuda 🙂
#include <p18f252.h> //includes necesarios para C en C18 Mplab
#include <delays.h>
#include <i2c.h>
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config BOR = OFF
#pragma config OSC = XT
void delay (void)
{
int i;
for (i = 0; i < 10000; i++);
}
void Inicio_i2c(void){
OpenI2C(MASTER,SLEW_OFF); //Inicio del I2C con reloj de 4Mhz
SSPADD=9; //Creo que el SSPADD esta bien calculado
}
void Mide_cm (void){ // Rutina para iniciar una medicion
StartI2C();
WriteI2C(0xE0);
WriteI2C(0x00);
WriteI2C(0x51);
StopI2C();
Delay100TCYx(70); //pausa de 70 ms
}
void parpadeo(void){
PORTB = 0x10;
Delay1KTCYx(250);
PORTB = 0x00;
Delay1KTCYx(250);
PORTB = 0x10;
Delay1KTCYx(250);
PORTB = 0x00;
Delay1KTCYx(250);
}
void main (void)
{
TRISB = 0;
TRISC = 0x18; //no estoy completamente seguro de que esto sea asi
while (1){
unsigned char x = 0x00;
Inicio_i2c();
Mide_cm();
StartI2C(); //Comienza la rutina para leer
WriteI2C(0xE0);
WriteI2C(0x02); //Registro a leer
RestartI2C();
WriteI2C(0xE1); //Dirección del srf02 con el bit de lectura a 1
IdleI2C();
x = ReadI2C(); //Aqui x siempre toma valor 0xFF
StopI2C();
if (x<0x56)PORTB = 0x10; //Esto seria para que si el bit alto de medición es //superior un led se enciende
else PORTB = 0x00;
}
}
Muchas gracias de antemano 🙂
Un saludo.
Gof
Ummm seguramente estas leyendo el pull-up del bus, posiblemente sea un problema de direcciones (que estes leyendo una dirección vacia) A mi me pasaba algo parecido con algunos integrados de philips.
En principio escribo en 0xE0 que es la dirección del SRF02 y cuando escribo el comando 0x51 (tomar medida en cm) el SRF02 actúa, ya que su led de actividad parpadea así que la dirección del dispositivo parece estar bien, y la del registro estimo que también, nadie tiene referencias o código concreto del manejo de estos dispositivos en C con C18? tiene que ser un fallo sencillo que no estoy teniendo en cuenta pero ya no lo veo 🙁
Gracias por las respuestas 🙂
Yo con el i2c, tube algunos problemas sobretodo cuando se me peto el periferico y lo tenia que usar con software. Mi recomendacion: entre las diferentes funciones de I2c pon esperas. Yo fue poner esperas y que fuera todo fluido.
Por cierto, mirando tu codigo por encima, crees necesario estar inicializando y parando constantemente el i2C? Inicialo una vez y ya esta, no lo hagas en cada vuelta del main.
Lo de la inicialización tienes toda la razon Lorth, voy a cambiar eso y a poner esperas entre los comandos a ver si me ayuda, informare con esos cambios y otros que me han comentado en el foro del fabricante, a ver si con todo eso consigo que funcione.
En cuanto tenga mas dudas o la solución, lo publico 🙂
Un saludo.