Aki dejo el programa que uso actualmente en mi bot para que le echeis un vistazo,
esta diseñado para llevar conectado un sensor de ultrasonidos SRF08 al bus I2c,
el cual incluye un pequeño sensor LDR para medir la luz,y un sensor PIR para
detectar movimiento en la patita D7 de nuestro PIC.
#include <18F452.h>
#fuses NOWDT,HS,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use I2C (master,sda=PIN_C4, scl= PIN_C3)
#include <lcd_placa.c>
typedef enum {parado, adelante, atras, derecha, izquierda} mov;
mov mov_bot=parado;
unsigned int aux;
//*************Rutina de interrupcion por desbordamiento del TIMER0*************
#INT_RTCC
void rutina_rtcc()
{
IF (mov_bot==parado)
{
output_bit(PIN_C1,0);
output_bit(PIN_C2,0);
}
ELSE
{
switch (mov_bot)
{
case adelante:
output_bit(PIN_D0,1);
output_bit(PIN_D1,1);
break;
case atras:
output_bit(PIN_D0,0);
output_bit(PIN_D1,0);
break;
case derecha:
output_bit(PIN_D0,0);
output_bit(PIN_D1,1);
break;
case izquierda:
output_bit(PIN_D0,1);
output_bit(PIN_D1,0);
break;
}
output_bit(PIN_C1,1); // enable-disable motor 1
output_bit(PIN_C2,1); // enable-disable motor 2
}
}
//******************************************************************************
void main()
{
int16 distancia,luz;
char distancia_L, distancia_H;
set_tris_a(0xFF);
set_tris_c(0b00000001);
set_tris_d(0b00000001);
set_tris_e(0b100);
lcd_init();
lcd_putc("f");
lcd_putc("Inicializando...
");
FOR (aux=20;aux>0;aux--)
{
lcd_gotoxy(1,2);
printf(lcd_putc,"%d secs ",aux);
delay_ms(1000);
}
lcd_putc("f");
aux=0;
output_float(PIN_C3);
output_float(PIN_C4);
setup_counters(rtcc_internal,rtcc_div_2);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
mov_bot=parado;
lcd_putc("f");
lcd_putc("SLEEPING");
WHILE(input(PIN_D7)==1) // 1 -> NO ha detectado movimiento
{
}
lcd_putc("f");
lcd_putc("MOV. DETECTADO");
delay_ms(1000);
lcd_putc("f");
WHILE (1)
{
aux=aux+1;
IF (aux==100)
{
mov_bot=parado;
lcd_putc("f");
lcd_putc("SLEEPING");
delay_ms(2000);
WHILE(input(PIN_D7)==1) // 1 -> NO ha detectado movimiento
{
}
lcd_putc("f");
lcd_putc("MOV. DETECTADO");
delay_ms(1000);
lcd_putc("f");
aux=0;
mov_bot=adelante;
}
i2c_start();
i2c_write(0xE0); //Direccion del SRF08 en escritura
i2c_write(0x00); //registro usado
i2c_write(0x51); //comando calculo distancia en centimetros
i2c_stop();
delay_ms(100);
i2c_start();
i2c_write(0xE0); //Direccion del SRF08 en escritura
i2c_write(0x01); // apunta al registro 0x01
i2c_stop();
i2c_start();
i2c_write(0xE1); //Direccion del SRF08 en lectura
luz=i2c_read(1); //lee la luminosidad
distancia_H=i2c_read(1); //lee el byte alto de la distancia
distancia_L=i2c_read(0); //lee el byte bajo de la distancia
i2c_stop();
distancia=make16(distancia_H,distancia_L);
IF (luz<15)
{
mov_bot=parado;
delay_ms(100);
lcd_putc("f");
lcd_putc("SLEEPING");
}
ELSE
{
mov_bot=adelante;
lcd_putc("f");
printf(LCD_putc,"Dist.: %lu cm
Luz: %lu lux", distancia, luz);
IF (distancia<15)
{
mov_bot=parado;
delay_ms(3000);
mov_bot=adelante;
}
IF (distancia<30)
{
mov_bot=derecha;
delay_ms(1000);
mov_bot=adelante;
delay_ms(200);
}
}
}
}