Advertisement
Electgpl

PIC - Recepción 16 bit UART

Nov 18th, 2017
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.87 KB | None | 0 0
  1. //*********************************************************************************************************
  2. // El programa recibe 16bit por UART y los muestra por puertos
  3. // El enlace se realiza mediante una comunicación ASK OOK UHF sobre UART Invertido a 600bps
  4. //*********************************************************************************************************
  5. #include <16F883.h>                                //Biblioteca del microcontrolador
  6. #fuses NOMCLR, NOWDT, INTRC_IO                     //Configuración de fuses
  7. #use delay(int=4000000)                            //Configuración del clock interno a 4MHz
  8. #use rs232(baud=600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) //Configuración de UART 600bps 8 N 1
  9. //*********************************************************************************************************
  10. // Variables
  11. //*********************************************************************************************************
  12. #define HEADER 200                                 //Definición de valor Header para el payload
  13. #define STATUS PIN_C0                              //Pin para analizar el status de la interrupt
  14. static int8 trama[4];                              //Variable donde se aloja el trama
  15. static int8 valor1=0, valor2=0;                    //Variable donde se alojan los datos externos
  16. //*********************************************************************************************************
  17. // Función Interrupción UART que realiza el parse de datos, validación de Header y Checksum
  18. // Si validación y Checksum son validos, carga el vector DATO para ser utilizado
  19. //*********************************************************************************************************
  20. int8 i=0;                                          //Variable para el contador de bytes de entrada
  21. #int_RDA                                           //Interrupción por dato en UART
  22. void intser(){                                     //Función de servicio de interrupción
  23.    trama[i++]=getc();                              //Guarda byte de entrada en trama. incrementa indice
  24.    if(i>4){                                        //Si el indice es mayor que 4 se asume que se completa el trama
  25.       if(trama[0]==HEADER){                        //Validación que el Header sea 200 (seteado en el transmisor)
  26.          if(trama[1]+trama[2]-trama[3]==0){        //Validación de checksum, si datos leídos son igual a checksum
  27.             valor1=trama[1];                       //Cargamos los datos en el vector
  28.             valor2=trama[2];                       //Cargamos los datos en el vector
  29.             output_high(STATUS);                   //Ponemos a 1 el LED de estado de dato presente
  30.             delay_ms(100);                         //Delay de LED encendido
  31.             output_low(STATUS);                    //Ponemos a 0 el LED
  32.          }
  33.       }
  34.       i=0;                                         //Una vez que se completan los 5 bytes, se reinicia el contador
  35.    }
  36. }
  37. //*********************************************************************************************************
  38. // Programa principal, recibe los datos por UART y los muestra en los puertos
  39. //*********************************************************************************************************
  40. void main(){                                       //Función principal
  41.    enable_interrupts(global);                      //Habilita interrupciones globales
  42.    enable_interrupts(int_rda);                     //Habilita interrupción de dato en UART
  43.    while(true){                                    //Loop principal infinito
  44.       output_a(valor1);                            //Cargamos puerto A
  45.       delay_us(100);                               //Delay de refresco
  46.       output_b(valor2);                            //Cargamos puerto B
  47.       delay_us(100);                               //Delay de refresco
  48.    }
  49. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement