Autor Tema: SRF08 con problema desconocido en el codigo C  (Leído 1377 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado djinn

  • PIC10
  • *
  • Mensajes: 2
SRF08 con problema desconocido en el codigo C
« en: 26 de Febrero de 2010, 15:02:03 »
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.

Código: [Seleccionar]
#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 );
}


 

anything