///////////////////////////////////////////////////////////////////////////////////////////////////
// Definiciones de configuración
///////////////////////////////////////////////////////////////////////////////////////////////////

#include <18f4550.h>

///////////////////////////////////////////////////////////////////////////////////////////////////
// Fuses y ajuste de Clock
///////////////////////////////////////////////////////////////////////////////////////////////////

#fuses HSPLL,NOMCLR,PUT,BROWNOUT,BORV43,NOWDT,NOPROTECT,NOLVP
#fuses NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,CCP2B3
#use delay(clock=48000000)

///////////////////////////////////////////////////////////////////////////////////////////////////
// Canal de Comunicación : usart
///////////////////////////////////////////////////////////////////////////////////////////////////

#define TTL_TX PIN_C6
#define TTL_RX PIN_C7

#use rs232(baud=115200, xmit=TTL_TX, rcv=TTL_RX)

///////////////////////////////////////////////////////////////////////////////////////////////////
// RAM
///////////////////////////////////////////////////////////////////////////////////////////////////

char Command;

///////////////////////////////////////////////////////////////////////////////////////////////////
// INTERRUPCIONES : RDA Recepción USART
///////////////////////////////////////////////////////////////////////////////////////////////////

#int_rda
void rda_handler(void){

   Command=getc();              //  recibe el comando ...

}

// Funciones a ejecutar según el comando recibido /////////////////////////////////////////////////

void first_function(void){

   printf(" > Exec first_function()\r\n");
}

void second_function(void){

   printf(" > Exec second_function()\r\n");
}

///////////////////////////////////////////////////////////////////////////////////////////////////

void main() {

   printf("TyP_Serie_TTL\r\n");   // Al inicio escribe para ver que emite correctamente
   printf("Method : Interrupt\r\n");
   printf("Commands mono-character\r\n");

   enable_interrupts(int_rda);    // Habilitamos la interrupción por recepción serie
   enable_interrupts(global);     // Habilitamos las interrupciones

   Command=0x00;                  // Inicializamos Command para estar seguros de que
                                  // su contenido es 0x00

   do{                            // inicio del Bucle infinito

      if(Command!=0x00){          // Si hemos recibido un comando ...
         printf(" < %c\r\n",Command);  // Lo mostramos de vuelta para saber que ha sido recibido ...
         switch(Command){
            case '1':             // y si éste es el caracter ASCII '1' entonces ...
               first_function();  // llamamos a la primera funcion.
               break;
            case '2':             // pero si éste es el caracter ASCII '2' entonces ...
               second_function(); // llamamos a la segunda funcion.
               break;
            default:
               printf(" < ?\r\n");// y si no es ninguno de los anteriores protestamos ...
               break;
         }
         Command=0x00;            // y volvemos a inicializar Command para que no
                                  // se vuelva a ejecutar hasta volver a recibirlo.
      }

   }while(TRUE);                  // final del Bucle infinito
}

// Fin del programa  //////////////////////////////////////////////////////////////////////////////



