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

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

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #30 en: 03 de Abril de 2014, 17:50:56 »
Recuerda que en ccs el tipo int es de 8 bits, por lo que solo puedes guardar hasta 127 en numeros signados, para leer 10 bits necesitas usar un tipo long, que es un entero de 16 bits

no necesitas verificar si es mayor o menor a 1000, la forma correcta sería la siguiente:

Código: C
  1. printf ("%04l",ValorADC );


lo que vas a imprimir es un long, entonces es %l, y para que sea fija la cantidad de caracteres a mostar usas %04l:

donde el numero que sigue al % es con lo que va a rellenar, en este caso un 0, y el siguiente numero es la cantidad fija de dijitos que quieres mostrar, 4 en este caso.


Espero te sirva, Saludos


Es decir que si utilizo sprintf(StringValorADC,".%04l",ValorADC); siempre voy a tener ValorADC=.0004 ó .0010 ó .0100 ó .1023 etc. Si en vez de un 0 introduzco un 1 el valor restante para completar los 4 dígitos los rellenaría con un 1?

Muchas grasias!

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #31 en: 03 de Abril de 2014, 17:56:12 »


Es decir que si utilizo sprintf(StringValorADC,".%04l",ValorADC); siempre voy a tener ValorADC=.0004 ó .0010 ó .0100 ó .1023 etc. Si en vez de un 0 introduzco un 1 el valor restante para completar los 4 dígitos los rellenaría con un 1?

Muchas grasias!

exacto, el primer digito indica con que va a completar para que impriman los caracteres faltantes
"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #32 en: 03 de Abril de 2014, 17:57:28 »
Me da un error de formato en el sprintf su pongo que para ésta función no le gusta el %04l. Necesito guardar el valor del ADC en forma de string dentro de una variable para luego concatenarla con otro string. Se puede hacer? (lo de concatenar ya lo hago con el strcat pero lo de guardar el valor del ADC dentro de otro string pero ya en formato string sin sprintf no se hacerlo)
« Última modificación: 03 de Abril de 2014, 18:01:41 por Prototipe88 »

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #33 en: 03 de Abril de 2014, 18:00:57 »
intenta con ld, en lugar de l
"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #34 en: 03 de Abril de 2014, 18:02:30 »
intenta con ld, en lugar de l

Ahora PERFERCTO.  :) :) :) :) :) :) Qué diferencia hay?

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #35 en: 03 de Abril de 2014, 18:14:11 »
ld es para imprimir "longs" signados y con lu imprimes no signados
"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #36 en: 03 de Abril de 2014, 18:35:26 »
ld es para imprimir "longs" signados y con lu imprimes no signados

:) ahora lo entiendo.

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #37 en: 10 de Abril de 2014, 12:10:32 »
rivale he utilizado el entorno de programación MPLAB y el compilador CCS. Entonces dispodré en poco tiempo del ICD2 de Microchip. Una vez compilo el programa (sin errores y solo unos warnings) debo utilizar el MPLAB ICD2 Setup Wizard para la programación del micro cierto? o hay que realizar un paso previo como el generar el archivo .hex para introducirlo en algún lugar antes? muchas gracias!

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #38 en: 11 de Abril de 2014, 10:45:17 »
rivale he utilizado el entorno de programación MPLAB y el compilador CCS. Entonces dispodré en poco tiempo del ICD2 de Microchip. Una vez compilo el programa (sin errores y solo unos warnings) debo utilizar el MPLAB ICD2 Setup Wizard para la programación del micro cierto? o hay que realizar un paso previo como el generar el archivo .hex para introducirlo en algún lugar antes? muchas gracias!
no tengo el ICD2, yo tengo el pickit3 y el programador de ccs(no recuerdo como se llama), pero en general en mplab escoges el programador a usar y solo le pones grabar, para el pickit 3 tenias que activarle el voltaje de salida para que se pudiera programar el micro usando como fuente el usb, pero creo que para el icd2 esto no es necesario
"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #39 en: 26 de Abril de 2014, 10:06:00 »
He conseguido programar con el ICD2 pero tengo un problema en el funcionamiento del programa. Cuando realizo la siguientes concatenaciones. El PIC mio se queda como colgado... es como si no le gustara la función STRCAT.


    
Código: [Seleccionar]
strcat(dato_salida, (char*)"$");
    strcat(dato_salida, tipo_dato); //tipo_dato es un string
    strcat(dato_salida, (char*)",");
    strcat(dato_salida, direccion_pic); // direccion_pic es un string
    strcat(dato_salida, (char*)"\r");
    strcat(dato_salida, (char*)"\n");
    printf("%s", dato_salida);


