Autor Tema: bug printf/puts?  (Leído 17063 veces)

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

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
bug printf/puts?
« en: 28 de Abril de 2014, 12:56:12 »
Hola, tengo un problema y es que mi programa me realiza cosas raras cuando utilizo la función printf o puts. En otras palabras... cuando envio por puerto serie el micro hace un funcionamiento extraño. Envia muchas veces lo mismo aun cuando solo hay una instruccion para ello... Este tema lo he hablado en un tema anterior pero creo que es mejor abrir un nuevo hilo ya que estoy hablando ya de otra cosa. No sé si puede ser un bug o algo... tengo la version 4.104 del ccs

Mi programa es el siguiente:


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]=""; //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=1;
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.

    //puts("$ADQ,P01");
    output_low(PIN_B0);


    break;


case 1:


    output_high(PIN_B0);

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

    output_low(PIN_B0);
    
    

    break;

}
return;
}


#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=1;
 lectura();

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

}
« Última modificación: 28 de Abril de 2014, 13:23:19 por Prototipe88 »

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: bug printf/puts?
« Respuesta #1 en: 28 de Abril de 2014, 13:28:37 »
el problema es que tu bandera flag_envio la activas cada que entras a procesamiento, por lo que estas mandando a llamar a tu función de envio en cada ciclo del while
"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: bug printf/puts?
« Respuesta #2 en: 28 de Abril de 2014, 17:29:28 »
el problema es que tu bandera flag_envio la activas cada que entras a procesamiento, por lo que estas mandando a llamar a tu función de envio en cada ciclo del while

Claro es porque me interesa hacer eso. Es decir si el dato de entrada por el puerto serie es el que me interesa es decir que contenga la direccion mia "P01" pues llamo a la función envio mediante flag_envio. El progrma es que me hace cosas raras.... es decir si yo le envio por el puerto serie un dato del estilo "$ADQ,P01,CH0\r" el programa me imprime correctamente lo que yo quiero. Pero al realizarlo por segunda vez ya no me imprime nada. Es como si se quedara colgado o algun flag del puerto serie no se limpiara.

Cuando le envio un dato del estilo "$TST,P01\r" me imprime infinitas vecs lo que yo quiero que envie por puerto serie... Ademas el programa en la simulacion me abre justo al entrar en la funcion printf el fichero del PIC16F88 y marca con una flecha verde el nombre del pic en el fichero... es raro no?
« Última modificación: 28 de Abril de 2014, 17:32:06 por Prototipe88 »

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: bug printf/puts?
« Respuesta #3 en: 28 de Abril de 2014, 17:56:50 »
creo que en esta parte deberias apagar la bandera, y la estas volviendo a poner en 1

