include<16F688.h>
#fuses HS,NOWDT,NOBROWNOUT,NOMCLR
#use delay(clock=20M)
#use rs232(baud=57600,parity=N,bits=8,UART1)
#zero_ram
#define on output_high
#define off output_low
#define EN_MLEFT on(pin_c0)
#define EN_MRIGHT on(pin_a2)
#define DIS_MLEFT off(pin_c0)
#define DIS_MRIGHT off(pin_a2)
#define LEFT1 pin_c1
#define LEFT2 pin_c2
#define RIGHT1 pin_a1
#define RIGHT2 pin_a0
#define GIROL1 on(LEFT1); off(LEFT2)
#define GIROL2 off(LEFT1); on(LEFT2)
#define STOPL off(LEFT1); off(LEFT2)
#define GIROR1 on(RIGHT1); off(RIGHT2)
#define GIROR2 off(RIGHT1); on(RIGHT2)
#define STOPR off(RIGHT1); off(RIGHT2)
const int LENGHT_BUFER = 70;
struct BytesUSART
{
int i;
int Buffer[LENGHT_BUFER];
short FlagOk;
short EnableRX;
}USART;
struct BytesTimer
{
int Ints;
}Timer;
#int_TIMER1
void Tiempo_isr(void)
{
Timer.Ints++;
if(Timer.Ints>=15)
{
Timer.Ints=0;
DIS_MLEFT;
DIS_MRIGHT;
}
}
void USARTProcess(DatoRx);
void LimpiarBufer(void);
#int_RDA
void Serial_isr(void)
{
if(kbhit())
{
Timer.Ints=0;
}
}
void main(void)
{
setup_comparator(NC_NC_NC_NC);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
EN_MLEFT;
EN_MRIGHT;
GIROL2; GIROR1; //UP
delay_ms(500);
GIROL1; GIROR2; //DOWN
delay_ms(500);
GIROL1; GIROR1; //LEFT
delay_ms(500);
GIROL2; GIROR2; //RIGHT
delay_ms(500);
enable_interrupts(INT_TIMER1);
while(true)
{
if(USART.FlagOk)
{
USART.FlagOk=0;
EN_MLEFT;
EN_MRIGHT;
switch(USART.Buffer[0])
{
case 'U':
GIROL2;
GIROR1;
break;
case 'D':
GIROL1;
GIROR2;
break;
case 'L':
GIROL1;
GIROR1;
break;
case 'R':
GIROL2;
GIROR2;
break;
case 'S':
STOPL;
STOPR;
break;
}
LimpiarBufer();
}
}
}
void USARTProcess(DatoRx)
{
if(USART.EnableRX==1)
{
switch(DatoRx)
{
case '!':
USART.FlagOk = 1;
USART.EnableRX = 0;
break;
default:
USART.Buffer[USART.i++]=DatoRx;
break;
}
}
if(DatoRx=='~')
USART.EnableRX = 1;
}
void LimpiarBufer(void)
{
int i;
for(i=0;USART.Buffer[i]!=0;i++)
USART.Buffer[i]=0;
USART.i=0;
}