En cambio cuando pongo solo:

Código: [Seleccionar]
printf("$ADQ,P00,CH0\r);

me lo hace sin problema. A qué puede ser debido? El programa no me da errores ni warnings respecto a ésto. Y compila bien al igual que al programarlo. He añadido también la libreria string.h pero no sé a qué puede ser debido éste fallo en el funcionamiento...


Te adjunto el codigo completo por si quieres hecharle un vistazo:


Código: [Seleccionar]
#include <16f88.h>
#device ADC=10 //INDICO EL NÚMERO DE BITS DEL ADC

#include <stdio.h>
#include <string.h>


#fuses HS, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT, PUT
#use delay(clock=8000000)
#use rs232(baud=9600, xmit=PIN_B5, rcv=PIN_B2) //CONFIGURO PUERTO SERIE


//**VARIABLES PARA GESTIONAR LA TRAMA RECIBIDA Y LA TRAMA A ENVIAR POR PUERTO SERIE**//

long valor_adc=0; //Variable para lectura ADC

int P_W=0; //puntero escritura
int P_R=0; //puntero lectura

int i=0; //puntero bucle for
int j=0;

int inicio=0;
int final=0;

char string_valor_adc[6]={0};//Cadena de caracteres para guardar valor ADC en Carcteres
char trama_entrada[91]={0}; //String para guardar el dato de entrada por UART
char direccion_pic[4]={0};
char tipo_dato[4]={0};
char canal[4]={0};
char dato_salida[19]={0}; //String para guardar lo que envio por UART
char dato[13]={0};

short flag=0;
short flag_permiso=0;
short flag_tst=0;


void lectura(){

 for(P_R=0; P_R<91; P_R++){

  if(trama_entrada[P_R]==(char*)"$"){

  inicio=P_R;
  
  for(P_R=inicio; P_R<91; P_R++){
 
   if(trama_entrada[P_R]==(char*)"\r"){

   P_W=0;
   final=P_R;
   flag_permiso=1;
   break;

    }
 
   }
   break;
  }

 }

}


void escritura(){

for(i=inicio; i<=final; i++){
  
dato[j]=trama_entrada[i];
j++;

  }

i=0;
j=0;

}


void procesamiento(){

for(i=0; i<3; i++){

direccion_pic[i]=dato[i+5];

}


if((flag=strcmp(direccion_pic, (char*)"P01")==0)){

for(i=0; i<3; i++){

tipo_dato[i]=dato[i+1];

}

if((flag=strcmp(tipo_dato, (char*)"ADQ")==0)){

for(i=0; i<3; i++){

canal[i]=dato[i+9];

}


if((flag=strcmp(canal,(char*)"CH1"))==0){
      set_adc_channel(1);  
   }
  
   else if((flag=strcmp(canal,(char*)"CH2"))==0){
      set_adc_channel(2);
   }

   else if((flag=strcmp(canal,(char*)"CH3"))==0){
      set_adc_channel(3);
   }

   else if((flag=strcmp(canal,(char*)"CH4"))==0){
      set_adc_channel(4);
   }

  else if((flag=strcmp(canal,(char*)"CH5"))==0){
      set_adc_channel(5);
   }


delay_us(20);//retardo para leer ADC
valor_adc=read_adc();//lectura ADC

 }

else if((flag=strcmp(tipo_dato, (char*)"TST")==0)){

flag_tst=1;

}

}

}

void enviar(){

switch(flag_tst){

case 0:

    sprintf(string_valor_adc,",%04ld",valor_adc);

    strcat(dato_salida, (char*)"$");
    strcat(dato_salida, tipo_dato);
    strcat(dato_salida, (char*)",");
    strcat(dato_salida, direccion_pic); //Concateno DireccionPICrespuesta y el canal "CHX")
    strcat(dato_salida, (char*)",");
    strcat(dato_salida, canal);
    strcat(dato_salida, string_valor_adc);//concateno String anterior y Valor del ADC
    strcat(dato_salida, (char*)"\r");
    strcat(dato_salida, (char*)"\n");


    output_high(PIN_B0);

    printf("%s", dato_salida); //Envio un solo String con la direccion, canal CHX y el resutado del PIC por UART.

    output_high(PIN_B0);

    flag_permiso=0;

    break;

case 1:

    strcat(dato_salida, (char*)"$");
    strcat(dato_salida, tipo_dato);
    strcat(dato_salida, (char*)",");
    strcat(dato_salida, direccion_pic); //Concateno DireccionPICrespuesta y el canal "CHX")
    strcat(dato_salida, (char*)"\r");
    strcat(dato_salida, (char*)"\n");

    output_high(PIN_B0);

    printf("%s", dato_salida); //Envio un solo String con la direccion, canal CHX y el resutado del PIC por UART.

    output_high(PIN_B0);

    flag_permiso=0;
    flag_tst=0;

    break;

}

}


#INT_RDA

void INT_UART() {

trama_entrada[P_W]=getc();
P_W++;
 
}


void main(){

output_low(PIN_B0);

enable_interrupts(GLOBAL); //HABIlLITO 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){

 lectura();

if(flag_permiso==1){
 escritura();
 procesamiento();
 enviar();
  }
 }
}

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #40 en: 26 de Abril de 2014, 12:15:26 »
Hola, porque no intentas concatenar todo al momento de mandarlo a imprimir


