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.
Vale, tienes razon.
Gracias.
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.
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
Eso es en ensamblador yo estoy programamdno en C, en ensamblador estaría más perdido ya que se muy poco.
Gracias.
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