Autor Tema: Enviar 3 valores de un pic a otro pic usando RS232  (Leído 1205 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado edgo155

  • PIC10
  • *
  • Mensajes: 4
Enviar 3 valores de un pic a otro pic usando RS232
« en: 02 de Agosto de 2021, 14:31:24 »
hola a todos, les comento mi problema. El programa debe censar 3 valores: temperatura, presion y humedad, se deben mostrar en un LCD grafico LGM12641BS1R (que solo me permite imprimir STRING) en un PIC 18F4550, ademas debo enviar esos datos a un segundo PIC 18f4550 y tambien mostrarlos en un LCD grafico, es decir: los datos que llegan al primer PIC que se muestran en el primer LCD, deben tambien aparecer en el LCD del PIC que hace de receptor.

Mi duda es con respecto al codigo, no consigo enviar y recibir los datos de forma correcta, cuando imprimo en el receptor el valor que se envió al puerto me muestra es un 0, he de decir que he usado putc, getc y puts para enviar y recepsionar solamente la temperatura, pero no me ha resultado, adjunto el código.

Codigo del PIC EMISOR

Código: C
  1. #include <18f4550.h>
  2. #device ADC=10   //Conversor Analógico digital a 10 bits.
  3. #fuses hs,nowdt,xt,NOWRT,NOPROTECT,NOPUT,NOLVP
  4. #use delay(crystal=8MHz)//Frecuencia de oscilador 8MHz. Para el 18F4550 Cristal externo escribir "crystal"
  5. #include <libreriaepica.c>
  6. #include <graphics.c>
  7. #include <stdlib.h> //libreria matematica
  8. #include <stdio.h>
  9.  
  10. #use RS232(baud=9600,bits=8,parity=N,xmit=pin_c6,rcv=pin_c7)//Para hacer la comunicacion con el otro PIC
  11.  
  12. #USE FAST_IO(A) //directivas para trabajar con estos pines
  13. #USE FAST_IO(B)
  14. #USE FAST_IO(C)
  15. #USE FAST_IO(D)
  16.  
  17. //VARIABLES TEMPERATURA
  18. char texto[20]={"Temperatura"};
  19. char temperatura[20];//Variable decimal "valor"
  20. int16 bits;
  21. float temperatura1;
  22.  
  23. //VARIABLES PRESION
  24. char texto1[20]={"Presion"};
  25. char presion[20];//Variable decimal "valor"
  26. int16 bits1;
  27. float presion1;
  28.  
  29. //VARIABLES HUMEDAD
  30. char texto2[20]={"Humedad"};
  31. char humedad[20];//Variable decimal "valor"
  32. int16 bits2;
  33. float humedad1;
  34.  
  35.  
  36. //Funcion Principal------------------------------------------------------------
  37. void main()
  38. {
  39.    //Configuracion
  40.    glcd_Init(on);
  41.    set_tris_a(0); //declarando lo pines que usaremos
  42.    set_tris_b(0);        
  43.    set_tris_c(0);  
  44.    set_tris_d(0);
  45.    setup_adc_ports(AN0);    //funcion que permite seleccionar que pines usaremos como analogicos
  46.    setup_adc(adc_clock_internal);// reloj para hacer la conversion analogo digital
  47.    glcd_fillScreen(0);//borrar pantalla
  48.  
  49.    
  50.    
  51.    
  52.    while(true)
  53.    {  
  54.       //Sensor de TEMPERTURA---------------------------------------------------      
  55.       set_adc_channel(0); //preparamos el canal que se leerá
  56.       delay_ms(1);//para preparar el ñon
  57.       bits=read_adc(); //lee y accede al valor
  58.       temperatura1=((bits*5.0)/1023.0)*100;    //  
  59.       glcd_text57(40,1,texto,1,ON);        
  60.       sprintf(temperatura,"%3.0f",temperatura1);
  61.       glcd_text57(1,1,temperatura,1,ON);
  62.       delay_ms(100);  
  63.       glcd_fillScreen(0);
  64.       puts(temperatura);
  65.      
  66.      
  67.       //Sensor de PRESION------------------------------------------------------
  68.       set_adc_channel(1); //preparamos el canal que se leerá
  69.       delay_ms(1);//para preparar el ñon
  70.       bits1=read_adc(); //lee y accede al valor
  71.       presion1=((bits1*250.0)/1023.0)+11;    //  
  72.       glcd_text57(40,20,texto1,1,ON);        
  73.       sprintf(presion,"%3.0f",presion1);
  74.       glcd_text57(1,20,presion,1,ON);
  75.       delay_ms(100);
  76.       glcd_fillScreen(0);
  77.      
  78.      
  79.       //Sensor de HUMEDAD------------------------------------------------------
  80.       set_adc_channel(2); //preparamos el canal que se leerá
  81.       delay_ms(1);//para preparar el ñon
  82.       bits2=read_adc(); //lee y accede al valor
  83.       humedad1=((bits2*100.0)/51)+31;    
  84.       glcd_text57(40,40,texto2,1,ON);        
  85.       sprintf(humedad,"%3.0f",humedad1);
  86.       glcd_text57(1,40,humedad,1,ON);
  87.       delay_ms(100);
  88.       glcd_fillScreen(0);        
  89.          
  90.  
  91.    }
  92.  
  93.  
  94. }


Codigo del PIC RECEPTOR

Código: C
  1. include <18f4550.h>
  2. #device ADC=10   //Conversor Analógico digital a 10 bits.
  3. #fuses hs,nowdt,xt,NOWRT,NOPROTECT,NOPUT,NOLVP
  4. #use delay(crystal=8MHz)//Frecuencia de oscilador 8MHz. Para el 18F4550 Cristal externo escribir "crystal"
  5. #include <libreriaepica.c>
  6. #include <graphics.c>
  7. #include <stdlib.h> //libreria matematica
  8. #include <stdio.h>
  9.  
  10. #use RS232(baud=9600,bits=8,parity=N,xmit=pin_c6,rcv=pin_c7)//Para hacer la comunicacion con el otro PIC
  11.  
  12. char temperatura[20];
  13.  
  14.  
  15. #int_RDA
  16. rda_isr() //Leerá las variables enviadas al puerto
  17. {  
  18.  
  19.    temperatura=gets();
  20.          
  21.  
  22.          
  23.    
  24. }
  25.  
  26. void main()
  27. {
  28.    glcd_init(on);
  29.    enable_interrupts(int_rda);           //Habilitamos la interrupción por recepción
  30.    enable_interrupts(GLOBAL);            //Habilitamos las interrupciones globales.
  31.    glcd_Init(on);
  32.    set_tris_a(0); //declarando lo pines que usaremos
  33.    set_tris_b(0);        
  34.    set_tris_c(0);  
  35.    set_tris_d(0);
  36.    
  37.    while(true)
  38.    {  
  39.       glcd_text57(1,1,temperatura,1,ON);
  40.       delay_ms(100);  
  41.       glcd_fillScreen(0);
  42.    }  
  43. }




Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Enviar 3 valores de un pic a otro pic usando RS232
« Respuesta #1 en: 02 de Agosto de 2021, 18:50:15 »
Hay varias cosas, la más importantes es que solo estas enviando el string temperatura, pero no presión ni humedad.

  Por otro lado, puts y gets están pensados más que nada para comunicar con una terminal donde las cadenas terminan con un endline (return + line feed): para pic a pic en lugar de puts te recomendaría usar: printf(“%s”,temperatura);  ya que de esta forma el printf te envía un NULL al final del string. 

 Luego en la recepción, implementaría recepción carácter  por carácter hasta recibir el NULL del printf anterior. Algo así:

Código: C
  1. do {
  2.  *temperatura = getc();
  3. } while(*temperatura++);


  Repites lo mismo para presión y humedad.

Desconectado edgo155

  • PIC10
  • *
  • Mensajes: 4
Re:Enviar 3 valores de un pic a otro pic usando RS232
« Respuesta #2 en: 02 de Agosto de 2021, 19:10:14 »
ok amigo creo que entiendo, pero disculpa mi ignoracnia, no soy tan buen programador, pero usaré el printf para enviar el valor de la temperatura al PIC de recepcion ?

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Enviar 3 valores de un pic a otro pic usando RS232
« Respuesta #3 en: 03 de Agosto de 2021, 05:17:26 »
ok amigo creo que entiendo, pero disculpa mi ignoracnia, no soy tan buen programador, pero usaré el printf para enviar el valor de la temperatura al PIC de recepcion ?

 Realmente tal y como lo estás planteando, tú no vas a enviar un valor al pic, sino una cadena de caracteres ascii imprimibles por el display que usas. Enviar solo un valor entero bien sea de 8,16,32 bits, reduce el volumen de datos a transmitir entre pic’s y es por tantos mucho mas rápido todo, luego es el receptor el que construye la cadena para mostrarla en el display.   Aunque tampoco es necesario. Esos displays también pueden mostrar valores enteros directamente.  Lo que pasa es que tú lo planteas con cadenas ascii y yo trato de ayudarte de la forma en que lo haces sin entrar a valorar por que lo haces así.

  El printf()  al ponerle el tipo de dato %s   Le estás diciendo que te saque por el puerto serie una cadena que tú le defines.  Al final de esa cadena, el propio compilador te añade un carácter NULL que es lo ideal para trabajar con cadenas en el entorno entre microcontroladores.

  Luego en el receptor recibes esa cadena hasta encontrar el NULL el cual se descarta y provoca la salida del bucle de recepción y la continuación del programa.

  Saludos.

Desconectado edgo155

  • PIC10
  • *
  • Mensajes: 4
Re:Enviar 3 valores de un pic a otro pic usando RS232
« Respuesta #4 en: 03 de Agosto de 2021, 22:40:13 »
Perfecto amigo muchas gracias, ya tengo una idea de como hacerlo.