printf("%s$%s,%s\r\n",dato_salida,tipodato,direccion_pic);


eso te da el resultado que quieres
"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #41 en: 26 de Abril de 2014, 12:28:11 »
Hola, porque no intentas concatenar todo al momento de mandarlo a imprimir


printf("%s$%s,%s\r\n",dato_salida,tipodato,direccion_pic);


eso te da el resultado que quieres


 Voy a probarlo... respecto a las interrupciones del puerto serie las ves bien definidas? el programa tampoco entra en ella... en la interrupcion de atencion al puerto serie....

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #42 en: 28 de Abril de 2014, 10:43:47 »
Bueno, ahora ya he conseguido que el programa entre dentro de la interrupcion serie pero... es como si el programa me hiciera cosas raras. Yo cuando le envio un dato del estilo "$ADQ,P01,CH0\r" el programa SOLO me hace una VEZ lo que yo quiero... y aunque le vuelva a enviar otro dato igual ya no responde a mi dato. Lego cuando le envio un dato del estilo "$TST,P01\r" el programa me printa infinitas veces lo que quiero que haga.... es super raro...


Código: [Seleccionar]
#include <16f88.h>
#device ADC=10 //INDICO EL NÚMERO DE BITS DEL ADC

#include <stdio.h>
#include <string.h>


#fuses HS, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT, PUT
#use delay(clock=8000000)
#use rs232(baud=9600, xmit=PIN_B5, rcv=PIN_B2) //CONFIGURO PUERTO SERIE


//**VARIABLES PARA GESTIONAR LA TRAMA RECIBIDA Y LA TRAMA A ENVIAR POR PUERTO SERIE**//

long valor_adc=0; //Variable para lectura ADC

int P_W=0; //puntero escritura
int P_R=0; //puntero lectura

int i=0; //puntero bucle for
int j=0;

int inicio=0;
int final=0;

