Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
PIC que envia
#include <16F876A.h>
#device adc=10
#FUSES XT,NOWDT
#define use_portb_lcd TRUE
#use delay(clock=4000000)
#include <math.h>
#include <lcd.c>
#use RS232(baud=9600, xmit=pin_c6, rcv=pin_c7)
#BYTE TRISA = 0X85
#BYTE PORTA = 0X05
#BYTE TRISC = 0X87
#BYTE PORTC = 0X07
void main() {
int16 pre,temp,hum ;
int presiol,presioh;
int temperatural,temperaturah;
int humedadl,humedadh;
int dato[6];
int i=0;
setup_adc_ports(all_analog);
setup_adc (ADC_CLOCK_INTERNAL);
lcd_init();
while(TRUE){
//TEMPERATURA POSITIVA
set_adc_channel(0);
delay_us(20);
temp=read_adc();
temperatural=make8(temp,0); // parte temperatura baja
temperaturah=make8(temp,1); // parte temperatura alta
//TEMPERATURA NEGATIVA
//PRESIÓN
set_adc_channel(2);
delay_us(20);
pre=read_adc();
presiol=make8(pre,0); // parte presión baja
presioh=make8(pre,1); // parte presión alta
//HUMEDAD
set_adc_channel(3);
delay_us(20);
hum=read_adc();
humedadl=make8(hum,0); // parte humedad baja
humedadh=make8(hum,1); // parte humedad alta
dato[0]=temperatural;
dato[1]=temperaturah;
dato[2]=presiol;
dato[3]=presioh;
dato[4]=humedadl;
dato[5]=humedadh;
for(i=0;i<=5;i++){
putc(dato); //Envia los 6 datos
if(i==5)
i==0; //Reseteo de la variable i
lcd_gotoxy (1,1);
printf (lcd_putc, "T=%3.2ld ", temp);
printf (lcd_putc, "P=%3.2ld ", pre);
lcd_gotoxy (1,2);
printf (lcd_putc, "H=%3.2ld ", hum);
delay_ms(250);
}
}
}
PIC que recibe
#include <16F876A.h>
#device adc=10
#FUSES XT,NOWDT
#define use_portb_lcd TRUE
#use delay(clock=4000000)
#include <math.h>
#include <lcd.c>
#use RS232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8)
#BYTE TRISA = 0X85
#BYTE PORTA = 0X05
int temperatural, temperaturah;
int presiol, presioh;
int humedadl, humedadh;
int16 presio, temperatura, humedad;
int dato[6];
int i;
#int_RDA
RDA_isr(){
for(i=0;i<=5;i++){
dato=GETC(); //recibe los datos
}
}
void main() {
lcd_init();
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
temperatural=dato[0];
temperaturah=dato[1];
presiol=dato[2];
presioh=dato[3];
humedadl=dato[4];
humedadh=dato[5];
temperatura=((int16)temperaturah<<8)|((int16)temperatural); //Deshago el cambio
presio=((int16)presioh<<8)|((int16)presiol); //Deshago el cambio
humedad=((int16)humedadh<<8)|((int16)humedadl); //Deshago el cambio
lcd_gotoxy (1,1);
printf (lcd_putc, "T=%4.2ld ",temperatura);
printf (lcd_putc, "P=%4.2ld ", presio);
lcd_gotoxy (1,2);
printf (lcd_putc, "H=%4.2ld ", humedad);
}
Se trata de una estación meteorológica inalámbrica que mide la temperatura, presión atmosférica y humedad, lo que hago es medir los valores con los sensores, después hago una conversión de un int16 a int8, envió todos los int8 que en mi caso son 6, y luego el otro pic deshace el cambio y saca por pantalla los datos.
Muchas gracias.
A si a primera vista veo un pequeño problema de sincronización del protocolo...
¿no evitarias fallos colocando 2 caracteres (inicio y cola) con valores fijos?
Si eso me comentaron unos amigos, pero no se hacerlo y que quereis decir con eso.
Antetodo hola y bienvenido.
Sin más datos es difícil ayudarte, supongo que estás usando el CCS pero en ningún momento dices cuál es el problema.
En un primer vistazo diría que el problema lo tienes en la interrupción de recepción de datos, estás poniendo un for sin desactivar la interrupción por lo que te siguen llegando interrupciones (no uses el for, haz un contador y un flag para indicar que has recibido los datos).
S2
Ranganok Schahzaman
Pues es facil manda un caracter al principio y al final y cuando salte la interrupcion miras que el primer caracter sea ese y si no lo es sales. Despues el ultimo compruebas que es él que tu has dicho y si no es pasas de los datos.