TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Prototipe88 en 28 de Abril de 2014, 12:56:12

Título: bug printf/puts?
Publicado por: Prototipe88 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();
}
  }
 }
}

}
Título: Re: bug printf/puts?
Publicado por: rivale 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
Título: Re: bug printf/puts?
Publicado por: Prototipe88 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?
Título: Re: bug printf/puts?
Publicado por: rivale 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. ...
Título: Re: bug printf/puts?
Publicado por: Prototipe88 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.
Título: Re: bug printf/puts?
Publicado por: rivale 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í
Título: Re: bug printf/puts?
Publicado por: rivale en 28 de Abril de 2014, 18:11:37
ya intentaste debuggear tu programa para ver en donde puede estar el fallo exactamente?
Título: Re: bug printf/puts?
Publicado por: Prototipe88 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.
Título: Re: bug printf/puts?
Publicado por: Prototipe88 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.
Título: Re: bug printf/puts?
Publicado por: Prototipe88 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.
Título: Re: bug printf/puts?
Publicado por: rivale 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
Título: Re: bug printf/puts?
Publicado por: rivale 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
Título: Re: bug printf/puts?
Publicado por: Prototipe88 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.
Título: Re: bug printf/puts?
Publicado por: Prototipe88 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é.
Título: Re: bug printf/puts?
Publicado por: rivale 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
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 28 de Abril de 2014, 18:59:13
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

Me sigue abriendo el fichero que te comenté así que no sé. He probado lo de los breakpoint pero no me aclaran nada... En mi caso se me abre el fichero del PIC16F88 sale una flecha verde apuntando al principio del fichero y parece que se queda ahi hasta que le da la gana salir y vuelve al inicio del programa. Probando fisicamente el programa. A veces cuando le envio una trama del estilo "$ADQ,P01,CH0\r" me imprime un resultado solo una unica vez. Si le envio una trama del estilo "$TST,P01\r" me imprime el dato que quiero mcuhas veces...
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 29 de Abril de 2014, 06:23:52
Tengo unas teorias a ver que te parecen:

1ª- Pudiera ser que la funcion PRINTF ocupara tanta memoria ram que el pic en algunos momentos se quedara "loco" o hiciera cosas que no debería hacer? (al compilar me indica ROM-31% y RAM 57%-61% así que creo que no debería ser ese el problema)

2ª-Resulta que yo habilito estas interrupciones:

Código: [Seleccionar]
enable_interrupts(GLOBAL); //HABIlLITO TODAS LAS INTERRUPCIONES GLOBALES
enable_interrupts(INT_RDA); //HABILITO LA INTERRUPCIÓN UART

Y antes de enviar el dato (activo el PIN B0) y luego de enviar el dato (desactivo el PIN B0)... quizás estoy realizando alguna interrupción externa en el PIC que hace que se quede "parado" en algunos momentos no crees? (ya que he definido enable_interrupts(GLOBAL) )

3ª- como le envio un dato de más de 2bytes puede ser que el buffer del puerto serie del pic se sature y quede algo pendiente ahi... no lo sé. (aunque creo que eso se solventa como lo he diseñado ya que voy leyendo lo que recibo por puerto serie)

Son solo unas teorias.
Título: Re: bug printf/puts?
Publicado por: rivale en 29 de Abril de 2014, 10:29:04
no creo que sean las interrupciones, ya que solo habilitas la int_rda, haz intentado hacer un programa que solo envíe una cadena usando el printf?
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 29 de Abril de 2014, 11:10:20
no creo que sean las interrupciones, ya que solo habilitas la int_rda, haz intentado hacer un programa que solo envíe una cadena usando el printf?