char string_valor_adc[]=",0000";//Cadena de caracteres para guardar valor ADC en Carcteres
char trama_entrada[91]={0}; //String para guardar el dato de entrada por UART
char direccion_pic[]="P01";
char tipo_dato[]="$ADQ";
char canal[]="CH0";
//char dato_salida[]="$ADQ,P01,CH0,0000\r\n"; //String para guardar lo que envio por UART
char dato[]="$ADQ,P01,CH0\r";


char midireccion[]="P01";
char micabecera[]="$ADQ";
char miretorno[]="\r";
char misimbolo[]="$";
char micanal0[]="CH0";
char micanal1[]="CH1";
char mitest[]="$TST";


short flag_final=0;
short flag_permiso=0;
short flag_tst=0;
short flag_envio=0;


void lectura(){

 for(P_R=0; P_R<91; P_R++){

  if(trama_entrada[P_R]==misimbolo[0]){

  inicio=P_R;
  
  for(P_R=inicio; P_R<91; P_R++){
 
   if(trama_entrada[P_R]==miretorno[0]){

   P_W=0;
   final=P_R;
   flag_permiso=1;
   break;

    }
 
   }
   break;
  }

 }
return;
}


void escritura(){

for(i=inicio; i<=final; i++){
  
dato[j]=trama_entrada[i];
j++;

  }

for(i=0;i<91;i++){
trama_entrada[i]='\0';
}
i=0;
j=0;

return;
}


void procesamiento(){

for(i=0; i<3; i++){

direccion_pic[i]=dato[i+5];

}

direccion_pic[3]='\0';


if(strcmp(direccion_pic, midireccion)==0){

for(i=0; i<4; i++){

tipo_dato[i]=dato[i];

}

tipo_dato[4]='\0';


if(strcmp(tipo_dato, micabecera)==0){

flag_tst=0;

for(i=0; i<3; i++){

canal[i]=dato[i+9];

}

canal[3]='\0';


if(strcmp(canal,micanal0)==0){
 set_adc_channel(0);  
   }
  
  
   else if(strcmp(canal,micanal1)==0){
      set_adc_channel(1);
   }

  
delay_us(20);//retardo para leer ADC
valor_adc=read_adc();//lectura ADC

 }

else if(strcmp(tipo_dato, mitest)==0){

flag_tst=1;

}
flag_envio=1;
}
return;
}


void enviar(){

switch(flag_tst){

case 0:

    sprintf(string_valor_adc,",%04ld",valor_adc);

    output_high(PIN_B0);

    printf("$ADQ,P01,%s%s\r", canal,string_valor_adc); //Envio un solo String con la direccion, canal CHX y el resutado del PIC por UART.

    output_low(PIN_B0);


    break;


case 1:


    output_high(PIN_B0);

    printf("$TST,P01\r"); //Envio un solo String con la direccion, canal CHX y el resutado del PIC por UART.

    output_low(PIN_B0);
    
    

    break;

}

}


#INT_RDA

void INT_UART() {
if(kbhit()){
trama_entrada[P_W]=getc();

if(trama_entrada[P_W]=='\r'){
P_W=0;
flag_final=1;
}

else{
P_W++;
}

}

}
void main(){

output_low(PIN_B0);

enable_interrupts(GLOBAL); //HABIlLITO 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(flag_final==1){
flag_final=0;
 lectura();

if(flag_permiso==1){
 flag_permiso=0;
 escritura();
 procesamiento();
if(flag_envio==1){
flag_envio=0;
enviar();
}
  }
 }
}

}

Debo quizás limpiar el buffer de entrada del puerto serie o limpiar las interrupciones del puerto serie?? Pero creo que las interrupciones del puerto serie se limpian automaticamente con las funciones ddel ccs no?


En la simulacion cuando se ejecuta el SPRINTF y PRINTF un cursor verde se queda justo cuando se abre un arhivo del pic aquí:

//////// Standard Header file for the PIC16F88 device ////////////////
-->#device PIC16F88
    #nolist

así que no sé, se queda pensand justo en ese pnto
« Última modificación: 28 de Abril de 2014, 11:23:23 por Prototipe88 »


 

anything