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.2 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
wirry
Respuestas: 16
Topic starter
(@wirry)
Active Member
Registrado: hace 15 años

Vale, tienes razon.

Gracias.

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

Hola FJ_Sanchez estoy dandole vueltas y no consigo hacerlo como dices, me puedes ayudar un poco más? Mira el codigo.

#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
#BYTE TRISC = 0X87
#BYTE PORTC = 0X07

int temperatural, temperaturah;
int temperaturanl, temperaturanh;
int presiol, presioh;
int humedadl, humedadh;
int16 presio, temperatura,temperaturan, humedad;
int dato[10];
int i;
int1 flag;
#int_RDA

RDA_isr()
{
dato=GETC(); //Lee el primer valor

if (dato[0]==0xAA){
i=0;
if (i=0){

i++;
dato=GETC();
if(i==10){
flag=1;
}
}
}
}

void main() {
lcd_init();
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);

while(1){
if(flag==1){
flag=0;
i=0;
temperatura=((int16)temperaturah<<8)|((int16)temperatural); //Deshago el cambio
temperaturan=((int16)temperaturanh<<8)|((int16)temperaturanl); //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=%3ld ",temperatura);
printf (lcd_putc, "P=%3ld ", presio);
lcd_gotoxy (1,2);
printf (lcd_putc, "H=%3ld ", humedad);
printf (lcd_putc, "T=%3ld ",temperaturan);
}
}
}

Muchas gracias.

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

wirry, antes de empezar a programar deberías conocer un poco lo que estás haciendo. Yo te recomiendo que empieces por el tutorial que tenemos en la wiki:
http://wiki.webdearde.com/index.php/Tutorial:_Programaci%C3%B3n_de_PICs_en_Ensamblador

Una vez lo tengas claro no creo que te queden dudas como las que tienes.

S2

Ranganok Schahzaman

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

Eso es en ensamblador yo estoy programamdno en C, en ensamblador estaría más perdido ya que se muy poco.

Gracias.

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

Con el ensamblador verías realmente qué hace el micro por lo que es una opción muy recomendable para aprender a usarlos. Una vez lo tengas claro pasa a C.

S2

Ranganok Schahzaman

Responder
Página 4 / 4
Compartir: