TODOPIC
Mecatrónica => Robótica => Mensaje iniciado por: Linea en 11 de Enero de 2011, 07:00:40
-
Hola a todos, estoy montando un robot seguidor de linea y necesito que alguien me ayude con el programa del sensor que no me funciona correctamente y ya he estropeado un servomotor.
El Robot se compone de 2 motores, uno DC para las ruedas traseras y un Servo para las ruedas delanteras.
Necesito ayuda para programar el giro con los 3 sensores.
El programa que llevo hecho es el siguiente:
//////////////////////////////////TIMERS////////////////////////////////////////
#include <12f683.h>
//#fuses NOWDT // SIN WATCH DOG TIMER
#fuses INTRC_IO // OSCILADOR INTERNO SIN CLKOUT
#fuses NOCPD // NO EE PROTECTION
#fuses NOPROTECT // NO SE PUEDE LEER EL CODIGO DEL PIC
#fuses NOMCLR // PIN_A3 USADA PARA ENTRADA Y NO PARA RESET
#fuses NOPUT // SIN POWER UP TIMER
#fuses NOBROWNOUT // SIN BROWNOUT RESET
#use delay (clock=8000000) //CONFIGURACION DEL RELOJ
//#rom 0x7ff = {0x3400} // SOLUCIONA UN BUG DEL COMPILADOR
#DEFINE LIMITE_CONTADOR2 100
#DEFINE LIMITE_CONTADOR0 100
//***************VARIABLES GLOBALES****************************
//***************INTERRUPCIONES********************************
//****************************************************************
//***************FUNCIONES**************************************
//****************************************************************
void main ()
{
int contador0=0, lectimer0=0, lectimer2=0, contador2=0;
int CENTRO=8;
int DERECHA=6;
int IZQUIERDA=10;
//*******************CONFIGURACION INICIAL**************************
setup_oscillator(OSC_8MHZ); //CONFIGURA EL OSCILADOR A 8 MHZ
setup_adc_ports(NO_ANALOGS); //ADCs DESACTIVADOS
setup_adc(ADC_OFF); //ADCs DESACTIVADOS
setup_comparator(NC_NC_NC_NC); //COMPARADOR DESACTIVADO
setup_vref(FALSE); //SIN TENSION DE REFERENCIA
setup_timer_0(RTCC_DIV_2 | RTCC_INTERNAL );
setup_timer_1(T1_DISABLED); //TIMER1 DESACTIVADO
setup_timer_2(T2_DIV_BY_4,0XFA,1); //TIMER2 - POR CADA 4 CUENTA 1
//setup_ccp1(CCP_PWM); //ANCHO DE PULSO
set_tris_a(0b00101110); //CONFIGURACIÓN TRISA
output_low(PIN_A0); //INICIALIZAMOS LA PUERTA A.
output_low(PIN_A1);
output_low(PIN_A2);
//output_low(PIN_A3);
output_low(PIN_A4);
output_low(PIN_A5);
delay_ms(500);
//***************CODIGO PRINCIPAL DEL PROGRAMA********************
while(true)
{
lectimer2=get_timer2(); //lectura del valor del timer 2
lectimer0=get_RTCC(); //lectura del valor del timer 0
if (input(PIN_A5)&&!input(PIN_A1)&&!input(PIN_A2))
if ((lectimer2>248) && (contador2<LIMITE_CONTADOR2))
{
contador2++;
set_timer2(0);
}
if ((lectimer0>123) && (contador0<CENTRO+1) && (contador2<LIMITE_CONTADOR2))
{
output_high(PIN_A4);
set_timer0(0);
contador0++;
}
if ((lectimer0>123) && (contador0>CENTRO) && (contador2<LIMITE_CONTADOR2))
{
output_low(PIN_A4);
set_timer0(0);
contador0++;
}
if (contador2==LIMITE_CONTADOR2)
{
contador0 = 0;
contador2 = 0;
}
}
if (input(PIN_A1)&&!input(PIN_A5)&&!input(PIN_A2))
{
if ((lectimer2>248) && (contador2<LIMITE_CONTADOR2))
{
contador2++;
set_timer2(0);
}
if ((lectimer0>123) && (contador0<IZQUIERDA+1) && (contador2<LIMITE_CONTADOR2))
{
output_high(PIN_A4);
set_timer0(0);
contador0++;
}
if ((lectimer0>123) && (contador0>IZQUIERDA) && (contador2<LIMITE_CONTADOR2))
{
output_low(PIN_A4);
set_timer0(0);
contador0++;
}
if (contador2==LIMITE_CONTADOR2)
{
contador0 = 0;
contador2 = 0;
}
}
if (input(PIN_A2)&&!input(PIN_A1)&&!input(PIN_A5))
{
if ((lectimer2>248) && (contador2<LIMITE_CONTADOR2))
{
contador2++;
set_timer2(0);
}
if ((lectimer0>123) && (contador0<DERECHA+1) && (contador2<LIMITE_CONTADOR2))
{
output_high(PIN_A4);
set_timer0(0);
contador0++;
}
if ((lectimer0>123) && (contador0>DERECHA) && (contador2<LIMITE_CONTADOR2))
{
output_low(PIN_A4);
set_timer0(0);
contador0++;
}
if (contador2==LIMITE_CONTADOR2)
{
contador0 = 0;
contador2 = 0;
}
}
}