Saludos compañeros PicListeros
A continuación les muestro el código en C18 del que pretende ser un programa que lea con el SRF08 1 metro de distancia.
es decir, mirar en un rango de 1 metro si hay algo o no.
el problema es que no lee mas de 40-50 cm. y no se porque, unicamente lee la parte baja, la alta son "cosas raras".
**la resistencias pull-up estan puestas de forma correcta.
**las librerias I2C y MCC18 añadidas estan correctas y han sido utilizadas en otros proyectos de forma satisfactoria.
Alguien que lo haya utilizado anteriormente o que tenga conocimientos sobre este sensor, me podria ayudar ?
muchas gracias de antemano.
#include "delays.h"
#include "i2c_pic.h"
/*
** palabra de configuracion
*/
#pragma config WDT=OFF, LVP=OFF, PBADEN=OFF, OSC=ECIO6
/*
** Rutinas a utilizar
*/
void configI2C( void ); //Config del I2C
void leeSRF08 ( char ); //Rutina para leer los datos del SRF08 indicado en el char
void leeI2C( char ); //Rutina que se encarga de la lectura I2C, ajena al dispositivo
void AckI2C( void ); //Rutina que envia un Ack por I2C
void cambiaDistancia ( char ); //Rutina para cambiar la distancia que lee el SRF08
/*
** Variables globales
*/
char bAsrf=0xaa; //byte alto del srf08
unsigned char bBsrf=0x00; //byte bajo del srf08
/*
** La main
*/
void main ( void )
{
CMCON = 0x07;
ADCON1 = 0x0f;
configI2C();
Delay10KTCYx( 250 );
//Testeo de la distancia
TRISB = 0x00;
TRISD = 0x00;
TRISC = 0XFF;
//Cambiar la distancia a 1m
//cambiaDistancia( 0xE0 );
while( 1 )
{
leeSRF08( 0xE0 );
if ( bBsrf > 0x69 )
{
}
else
{
}
LATD = bBsrf;
}
}
void configI2C( void )
{
HabilitarI2C( MASTER , SLEW_OFF );
}
/*
** Lee del SRF08
*/
void leeSRF08 ( char id )
{
//vble que controla posibles errores en la transmision en I2C
char ctrl;
//0.- Comprobamos que el bus I2C este libre
IdleI2C();
//1.- Bit Inicio
StartI2C();
//2.- Dir Disp en escritura: ||0
ctrl = WriteI2C( id );
//3.- Dir Interna: 0x00:registro de comandos
ctrl = WriteI2C( 0x00 );
//4.- Comando a ejecutar: 0x51: carga los registros que los voy a leer
ctrl = WriteI2C( 0x51 );
//5.- Bit Stop
StopI2C();
//6.- Esperamos 500 ms para que se carguen bien los registros
Delay10KTCYx( 7 );
//8.- Leemos byte a byte
leeI2C( id );
}
/*
** Rutina de lectura de I2C, ajena al dispositivo
*/
void leeI2C( char id )
{
//vble que controla posibles errores en I2C
char ctrl;
//1.- inicio
StartI2C();
//2.- dir disp
WriteI2C( id|0 );//
//3.- dir interna a leer
ctrl = WriteI2C( 0x03 );
//5.- inicio
StartI2C();
IdleI2C();
//6.- dir disp
ctrl = WriteI2C( id|1 );
//7.- leemos todo lo que queramos, enviamos ACK por cada lectura
//bAsrf = ReadI2C();
//AckI2C();
bBsrf = ReadI2C();
//8.- nack de fin
NotAckI2C();
StopI2C();
}
/*
** Rutina de envio de ACK por bus I2C
*/
void AckI2C( void )
{
SSPCON2bits.ACKDT = 0; // set acknowledge bit for ACK
SSPCON2bits.ACKEN = 1; // initiate bus acknowledge sequence
while ( SSPCON2bits.ACKEN==1 );
}
void cambiaDistancia ( char id )
{
//vble que controla posibles errores en la transmision en I2C
char ctrl;
//0.- Comprobamos que el bus I2C este libre
IdleI2C();
//1.- Bit Inicio
StartI2C();
//2.- Dir Disp en escritura: ||0
ctrl = WriteI2C( id );
//3.- Dir Interna: 0x00:registro de comandos
ctrl = WriteI2C( 0x02 );
//4.- Comando a ejecutar: 0x51: carga los registros que los voy a leer
ctrl = WriteI2C( 0x50 );
//5.- Bit Stop
StopI2C();
//6.- Esperamos 500 ms para que se carguen bien los registros
Delay10KTCYx( 7 );
}