Hola saludos a todos, quería preguntar sobre un proyecto que estoy realizando. El proyecto consta de 2 PIC que se comunican de manera serial por los puertos TX/RX.
El primero de ellos 16F887 realiza 3 lecturas (Temperatura, Humedad y Presión) mediante el conversor A/D integrado, las cuales debe enviar el segundo PIC 18F2550 el cual se encargará de mostrarlas en una pantalla LCD. El problema que tengo es que no logro enviar más de una variable a la vez, o sea si envío temperatura la muestra pero no puedo enviar presión o humedad, necesito al menos ver 2 variables al mismo tiempo en la pantalla. Otro problema que tengo, es que en el 16F887 yo realizaba las conversiones a voltaje de una vez, pero esas conversiones no las muestra el 18F2550, o sea no muestra el valor real, esto lo solucione realizando las conversiones en el 18F2550 pero me gustaría saber si hay una solución.
PIC de envío:
Lo que esta en negrita es lo que yo envío y convierto en el 18F2550, por que el valor p no se envía correctamente.
PIC de recepción:
Lo que esta en negrita es la recepción y conversión del valor de alguna variable. Yo puedo recibir un valor, pero no se como recibir 2,3 o más.
Diagrama:

El primero de ellos 16F887 realiza 3 lecturas (Temperatura, Humedad y Presión) mediante el conversor A/D integrado, las cuales debe enviar el segundo PIC 18F2550 el cual se encargará de mostrarlas en una pantalla LCD. El problema que tengo es que no logro enviar más de una variable a la vez, o sea si envío temperatura la muestra pero no puedo enviar presión o humedad, necesito al menos ver 2 variables al mismo tiempo en la pantalla. Otro problema que tengo, es que en el 16F887 yo realizaba las conversiones a voltaje de una vez, pero esas conversiones no las muestra el 18F2550, o sea no muestra el valor real, esto lo solucione realizando las conversiones en el 18F2550 pero me gustaría saber si hay una solución.
PIC de envío:
Código:
#include <16F887.h> //Declaracion del PIC
#device adc=10 //Uso de conversor
#fuses XT,NOWDT //Fusibles
#use delay (clock=4000000) //Frecuencia de reloj
#include <LCD.c> //Declaracion de LCD
#include <math.h>
#use rs232 (baud=9600, xmit=pin_c6, rcv=pin_c7)
void main (){ //Inicio
int16 q; //Entero de X bits
float error,presion,p,r,temp,TF,tr,x,y,z; //Flotantes
setup_adc_ports(sAN0|sAN1|sAN2); //Declaracion de puertos A/D
setup_adc (adc_clock_internal); //Uso de reloj interno
lcd_init (); //Inicia el LCD
for (;;){ //Para
set_adc_channel(0); //Lectura de puerto
delay_us (20); //Retraso obligatorio
q = read_adc(); //Asigna el valor
putc (q);
p = (q*100)*5.0/1024.0; //Conversión de temperatura
tr = p*10000.0/(5.0-p); //Inicia proceso de error
y = log(tr/20000.0);
y = (1.0/298.15)+(y*(1.0/4050.0));
temp = 1.0/y;
temp = temp-273.15;
if (temp>=0 && temp<=85) TF=1.0;
else TF = 3.0;
error = TF*1.5; //Finaliza proceso de error
set_adc_channel(1); //Lectura de puerto
delay_us (20); //Retraso
q = read_adc(); //Asignación
r = q*5.0/1024.0; //Conversión
presion = (0.475+r)/0.045; //Formula de presión
presion = presion-error; //Presión real
set_adc_channel (2);
delay_us (20);
//q = read_adc();
//x = q*5.0/1024.0;
z = ((x/5)-0.2354)/0.00474;
printf (lcd_putc, "\fETemp = %1.2fC", p);
printf (lcd_putc, "\nPres = %1.2fKpa", presion);
//printf (lcd_putc, "\nHrel = %1.2fP", z);
delay_ms (200);
}
}
Lo que esta en negrita es lo que yo envío y convierto en el 18F2550, por que el valor p no se envía correctamente.
PIC de recepción:
Código:
#include <18F2550.h> //Declaracion del PIC
#fuses XT,NOWDT //Fusibles
#use delay (clock=4000000) //Frecuencia de reloj
#include <LCD.c> //Declaracion de LCD
#include <math.h>
#use rs232 (baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8)
#byte trisA=0x85
#byte portA=0x05
int16 v,w,x;
float a,b,c;
#int_RDA
void RDA_ISR ()
{
v=getc ();
a = (v*100)*5.0/1024.0;
}
void main (){
bit_clear (trisA,0);
lcd_init ();
enable_interrupts (INT_RDA);
enable_interrupts (Global);
for (;;){
lcd_gotoxy (1,1);
printf (lcd_putc, "\fTemp = %1.2fC", a);
//printf (lcd_putc, "\nPres = %1.2fKpa", presion);
//printf (lcd_putc, "\nHrel = %1.2fP", z);
delay_ms (200);
}
}
Lo que esta en negrita es la recepción y conversión del valor de alguna variable. Yo puedo recibir un valor, pero no se como recibir 2,3 o más.
Diagrama:

Última edición por un moderador: