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,366 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
goofyahead
Respuestas: 35
Topic starter
(@goofyahead)
Eminent Member
Registrado: hace 18 años

Mas descubrimientos pero sigo atascadisimo, poniendo el InicioI2C(); fuera del while no parpadea el led de medición del srf02, si esta dentro si, sucede lo mismo con las definiciones de variables, estimo que el compilador lo determina asi, aunque deberia poder estar fuera del while, no lo hace, sigue sin funcionar y cada vez entiendo menos...

Un saludo.

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

He mirado el codigo donde usao el I2C, y he visto que los puertos del I2C, uso software, lo pongo a 1, antes de empezar toda la rista de funciones para que vaya... prueba a ver....

Responder
Página 2 / 2
Compartir: