Autor Tema: Posibles "bugs" del compilador de CCS  (Leído 191109 veces)

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

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Posibles "bugs" del compilador de CCS
« en: 07 de Abril de 2008, 14:20:52 »
Este hilo se abre para intentar que otros no pierdan el tiempo que nosotros perdimos por culpa de un mal funcionamiento del compilador de CCS.

Particularmente es el compilador que más uso y es uno de los más usados, por no decir el que más.

1er PROBLEMA: mal funcionamiento de la interrupción por cambio de estado RB4..RB7

Os paso a detallar lo que me ha pasado. El PROBLEMA está en la interrupción por cambio de estado en portB RB4..RB7, resulta que el compilador al salir de la interrupción baja la bandera RBIF pero no hace una lectura/escritura en el portB y estas dos cosas se deben cumplir (mirar el Datasheet) para que de nuevo no entre en la interrupción hasta que realmente haya otro cambio de estado. Si no se hace una lectura/escritura en el portB el programa se vuelve loco y está contínuamente entrando y saliendo de la interrupción.

SOLUCION:

Leer/escribir el portB antes de abandonar la interrupción mediante un input ó un output de relleno, ó mejor aún para no perder tiempo hacerlo en ensamblador como bien dice el compañero del FORO jfh900 mediante las sentencias: #asm movf port_b,0 #endasm

Añadir esta instrucción de relleno nada más entrar en la rutina, si se hace al final dá lugar a mal funcionamiento.

Programa de ejemplo en el que sucede esto:

Código:

#include <16F876a.h>
#fuses NOWDT,XT, NOPUT, NOPROTECT
#use delay(clock=4000000)

#byte port_b=6

#INT_RB
Interrupcion_RB()
{
   delay_ms(20);     //Antirebotes
     //#asm movf port_b,0 #endasm   //Sin quitamos esta instrucción de relleno no funciona bien la interrupción
   output_toggle(PIN_A0);
}

void main()
{
   set_tris_a(0x00);        // Todo salidas
     set_tris_b(0xFF);       // Todo entradas
     output_a(0x00);

     enable_interrupts(INT_RB);
     enable_interrupts(GLOBAL);

     while(true);
}

Prueba realizada físicamente usando las versiones del compilador 3.245 y 4.065

Si en vuestra larga/corta carrera PICmaniaca habeis detectado otros fallos del compilador sería de recibo que los comentaseis en este post: COMENTAR FALLOS DEL COMPILADOR para que así todos los pudiésemos ver y discutir. Si efectivamente se tratase de un error del compilador sería subido aquí arriba.

Aquí en este tema solo se pondran los resumenes de los errores pasados a limpio, después de haber sido discutidos en el otro Tema.

Un saludo
« Última modificación: 08 de Abril de 2008, 09:06:17 por pocher »

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Posibles "bugs" del compilador de CCS
« Respuesta #1 en: 07 de Abril de 2008, 21:23:16 »
Yo le agregaria a los datos, la version del compilador que genera el codigo con el error que se detalla, porque las diferentes versiones del compilador tienen diferentes BUGs... :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Posibles "bugs" del compilador de CCS
« Respuesta #2 en: 07 de Abril de 2008, 21:40:42 »
Pregunta de un ignorante del mundo CSS y PIC, eso es bug del compilador o un bug del Micro ?
Saludos !

Desconectado gu1llermo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 217
Re: Posibles "bugs" del compilador de CCS
« Respuesta #3 en: 07 de Abril de 2008, 22:19:51 »
Compilador RICHI777, el datasheet lo explica todo muy bien así como dijo pocher
...El PROBLEMA está en la interrupción por cambio de estado en portB RB4..RB7, resulta que el compilador al salir de la interrupción baja la bandera RBIF pero no hace una lectura/escritura en el portB y estas dos cosas se deben cumplir (mirar el Datasheet) para que de nuevo no entre en la interrupción hasta que realmente haya otro cambio de estado. Si no se hace una lectura/escritura en el portB el programa se vuelve loco y está contínuamente entrando y saliendo de la interrupción.
...

Saludos.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Posibles "bugs" del compilador de CCS
« Respuesta #4 en: 07 de Abril de 2008, 22:55:07 »
Me quedo clarisimo, es un bug del compilador  8)
Gracias y saludos !

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Posibles "bugs" del compilador de CCS
« Respuesta #5 en: 08 de Abril de 2008, 09:09:11 »
¡Añadido las versiones del compilador utilizado en el primer bug!

Pronto voy a poner el 2º bug encontrado.

Un saludo

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Posibles "bugs" del compilador de CCS
« Respuesta #6 en: 08 de Abril de 2008, 12:01:28 »
2º BUG: ¡ mal funcionamiento del tratamiento de las prioridades con PICs18 !

Si un PIC18 tengo 2 interrupciones y una de ellas la declaro como de alta prioridad, si cuando se está ejecutando la instrucción de baja prioridad, llega la de alta prioridad se debe de abandonar inmediatamente la primera rutina e ir a atender a la rutina de alta prioridad.

Cuando finalice la rutina de alta prioridad retornará al punto donde se había quedado en la rutina de baja prioridad. Bueno, el caso es que esto no funciona.

Os pongo un programa de ejemplo y os digo como reacciona.

Código: [Seleccionar]
#include <18F4550.h>

#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN

#DEVICE HIGH_INTS=true

#use delay(clock=48000000)           //Cristal de 4 MHz (PLL1)

#use fast_io(B)

#byte port_a = 0xF80
#byte port_b = 0xF81

//#PRIORITY int_ext,int_rb
//#PRIORITY int_rb,int_ext


#INT_TIMER0                        // Interrupción externa en RB0
//#INT_TIMER0 HIGH                     
interrupcion_TIMER0()          // Función de atención a la interrupción
{
delay_ms(3000);
  output_toggle(PIN_B1);
  disable_interrupts(INT_TIMER0); 
}

#INT_EXT                        // Interrupción externa en RB0
//#INT_EXT HIGH                     
interrupcion_RB0()          // Función de atención a la interrupción
{
delay_ms(3000);
output_toggle(PIN_A0);
}

//#INT_RB                        // Interrupción externa en RB4-RB7   
#INT_RB HIGH
//#INT_RB FAST                     
interrupcion_RB4_RB7()          // Función de atención a la interrupción
{
delay_ms(3000);
  #asm movf port_b,0 #endasm //Hace falta leer el portb, si no va mal
  output_toggle(PIN_B3);
}

main()
{
set_tris_b(0x85); // RB4 salida, RB4-RB7,RB0 entradas.
  set_tris_a(0x00);
  //bit_clear(port_a,0);
//bit_clear(port_b,1);
//bit_clear(port_b,3);
        output_low(PIN_A0);
        output_low(PIN_B1);
output_low(PIN_B3);

setup_counters(RTCC_8_BIT,RTCC_DIV_128);

  enable_interrupts(GLOBAL);
  enable_interrupts(INT_RB);
  enable_interrupts(INT_EXT);

  while(1)
  {
  if(input(pin_b2))
  enable_interrupts(INT_TIMER0);
  }
}

La interrupción de RB0 es de baja prioridad y la de RB4..RB7 de alta.

Si activamos la interrupción RB0 se mete dentro de su rutina (concretamente en el delay_ms(3000)) y si a continuación activamos la de RB4..RB7 tendría que dejar el delay_ms(3000) y ejecutar por completo la rutina de interrupción RB4..RB7 activando la salida RB3 para luego regresar a la rutina de interrupción RB0 (al  delay_ms(3000)) y activar la salida RA0. Pués no, hace justamente lo contrario, primero activa la salida RA0 y luego la salida RB3, es decir se comporta sin tener en cuenta la prioridad de RB4..RB7.

Decididamente el tema de las prioridades con interrupciones falla. He estado probando físicamente (y con PROTEUS) otras combinaciones de prioridades (INT_TMR0,INT_EXT y INT_RB) y algunas van bien pero otras fallan.

Algunos CASOS realizados con pruebas físicas y con PROTEUS:

- Si TMR0=OFF, RBO alta prioridad y RB4..RB7 baja prioridad:
                  Secuencia: RB7 -- RBO ---> RA0=1 -- RB3=1  ¡BIEN!
                  Secuencia: RB0 -- RB7 ---> RA0=1 -- RB3=1  ¡BIEN!
- Si TMR0=OFF, RBO baja prioridad y RB4..RB7 alta prioridad:
                  Secuencia: RB0(baja) -- RB7(alta) ---> RA0=1 -- RB3=1   ¡MAL!
                  Secuencia: RB7(alta) -- RB0(baja) ---> RB3=1 -- RA0=1   ¡BIEN!
- Si TMR0 baja prioridad, RBO alta prioridad y RB4..RB7 alta prioridad:
                  Secuencia: TMR0 -- RB7 -- RBO ---> RB3=1 -- RA0=1 -- RB1=1  ¡BIEN!
                  Secuencia: TMR0 -- RB0 -- RB7 ---> RA0=1 -- RB3=1 -- RB1=1  ¡BIEN!
                  Secuencia: RB0 -- TMR0 -- RB7 ---> RA0=1 -- RB3=1 -- RB1=1  ¡BIEN!
- Si TMR0 alta prioridad, RBO alta prioridad y RB4..RB7 alta prioridad:
                  Secuencia: TMR0 -- RB0 -- RB7 ---> RB1=1 -- RA0=1 -- RB3=1  ¡BIEN!
                  Secuencia: TMR0 -- RB7 -- RB0 ---> RB1=1 -- RA0=1 -- RB3=1  ¡MAL!
- Si TMR0 alta prioridad, RBO baja prioridad y RB4..RB7 alta prioridad:
                  Secuencia: TMR0 -- RB0 -- RB7 ---> RB1=1 -- RA0=1 -- RB3=1  ¡MAL!
                  Secuencia: TMR0 -- RB7 -- RB0 ---> RB1=1 -- RA0=1 -- RB3=1  ¡MAL!

Las pruebas han sido realizadas con la versión del compilador 4.065

Un saludo