rivale he puesto que se encienda un led cada vez que entro en la interrupcion serie. La primera vez que entra se enciende el led. Pero luego ya no consigue entrar. Creo que el problema es el puerto serie, algun flag del PIC no vuelve a cero cuando salgo de la interrupcion.... Puedo probar de poner el registro RCIF a cero. Como se haría en el programa? (He probado con la funcion clear_interrupts(INT_RDA) pero no me sirve...
Título: Re: bug printf/puts?
Publicado por: rivale en 29 de Abril de 2014, 11:24:16
puedes borrar la bandera de la interrupción usando la intrucción

clear_interrupt(int_rda)
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 29 de Abril de 2014, 11:26:04
puedes borrar la bandera de la interrupción usando la intrucción

clear_interrupt(int_rda)

He probado con un printf cada vez que entre a la interrupcion serie. Pero solo entra una unica vez. Luego ya no vuelve a entrar más. Es como si se quedara colgado.
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 29 de Abril de 2014, 11:55:47
DEFINITIVAMENTE es problema del puerto serie. Inicio el programa y se ejecuta la INTERRUPCION DEL PUERTO SERIE, luego le intento enviar caracteres y no los detecta. Probaré de limpiar el bit manialmente el RCIF que pertenece al registro PIR1 que está en la dirección de memoria 0x0C pero no sé como ponerlo en el programa para poner dicho bit a 0. ¿Como se haría? Es la única opcion que me queda...
Título: Re: bug printf/puts?
Publicado por: ppyote en 29 de Abril de 2014, 12:15:15
Yo del ccs no me fiaria, prueba otra versión del compilador
Título: Re: bug printf/puts?
Publicado por: MGLSOFT en 29 de Abril de 2014, 12:15:50
Porque no pones el esquemático de tu proyecto??
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 29 de Abril de 2014, 12:21:50
Éste es el codigo SIMPLE que estoy utilizando para probar.... qué es lo que hago mal? tengo la version 1.042 del CCS donde dicen que se han solucionado muchos bugs... me estoy desesperando con esto...


Código: [Seleccionar]
#include <16f88.h>

#include <stdio.h>
#include <string.h>
#include <stdlib.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

char trama_entrada[5]={0};

#INT_RDA
void INT_UART() {

clear_interrupt(INT_RDA);

trama_entrada[0]=getc(); //SOLO LE ENVIO UN CARACTER PARA VER SI RECIBE

printf("$ADQ,P77,CH7,1000\r");

}


void main(){

enable_interrupts(INT_RDA); //HABILITO LA INTERRUPCIÓN UART
enable_interrupts(GLOBAL); //HABIlLITO TODAS LAS INTERRUPCIONES GLOBALES


while(1){

}

}
Título: Re: bug printf/puts?
Publicado por: rivale en 29 de Abril de 2014, 12:28:18
Éste es el codigo SIMPLE que estoy utilizando para probar.... qué es lo que hago mal? tengo la version 1.042 del CCS donde dicen que se han solucionado muchos bugs... me estoy desesperando con esto...


yo creo que es por la versión, esa es muuuy vieja, ya van en la 5.025, intenta cambiarla por alguna mas reciente
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 29 de Abril de 2014, 12:29:09
He probado de todo.... de dejar el while vacio, de meterle un parpadeo de un led... de resetear el micro cuando termina la interrupcion de puerto serie... de desabilitar la interrupcion y abilitarla cuando acabo... de todo ya... La simulacion parece que va bien pero no sé...   Qué version del CCS me podria ir bien....??? tengo la 4.042 y utlizo MPLAB 8.87 con el programador ICD2 de microchip...
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 29 de Abril de 2014, 12:30:27
Éste es el codigo SIMPLE que estoy utilizando para probar.... qué es lo que hago mal? tengo la version 1.042 del CCS donde dicen que se han solucionado muchos bugs... me estoy desesperando con esto...


yo creo que es por la versión, esa es muuuy vieja, ya van en la 5.025, intenta cambiarla por alguna mas reciente


PERDONA queria decir la version 4.042.... me confundí esta version no es tan vieja
Título: Re: bug printf/puts?
Publicado por: rivale en 29 de Abril de 2014, 12:30:44
al menos yo no he tenido problemas con rs232 usando versiones 4, yo creo que a partir de ahí hacia la 5 no deberías tener problemas
Título: Re: bug printf/puts?
Publicado por: rivale en 29 de Abril de 2014, 12:32:48
Porque no pones el esquemático de tu proyecto??
++;

pon tu diagrama o simulación para darme mas idea, porque no se como tienes conectado tu circuito
Título: Re: bug printf/puts?
Publicado por: ppyote en 29 de Abril de 2014, 12:33:13
Porque no pones el esquemático de tu proyecto??
por sí acaso tiene las líneas RX,TX mal conectadas?
Podría ser el problema
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 29 de Abril de 2014, 12:41:18
Las lineas rx y tx no las tengo mal conectadas. Con el otro programa más completo que utilizaba conseguía entrar UNA SOLA VEZ  a la interrupción. Utilizo una arduino DUE para transmitir los datos y recibirlos. Es una placa cuyo funcionamiento es a 3,3V. Sé que para recibir los datos si me paso un poco del voltaje no tengo problemas porque ya lo he probado. Pero le meto un divisor de tension para tener los 3,3v en TX del arduino. Luego para transmitir supongo que transmitiendo a 3,3v no hay problema no? es lo último que se me ocurre ya... pero como es posible que la interrupcion me la haga una vez si ese fuera el problema?

Aunque ese fuera el problema al transmitir a 3,3v ( de la arduino al pic ) la interrupcion se deberia ejecutar...
Título: Re: bug printf/puts?
Publicado por: rivale en 29 de Abril de 2014, 12:47:17
yo culparía al arduino  :D

porque no pruebas haciendo la comunicación con una computadora, de esta forma puedes usar un sniffer para ver que esta entrando y saliendo por el puerto serie
Título: Re: bug printf/puts?
Publicado por: ppyote en 29 de Abril de 2014, 13:27:56
El TX del pic lo tienes en el RX del arduino? Y el RX del pic al TX del arduino?
Es que me ha parecido entenderlo al revés
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 29 de Abril de 2014, 16:32:58
El TX del pic lo tienes en el RX del arduino? Y el RX del pic al TX del arduino?
Es que me ha parecido entenderlo al revés

Exacto así lo tengo. Es más... he programados dos pics... uno para que envio un caracter al otro y el otro pic con la interrupcion serie activada. Entonces este ultimo me enviaria al arduino un pequeño dato. Resulta que me ocurre lo mismo que antes... se queda colgado y solo envia al principio. Esto tiene que ver con el compilador CCS?? estoy desesperado ya...
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 29 de Abril de 2014, 16:38:54
No puedo seguir así esto es de locos que el pic haga lo que le de la gana con la interrupcion serie... :((((((((((
Título: Re: bug printf/puts?
Publicado por: ppyote en 29 de Abril de 2014, 16:57:28
El TX del pic lo tienes en el RX del arduino? Y el RX del pic al TX del arduino?
Es que me ha parecido entenderlo al revés

Exacto así lo tengo. Es más... he programados dos pics... uno para que envio un caracter al otro y el otro pic con la interrupcion serie activada. Entonces este ultimo me enviaria al arduino un pequeño dato. Resulta que me ocurre lo mismo que antes... se queda colgado y solo envia al principio. Esto tiene que ver con el compilador CCS?? estoy desesperado ya...

podría ser un bug, instala otra versión a parte de la que tienes, y prueba a ver
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 29 de Abril de 2014, 17:02:14


para instalar una version mas nueva debo desinstalar la anterior cierto?
Título: Re: bug printf/puts?
Publicado por: rivale en 29 de Abril de 2014, 17:13:25
si instalas alguna versión 5 esta te permite conservar las versiones anteriores
Título: Re: bug printf/puts?
Publicado por: ppyote en 29 de Abril de 2014, 18:00:36
si instalas alguna versión 5 esta te permite conservar las versiones anteriores

Menor de la 5, puede hacerlo cambiando el directorio de destino
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 29 de Abril de 2014, 19:14:07
Vaya... he desinstalado el CCS he vuelto a instalarlo con los plgins y... ahora se compila bien y meto el .hex en el pic pero... ya no gace absolutamente nada... ahora se me esta programando mal. He configurado el programador correctamente y ya ni enciende un simple led... Si lo llego a saber no comienzo con CCS me está dando muchos dolores de cabeza con un simple programa...
Título: Re: bug printf/puts?
Publicado por: sander en 29 de Abril de 2014, 19:45:59
Como tiene conectado el MCLR ?

Saludos.
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 29 de Abril de 2014, 19:55:19
Como tiene conectado el MCLR ?

Saludos.


Lo básico está en principio todo bien. El MCLR lo tengo a 5v. Al desinstalar el ccs y volverlo a instalar ya no se queda programado el micro es curioso. O alomejor falta otro plugin o algo no sé.
Título: Re: bug printf/puts?
Publicado por: sander en 29 de Abril de 2014, 19:59:17
Y que grabador esta usando para programar el microcontrolador?


Saludos
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 29 de Abril de 2014, 20:03:45
Y que grabador esta usando para programar el microcontrolador?


Saludos

programador ICD2 con MPLAB Y CCS que lo volvi a reinstalar. El programador me detecta el micro. y programa el archivo .hex que importe al compilar. Todo eso lo hace bien pero a la hora de verificar mi programa veo que no hace nada el pic. Está vacio.
Título: Re: bug printf/puts?
Publicado por: rivale en 29 de Abril de 2014, 20:45:35
checa si al simuar tu circuito funciona
Título: Re: bug printf/puts?
Publicado por: Prototipe88 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...
Título: Re: bug printf/puts?
Publicado por: jhozate 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
Título: Re: bug printf/puts?
Publicado por: ppyote 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
Título: Re: bug printf/puts?
Publicado por: Prototipe88 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.
Título: Re: bug printf/puts?
Publicado por: ppyote 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
Título: Re: bug printf/puts?
Publicado por: Prototipe88 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
Título: Re: bug printf/puts?
Publicado por: ppyote 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?
Título: Re: bug printf/puts?
Publicado por: Prototipe88 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.
Título: Re: bug printf/puts?
Publicado por: Prototipe88 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();
}
  }
 }
}

}


Título: Re: bug printf/puts?
Publicado por: ppyote en 30 de Abril de 2014, 16:15:58
Sube el archivo cof que genera el ccs para simulación paso a paso
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 30 de Abril de 2014, 16:22:33
Sube el archivo cof que genera el ccs para simulación paso a paso
Título: Re: bug printf/puts?
Publicado por: ppyote 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
Título: Re: bug printf/puts?
Publicado por: rivale 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
Título: Re: bug printf/puts?
Publicado por: Prototipe88 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.
Título: Re: bug printf/puts?
Publicado por: rivale en 30 de Abril de 2014, 18:24:35
en el ejemplo que te puse funciona bien, puedes verlo con el proteus, cuando le envías una cadena, el pic te va a responder "recibi:" y después la cadena que le enviaste. como tienes conectados tus 3 micros?

por lo que entiendo un pic1 le envía datos al pic2, y este a su vez le envía datos al arduino, pero para el pic2 tienes definidos 2 puertos serie? ya que no puedes enviar datos entre mas de 2 dispositivos usando un solo puerto rs232
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 30 de Abril de 2014, 19:32:36
en el ejemplo que te puse funciona bien, puedes verlo con el proteus, cuando le envías una cadena, el pic te va a responder "recibi:" y después la cadena que le enviaste. como tienes conectados tus 3 micros?

por lo que entiendo un pic1 le envía datos al pic2, y este a su vez le envía datos al arduino, pero para el pic2 tienes definidos 2 puertos serie? ya que no puedes enviar datos entre mas de 2 dispositivos usando un solo puerto rs232

No, es decir el pic1 le envia un dato via puerto serie al pic2 que este l recibe por tx, entonces éste pic2 por rx envia datos al arduino. Simplemente es un circuito sencillo para ver si el fallo eran ls 3,3V que slo puede dar el arduino por su puerto serie. Pero parece ser que entre el pic1 y el pic2 las interrupciones andan mal.
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 30 de Abril de 2014, 19:39:43
Algno de vosotros me podría dar el archiv .hex del codigo compilado??? Es que a mi hay veces que la función printf no me va.. eos a qué puede ser debido?? (en cambio con putc enviando caracter a caracter si me hace bien) pero es raro que con una funcion asi pues no me haga nada....

Si me pasa eso con la función printf tampoco es de estrañar que la interrupcion serie haga cosas raras... y también si teneis algún link o algo para bajrme el CCS 5 enviadme por fabor!! necesito probar cosas.
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 01 de Mayo de 2014, 08:43:43
1º- Si yo pongo en el programa un LED para que se encienda cuando se produce una interrupción serie... Debería éste led encenderse cuando inicio el pic (depsués de un reset). Es decir cuando se enciende el pic despues de apagado o se reinicia debería éste led encenderse no? es lo que me ocurre... se enciende cuando reinicio el pic, entra en la interrupción serie después de un reset. Es normal no?

2º- Luego creo que uno de los pics puede estar roto ya que cuando conecto uno junto con el otro el programa hace cosas raras. Los leds tienen retardos distintos y demás. Solo comparten alimentación así que supongo que ese pic puede estar defectuoso no? Pero cuando conecto uno de ellos que es el que me parece que es el mas fiable SOLO el programa anda bien. El led hace el retardo programado y demás.

Muchas gracias por vuestras respuestas.


yo tengo definido ésto antes del void main()

Código: [Seleccionar]
#INT_RDA

void INT_UART() {


trama_entrada[P_W]=getc();

output_high(PIN_B0);
delay_ms(2000);
output_low(PIN_B0);

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

else{
P_W++;
}

}

Título: Re: bug printf/puts?
Publicado por: MGLSOFT en 01 de Mayo de 2014, 09:56:54
Que el led se encienda cuando inicias no quiere decir que ocurra la interrupción, puede ser simplemente que no lo apagas al iniciar.
Los pines de salida pueden tomar valores aleatorios en un inicio, por lo tanto la regla de oro es apagarlos antes de habilitar interrupciones y demás tareas del PIC.

Respecto a lo otro, repito mi pedido, pon los esquemáticos de como estas conectado todo y podremos ayudarte mejor...
Aunque sea dibújalos a mano alzada, muchos al hacerlo se dieron cuenta de sus propios errores...
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 01 de Mayo de 2014, 09:58:05
Que el led se encienda cuando inicias no quiere decir que ocurra la interrupción, puede ser simplemente que no lo apagas al iniciar.
Los pines de salida pueden tomar valores aleatorios en un inicio, por lo tanto la regla de oro es apagarlos antes de habilitar interrupciones y demás tareas del PIC.

Respecto a lo otro, repito mi pedido, pon los esquemáticos de como estas conectado todo y podremos ayudarte mejor...
Aunque sea dibújalos a mano alzada, muchos al hacerlo se dieron cuenta de sus propios errores...

El led lo lo apago justo antes de abilitar la interrupcion!! eso es lo extraño Encima seé que esta entrando en la interrupcion serie al iniciar porque realiza el delay que le indico!! :(

En cuanto pueda colgo los esquematicos
Título: Re: bug printf/puts?
Publicado por: MGLSOFT en 01 de Mayo de 2014, 10:07:27
Una vez a mi sin querer se me puentearon los pines tx y rx del pic, y me hacia cosas parecidas...
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 01 de Mayo de 2014, 10:09:40
Una vez a mi sin querer se me puentearon los pines tx y rx del pic, y me hacia cosas parecidas...

es posible que sin querer alguna vez puentera los tx y rx de los pic... por ejemplo conecte el RX1 del PIC1 en RX2 del PIC2 y TX1 del PIC1 en RX2 del PIC2.... puede ser que se averiraran??
Título: Re: bug printf/puts?
Publicado por: MGLSOFT en 01 de Mayo de 2014, 10:20:01
Estas usándolos directo, sin conversor??
Alimentas los pics con la misma fuente DC?

Mas que nunca deberías poner el esquemático que usas !!
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 01 de Mayo de 2014, 11:23:37
El problema que tengo es que las funciones strcat y sprintf andan mal en mi programa. Pasa algo con ellas. ¿Puedo utilizar otras funciones para pasar un valor INT a STRING y pode concatenar?

Necesito que el valor del ADC pase a string de 4 caracteres. Por ejemplo si valor_adc=23 quiero que en string_valor_adc=0023. el valor_adc lo he definido como un long ya que el adc del pic es de 10 bits.

Luego necesito saber un método para concatenar strings sin utilizar strcat.

Título: Re: bug printf/puts?
Publicado por: rivale en 07 de Mayo de 2014, 10:57:40
creo que el sprintf debería funcionar, pero como alternativa podrías usar la función itoa para convertir un entero a una cadena.

para concatenar al momento de enviar los datos puedes hacerlo dentro de la función de printf.
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 07 de Mayo de 2014, 13:21:43
creo que el sprintf debería funcionar, pero como alternativa podrías usar la función itoa para convertir un entero a una cadena.

para concatenar al momento de enviar los datos puedes hacerlo dentro de la función de printf.


rivale al final resultó ser problema de la version. Ni con la 5.012 me funcionaba. He tenido que bajarme la 5.015 con esta version tengo poquisimos problemas ahora respecto a las funciones. Lo único que tengo problemas es en lo siguiente. que cuando cambio de tipo de solicitud el micro se queda como tonto y no me la reconoce. solo me reconoce la del primer tipo que le envio.

Si te adjunto el código de nuevo y te explico más concretamente lo que me ocurre podrías hecharle un vistazo? Es que no veo esto ya. Y creo que no es problema del compilador ahora.
Título: Re: bug printf/puts?
Publicado por: rivale en 07 de Mayo de 2014, 14:08:27
puede que no reinicies algún contador y no lea correctamente el comando siguiente. pega tu código para darle un vistazo.
Saludos
Título: Re: bug printf/puts?
Publicado por: Prototipe88 en 08 de Mayo de 2014, 05:18:38
puede que no reinicies algún contador y no lea correctamente el comando siguiente. pega tu código para darle un vistazo.
Saludos

El problema con éste programa ya está solucionado. El problema era que al compilador no le gusta o no se entera del espacio total que hay que guardar cuando se define algo así   char cadena[]="cadena";. Al cambiar eso por ésto char cadena[7]="cadena"; el programa anda perfecto.

Conclusión, he tenido que cambiar a la versión CCS 5.025 y definir más concretamente las variables que voy a utilizar. Así el programa me ha andado bien :) Por fin!

Podría consultarte una cosa sobre MAX485 entre pics?

Quiero conectar tres pics. El pic principal interroga a los otros dos enviandoles una direccion y estos responden si esa direccion coincide con la suya.

Yo he conectado estos tres pics tal cual dice en las especificaciones. Pero solo me responde uno de ellos, el otro no me responde. Si vuelvo a conectar y desconectar todo a veces me responde el segundo pic pero el primero ya no.

¿Hay que elaborar algún tipo de protocolo para que cada MAX485 sepa cual es su función? o simplemente cambiando el estado de los pines RE/DE ya hay suficiente (porque ésto es lo que realizo en función de si escribo o escucho)?
Título: Re: bug printf/puts?
Publicado por: rivale en 08 de Mayo de 2014, 11:27:45
haa, que bueno que ya se solucionó. aunque es raro que no te permita definir así las cadenas.

en cuanto a tu otra pregunta, te recomiendo abrir un tema nuevo porque es un tema diferente