/////////////////////////////////////////////////////////////////////////////////////////
// 09/MAYO/2019                                                                        //
// CONTROL RC                                                                          //
//                                                                                     //
//                                                                                     //
/////////////////////////////////////////////////////////////////////////////////////////

#include <16F877A.h>

#fuses NOWDT,HS,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP,NOCPD,NOWRT
#use delay(clock=4000000)

#use rs232(baud=9600,bits=8,parity=N,xmit=PIN_C6,rcv=PIN_C7)

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)




//VARIABLES LED
int8 led1=PIN_B3;
int8 led2=PIN_B4;

//VARIABLES MOTORES
int8 IN_A1 = PIN_C3;
int8 IN_A2 = PIN_C0;
int8 IN_B1 = PIN_C4;
int8 IN_B2 = PIN_C5;

//VARIABLES PWM
int8 pwm1;
int8 pwm2;
int8 var,postscaler;

//int i=0;
char valor;


void IniPuertos()
{
   set_tris_A(0xFF);
   set_tris_B(0x00);          
   output_B(0x00);
   set_tris_C(0b11000000);          
   //output_C(0b0000);
}   

void IniPWM()
{
   var=249;
   postscaler=1;

   setup_timer_2(T2_DIV_BY_4, var,postscaler); // N=(var+1)*prediv*posviv = Periodo de la señal
   //Valor=Talto*clock/Predivisor

   setup_ccp1(CCP_PWM);// Configure CCP1 as a PWM
   setup_ccp2(CCP_PWM);// Configure CCP2 as a PWM

   delay_ms(100);
   set_pwm1_duty(0);   
   set_pwm2_duty(0);
   
   
}

void clear()
{
   output_bit(led1,0);
   output_bit(led2,0);

   output_bit(IN_A1,0);
   output_bit(IN_A2,0);
   set_pwm1_duty(0);

   output_bit(IN_B1,0);
   output_bit(IN_B2,0);   
   set_pwm2_duty(0);
}

void adelante()
{
   output_bit(led1,1);
   output_bit(led2,0);

   output_bit(IN_A1,1);
   output_bit(IN_A2,0);
   set_pwm1_duty(255);

   output_bit(IN_B1,1);
   output_bit(IN_B2,0);   
   set_pwm2_duty(255);
}

void atras()
{
   output_bit(led1,0);
   output_bit(led2,1);

   output_bit(IN_A1,0);
   output_bit(IN_A2,1);      
   set_pwm1_duty(255);

   output_bit(IN_B1,0);
   output_bit(IN_B2,1);
   set_pwm2_duty(255);
}

void izquierda_adelante()
{
   output_bit(led1,0);
   output_bit(led2,1);

   output_bit(IN_A1,0);
   output_bit(IN_A2,0);      
   set_pwm1_duty(255);

   output_bit(IN_B1,1);
   output_bit(IN_B2,0);
   set_pwm2_duty(255);
}

void derecha_adelante()
{
   output_bit(led1,0);
   output_bit(led2,1);

   output_bit(IN_A1,1);
   output_bit(IN_A2,0);      
   set_pwm1_duty(255);

   output_bit(IN_B1,0);
   output_bit(IN_B2,0);
   set_pwm2_duty(255);
}


void izquierda_atras()
{
   output_bit(led1,1);
   output_bit(led2,1);

   output_bit(IN_A1,0);
   output_bit(IN_A2,0);      
   set_pwm1_duty(255);

   output_bit(IN_B1,0);
   output_bit(IN_B2,1);
   set_pwm2_duty(255);
}

void derecha_atras()
{
   output_bit(led1,1);
   output_bit(led2,1);

   output_bit(IN_A1,0);
   output_bit(IN_A2,1);      
   set_pwm1_duty(255);

   output_bit(IN_B1,0);
   output_bit(IN_B2,0);
   set_pwm2_duty(255);
}

void curva_derecha_adelante()
{
   output_bit(led1,1);
   output_bit(led2,0);

   output_bit(IN_A1,1);
   output_bit(IN_A2,0);      
   set_pwm1_duty(255);

   output_bit(IN_B1,1);
   output_bit(IN_B2,0);
   set_pwm2_duty(120);
}

void curva_izquierda_adelante()
{
   output_bit(led1,1);
   output_bit(led2,0);

   output_bit(IN_A1,1);
   output_bit(IN_A2,0);      
   set_pwm1_duty(120);

   output_bit(IN_B1,1);
   output_bit(IN_B2,0);
   set_pwm2_duty(255);
}

void curva_derecha_atras()
{
   output_bit(led1,1);
   output_bit(led2,0);

   output_bit(IN_A1,0);
   output_bit(IN_A2,1);      
   set_pwm1_duty(255);

   output_bit(IN_B1,0);
   output_bit(IN_B2,1);
   set_pwm2_duty(120);
}

void curva_izquierda_atras()
{
   output_bit(led1,1);
   output_bit(led2,0);

   output_bit(IN_A1,0);
   output_bit(IN_A2,1);      
   set_pwm1_duty(120);

   output_bit(IN_B1,0);
   output_bit(IN_B2,1);
   set_pwm2_duty(255);
}


void main()
{
   
   IniPuertos();   
   IniPWM();
   clear();
   

   while(true)
   {
   
   
 if(kbhit()){ // Preguntamos si hay disponible dato en bufer de recepción.
 valor=getc(); // Si así es, lo leemos y guardamos en DatoRx.

 if(valor=='a'){
  adelante();
 }
 
 if(valor=='b'){
  izquierda_adelante();
 }
 
 if(valor=='c'){
  clear();
 }
 
 if(valor=='d'){
  derecha_adelante();
 }
 
 if(valor=='e'){
  atras();
 }
 
//if(valor=='f'){
// inc_vel();
// }
 
 if(valor=='g'){
  clear();
 }

      
    }
  }
}