fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Transmitir datos en...
 
Avisos
Vaciar todo

Transmitir datos entre 2 pics

20 Respuestas
4 Usuarios
0 Reactions
15.1 K Visitas
wirry
Respuestas: 16
Topic starter
(@wirry)
Active Member
Registrado: hace 15 años

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.

Responder
19 respuestas
boops
Respuestas: 1813
(@boops)
Ardero
Registrado: hace 19 años

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?

Responder
wirry
Respuestas: 16
Topic starter
(@wirry)
Active Member
Registrado: hace 15 años

Si eso me comentaron unos amigos, pero no se hacerlo y que quereis decir con eso.

Responder
ranganok
Respuestas: 3875
(@ranganok)
Ardero
Registrado: hace 19 años

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

Responder
boops
Respuestas: 1813
(@boops)
Ardero
Registrado: hace 19 años

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.

Responder
Página 1 / 4
Compartir: