TODOPIC

Otros Microcontroladores / Dispositivos programables => ** PROYECTOS ** => Mensaje iniciado por: Superboy en 28 de Enero de 2019, 01:13:53

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


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


muchas gracias por la atencion.