Advertisement
Electgpl

PIC - Recepción Payload LCD 883

Sep 5th, 2017
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.35 KB | None | 0 0
  1. //
  2. // Programa que realiza la recepcion de 3 canales ADC de 0 a 255, mediante puerto UART a 600bps
  3. // El objetivo es realizar un enlace simplex mediante módulos ASK OOK UHF
  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. #include <LCD.C>                                                //Biblioteca del display LCD
  10. //
  11. // Función Interrupción UART que realiza el parse de datos, validación de Header y Checksum
  12. // Si validación y Checksum son validos, carga el vector DATO para ser utilizado
  13. //
  14. #define HEADER 200                                              //Definición de valor Header para el payload
  15. static char payload[5];                                         //Variable donde se aloja el payload
  16. static char dato[3];                                            //Variable donde se alojan los datos
  17. int8 i=0;                                                       //Variable para el contador de bytes de entrada
  18. #int_RDA                                                        //Interrupción por dato en UART
  19. void intser(){                                                  //Función de servicio de interrupción
  20.    payload[i++]=getc();                                         //Guarda byte de entrada en payload. incrementa indice
  21.    if(i>5){                                                     //Si el indice es mayor que 5 se asume que se completa el payload
  22.       if(payload[0]==HEADER){                                   //Validación que el Header sea 200 (seteado en el transmisor)
  23.          if(payload[1]+payload[2]+payload[3]-payload[4]==0){    //Validación de checksum, si datos leídos son igual a checksum
  24.             dato[0]=payload[1];                                 //Cargamos los datos en el vector
  25.             dato[1]=payload[2];                                 //Cargamos los datos en el vector
  26.             dato[2]=payload[3];                                 //Cargamos los datos en el vector
  27.          }
  28.       }
  29.       i=0;                                                      //Una vez que se completan los 5 bytes, se reinicia el contador
  30.    }
  31.    output_toggle(PIN_C0);                                       //Salida de monitoreo de ingreso a interrupción
  32. }
  33. //
  34. //Programa principal, realiza la recepción de datos mediante interrupción y muestra los valores en el display LCD
  35. //
  36. void main(){                                                    //Función principal
  37.    enable_interrupts(global);                                   //Habilita interrupciones globales
  38.    enable_interrupts(int_rda);                                  //Habilita interrupción de dato en UART
  39.    lcd_init();                                                  //Inicializa LCD
  40.    lcd_gotoxy(1,1);                                             //Posiciona el cursor en la pantalla
  41.    printf(lcd_putc,"START.");                                   //Muestra la leyenda START con 1 punto
  42.    delay_ms(500);                                               //Delay para el efecto del punto en el LCD
  43.    lcd_gotoxy(1,1);                                             //Posiciona el cursor en la pantalla
  44.    printf(lcd_putc,"START..");                                  //Muestra la leyenda START con 2 puntos
  45.    delay_ms(500);                                               //Delay para el efecto del punto en el LCD
  46.    lcd_init();                                                  //Inicializa LCD
  47.    while(true){                                                 //Loop principal infinito
  48.       lcd_gotoxy(1,1);                                          //Posiciona el cursor en la pantalla
  49.       printf(lcd_putc,"T:%3u H:%3u",dato[0],dato[1]);           //Formatea los datos y los muestra en el LCD
  50.       lcd_gotoxy(1,2);                                          //Posiciona el cursor en la pantalla
  51.       printf(lcd_putc,"L:%3u ",dato[2]);                        //Formatea los datos y los muestra en el LCD
  52.       delay_ms(1000);                                           //Delay de refresco de datos
  53.    }
  54. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement