Autor Tema: Errores al compilar programa en CCS para PIC16F88  (Leído 16128 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Errores al compilar programa en CCS para PIC16F88
« en: 28 de Marzo de 2014, 14:05:59 »
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 direccion 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 éste 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

#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=DatoEntrada;
}
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=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
  • .

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,CanalRe cibido); //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);
}
« Última modificación: 28 de Marzo de 2014, 14:08:12 por Prototipe88 »

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #1 en: 28 de Marzo de 2014, 14:25:29 »
bueno donde pone CH6 es en realidad CH5

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #2 en: 28 de Marzo de 2014, 14:35:06 »
te marca error al compilar? o en la ejecución del programa?
"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #3 en: 28 de Marzo de 2014, 14:41:43 »
te marca error al compilar? o en la ejecución del programa?

Hola de nuevo rivale! Pues me marca digamos los errores siguientes:


*** Error 23 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 5(8,9): Can not change device type this far into the code
*** Error 48 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 5(9,12): Expecting a (
*** Error 43 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 5(13,15): Expecting a declaration
*** Error 36 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 13(5,8): Expecting a ; or ,
*** Error 43 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 13(11,12): Expecting a declaration
*** Error 46 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 13(31,32): Expecting an =
*** Error 46 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 13(52,53): Expecting an =
*** Error 43 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 13(53,54): Expecting a declaration
*** Error 49 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 31(1,12): Expecting LVALUE such as a variable name  or  * expression
*** Error 45 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 37(23,25): Subscript out of range
*** Error 5 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 37(27,29): Character constant constructed incorrectly
*** Error 5 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 37(30,32): Character constant constructed incorrectly
*** Error 12 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 45(5,14): Undefined identifier   variable2
*** Error 5 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 45(18,20): Character constant constructed incorrectly
*** Error 5 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 45(21,23): Character constant constructed incorrectly
*** Error 51 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 51(4,8): A numeric expression must appear here
*** Error 51 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 55(4,8): A numeric expression must appear here
*** Error 51 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 59(4,8): A numeric expression must appear here
*** Error 51 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 63(4,8): A numeric expression must appear here
*** Error 51 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 67(3,7): A numeric expression must appear here
*** Error 5 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 88(20,22): Character constant constructed incorrectly
*** Error 5 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 88(23,25): Character constant constructed incorrectly
*** Error 76 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 90(1,14): Expect ;
*** Error 49 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 92(1,11): Expecting LVALUE such as a variable name  or  * expression
*** Error 51 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 99(1,5): A numeric expression must appear here
*** Error 58 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 103(26,27): Expecting a close paren
*** Error 127 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 105(1,7): Return value not allowed in void function
*** Error 79 "D:\Documents and Settings\Administrador.DESKTOP\Mis documentos\Programa PIC\project1.c" Line 108(0,1): Expect }
      28 Errors,  0 Warnings.
« Última modificación: 28 de Marzo de 2014, 14:45:31 por Prototipe88 »

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #4 en: 28 de Marzo de 2014, 14:43:24 »
Alguna variable no estaba definida pero ya lo solventé.
« Última modificación: 28 de Marzo de 2014, 14:46:06 por Prototipe88 »

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #5 en: 28 de Marzo de 2014, 15:00:03 »
Alguna variable no estaba definida pero ya lo solventé.
ya lo corregiste?. por lo que veo te faltan ; en algunas lineas por eso te marca varios errores, puedes picarle en el error y te envía a la linea correspondiente
"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #6 en: 28 de Marzo de 2014, 17:18:57 »
Alguna variable no estaba definida pero ya lo solventé.
ya lo corregiste?. por lo que veo te faltan ; en algunas lineas por eso te marca varios errores, puedes picarle en el error y te envía a la linea correspondiente

Le doy al error pero en principio veo que tengo los ";"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #7 en: 28 de Marzo de 2014, 17:24:20 »
¿Me podrías repasar un poco la definición de las funciones y las ideas que estoy plasmando en el programa? Me sería de grandísima ayuda ya que no sé si plasmo correctamente lo que pienso en C (CCS)

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #8 en: 28 de Marzo de 2014, 17:33:37 »
viendo tu código encuentro algunos errores:

