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

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

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: bug printf/puts?
« Respuesta #45 en: 29 de Abril de 2014, 20:45:35 »
checa si al simuar tu circuito funciona
"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: bug printf/puts?
« Respuesta #46 en: 30 de Abril de 2014, 13:22:01 »
Tengo un buen problema con el CCS entonces. Cuando entra a delay_ms(1000) para el retardo del parpaedo de un led se queda colgada la simulación marcando con una flech VERDE la siguiente instrucción del Codigo #use delay(clock=8000000)
Es la misma flecha verde que salia en el codigo de antes...

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: bug printf/puts?
« Respuesta #47 en: 30 de Abril de 2014, 13:54:19 »
yo acabo de compilar en ccs 5.025 , y en proteus solo pongo un 16f88 y simula sin problemas. Debe haber algun detalle en procedimiento que pasas por alto. Si es posible sube tus archivos de simulacion y el .hex y probamos
« Última modificación: 30 de Abril de 2014, 14:08:27 por jhozate »
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: bug printf/puts?
« Respuesta #48 en: 30 de Abril de 2014, 14:01:29 »
Tengo un buen problema con el CCS entonces. Cuando entra a delay_ms(1000) para el retardo del parpaedo de un led se queda colgada la simulación marcando con una flech VERDE la siguiente instrucción del Codigo #use delay(clock=8000000)
Es la misma flecha verde que salia en el codigo de antes...
eso siempre pasa, coloca un breakpoint después del delay, y dale a play para continuar la simulación hasta que acabe el delay
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: bug printf/puts?
« Respuesta #49 en: 30 de Abril de 2014, 14:56:21 »
Bueno despues de batallar y batallay y dormir poco he conseguido solucionarlo. Parece ser, que no sé por qué razón desconocida el ccs no se me instalaba correctamente. He desinstalado absolutamente todo hasta el MPLAB y he pasado el ccleaner. Luego he instalado todo y me enciende los leds.... ahora voy a probar con el otro programa a ver que pasa.

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: bug printf/puts?
« Respuesta #50 en: 30 de Abril de 2014, 15:24:02 »
Por cierto, tienes configurada la misma velocidad, paridad y envio de bits, y demás en los 2 dispositivos? Imagino que sí, pero por sí acaso bueno es preguntar
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: bug printf/puts?
« Respuesta #51 en: 30 de Abril de 2014, 15:25:50 »
Bueno el programa solo me hace una sola vez la interrupcion del puerto serie... tengo ésto definido en la funcion de atencion a la interrupcion del puerto serie... y sí, tengo definido todo eso en los dos dispositivos :)

Código: [Seleccionar]
#INT_RDA

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

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

else{
P_W++;
}

}

enable_interrupts(INT_RDA);
}


es como si no se limpiaran el flag de interrupcion del puerto serie... alguien sabe como poner manualmente un flag del pic16f88 a 0 (que no sea utilizando esas funciones porqe no me sirven) concretamente el registro PIR1 (flag--->RCIF) que esta en 0x0C
« Última modificación: 30 de Abril de 2014, 15:28:47 por Prototipe88 »

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: bug printf/puts?
« Respuesta #52 en: 30 de Abril de 2014, 15:49:57 »
Limpia la interrupción justo cuando acabe la función int_uart, por que deshabilitas la interrupción en la función?
No alcanzo a ver todo el código por que no me lo permite el móvil, cuando vuelves a habilitarla? Por cierto, que tamaño tiene el array de trama_entrada?
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: bug printf/puts?
« Respuesta #53 en: 30 de Abril de 2014, 16:00:29 »
Limpia la interrupción justo cuando acabe la función int_uart, por que deshabilitas la interrupción en la función?
No alcanzo a ver todo el código por que no me lo permite el móvil, cuando vuelves a habilitarla? Por cierto, que tamaño tiene el array de trama_entrada?

Era por probar cosas, desabilito la interupcion cuando entra en ella y habilito cuando ya he cogido el caracter. Pero he probado sin desabilitar/habilitar y tampoco me hace un funcionamiento correcto. Al igual que con la instrucción reset_cpu() justo cuando ya he cogido y procesado mi dato. Solo consigue volver a la interrupcion del puerto serie con un Reset físico.

char trama_entrada tiene una longitud de 91 posiciones.

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: bug printf/puts?
« Respuesta #54 en: 30 de Abril de 2014, 16:06:11 »
Os adjunto el código completo y el .hex por quien quiera intentar simular... Yo simulo en MPLAB

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

 }

}


void escritura(){

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

  }

strcpy(trama_entrada,"");

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){

strcpy(direccion_pic,"");

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

tipo_dato[i]=dato[i];

}

tipo_dato[4]='\0';


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

strcpy(tipo_dato,"");

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){
      strcpy(canal,"");
      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);
     
   strcpy(string_valor_adc,"");
   strcpy(canal,"");

    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;

}
return;
}


#INT_RDA

void INT_UART() {
clear_interrupt(INT_RDA);

//if(kbhit()){

trama_entrada[P_W]=getc();

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

else{
P_W++;
}
return;
//}


}
void main(){

output_low(PIN_B0);

disable_interrupts(INT_RDA);
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();
}
  }
 }
}

}



Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: bug printf/puts?
« Respuesta #55 en: 30 de Abril de 2014, 16:15:58 »
Sube el archivo cof que genera el ccs para simulación paso a paso
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: bug printf/puts?
« Respuesta #56 en: 30 de Abril de 2014, 16:22:33 »
Sube el archivo cof que genera el ccs para simulación paso a paso

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: bug printf/puts?
« Respuesta #57 en: 30 de Abril de 2014, 16:55:32 »
Cuando llegue a casa lo pruebo en el proteus, y en real, sí tengo algún 88
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: bug printf/puts?
« Respuesta #58 en: 30 de Abril de 2014, 17:38:43 »
hice un programa muy simple a partir de tu código, en la interrupción solamente lee una cadena y la envía de regreso, hace un echo. adjunto el código y simulación, compile con el ccs 5.011

P.D. la función de interrupción no lleva return
"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: bug printf/puts?
« Respuesta #59 en: 30 de Abril de 2014, 18:16:58 »
hice un programa muy simple a partir de tu código, en la interrupción solamente lee una cadena y la envía de regreso, hace un echo. adjunto el código y simulación, compile con el ccs 5.011

P.D. la función de interrupción no lleva return


Pero cuando le vuelves a enviar otra cadena hace lo mismo no? es que a mi no me funciona fisicamente... estoy comunicando dos pics, uno le envia un dato al otro y este otro a la arduino. Pero se queda clavado en la interrupcion no sé. Quizás es por la comunicacion pic a pic o la comunicacion arduino.