Código: C
  1. if(flag_final==1){
  2. flag_final=1;
  3.  lectura();
  4. ...
"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: bug printf/puts?
« Respuesta #4 en: 28 de Abril de 2014, 18:03:09 »
creo que en esta parte deberias apagar la bandera, y la estas volviendo a poner en 1

Código: C
  1. if(flag_final==1){
  2. flag_final=1;
  3.  lectura();
  4. ...

Eso también lo he cambiado pero el programa me sigue haciendo la misma cosa.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: bug printf/puts?
« Respuesta #5 en: 28 de Abril de 2014, 18:06:22 »
porque no pruebas por partes, primero intenta enviar una única cadena, para que veas si el problema es la funcion de printf o si es tu lógica, tal vez falta cambiar alguna bandera por ahí
"Nada es imposible, no si puedes imaginarlo"

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: bug printf/puts?
« Respuesta #6 en: 28 de Abril de 2014, 18:11:37 »
ya intentaste debuggear tu programa para ver en donde puede estar el fallo exactamente?
"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: bug printf/puts?
« Respuesta #7 en: 28 de Abril de 2014, 18:13:28 »
porque no pruebas por partes, primero intenta enviar una única cadena, para que veas si el problema es la funcion de printf o si es tu lógica, tal vez falta cambiar alguna bandera por ahí

respecto a la interrupcion del puerto serie y tal lo tengo bien definido no? y también los fuses y eso no? Es para evitar pensar en eso y centrarme mas en la logica del programa. Aunque tambien podria enviar caracter a carcter a ver que pasa.

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: bug printf/puts?
« Respuesta #8 en: 28 de Abril de 2014, 18:14:41 »
si he intentado debugear me lo hace todo perfecto pero cuando entra en los print se abre otro archivo y se queda como en espera de algo nose. Es como si el printf o el puts no le gustara.

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: bug printf/puts?
« Respuesta #9 en: 28 de Abril de 2014, 18:16:49 »
Si quieres tu mismo puedes tb ver lo que me hace le introduces en donde pone trama_entrada el dato "$ADQ,P01,CH0\r" (la \r la pones en hexadecimal ox0D)y pones antes de compilar el flag_fin=1 porque en la memoria de datos nose que pasa que no sale. Y ya veras lo que hace cuando entra en  el print.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: bug printf/puts?
« Respuesta #10 en: 28 de Abril de 2014, 18:19:24 »
si he intentado debugear me lo hace todo perfecto pero cuando entra en los print se abre otro archivo y se queda como en espera de algo nose. Es como si el printf o el puts no le gustara.

cuando hagas el debugg no entres a la función del print, solo intenta que la brinque para que veas que entrega esta función, es decir cuantas veces imprime el resultado

en cuanto a los fuses están bien colocados, estas usando el oscilador externo a 8 MHz, supongo que tienes el MCLR a vdd para evitar el reset?.

podrías intentar con otra versión del ccs para descartar que sea eso.

como último comentario, porque no en lugar de leer los caracteres uno a uno y esperar el \r, usa la función gets para leer una cadena completa, esto funciona siempre y cuando desde donde envías los datos al final de tu cadena pongas un salto de linea \n
"Nada es imposible, no si puedes imaginarlo"

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: bug printf/puts?
« Respuesta #11 en: 28 de Abril de 2014, 18:20:22 »
Si quieres tu mismo puedes tb ver lo que me hace le introduces en donde pone trama_entrada el dato "$ADQ,P01,CH0\r" (la \r la pones en hexadecimal ox0D)y pones antes de compilar el flag_fin=1 porque en la memoria de datos nose que pasa que no sale. Y ya veras lo que hace cuando entra en  el print.

por el momento no tengo como probar tu código, te podría ayudar mas tarde que salga del trabajo, mientras puedes revisar lo del comentario anterior

Saludos
"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: bug printf/puts?
« Respuesta #12 en: 28 de Abril de 2014, 18:23:39 »
si he intentado debugear me lo hace todo perfecto pero cuando entra en los print se abre otro archivo y se queda como en espera de algo nose. Es como si el printf o el puts no le gustara.

cuando hagas el debugg no entres a la función del print, solo intenta que la brinque para que veas que entrega esta función, es decir cuantas veces imprime el resultado

en cuanto a los fuses están bien colocados, estas usando el oscilador externo a 8 MHz, supongo que tienes el MCLR a vdd para evitar el reset?.

podrías intentar con otra versión del ccs para descartar que sea eso.

como último comentario, porque no en lugar de leer los caracteres uno a uno y esperar el \r, usa la función gets para leer una cadena completa, esto funciona siempre y cuando desde donde envías los datos al final de tu cadena pongas un salto de linea \n


Si tengo el MCLR a vdd y he probado con la versión del CCS 1.042 o algo así una mas nueva que la que tengo. Voy a probar eso que comentas de saltarme la funcion printf y lo de gets a ver que ocurre.... pero ya probé de todo y no sé que pasa. Gracias como siempre rivale. Cuando tenga sun rato si puedes debuggearlo un rato para que veas te lo agradeceria quizas tu ves el fallo en un segundo.

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: bug printf/puts?
« Respuesta #13 en: 28 de Abril de 2014, 18:42:51 »
Yo ya he probado de debugearlo y cuando intento saltar la funcion printf no me deja saltarla se abre ese archivo del pic que te comenté.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: bug printf/puts?
« Respuesta #14 en: 28 de Abril de 2014, 18:45:44 »
ponle un break point despues de la función del printf y deja correr el programa, porque si lo imprime eso significa que si está pasando por ahí correctamente
"Nada es imposible, no si puedes imaginarlo"


 

anything