-dentro del main debes tener un ciclo infinito para que tu pic no se resetee.
-dentro de la interrupción lo ideal es que no realices muchas operaciones, puedes activar una bander y posteriormente realizar lo que desees dentro del main o mandando a llamar a una función
-la función  strcmp no es necesario que la definas, esta ya esta definida dentro de las librerias string.h

"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #9 en: 28 de Marzo de 2014, 18:38:25 »
viendo tu código encuentro algunos errores:

-dentro del main debes tener un ciclo infinito para que tu pic no se resetee.
-dentro de la interrupción lo ideal es que no realices muchas operaciones, puedes activar una bander y posteriormente realizar lo que desees dentro del main o mandando a llamar a una función
-la función  strcmp no es necesario que la definas, esta ya esta definida dentro de las librerias string.h





Vale rivale ya he corregido ésto. Adjunto de nuevo el programa.



#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

#define TRUE 1
#define FALSE 0

char DireccionPIC[10]= "$ADQ,P01,"; //Es la direccion del PIC
char DireccionPICrespuesta[10]="$DAT,P01,"

//Definición de variables

int ValorADC=0; //Variable para lectura ADC
int CopiaValorADC;
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
int FlagUART

#INT_RDA
void INT_UART() {

DatoEntrada=fgets();
FlagUART=TRUE;

} //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

while(1){

if(FlagUART==TRUE){

FlagUART=FALSE;

for(i=0;i<10;i++){  //Con éste for obtengo la direccion recibida por UART
    DireccionRecibida=DatoEntrada;
}
    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=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,"CH5")==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
  • .

    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.

   }
 
  }

 }

}


Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #10 en: 28 de Marzo de 2014, 18:42:56 »
ya te compila y funciona como lo esperabas?
"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #11 en: 28 de Marzo de 2014, 18:52:35 »
ya te compila y funciona como lo esperabas?


No me funciona bien aún... hay algo que no estoy haciendo bien... puse ";" en FlafUART; y tambien lo de variable2 que la cambie por otra.
« Última modificación: 28 de Marzo de 2014, 18:56:59 por Prototipe88 »

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #12 en: 28 de Marzo de 2014, 19:03:44 »
otro error en esta linea

 DireccionRecibida=DatoEntrada;

debes ir copiando los elementos del vector, debe ser así

DireccionRecibida=DatoEntrada;

 
Código: C
  1. DireccionRecibida[i]=DatoEntrada[i];

también en esta linea, del lado de canal recibido no estas asignando un elemento del vector
Código: C
  1. CanalRecibido[i]=DatoEntrada[i+9];
« Última modificación: 28 de Marzo de 2014, 19:35:25 por rivale »
"Nada es imposible, no si puedes imaginarlo"

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #13 en: 28 de Marzo de 2014, 19:07:44 »
una sugerencia para hacer mas facil la selección del canal es que solo tomes en cuenta el caracter que corresponde al canal

"$ADQ,P01,CHx,"

esta en la posición 11, entonces podrias leer solo ese character, restarle 0x30 y tienes directamente el canal que tienes que leer.
"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #14 en: 28 de Marzo de 2014, 19:31:29 »
una sugerencia para hacer mas facil la selección del canal es que solo tomes en cuenta el caracter que corresponde al canal

"$ADQ,P01,CHx,"

esta en la posición 11, entonces podrias leer solo ese character, restarle 0x30 y tienes directamente el canal que tienes que leer.


Pues no sé por qué razón lo de los vectores no se copió bien. Pero a corregí de nuevo eso de DatoRecibido:

CORRECIÓN1:

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


CORRECIÓN2:

for(i=0;i<5;i++){
      CanalRecibido[ i ]=DatoEntrada[i+9]; //Si coincide obtengo el canal de lectura del ADC
   }
    i=0;
    CanalRecibido[5]='/0';   //Pongo caracter nulo para que sea string


 

anything