Hola, he armado un código en C para mi robot minisumo, pero tengo el sig. problema: El robot cuando esta en movimiento y detecta al oponente o el borde del ring, automáticamente no inicia la subrutina hecha para cada situación, sino que espera a terminar el movimiento y recién ahí la realiza(si aun la detecta) o sino continua buscando(moviéndose). He pensado en mejorar el código usando interrupciones, pero hay de muchos tipos y no se como configurarlas. Si alguien se le ocurre otra idea o tiene experiencia con lo robots sumo-minisumo por favor comenten...
Dejo el codigo que tengo hasta ahora:
Dejo el codigo que tengo hasta ahora:
Código:
#include<16F628A.h> //USO PIC 16F628A
#use delay (clock=4000000) //CRISTAL 4MHz
#define TRISB=0b11111111 //PUERTO B ENTRADA
#define TRISA=0b00000 //PUERTO A SALIDA
#FUSES XT,NOWDT
#use fast_io(A)
#use fast_io(B)
#byte portA = 5 // se definen las direcciones de memoria
#byte portB = 6 // se definen las direcciones de memoria
VOID AVANZAR(); //FUNCION AVANZAR
VOID DER(); //FUNCION GIRAR A LA DERECHA
VOID IZQ(); //FUNCION GIRAR A LA IZQUIERDA
VOID ATRAS(); //FUNCION RETROCEDER
VOID VUELTA(); //FUNCION GIRA 180º A LA DERECHA
VOID SURESTE(); //FUNCION GIRAR 135º DERECHA
VOID SUROESTE(); //FUNCION GIRAR 135º IZQUIERDA
VOID DIAGODER(); //FUNCION GIRAR 45º DERECHA
VOID DIAGOIZQ(); //FUNCION GIRAR 45º IZQUIERDA
void main()
{
set_tris_b (0b11111111); //DEFINE TRIS B COMO ENTRADAS 1
set_tris_a (0b00000); //DEFINE TRIS A COMO SALIDAS 0
PORTA=(0x00); //INICIALIZA TODO EN 0
PORTB=(0x00);
DELAY_MS(5000); //ESPERA 5 SEG.
WHILE(TRUE)
{
//****//****SENSORES OPONENTE****//****
IF(INPUT(PIN_B0)) //SENSOR FRENTE
{DELAY_MS(20);
IF(INPUT(PIN_B0))
AVANZAR();}
ELSE IF(INPUT(PIN_B1)) //SENSOR DERECHA
{DELAY_MS(20);
IF(INPUT(PIN_B1))
{DER();
AVANZAR();
}
}
ELSE IF(INPUT(PIN_B2)) //SENSOR ATRAS
{DELAY_MS(20);
IF(INPUT(PIN_B2))
{VUELTA();
AVANZAR();
}}
ELSE IF(INPUT(PIN_B3)) //SENSOR IZQ
{DELAY_MS(20);
IF(INPUT(PIN_B3))
{
IZQ();
AVANZAR();
}
}
//****//****SENSORES DE LINEA****//****
ELSE IF(INPUT(PIN_B4)) //SENSOR FRONTAL IZQ
{DELAY_MS(20);
IF(INPUT(PIN_B4))
{
ATRAS();
SURESTE();
AVANZAR();}
}
ELSE IF(INPUT(PIN_B5)) //SENSOR FRONTAL DER
{DELAY_MS(20);
IF(INPUT(PIN_B5))
{
ATRAS();
SUROESTE();
AVANZAR();}
}
ELSE IF(INPUT(PIN_B6)) //SENSOR ATRAS DER
{DELAY_MS(20);
IF(INPUT(PIN_B6))
{
AVANZAR();
DIAGOIZQ();
AVANZAR();
}
}
ELSE IF(INPUT(PIN_B7)) //SENSOR ATRAS IZQ
{DELAY_MS(20);
IF(INPUT(PIN_B7))
{
AVANZAR();
DIAGODER();
AVANZAR();
}
}
ELSE IF(INPUT(PIN_B4)&&INPUT(PIN_B5)) //FRONTAL IZQ+DER
{DELAY_MS(20);
IF(INPUT(PIN_B4)&&INPUT(PIN_B5))
{ATRAS();
VUELTA();
AVANZAR();
}
}
ELSE IF(INPUT(PIN_B5)&&INPUT(PIN_B6)) //FRONTAL DER+ATRAS DER
{DELAY_MS(20);
IF(INPUT(PIN_B5)&&INPUT(PIN_B6))
{DIAGODER();
AVANZAR();
}
}
ELSE IF(INPUT(PIN_B6)&&INPUT(PIN_B7)) //ATRAS IZQ+DER
{DELAY_MS(20);
IF(INPUT(PIN_B6)&&INPUT(PIN_B7))
{DIAGODER();
AVANZAR();
}
}
ELSE IF(INPUT(PIN_B4)&&INPUT(PIN_B7)) //ATRAS IZQ+FRONTAL IZQ
{DELAY_MS(20);
IF(INPUT(PIN_B4)&&INPUT(PIN_B7))
{DIAGODER();
AVANZAR();
}
}
//****//****OTROS****//****
ELSE { //SINO DETECTA NADA
VUELTA();
AVANZAR();
}
}
}
VOID AVANZAR()
{
PORTA=(0b10101);
delay_ms(3000);
PORTA=(0b00000);
}
VOID DER()
{
PORTA=(0b01101);
delay_ms(3000);
PORTA=(0b00000);
}
VOID IZQ()
{
PORTA=(0b10011);
delay_ms(3000);
PORTA=(0b00000);
}
VOID ATRAS()
{
PORTA=(0b01011);
delay_ms(3000);
PORTA=(0b00000);
}
VOID VUELTA()
{
PORTA=(0b01101);
delay_ms(6000);
PORTA=(0b00000);
}
VOID DIAGODER()
{
PORTA=(0b01101);
delay_ms(1500);
PORTA=(0b00000);
}
VOID DIAGOIZQ()
{
PORTA=(0b10011);
delay_ms(1500);
PORTA=(0b00000);
}
VOID SURESTE()
{
PORTA=(0b01101);
delay_ms(4500);
PORTA=(0b00000);
}
VOID SUROESTE()
{
PORTA=(0b10011);
delay_ms(4500);
PORTA=(0b00000);
}