TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: japifer_22 en 25 de Enero de 2011, 18:53:13
-
hola, estoy en estos dias queriendo hacer una comunicacion entre pic los cuales son los 16f873a en C. lo que intento y no me sale, es poder leer 3 entradas analogas de uno de los pic y reflejar los reslultados de estas en una LCD pero en el otro pic, en realidad no me sale esto, alguien tiene una idea de como poder solucionar esto, ademas de poder compartir sus conocimientos conmigo :lol: y sus codigos :mrgreen:
lo que he intentado es: la lectura de la entrada analoga N0 supongamos, la almaceno en una variable "rango" y esta la intento mandar al otro pic por medio de printf("%f",rango); es la unica forma que me da numeros de todas las otras que intentado, pero estan malos siempre me aroja 4Volt cuNDO LE PONGO 3V a la entrada.
espero su ayuda por favor.
saludos.
bueno logre mandar el dato al otro pic, pero el punto ahora es que me llega de a un caracter al otro pic, osea si el valor del pic 1 es 2,45, en el pic 2 llega 2 , 4 5 y no como solo un numero, ahora mi pregunta tengo que meter todo a dentro de un string o no? apenas llege este dato???????
-
hola, otra vez, bueno e hecho un codigo y no se por que no se ve reflejado los datos del pic 2 en el pic 1 por medio de la LCD, en esta ultima solo me aparece el valor 0.00 y nada mas.
pic que contiene la señales analogas a mandar al pic 2:
#include <16F873a.h>
#device adc=10
#FUSES NOWDT, XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay (clock=4000000) //Fosc=4Mhz
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)
#define use_portb_lcd TRUE //definir portb lcd
#include <lcd420.c>
#include <stdlib.h>
#use standard_io(C)
float const resolucion= 5.0/1022.0; // Conversión con 10 bits
float rango1, rango2,rango3;
int16 V1,V2,V3;//variables para las señales analogas
char lectura;
#int_RDA //interrupcion para la resepcion del master
void RDA_isr()
{
if(kbhit()){
lectura=GETC(); //guarda el valor enviado por el RS-232
putc(lectura);
}}
void main(void)
{
lcd_init();
enable_interrupts(GLOBAL); //todas las interrupciones activadas
enable_interrupts(INT_RDA); //interrupcion INT_RDA activada. comunicacion rs232
setup_port_A( ALL_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
while(TRUE){
//avilita la entrada analoga N0
set_adc_channel( 0 );//numero del puerto analogo N0
delay_us(20);
V1 = read_adc();//guarda el dato optenido de la entrada analoga
//avilita la entrada analoga N1
set_adc_channel( 1 );//numero del puerto analogo N1
delay_us(20);
V2 = read_adc();//guarda el dato optenido de la entrada analoga
//avilita la entrada analoga N2
set_adc_channel( 2 );//numero del puerto analogo N1
delay_us(20);
V3 = read_adc();//guarda el dato optenido de la entrada analoga
rango1=V1 * resolucion;
rango2=V2 * resolucion;
rango3=V3 * resolucion;
lcd_gotoxy(1,1);
printf(lcd_putc,"valor 1: %f",rango1);
lcd_gotoxy(1,2);
printf(lcd_putc,"valor 2: %f",rango2);
lcd_gotoxy(1,3);
printf(lcd_putc,"valor 3: %f",rango3);
//printf("%.2f 0x09",rango1);
printf("%f",rango1);
delay_us(20);
putc(0x0D);
}}
resepcion de las señales analogas:
#include <16F873a.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay (clock=4000000) //Fosc=4Mhz
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)
#define use_portb_lcd TRUE //definir portb lcd
#include <lcd420.c>
#include <stdlib.h>
#use standard_io(C)
int xbuff=0x00; // Índice: siguiente char en cbuff
char lectura=0x00; // último caracter recibido
float numero;
#int_rda
void serial_isr() { // Interrupción recepción serie USART
if(kbhit()){ // Si hay algo pendiente de recibir ...
lectura=getc(); // lo descargo y ...
}
}
void main(void)
{
lcd_init();
delay_ms(2000); // Espero a estabilizar antes de actuar
enable_interrupts(INT_RDA); //interrupcion INT_RDA activada. comunicacion rs232
enable_interrupts(GLOBAL); //todas las interrupciones activadas
do {
for(xbuff=0;xbuff<=3;xbuff++){
do{
}while(lectura==0x0D);
cbuff[cbuff]=lectura;
numero=atof(cbuff);
lcd_gotoxy(1,1);
printf(lcd_putc,"%f",numero);
putc(0x00);
}
} while (TRUE);
}
bucha espero que me puedan ayudar en esto ya que no logro nada de lo que quiero :oops:
-
Hola.
Lo que te llega al pic es un string y lo que debes hacer es guardar todos esos datos en un bufer. En tu caso envias un float, por lo que debes usar una función que pase de string a float.
En la ayuda del CCS estan esas funciones.
Saludos
-
hola MLO te comento que tambie nintente poniendo el atof para transformar esto pero aun asi no me sale nada por la pantalla, te dejo lo que hice para que veaz.
#include <16F873a.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay (clock=4000000) //Fosc=4Mhz
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)
#define use_portb_lcd TRUE //definir portb lcd
#include <lcd420.c>
#include <stdlib.h>
#use standard_io(C)
char lectura; // último caracter recibido
float numero;
#int_rda
void serial_isr() { // Interrupción recepción serie USART
if(kbhit()){ // Si hay algo pendiente de recibir ...
lectura=getc(); // lo descargo y ...
}
}
void main(void)
{
lcd_init();
delay_ms(2000); // Espero a estabilizar antes de actuar
enable_interrupts(INT_RDA); //interrupcion INT_RDA activada. comunicacion rs232
enable_interrupts(GLOBAL); //todas las interrupciones activadas
while (TRUE){
numero=atof(lectura);
lcd_gotoxy(1,1);
printf(lcd_putc,"%f,"numero);
-
Hola.
La función atof pasa un string a un valor float ... y tu estas enviado como parametro un char :?
char string [10];
float x;
strcpy (string, "123.456");
x = atof(string);
// x is now 123.456
El ejemplo lo dice todo. :mrgreen:
Debes cambiar la rutina de interrupcion serial, de tal manera que se vayan almacenando los bytes recibidos en un bufer y asi poder usar la funcion correctamente.
Saludos
-
Qué tal todos!
Japifer, y no has pensado en la opción de que el pic que haga la conversión A/D mande el dato tal cual de la conversión (si usas conversión a 8bits, sólo tendrías que mandar un byte, y tendrías sensibilidad -si ese no es el término correcto me corrigen por favor- de unos 0.02V)... y que sea el pic receptor el que haga los cálculos en float y muestre en el LCD?
Bueno es sólo una sugerencia, para ahorrarte trabajo con los strings -aunque como te está explicando MLO, tampoco es algo del otro mundo, pero para los novatos como nosotros la cosa a veces se nos pone difícil jeje-...
Ok avisa si lograste resolver...
Saludos, nos leemos! :mrgreen:
-
hola, gracias por la sujerencia y correccion, aver si con lo que dicen puedo lograr algo.
-
hola, gracias por la sujerencia y correccion, aver si con lo que dicen puedo lograr algo.
Hola japifer_22 , lograste algun avance en el programa que estabas realizando? Yo ando en las mismas...
Saludos.