#include <16F873A.H>
#fuses PUT,BROWNOUT,NOWDT,NOLVP,XT,PROTECT,WRT_50%,CPD //Fusibles de programacion
#use delay(clock=4M) //Frecuencia de trabajo
#use i2c (master,scl=PIN_C3,sda=PIN_C4,slow) //Habilita funciones I2C por hardware
#use fast_io (C) //Configuracion de los puertos
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) //Habilita las funciones RS232, velocidad a 9600 baudios
#define Tx printf
#define Rx getc
#define Tx_char putc
#define lcd_xy lcd_gotoxy
#define lcd_char lcd_putc
int I2C_Buffer [16]; //buffer de recepción de un dispositivo I2C
int1 data=0;
#include <I2C_16-18FXXX.H> //Incluye rutinas I2C básicas de propósito general
#include <SRF02_multidir.H> //Incluye rutinas de control del sónar SRF02 multidireccion
#include "lcdb.c" //Incluye rutinas para el manejo de la LCD en el puerto B
#int_CCP2 //Interrupcion para el control de la medida
void go_done_isr(void)
{
if(data)
data = false;
else
data = true;
}
void main()
{
int16 resultado1,resultado_old=0;
SETUP_ADC_PORTS(NO_ANALOGS);
SETUP_CCP2(CCP_CAPTURE_FE);
enable_interrupts(INT_CCP2);
enable_interrupts(GLOBAL);
lcd_init();
lcd_char("\fSRF02 - M.L.O");
putc(0x0c);
Tx("SRF02 - M.L.O\r\n");
delay_ms(1000);
lcd_char("\f");
while(true)
{
if(data)
{
SRF02_cm(SRF02_1);//SRF02_1 : 0xE0
resultado1=make16(I2C_Buffer[0],I2C_Buffer[1]);
lcd_xy(1,1);
Tx(lcd_char,"dx:%lu cm ",resultado1);
if(resultado1 != resultado_old)
{
Tx("dx: %lu cm \r\n", resultado1);
resultado_old = resultado1;
}
}
else
{
lcd_xy(1,1);
lcd_char("ESPERANDO ACTIVACION");
}
}
VOID Leer_I2C(Dir_I2C,I2C_Dir_Ini,I2C_N_Bytes)
{
int indice=0;
int contador;
i2c_start(); //Secuencia de inicio
i2c_write(Dir_I2C); //Dirección I2C del dispositivo modo escritura
i2c_write(I2C_Dir_Ini); //Envia dirección interna del dispositivo
i2c_stop(); //Envía secuencia de stop
i2c_start(); //Envía secuencia de inicio
i2c_write(Dir_I2C|0b00000001); //Envía dirección I2C del dispositivo en modo lectura
For(contador=I2C_N_Bytes-1;contador>=1;contador--) //Ultimo byte a leer ??
{
I2C_Buffer[indice]=i2c_read(); //No, leer el byte, envíar ACK y almacenar en el buffer
indice++; //Siguiente posición en el buffer
}
I2C_Buffer[indice]=i2c_read(0); //Si, lee último byte, envía NACK y almacena en el buffer
i2c_stop(); //Secuencia de stop
}
VOID Escr_I2C(Dir_I2C,I2C_Dir_Ini,I2C_N_Bytes)
{
int indice=0;
int contador;
i2c_start(); //Secuencia de inicio
i2c_write(Dir_I2C); //Dirección I2C del dispositivo modo escritura
i2c_write(I2C_Dir_Ini); //Envia dirección interna del dispositivo
For(contador=I2C_N_Bytes;contador>=1;contador--) //Ultimo byte a escribir ??
{
i2c_write(I2C_Buffer[indice]); //No, leer byte del buffer y enciarlo al dispositivo I2C
indice++; //Siguiente posición del buffer
}
i2c_stop(); //Secuencia de stop
}
#define SRF02_1 0xE0 //Dirección I2C del SRF02_1
#define SRF02_2 0XE2 //Direccion I2C del SRF02_2
/*************************************************************************************************
SRF02_Ejec():El SRF02 ejecuta un determinado comando.
dir es la direccion correspondiente del SRF02*/
void SRF02_Ejec(int SRF02_Comando,int dir)
{
i2c_start(); //Secuencia de inicio
i2c_write(dir); //Dirección I2C del SRF02 modo escritura
i2c_write(0x00); //Dirección interna 0x00 (registro de comandos)
i2c_write(SRF02_Comando); //Enviar comando a ejecutar
i2c_stop(); //Secuencia de stop
delay_ms(80); //Temporización de 80mS necesaria para realizar la ejecución
/*Secuencia para la lectura del resultado medido por el SRF02 */
Leer_I2C(dir,0x2,0x02); //Realiza la medida del resultado
}
/**********************************************************************************************
SRF02_in(): Realiza una medida en pulgadas.El resultado se almacen en I2C_Buffer */
void SRF02_in(int dir)
{
SRF02_Ejec(0x50,dir); //Ejecuta el comando
}
/**********************************************************************************************
SRF02_cm(): Realiza una medida en centímetros.El resultado se almacen en I2C_Buffer */
void SRF02_cm(int dir)
{
SRF02_Ejec(0x51,dir); //Ejecuta el comando
}
/**********************************************************************************************
SRF02_us(): Realiza una medida en microsegundos.El resultado se almacen en I2C_Buffer */
void SRF02_us(int dir)
{
SRF02_Ejec(0x52,dir); //Ejecuta el comando
}
/***********************************************************************************************************
SRF02_Reset(): Fuerza un reinicio del SRF02, realizando un ciclo de autoajuste. Es similar al Power Up */
void SRF02_Reset(int dir)
{
i2c_start(); //Secuencia de inicio
i2c_write(dir); //Dirección I2C del SRF02 modo escritura
i2c_write(0x00); //Dirección interna 0x00 (registro de comandos)
i2c_write(0x60); //Enviar comando para la transmisión de una ráfaga
i2c_stop(); //Secuencia de stop
delay_ms(80); //Temporización de 80mS necesaria para realizar la ejecución
}
/***********************************************************************************************************
SRF02_I2C_Dir(): Cambia la dirección I2C del SRF02. SRF02_New_Dir debe expresar la nueva dirección I2C */
void SRF02_I2C_Dir(int SRF02_New_Dir, int SRF02_Last_Dir)
{
i2c_start(); //Secuencia de inicio
i2c_write(SRF02_Last_Dir); //Dirección I2C del SRF02 modo escritura
i2c_write(0x00); //Dirección interna 0x00 (registro de comandos)
i2c_write(0xA0); //1ª secuencia para el cambio de dirección
i2c_stop(); //Secuencia de stop
i2c_start(); //Secuencia de inicio
i2c_write(SRF02_Last_Dir); //Dirección I2C del SRF02 modo escritura
i2c_write(0x00); //Dirección interna 0x00 (registro de comandos)
i2c_write(0xAA); //2ª secuencia para el cambio de dirección
i2c_stop(); //Secuencia de stop
i2c_start(); //Secuencia de inicio
i2c_write(SRF02_Last_Dir); //Dirección I2C del SRF02 modo escritura
i2c_write(0x00); //Dirección interna 0x00 (registro de comandos)
i2c_write(0xA5); //3ª secuencia para el cambio de dirección
i2c_stop(); //Secuencia de stop
i2c_start(); //Secuencia de inicio
i2c_write(SRF02_Last_Dir);//Dirección I2C del SRF02 modo escritura
i2c_write(0x00); //Dirección interna 0x00 (registro de comandos)
i2c_write(SRF02_New_Dir); //Nueva dirección I2C
i2c_stop(); //Secuencia de stop
}