« Última modificación: 08 de Abril de 2008, 12:05:13 por pocher »

Desconectado ElVale

  • PIC10
  • *
  • Mensajes: 31
Re: Posibles "bugs" del compilador de CCS
« Respuesta #7 en: 18 de Agosto de 2008, 15:54:47 »
BUG: Logaritmos: log() y log10() dan resultados incorrectos para la versión 4.023

Ejemplos:
log(50) da 17.41, log(5) da 0

Causa:
Hay dos lineas en math.h que accesan a un byte de una variable float, cuando primero hay que hacer un cast para hacer tal operación

SOLUCIÓN:
Abran math.h y localicen la funcion log()
Código: [Seleccionar]
float log(float x)
Cambien las siguientes dos líneas. Los cambios están en negrita.
Citar
*((char *)&y) = 0x7E;
Citar
n = *((char *)&x) - 0x7E;

Recompilen y debe funcionar bien ahora.


Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Posibles "bugs" del compilador de CCS
« Respuesta #9 en: 15 de Enero de 2009, 21:52:37 »
Hola amigos!
Estimado pocher lo que colocas aqui nos en un bug del compilador a mi entender   :mrgreen:

Citar
1er PROBLEMA: mal funcionamiento de la interrupción por cambio de estado RB4..RB7

Os paso a detallar lo que me ha pasado. El PROBLEMA está en la interrupción por cambio de estado en portB RB4..RB7, resulta que el compilador al salir de la interrupción baja la bandera RBIF pero no hace una lectura/escritura en el portB y estas dos cosas se deben cumplir (mirar el Datasheet) para que de nuevo no entre en la interrupción hasta que realmente haya otro cambio de estado. Si no se hace una lectura/escritura en el portB el programa se vuelve loco y está contínuamente entrando y saliendo de la interrupción.

SOLUCION:

Leer/escribir el portB antes de abandonar la interrupción mediante un input ó un output de relleno, ó mejor aún para no perder tiempo hacerlo en ensamblador como bien dice el compañero del FORO jfh900 mediante las sentencias: #asm movf port_b,0 #endasm

Tal como ves en el data sheet cuando se utilizan las interrupciones por el portb4...b7, al entrar en esta el puerto B debe leerse aunque los valores del puerto no nos interesen, eso es una caracteristica del pic y no del compilador. Asi que para resolver el problema se debe primero leer el puerto o escribirlo y luego se debe borrar el flag RBIf antes de salir de la interupcion.

Eso me paso tambien en el proton y lo resolvi de esa manera.

SAludos

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Posibles "bugs" del compilador de CCS
« Respuesta #10 en: 16 de Enero de 2009, 15:24:38 »
Tal vez sería una sugerencia para los de ccs, decirles que incluyan ese detalle en su compilador para que lo haga de manera transparente y no estar nosotros pendientes de limpiarlo.

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Posibles "bugs" del compilador de CCS
« Respuesta #11 en: 20 de Enero de 2009, 11:08:24 »
 :D Yes, very well, Manuel.  :D


Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Re: Posibles "bugs" del compilador de CCS
« Respuesta #12 en: 13 de Febrero de 2009, 16:08:30 »
Pues no se trata de un bug del compilador, pero el monitor del puerto serial trabaja mal en la version 4.78, he perdido todo el dia pensando que eran fallos en el programa del pic, pero es del monitor, he usado el hyperterminal de windows xp y por ahora sin problemas.
Saludos desde Córdoba, españa

Desconectado FDamn

  • PIC10
  • *
  • Mensajes: 2
Bugs de CCS en dsPICs
« Respuesta #13 en: 24 de Febrero de 2009, 18:13:40 »
Que tal.

Mi experiencia con ccs empezo intentando realizar un filtro digital basado en dsPIC.

En realidad use ccs como compilador de asembler usando las directivas #asm y #endasm.

El uno de los bugs que noté fue el siguiente:

Codigo original:
void main()
{
  #asm
    mac W4*W5,A,[W8]+=2,W4,[W10]+=2,W5
  #endasm
}

Salida del compilador:
void main()
{
  #asm
    edac W4*W4,A,[W8]+=2,W4,[W10]+=2,W5
  #endasm
}

Despues de compilar, la instruccion mac se convierte en edac...
Esto es un serio problema, pues la instruccion mas fundamental de los algoritmos DSP (la instruccion mac) no se puede usar..

"Resolvi" esto poniendo a mano el OPCODE de la instruccion directamente en el archivo .hex...
Si alguien tiene el mismo problema y aun no lo resolvio, avisen por favor que no tendre problemas en enviar el OPCODE de cada instruccion sacado de los manuales de referencia de microchip (que seguramente estan disponibles en el sitio oficial).
Si alguien resolvio de alguna manera mas eficaz este problema agradeceria que lo compartiera. Gracias.

Saludos.

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Posibles "bugs" del compilador de CCS
« Respuesta #14 en: 24 de Febrero de 2009, 21:57:23 »
FDamn, estas seguro que tu version del CCS soporta los dsPIC? Creo que necesitas el compilador PCD para poder compilar correctamente los dsPIC y los PIC24.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."