Hola a todos. Estoy desarrollando una aplicación y al compilar tengo uno errores en el programa. Vamos hay un poco de todo. Explicaré el programa para que sepáis qué hace exactamente.
Desde otro PIC master yo enviaré una solicitud para pedir una lectura del ADC. En esa solicitud especificaré la dirección de mi PIC slave y también el canal del que deseo obtener la información. La trama a enviar por puerto serie desde el PIC master hacia mi PIC slave será la siguiente: "$ADQ,P01,CHx," donde [ x ] será un valor del 0 al 5 (referente al canal de lectura).
Una vez reciba la trama por el puerto serie de mi PIC slave primero de todo tendré que comprobar si la dirección recibida coincide con la del PIC slave. La dirección de éste PIC slave es la siguiente: "$ADQ,P01,". Comprobaré si coincide con la recibida y posteriormente miraré qué canal de lectura hay que leer. La cadena de caracteres a obtener de la trama recibida es solamente "CHx" para saber qué canal hay que leer. Para éstas dos cosas defino unos strings para guardar la dirección recibida y el canal recibido.
Una vez sepa el canal realizo la lectura y lo guardo en una variable. Es evidente que para cambiar de un valor Numérico a un String tengo que hacer una conversión. Hay unas funciones como por ejemplo itoa() pero prefiero hacerlo manualmente.
Una vez convierto este valor del ADC a string concateno unos strings para obtener mi dato a devolver por puerto serie. El dato a devolver es el siguiente: "$DAT,P01,CHx,xxxxxxxxxx" donde xxxxxxxxxx es el valor del ADC de 10 bits del PIC 16F88.
Quiero comprobar que todo esté bien definido ya que obtengo errores al compilar y no tengo ni idea... llevo muy poco con CCS. Ya sé que el programa quizás es un poco largo pero si alguien pudiera repasarlo. Cualquier duda respecto al funcionamiento que quiero hacer puedo responder.
Muchas gracias
Bueno donde dice CH6 es en realidad CH5
Hay alguna variable que no estaba definida pero ya lo solventé.
Desde otro PIC master yo enviaré una solicitud para pedir una lectura del ADC. En esa solicitud especificaré la dirección de mi PIC slave y también el canal del que deseo obtener la información. La trama a enviar por puerto serie desde el PIC master hacia mi PIC slave será la siguiente: "$ADQ,P01,CHx," donde [ x ] será un valor del 0 al 5 (referente al canal de lectura).
Una vez reciba la trama por el puerto serie de mi PIC slave primero de todo tendré que comprobar si la dirección recibida coincide con la del PIC slave. La dirección de éste PIC slave es la siguiente: "$ADQ,P01,". Comprobaré si coincide con la recibida y posteriormente miraré qué canal de lectura hay que leer. La cadena de caracteres a obtener de la trama recibida es solamente "CHx" para saber qué canal hay que leer. Para éstas dos cosas defino unos strings para guardar la dirección recibida y el canal recibido.
Una vez sepa el canal realizo la lectura y lo guardo en una variable. Es evidente que para cambiar de un valor Numérico a un String tengo que hacer una conversión. Hay unas funciones como por ejemplo itoa() pero prefiero hacerlo manualmente.
Una vez convierto este valor del ADC a string concateno unos strings para obtener mi dato a devolver por puerto serie. El dato a devolver es el siguiente: "$DAT,P01,CHx,xxxxxxxxxx" donde xxxxxxxxxx es el valor del ADC de 10 bits del PIC 16F88.
Quiero comprobar que todo esté bien definido ya que obtengo errores al compilar y no tengo ni idea... llevo muy poco con CCS. Ya sé que el programa quizás es un poco largo pero si alguien pudiera repasarlo. Cualquier duda respecto al funcionamiento que quiero hacer puedo responder.
Muchas gracias
Código:
#include <16F88.h>
#include <stdio.h>
#include <string.h>
#device adc=10 //INDICO EL NÚMERO DE BITS DEL ADC
#fuses HS, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT, PUT
#use delay(clock=8000000)
#use rs232(baud=9600, xmit=PIN_B5, rcv=PIN_B2) //*CONFIGURO PUERTO SERIE
char DireccionPIC[10]= "$ADQ,P01,"; //Es la direccion del PIC
char DireccionPICrespuesta[10]="$DAT,P01,"
int strcmp(const char *cadena1, const char *cadena2); //Definicion funcion STRCMP creo que es obligatorio
#INT_RDA
void INT_UART() {
//Definición de variables
int ValorADC=0; //Variable para lectura ADC
int i=0; //Variable para ciclos for
int Maskara=0; //Variable para obtencion de bits '0' o '1'
char StringValorADC[12]={0};//Cadena de caracteres para guardar valor ADC en Carcteres
char PreDatoSalida[15]={0};
char DatoEntrada[15]={0}; //String para guardar el dato de entrada por UART
char DatoSalida[24]={0}; //String para guardar lo que envio por UART
char DireccionRecibida[10]={0}; //Variable para guardar direccion entrada
char CanalRecibido[6]={0}; //Variable para guardar canal ADC a leer
DatoEntrada=fgets();
for(i=0;i<10;i++){ //Con éste for obtengo la direccion recibida por UART
DireccionRecibida[i]=DatoEntrada[i];
}
i=0;
DireccionRecibida[10]='/0'; //Pongo caracter nulo para que sea string
if(strcmp(DireccionRecibida, DireccionPIC)==0){ //Comparo si la direccion recibida coincide con la del PIC
for(i=0;i<5;i++){
CanalRecibido[i]=DatoEntrada[i+9]; //Si coincide obtengo el canal de lectura del ADC
}
i=0;
variable2[5]='/0'; //Pongo caracter nulo para que sea string
if(strcmp(CanalRecibido,"CH0")==0){ //voy comparando para ver qué canal he obtenido y leo CHX
set_adc_channel(0); //SELECCIONO CANAL 0 (PIN A0) DEL ADC PARA A LEER.
}
else if(strcmp(CanalRecibido,"CH1")==0){
set_adc_channel(1);
}
else if(strcmp(CanalRecibido,"CH2")==0){
set_adc_channel(2);
}
else if(strcmp(CanalRecibido,"CH3")==0){
set_adc_channel(3);
}
else if(strcmp(CanalRecibido,"CH4")==0){
set_adc_channel(4);
}
else if(strcmp(CanalRecibido,"CH6")==0){
set_adc_channel(5);
}
delay_us(20); //retardo para leer ADC
ValorADC=read_adc(); //lectura ADC
for(i=0;i<10;i++){ //Con un for recorreré solo 10 posiciones del resultado ValorADC (ADC 10 bits)
CopiaValorADC=ValorADC; //Realizo una copia del valor numérico del ADC para no perderlo
Maskara=CopiaValorADC>>i; //Quiero tener el bit "i" a la derecha del todo
Maskara=Maskara&0x0000000000000001; //realizo una AND para ver si tengo un [1] o un [0].
if(Maskara==1){
StringValorADC[10-i]='1'; //Meto los bits (en forma de caracter) en el String StringValorADC
}
else{
StringValorADC[10-i]='0';
}
}
StringValorADC[0]=','; //Pongo una ',' al principio del resultado
StringValorADC[11]='/0'; //Por último pongo el caracter nulo (para que sea String)
PreDatoSalida=strcat(DireccionPICrespuesta,CanalRecibido); //Concateno DireccionPICrespuesta y el canal "CHX")
DatoSalida=strcat(PreDatoSalida,StringValorADC);//concateno String anterior y Valor del ADC
puts(DatoSalida); //Envio un solo String con la direccion, canal CHX y el resutado del PIC por UART.
} //ya he enviado por UART: "$ADQ,P01,CHx,xxxxxxxxxx"
void main(){
enable_interrupts(GLOBAL); //HABITILRO TODAS LAS INTERRUPCIONES GLOBALES
enable_interrupts(INT_RDA); //HABILITO LA INTERRUPCIÓN UART
setup_adc_ports(sAN0,sAN1,sAN2,sAN3,sAN4,sAN5); //INDICO EL PIN A0/A1/A2/A3/A4/A5 COMO ENTRADA ANALÓGICA
setup_adc(ADC_CLOCK_INTERNAL); //CLOCK INTERNO PARA CONVERSIÓN ADC
return(0);
}
Bueno donde dice CH6 es en realidad CH5
Hay alguna variable que no estaba definida pero ya lo solventé.
Última edición por un moderador: