Hola gente de todo pic, estoy haciendo una aplicacion con un pic 16f877A programado en ccs, el cual debe leer 3 canales del Adc con resolucion de 10 bits y enviar los datos a la pc por el protocolo RS232.
Yo leo el conversor en una variable de 16bits (word) y luego la desarmo en dos bytes con make8 para tener una parte alta y otra parte baja y luego envio los datos.
Hasta aqui mi programa funciona perfectamente, fue simulado en proteus y a los datos los envia bien.
Mi problema es que tengo tres datos distintos (por ejemplo, 3 sensores distintos de temperatura), pero cuando los envio a la pc no se como hacer para saber cuales son la parte alta y baja del sensor 1, la del sensor 2 y la del 3.
Yo pensaba en meterle unos bits a la parte alta y que la pc los teste y decida pero no se si esa es la forma.
Ustedes que tienen mas experiencia a lo mejor hicieron algo similar.
Les adjunto mi codigo, esta compilado en pic ccs. Gracias.
//Este Firmware lee 3 canales del ADC configurado con una resolucion de 10bits
//y luego envia por RS232 la parte baja y la parte alta del word adquirido
//Jorge Peirone
#include<16f877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device adc=10 //nos permite especificar el número de bits que la función read_adc() debe retornar.
#use delay(clock=4000000)
#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7)
int16 conversion(int);
int16 ECG; //Variable para guardar la medicion para enviar.
int16 TORAX; //int16 es un word 16bits
int16 TEMP;
int HiByte,LoByte;// dos registros de 8 bits , 2 bytes.
void main()
{
setup_adc_ports(ANALOG_RA3_REF);//pongo todas las entradas como analogicas y Ra3 como Vref+
setup_adc(ADC_CLOCK_INTERNAL);//definimos la frecuencia de reloj empleada en la conversión.
while(TRUE)
{
ECG=conversion(0);
LoByte=make8(ECG,0); //La funcion make8 me devuelve la parte parte del word con el corrimiento que quiero, corrimiento 0 obtengo el primer byte
HiByte=make8(ECG,1);//con el corrimiento 1 obtengo la parte alta es decir que me corro un bayte y guardo en la parte alta.
printf("%u\r\n",LoByte); // primero enviamos la parte baja
printf("%u\r\n",HiByte); // despues la parte alta
LoByte=0x00; //los vuelvo a 0
HiByte=0x00;
delay_ms(2000); // solo para darme cuenta en la simulacion
TORAX=conversion(1);
LoByte=make8(TORAX,0);
HiByte=make8(TORAX,1);
printf("%u\r\n",LoByte);
printf("%u\r\n",HiByte);
LoByte=0x00; //los vuelvo a 0
HiByte=0x00;
delay_ms(2000);
TEMP=conversion(2);
LoByte=make8(TEMP,0);
HiByte=make8(TEMP,1);
printf("%u\r\n",LoByte);
printf("%u\r\n",HiByte);
LoByte=0x00; //los vuelvo a 0
HiByte=0x00;
delay_ms(3000);
}
}
int16 conversion (int canal)
{
int16 value;
set_adc_channel(canal);
delay_us(20);
value=read_adc();
return(value);
}
Bueno muchas gracias y espero su respuesta.