Autor Tema: lcd 16x2 y pic 16f887  (Leído 202 veces)

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

Desconectado Superboy

  • PIC10
  • *
  • Mensajes: 21
lcd 16x2 y pic 16f887
« en: 28 de Enero de 2019, 01:13:53 »
Hola buena noche, estoy programando 2 pic 16f887 para usar la comunicación seria junto a un lm35 y 2 lcd 16x2, yo envió el valor leído de un lm35 de un pic a otro y lo muestro en la lcd de cada pic, pero me surge un error y es el motivo por el cual escribo.

Tengo que la lectura de temperatura por decir 23.45 que es un dato flotante, lo envió con putc(valor) y el pic que lo recibe usa la interrupción de comunicación serial y el dato lo recibe con get(valor) pero; al momento de que lo recibe muestra un dato diferente
 ==> 131  :oops: :oops: y me gustaría saber ¿cual es el error que estoy teniendo y como puedo solucionarlo?  :shock: :shock:.

Uso un cristal externo de 20MHz y de cabecera para la comunicación serial en los pic tengo...
 
#use RS232 (baud=57600,xmit=pin_c6,rcv=pin_c7,bits=8,parity=N)

Muchas gracias.

Desconectado elreypic2

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 931
Re:lcd 16x2 y pic 16f887
« Respuesta #1 en: 28 de Enero de 2019, 17:22:08 »
Que tal Superboy,

En realidad lo que está equivocado es el uso de putc() y del get(). Ya que esas funciones son para enviar variables de tipo char y es obvio que lo que quieres enviar en una variable del tipo float. Para ello tienes que usar algo como esto:

Enviar:
Código: [Seleccionar]
float f;
int8 *p;

f = 0.0123;
p = &f;  // pointer p points to the first byte of f

putc(p[0]);  // use p as an array Send the first byte
putc(p[1]);  // Send the second byte
putc(p[2]);  // Send the third byte
putc(p[3]);  // Send the forth byte

Recibir:
Código: [Seleccionar]
int8 f;
int8 *p;

p = &f;
p[0] = getc();
p[1] = getc();
p[2] = getc();
p[3] = getc();

printf("%f", f);

Saludos,

elreypic.

Desconectado Superboy

  • PIC10
  • *
  • Mensajes: 21
Re:lcd 16x2 y pic 16f887
« Respuesta #2 en: 29 de Enero de 2019, 14:02:54 »
hola elreypic gracias por responder, encontre un codigo en el cual hacia envio y recepcion de un dato flotante con una cadena y la funcion string mas atof, la cosa es que cuando envio el dato flotante de un pic a otro el pic receptor ya no me muestra un dato como el 131 que me aparecia antes, ahora solo me aparece 0.00 cuando el valor de mi variable es 23.45 y ahora no se por que sale asi adjunto el pedazo de programa nuevo esperando me puedas dar una mano.

aun sigo usando #use RS232 (baud=57600,xmit=pin_c6,rcv=pin_c7,bits=8,parity=N) y el cristal interno de 4M del pic 16f887

pic transmisor
Código: C++
  1.  
  2.  
  3. float h; // TEMPERATURA
  4. char cadena[6];   // dato a transmitir en string (el signo, los dos enteros, el punto decimal, los dos decimales
  5. char string[6];   // guarda el valor del dato del string a transmitir
  6. int i; // contara los caracteres del string
  7.  
  8. /////////// lectura adc con promedio para evitar errores ///////////////
  9.  
  10. int8 adc(int8 canal)
  11. {
  12.  
  13.      
  14.      int8 dato;
  15.      
  16.    
  17.      dato=0;
  18.      
  19.      set_adc_channel(canal);
  20.      delay_us(20);
  21.      dato=read_adc();
  22.      delay_us(100);
  23.    
  24. }
  25.  
  26. /////////////// programa principal ///////////////
  27.  
  28. void main()
  29. {
  30.    
  31.    disable_interrupts(GLOBAL);
  32.    
  33.    setup_adc_ports(sAN3);
  34.    setup_adc(ADC_CLOCK_DIV_8);
  35.    setup_comparator(NC_NC_NC_NC);
  36.  
  37.  
  38.    set_tris_A(0b00001111);
  39.    set_tris_D(0b00000000);
  40.  
  41.  
  42.    
  43.    lcd_init();
  44.    lcd_putc("\f");    // limpia la LCD
  45.    
  46.    while(TRUE)
  47.    {
  48.        
  49.        h=adc(3)*0.4882;  // coversion a °C
  50.        
  51.        lcd_gotoxy(1,1);
  52.        printf(lcd_putc,"temp=%f",h);
  53.        sprintf(string,"%f",h);
  54.        
  55.        
  56.        for (i=0;i<=6;i++)
  57.        {
  58.        putc(cadena[i]);
  59.        delay_ms(150);
  60.        }
  61.    
  62.    }
  63. }
  64.  


pic receptor
Código: C++
  1.  
  2. #INCLUDE <stdlib.h>
  3.  
  4. ////////// variables globales //////////////
  5.  
  6. float h; // OBTIENE EL DATO DE LA COMUNICACION SERIAL
  7. char cadena[6]; // guarda el strig recibido
  8. int i=0;  // cuenta el numero de caracteres en el string
  9.  
  10. ////////////// interrucpicon serial ///////////////
  11.  
  12. #int_rda
  13. void serial_isr(void)
  14. {
  15.  
  16. cadena[i]=getc();  // recepcion del string
  17.    
  18.     if(i==5)  // todos los caracteres recibidos
  19.     {
  20.  
  21.         // recibe el siguiente caracter
  22.     h=atof(cadena);  // paso del string a su valor float
  23.  
  24.     lcd_gotoxy(1,1);
  25.     printf(lcd_putc,"temp=%f",h);
  26.       i=0;
  27.      
  28.     }
  29.    
  30.      ++i;     // preparacion para recibir los caracteres
  31.  
  32.    
  33. }
  34.  
  35. /////////////// programa principal ///////////////
  36.  
  37. void main()
  38. {
  39.    disable_interrupts(GLOBAL);  
  40.    setup_comparator(NC_NC_NC_NC);
  41.  
  42.    set_tris_D(0b00000000);
  43.    
  44.     enable_interrupts(int_rda);
  45.    enable_interrupts(global);
  46.    
  47.      
  48.    lcd_init();
  49.  
  50.  
  51.    
  52.    while(TRUE)
  53.    {
  54.    
  55.    }
  56. }
  57.  


muchas gracias por la atencion.


 

anything