fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Utilizar I2C con se...
 
Avisos
Vaciar todo

Utilizar I2C con sensor Srf02

7 Respuestas
3 Usuarios
0 Reactions
3,365 Visitas
goofyahead
Respuestas: 35
Topic starter
(@goofyahead)
Eminent Member
Registrado: hace 18 años

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

Responder
6 respuestas
boops
Respuestas: 1813
(@boops)
Ardero
Registrado: hace 19 años

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.

Responder
goofyahead
Respuestas: 35
Topic starter
(@goofyahead)
Eminent Member
Registrado: hace 18 años

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 🙂

Responder
Lorth
Respuestas: 188
(@lorth)
Estimable Member
Registrado: hace 17 años

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.

Responder
goofyahead
Respuestas: 35
Topic starter
(@goofyahead)
Eminent Member
Registrado: hace 18 años

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.

Responder
Página 1 / 2
Compartir: