TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pocher en 07 de Abril de 2008, 14:20:52

Título: Posibles "bugs" del compilador de CCS
Publicado por: pocher 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 (http://www.todopic.com.ar/foros/index.php?topic=21200.0) 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
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: MGLSOFT 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:
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: RICHI777 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 !
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: gu1llermo 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.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: RICHI777 en 07 de Abril de 2008, 22:55:07
Me quedo clarisimo, es un bug del compilador  8)
Gracias y saludos !
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: pocher 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
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: pocher 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

Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: ElVale 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.
Título: [*] Re: Posibles "bugs" del compilador de CCS
Publicado por: Nocturno en 19 de Agosto de 2008, 01:30:48
 :shock: :shock: :shock: :shock: :shock: :shock:
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: RALF2 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
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: PalitroqueZ 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.

Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: pocher en 20 de Enero de 2009, 11:08:24
 :D Yes, very well, Manuel.  :D

Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: kain589 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.
Título: Bugs de CCS en dsPICs
Publicado por: FDamn 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.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Gonzalo_BlackHawk 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.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: tithanae en 07 de Marzo de 2009, 19:13:52
Otro BUG  version 4.049
El archivo .h de el 18F25K20 esta incorrecto utiliza el del 18F2520 la parte que esta mal es la de el oscilador interno para arreglarlo colocar esto en el achivo 18F25K20.h:
Código: [Seleccionar]
////////////////////////////////////////////////////////////////// INTERNAL RC
// Constants used in setup_oscillator() are:
// Constants used in setup_oscillator() are:
// First param:
#define OSC_31KHZ   0// este es el arreglo
#define OSC_250KHZ  0x10
#define OSC_500KHZ  0x20
#define OSC_1MHZ    0x30
#define OSC_2MHZ    0x40
#define OSC_4MHZ    0x50
#define OSC_8MHZ    0x60
#define OSC_16MHZ   0x70
#define OSC_32MHZ   0x4060
#define OSC_64MHZ   0x4070
/*#define OSC_31KHZ   0              esto es  lo que tiene originalmente
#define OSC_125KHZ  0x10
#define OSC_250KHZ  0x20
#define OSC_500KHZ  0x30
#define OSC_1MHZ    0x40
#define OSC_2MHZ    0x50
#define OSC_4MHZ    0x60
#define OSC_8MHZ    0x70*/
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: jhozate en 11 de Marzo de 2009, 20:39:39
 :D :D :D vaya me sacaron de una duda q tenia, yo programo en assembler y pss no habia leido el datasheet en el 16F84 y resulta q estaba haciendo un programa sencillo de interrupcion por cambio de estado de RB4:RB7 y tambien tenia el problema de q el programa no se me salia de la interrupcion, y tambien me dijeron q agregara a la rutina la instruccion de relleno "movf portb,w" y de esta manera se solucionó el problema

gracias
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Cryn en 13 de Marzo de 2009, 23:33:27
queda claro que es un bug de usuario entonces :D :D

que mal, los de microchip deberían haber corregido eso, me parece que debería limpiarse solo :x
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: jhozate en 14 de Marzo de 2009, 00:11:16
no no no gente, investigando mas,,,no es un bug, lo q pasa es q cuando se habilita interrupcion por cambio de nibble, para esta interrupcion no se especifica si el cambio es de 0 a 1 ó de 1 a 0, es por eso qse hace necesario incluir una rutina ya sea de lectura o escritura, es para dejarle fijado al micro el estado de los bit y de esta manera pueda darse cuenta de q hubo un cambio en el nibble.
esta es la cita textual de donde saque la info
"interrupcion por cambio de estado en las entradas RB4-RB7. se deshabilita mediante el bit RBIE del registro INTCON.cuando en cualquiera de las entradas RB4-RB7 se produce un cambio de estado logico respecto al ultimo valor leido en las mismas, el flag RBIF del registro INTCON refleja dicho suceso. para poner esta interrupcion es necesario leer el puerto B de entrada y registrar el nuevo valor de RB4-RB7 asi como poner a 0 el bit RBIF.

otra cosa,,en el datasheet si esta especificada dicha rutina tambien

aqui esta la cita:
"Four of PORTB’s pins, RB7:RB4, have an interrupt-onchange
feature. Only pins configured as inputs can
cause this interrupt to occur (i.e., any RB7:RB4 pin
configured as an output is excluded from the interrupton-
change comparison). The input pins (of RB7:RB4)
are compared with the old value latched on the last
read of PORTB. The “mismatch” outputs of RB7:RB4
are OR’ed together to generate the RB Port Change
Interrupt with flag bit RBIF (INTCON<0>).
This interrupt can wake the device from SLEEP. The
user, in the Interrupt Service Routine, can clear the
interrupt in the following manner:
a) Any read or write of PORTB. This will end the
mismatch condition.
b) Clear flag bit RBIF.
A mismatch condition will continue to set flag bit RBIF.
Reading PORTB will end the mismatch condition and
allow flag bit RBIF to be cleared.
The interrupt-on-change feature is recommended for
wake-up on key depression operation and operations
where PORTB is only used for the interrupt-on-change
feature. Polling of PORTB is not recommended while
using the interrupt-on-change feature."

esta claro no..?? :D :mrgreen:
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Cryn en 14 de Marzo de 2009, 12:02:23
si, yo decía que es un error nuestro por no habernos fijado la hoja de datos :mrgreen:

cuando uno usa la interrupción por RB ya esta consiente en que estados estarán y solo espera que se modifiquen, bueno al menos cuando se usa pulsadores, quizá para otras aplicaciones si sea necesario, pero por ahora yo no le encuentro razón de reescribir el portb, porque no admite solo una lectura y escritura, debe ser simultaneo para recién borrar el flag

y si esta clarísimo :mrgreen: pregúntamelo a mi que me pase muy buen tiempo intentando descubrir la falla que tenía :D

un saludo
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Suky en 14 de Marzo de 2009, 20:56:41
Cuando se usa interrupción por comparadores analógicos del PIC, se debe leer o escribir el registro CMCON. Al igual que para la interrupción por RB4-RB7 no lo veo implementado en el compilador CCS  versión 4.014.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: KALLITOS en 30 de Abril de 2009, 01:29:27
Hola, bueno uso el CCS 4.074 y tengo problemas con las multiplicaciones x100, es raro porque con multiplicaciones con 10, 1000 o 10000 va bien, solo con 100 tengo problemas, y lo soluciono de la siguiente manera:

Código: [Seleccionar]
valor = 0;
while(byte_4 !=0)          //SE REALIZA ESTO POR QUE LA MULTIPLICACION X100 ES ERRONEA
      {
      valor += 100;
      byte_4--;
      }

donde byte_4 es el valor que deseo multiplicar.

Otra es que cuando realizo el anterior procedimiento con una variable del tipo float32 se acumulan errores es decir si multiplico 1 por 500 me da resultado 503.4 y a mayores valores el error se acumula, lo solucione trabajando primero con int32 y luego paso el resultado a float32 para continuar con los calculos

Código: [Seleccionar]
resultado=(float32) resultado_1;
         resultado /= cifra_2;
         printf("resultado: %f%%\r\n",resultado);

Bueno espero le sirva a alguien.
Saludos.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: migsantiago en 30 de Abril de 2009, 12:37:08
Hola Kallitos

Deberías poner el código que supuestamente falla y después las soluciones. Cuesta trabajo imaginarse el error si no muestras cómo declaraste las variables y cómo son modificadas.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: KALLITOS en 05 de Mayo de 2009, 01:17:54
Hola y disculpas por no responder, bueno aqui les pego un trozo de codigo como ejemplo:

Codigo fallido
Código: C
  1. int16 valor = 0;
  2.             byte_3 -= 48;
  3.            
  4.             valor = byte_3 * 100;

Solucion
Código: C
  1. int16 valor = 0;
  2.             byte_3 -= 48;
  3.            
  4.             while(byte_3 != 0){byte_3--; valor += 100;}
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: migsantiago en 05 de Mayo de 2009, 11:34:02
El valor '100' es un int8. Si la variable byte3 es declarada como int8, entonces no creo que sea bug de ccs.

Al multiplicar un int8 por un int8 el resultado será un int8, a pesar de que puede exceder a un int8. Hay 2 formas de hacerlo correctamente en mi opinión:

Haciendo casting.
Código: [Seleccionar]
int16 valor;
int8 byte_3=48;

valor = (int16) byte_3 * 100;

Declarando a byte_3 como int16
Código: [Seleccionar]
int16 valor;
int16 byte_3=48;

valor = byte_3 * 100;

Al declarar a byte_3 como int16 se crea un casting automático sobre el valor 100, convirtiéndolo en un int16.

No creo que sea un bug de ccs, solo es manejo de tipos de variables.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: KALLITOS en 05 de Mayo de 2009, 20:52:53
Hola MigSantiago, realizando el casting funcionó, no realice con byte_3 a int16 debido a que trabaja con otros bytes y en momentos hago comparaciones como
Código: C
  1. if (byte_2 == 'S')
o
Código: C
  1. if (byte_5 == 'A')
entonces realizar eso con int16 supongo habra problemas por definicion de variables.

El valor '100' es un int8. Si la variable byte3 es declarada como int8, entonces no creo que sea bug de ccs.

Pero realizando multiplicacion por 10 si funciona, como sería en este caso?

Gracias por las respuestas Mig  :P
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: migsantiago en 05 de Mayo de 2009, 21:10:51
El valor '100' es un int8. Si la variable byte3 es declarada como int8, entonces no creo que sea bug de ccs.

Pero realizando multiplicacion por 10 si funciona, como sería en este caso?

Gracias por las respuestas Mig  :P

Hola Kallitos  :mrgreen:

Hum, por favor pon un ejemplo. Hasta donde yo sé, si byte3 es un int8 y lo multiplicas por '10', el resultado va a ser correcto mientras sea menor a 255. Por ejemplo,

Código: [Seleccionar]
int16 valor;
int8 byte3 = 25;

valor = byte3 * 10;

Valor valdrá 250. Si byte3 valiera 26, valor ya no contendría el valor completo porque 260 ya requiere más de 8 bits para ser expresado.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: KALLITOS en 06 de Mayo de 2009, 21:38:09
Hola mig, escribo desde el trabajo, bueno creo que cometi error en la explicación aqui va el ejemplo completo y explico lo que hago en mis codigos.

Realizo la recepción USART por interrupcion y siempre byte a byte con el sgte codigo

int byte_1,byte_2,byte_3,byte_4,byte_5,byte_6;
int 16 valor;

byte_6 = byte_5;
byte_5 = byte_4;
byte_4 = byte_3;
byte_3 = byte_2;
byte_2 = byte_1;
byte_1 = getc();

if (byte_1 = 13)
   {
      byte_2 -= 48;     
      byte_3 -= 48;     
      byte_4 -= 48;     
      byte_5 -= 48;     
      byte_6 -= 48;     
      valor = 0;

      valor = byte_5 * 10000;
      valor += byte_4 * 1000;
      while(byte_3 != 0){byte_3--; valor += 100;}
      valor += byte_2 * 10;
      valor += byte_1;
      }
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: migsantiago en 06 de Mayo de 2009, 22:45:42
Ah ya veo, estás pasando de ASCII a entero.

Código: [Seleccionar]
      valor = byte_5 * 10000; //Funciona porque 10000 es un int16 y hace un casting implícito sobre byte_5 a int16
      valor += byte_4 * 1000; //Funciona porque 10000 es un int16 y hace un casting implícito sobre byte_4 a int16
      valor += byte_3 *100; //No te funciona porque 100 es un int8 y no hace casting implícito, debes hacer uno explícito para pasarlo a int16
      valor += byte_2 * 10; //Funciona porque el número va a ser de 0 a 9, el resultado será 0 a 90, que caben en un int8 normalmente
      valor += byte_1;

La forma correcta de lo anterior debería ser:

Código: [Seleccionar]
      valor = byte_5 * 10000;
      valor += byte_4 * 1000;
      valor += (int16) byte_3 * 100;
      valor += byte_2 * 10; //Lo dejo así porque ya se sabe que byte_2 nunca excederá el 9
      valor += byte_1;

Es cuestión de manejo de castings.  :wink:
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: KALLITOS en 07 de Mayo de 2009, 00:21:33
Muy bien Mig, entendido, realice la siguiente prueba:
Código: Microchip Assembler
  1. printf("HOLA MUNDO CRUEL!!!\n\r");
  2.     byte_1 = 23;
  3.     byte_1 *= 10;
  4.     byte_2 = 26;
  5.     byte_2 *= 10;
  6.     printf("byte_1 = 23 : %u\n\r",byte_1);
  7.     printf("byte_2 = 26 : %u\n\r",byte_2);
Y en el virtual terminal de PROTEUS, obtuve lo siguiente:

HOLA MUNDO CRUEL!!!
byte_1 = 23 : 230
byte_2 = 26 : 4

Fue un bug CCS, mito o verdad??
Mito, bug humano  :mrgreen:.

Ahora a trabajar con castings 

Gracias Mig, me desasnaste!!! :D

Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: migsantiago en 07 de Mayo de 2009, 12:59:41
Qué bueno que me entendiste.  :-/

Te quedó 4 porque...

260 = 0x0104, pero solo cabe el byte bajo... 0x04
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Geo en 28 de Junio de 2009, 02:34:41
Haciendo pruebas de comunicación por USB mediante la clase CDC (puerto COM virtual), estuve quebrándome la cabeza porque las cosas no me salían, tenía estas declaraciones de variables:
Código: C
  1. void main() {
  2.    char comando[ 8 ];
  3.    int8 num_comandos;
  4.    char linea_comandos[ 32 ];
  5.    int8 param1;
  6.    int8 param2;
  7.    int8 lista[ 2 ];
  8.    char com_led[ 4 ] = "LED";
La idea es recibir varias cadenas de texto separadas por espacios u otro caracter especial, para luego comparar con variables com_XXX para averiguar qué comando se pretende ejecutar. Así, la variable com_led indica la cadena de texto que se tomará como el comando de encendido/apagado de leds, algo simple. El problema es que estuve HORAS probando y nunca me tomaba el comando, enviaba algo como esto:
led 1 0
(led número 1, apagar)
Intenté de muchas formas pero no lo conseguía, hasta que probé moviendo la declaración de com_led, primero la puse fuera de la función main y ¡funcionó! Después, y es lo que me confundió más, logré que funcionara haciendo simplemente esto:
Código: C
  1. char com_led[ 4 ] = "LED";
  2.    char comando[ 8 ];
  3.    int8 num_comandos;
  4.    char linea_comandos[ 32 ];
  5.    int8 param1;
  6.    int8 param2;
  7.    int8 lista[ 2 ];
¡Si, moviendo la definición de com_led al inicio de todas las variables!
:?

Debo decir que estoy compilando con CCS desde Linux utilizando Wine, y que voy a intentar recortar el código lo más que pueda para reproducir el error, así como probar en Windows, porque esto de plano no me parece :?.

--------------------------
Edición:
El que no hubiera problemas al mover la declaración era la clave para notar el problema pero en primera instancia lo pasé por alto :p. Unos minutos después con la cabeza más fría, era evidente que estaba sobrepasando los límites de la variable lista (desbordándola) y sobreescribiendo el contenido de la siguiente (com_led), ahí el problema.
Afortunadamente, no se trata de un error inexplicable de CCS como en un principio pensé :), aunque a estas alturas los compiladores deberían avisar de este tipo de cosas :P (si, ya me estoy mal acostumbrando), ¿existe alguna opción del compilador para activar más mensajes de advertencia sobre problemas como este? ¿O es que simplemente no está implementado :p.?
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: migsantiago en 28 de Junio de 2009, 15:31:09
Hola Geo

Normalmente los compiladores avisan que una variable está invadiendo el espacio de otra solo en modo de depuración o solo si la invasión se hace con un puntero cuyo valor sea constante y el compilador determine al 100% que la invasión ocurrirá.

Al ser un compilador de pics pues desconozco si hay depuradores que sean capaces de depurar paso a paso el programa en un pic por hardware. En caso de haberlos es ahí donde podrás ver el error.

Al momento de compilar el programa es difícil que el compilador te lance una advertencia de que las variables se pueden sobreescribir porque hay mil posibilidades diferentes de que suceda, la única detectable es con punteros constantes.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Geo en 29 de Junio de 2009, 02:02:29
Tienes razón, estoy mezclando cosas. Lo que tenía en la mente es cuando depuro con VS :p.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: moronilehi en 16 de Julio de 2009, 23:05:54
Hola a todo soy nuevo en este mundo de microcontroladores y es la primera vez que escribo, tengo la siguiente inquietud es que  compre un Lcd VT162B/B que supuesta mente era compatible con S6A0069 bueno tuve problema con la compatibilidad del Lcd que no me funcionaba y aun no me funciona , la historia es que pedí ayuda a la empresa  ellos me enviaron un archivo y un data de este modelo(no aceptaban devoluciones) y bueno  me enviaron una librería que supuestamente trabaja con el LCD VT162B/B y es como me dijo el hombre  que la librería es del CCS, Bueno lo compilo y buala me sale un mensaje de error o es un bugs del compilador por la siguiente declaración
 
Código: [Seleccionar]
#byte DataBus = PORTD               // DEFINE BUS DE DATOS
#byte Tris_DataBus = TRISD         // DEFINE TRIS DE BUS DE DATOS        
#byte ControlBus = PORTE            // DEFINE BUS DE CONTROL
#byte Tris_ControlBus = TRISE   // DEFINE TRIS DEL BUS DE CONTROL


 Yo estoy usando el compilador CCS 4.08 y el pic16f874a no sé si es un bugs o es que me enviaron para callarme un código cualquiera de internet por favor ayúdenme le agradesco por su comprensión.
Pd aquí le envió el código completo que me entrego la empresa para el LCD:

Código: [Seleccionar]

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                                   LCD.H                                                                                      //
//                                                             VERSION   2.1                                                                                 //
//                                                              JULIO 2009                                                                                 //
//                                                                                                                                                               //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
#nolist

                                             // DEFINICION DE CONSTANTES PARA USO EN FUNCIONES
#define HOME               0x02      // PARA PONER CURSOR EN LA POSICION 0 DEL DISPLAY. USAR CON WRITE_LCD_COM
#define INCREASE         0x02      // INCREMENTA CURSOR. USAR CON LCD.ID
#define DECREASE         0x00      // DECREMENTA CURSOS. USAR CON LCD.ID
#define SHIFT_ON         0x01      // SHIFT DISPLAY. USAR CON LCD.SHIFT
#define SHIFT_OFF         0x00      // NO SHIFT DISPLAY. USAR CON LCD.SHIFT
#define LCD_ON            0x04      // ACTIVA LCD. USAR CON LCD.MODE
#define LCD_OFF            0x00      // DESACTIVA LCD. USAR CON LCD.MODE
#define CURSOR_ON         0x02      // ACTIVA CURSOR. USAR CON LCD.CURSOR
#define CURSOR_OFF      0x00      // DESACTIVA CURSOR. USAR CON LCD.CURSOR
#define BLINK_ON         0x01      // ACTIVA PARPADEO DEL CURSOR. USAR CON LCD.BLINK  
#define BLINK_OFF         0x00      // DESACTIVA PARPADEO DEL CURSOR. USAR CON LCD.BLINK  
#define BUS_8               0x10      // DEFINE BUS DE 8 BITS. USAR CON LCD.INTERFASE
#define BUS_4               0x00      // DEFINE BUS DE 4 BITS. USAR CON LCD.INTERFASE
#define CLEAR               0x01      // LIMPIA DISPLAY. USAR CON FUNCION WRITE_LCD_DATA()
#define NOCLEAR            0x00      // NO LIMPIA DISPLAY. USAR CON FUNCION WRITE_LCD_DATA()
#define   LINE1               0x00      // PRIMERA DIRECCION DE LINEA 1.
#define   LINE2               0x40      // PRIMERA DIRECCION DE LINEA 2.
#define   LINE3               0x14      // PRIMERA DIRECCION DE LINEA 3.
#define   LINE4               0x54      // PRIMERA DIRECCION DE LINEA 4.
#define LARGO               16         // Editar esta línea para indicar la cantidad de caracteres por línea del display
#define LINEAS            2            // Editar este línea para indicar la cantidad de líneas que dispone el display
#define   NULL               0x00

#list

struct
{
   char TEXT[LARGO+1];                  // define texto para escribir en lcd  
   int ID;                                    // define si el cursor de incrementará o decrementará
   int SHIFT;                              // define el shift del cursor
   int MODE;                                 // define si el display está ON ú OFF
   int CURSOR;                              // define si el cursor estará visible
   int BLINK;                              // define si el cursor parpadeará
   int INTERFASE;                        // define interfase de 4/8 bits
} lcd;

// CONFIGURAR AQUI LOS PUERTO QUE SE USARAN PARA BUS DE DATOS Y DE CONTROL
#byte DataBus = PORTD               // DEFINE BUS DE DATOS
#byte Tris_DataBus = TRISD         // DEFINE TRIS DE BUS DE DATOS
#byte ControlBus = PORTE            // DEFINE BUS DE CONTROL
#byte Tris_ControlBus = TRISE   // DEFINE TRIS DEL BUS DE CONTROL

// GENERA PULSOS DE ESCRITURA PARA COMANDOS DEL DISPLAY Y SACA DATO
void WriteLcdComData(int x)
{
   Tris_ControlBus = 0xF8 & Tris_ControlBus;
   Tris_DatalBus = 0x00;
   DataBus = ControlBus = 0x00;
   ControlBus = 3;
   ControlBus = 0;
   ControlBus = 4;
   DataBus = x;
   ControlBus = 0;
   ControlBus = 3;
   delay_us(50);
}

// LIMPIA DISPLAY
void ClearLcd(void)
{
   WriteLcdComData(CLEAR);               // display clear
   delay_ms(2);
}

// INICIALIZA EL EL DISPLAY
 void IniLcd(void)
{
   delay_ms(20);
   WriteLcdComData(0x30);
   delay_ms(5);  
   WriteLcdComData(0x30);
   delay_us(150);
   WriteLcdComData(0x30);  
}

// CONFIGURA EL DISPLAY. LOS DATOS PARA LA CONFIGURACION DEBEN SER PUERTOS ANTES DE LLAMAR
// A ESTA FUNCION. LOS DATOS SON PARTE DE LA ESTRUCTURA LCD.
void SetupLcd(void)
{
   WriteLcdComData(0x04 | lcd.ID | lcd.SHIFT);                              //ENTRY MODE SET
   WriteLcdComData(0x08 | lcd.MODE | lcd.CURSOR | lcd.BLINK);      // DISPLAY ON OFF
   WriteLcdComData(0x28 | lcd.INTERFASE);                                    // SET FUNCTION
}

// ESCRIBE DATOS EN EL DISPLAY. X REPRSENTA DESDE QUE DIRECCIÓN DEL DISPLAY SE DESEAN ESCRIBIR LOS DATOS
// E Y INDICA SE SE LIMPIARÁ EL DISPLAY ANTES DE ESCRIBIR
// SI C = CLEAN, EL DISPLAY ES LIMPIADO
// SI C = NOCLEAN, SOLO SE ESCRIBEN LOS DATOS DESDE LA POCISION ESPECIFICADA POR POS
// LOS DATOS A ESCRIBIR DEBE SER COPIADOS PREVIAMENTE EN EL ELEMENTO LCD.TEXT DE LA ESCTRUCTIRA LCD
void WriteLcd(int pos, int c)
{
   int *p;
   Tris_ControlBus = 0xF8 & Tris_ControlBus;
   Tris_DatalBus = 0x00;
   DataBus = ControlBus =0x00;
   if (c)
      {
         clear_lcd();
         delay_ms(2);
      }
   pos|= 0x80;
   WriteLcdComData(pos);
   p = lcd.TEXT;
   for (; *p!=NULL; p++)
   {  
      DataBus = 0xff;
      ControlBus = 2;
      ControlBus = 1;
      ControlBus = 5;
      DataBus = *p;
      ControlBus = 1;
      ControlBus = 2;
      delay_us(50);
   }
}

void PutcLcd(int ini, char data)
{
   if (ini != CURRENT)
      {
         ini|= 0x80;
         WriteLcdComData(ini);
      }
   Tris_ControlBus = 0xF8 & Tris_ControlBus;
   Tris_DatalBus = ControlBus = 0x00;
   DataBus = 0xff;
   ControlBus = 2;
   ControlBus = 1;
   ControlBus = 5;
   DataBus = data;
   ControlBus = 1;
   ControlBus = 2;
   delay_us(50);
}

void ClearLcdLine(int x)
{
   int y;
   for (y=0; y<=LARGO; y++)
      {
         lcd.TEXT[y] = ' ';
      }
   lcd.TEXT[++y] = NULL;
   switch (x)
      {
         case 1   :   WriteLcd(LINE1,NOCLEAR);
                        break;
         case 2   :   WriteLcd(LINE2,NOCLEAR);
                        break;
         case 3  :   WriteLcd(LINE3,NOCLEAR);
                        break;
         case 4  :   WriteLcd(LINE4,NOCLEAR);
                        break;
         default :   break;
      }
}

 8) :mrgreen: :-/
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: migsantiago en 16 de Julio de 2009, 23:25:53
¿Y cuál es el error que tira?
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: moronilehi en 16 de Julio de 2009, 23:42:23
#byte DataBus = PORTD               // DEFINE BUS DE DATOS
#byte Tris_DataBus = TRISD         // DEFINE TRIS DE BUS DE DATOS
me sale el erro Undefined identifier en el byte yExpecting en ( port
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: moronilehi en 16 de Julio de 2009, 23:44:38
y los error que marca son 12 48
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: migsantiago en 17 de Julio de 2009, 00:04:09
Eso no es un bug, es un error de definiciones.

Dale valor a PORTD y a TRISD con #define o con un número hexadecimal.

Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: moronilehi en 17 de Julio de 2009, 00:10:48
Ya lo hice y no es el problema :( 
La cosa es que está siendo referenciando al databus y al controlbus a los ports y los tris supuestamente este programa que me entrego el vendedor era para el CCS. Cuando dejo a uno de los las referencia miento o instancias #byte DataBus = PORTD y dejando solamente uno de esto el compilador funciona a la perfección pero no cuando pones los 4 referencia miento de PORT y TRIS aparece inmediatamente el error.
Compílalo si no te aparece los errores dime  a lo mejor es problema bugs de la versión que uso :?
Te agradecería si tienes la solucion
 :? :(
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: migsantiago en 17 de Julio de 2009, 12:58:25
Cuesta trabajo entender lo que escribes.

Cópianos el output de errores que CCS te da, tal cual te lo da.

Después copia el código que quieres compilar y enciérralo en:

Código: [Seleccionar]
[ code][ /code]
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: PicMinor en 27 de Noviembre de 2009, 07:01:14
Comportamiento "Raro" del Puerto C

Estoy utilizando la UART del PIC16F876 para una comunicación RS485 mediante la directiva:

Código: [Seleccionar]
#use    RS232 (Baud=9600, Parity=N, Xmit=PIN_C6, Rcv=PIN_C7, Stream=Master, Bits=8, Enable=PIN_C5)

y uso la interrupción RDA

enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);


Además pretendo utilizar el PIN_C2 como salida. Bueno, el problema surge con el pin C2. Si no hago nada con el pin C2 la cosa funciona correctamente pero si intento escribir algo en el pin, por ejemplo:

output_bit(PIN_C2,1);

pues ya no funciona la Interrupción RDA.

No se si le ha ocurrido a alguien más pero por si le puede servir he utilizado el siguiente "truco" para poder seguir con mi proyecto:

Código: [Seleccionar]
Al principio defino el puerto y el Tris

#byte PORTC = 0x07 // Necesarias
#byte TRISC = 0x87 // Necesarias

Y luego hago estos cambios:

output_bit(PIN_C2,1); lo cambio por bit_set(PORTC,2);
output_bit(PIN_C2,0); lo cambio por bit_clear(PORTC,2);


Así me funciona pero es una manera un poco cutre de hacerlo. ¿Hay algún método más ortodoxo?

Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: PicMinor en 27 de Noviembre de 2009, 16:56:39
Más complicaciones con el Puerto C

Añado al problema que he comentado anteriormente el efecto contrario:

Cuando he conseguido activar o desactivar la línea PORT_C2 usando el bit_set(PORTC,2) me ocurre lo siguiente: Si posteriormente transmito datos por el RS485 me cambia el TRISC a modo entrada en el pin 2, por lo que ya no puedo usarlo como salida si no restauro la situación mediante bit_clear(TRISC,2).

¿Por qué output_bit me afecta a la interrupción #INT RDA?

¿Por qué la transmisión serie afecta a la configuración del PORTC, (Pero no la recepcción)?

¿No debería de limitarse su influencia a los pines Xmit, Rcv y eventualmente el pin Enable, definidos en la directiva #use RS232?
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Suky en 27 de Noviembre de 2009, 17:26:33
Trabaja el puerto con #use fast_io(c) configurando el tris con set_tris_c(); y creo que solucionarás el problema.

Saludos!
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: PicMinor en 30 de Noviembre de 2009, 04:41:21
Gracias Suky por tu respuesta pero la directiva #use_fast_io(c) no soluciona el problema. Configuro el set_tris_c() en la Inicialización pero en el momento en que transmite el RS232/RS485 el pin C2 lo vuelve a poner como entrada. Te pongo los datos:

Una vez completada la Inicialización y recibida la cadena desde el Máster tenemos:

TRISC = 10000011

Después de la transmisión por parte del micro de la respuesta tenemos:

TRISC = 10011111

El cambio en el TRISC de los Bits 7/6/5/4 no me preocupan ya que son los puertos RS232 y I2C y "supongo" que se encargará el compilador de configurarlos de la manera adecuada. Pero ¿Por qué cambia el pin C2 que es el CCP1 y no lo uso como tal sino como salida normal y corriente?
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: BrunoF en 08 de Diciembre de 2009, 00:01:57
Tal vez me fumé mucho ya, pero juro que o he enloquecido, o encontré un bug bastante groso.

Encontrado en varias versiones. Actualmente uso la 4.088.

Un error en la función pow(x,y) de la librería math.h:

Hacer esto:

Código: C
  1. float32 out;
  2.    out=pow(-2.0,2.0);
  3.    printf("El resultado es: %f",out);
arroja como resultado: -4.00

No he tenido tiempo de analizar la solución, pero el problema es claramente visible en la librería math.h:

Código: C
  1. //////////////////// Power functions ////////////////////
  2.  
  3. ////////////////////////////////////////////////////////////////////////////
  4. //   float pow(float x,float y)
  5. ////////////////////////////////////////////////////////////////////////////
  6. // Description : returns the value (x^y)
  7. // Date : N/A
  8. //
  9. float32 pow(float32 x,float32 y)
  10. {
  11.    if(x>=0)
  12.      return(  exp(y*log(x)) );
  13.    else
  14.      return(  -exp(y*log(-x)) );
  15. }

 Si analizamos la condicion del IF tenemos que
      si x<0 entonces,
      return(  -(exp(y*log(-x))) );
pero como x<0, entonces hacer eso es lo mismo que hacer:
      return(  -exp(y*log(x)) );

     porque como x era menor a cero, los signos negativos se cancelan quedando x positiva...
 
si nos fijamos, en realidad lo obtenido no es mas que el resultado para x>=0 pero con distinto signo final.

Entonces, podriamos simplificar diciendo que la funcion hace esto:

Sea Q(x,y)=exp(y*log(x) ) una funcion que devolvera supuestamente el valor absoluto1 de la funcion pow

si x>=0 entonces
      devuelve Q(x,y)
sino
      devuelve -Q(x,y)

Vamos a ver en detalle el error ahora que se ha simplificado el algoritmo a sólo un cambio de signo según el signo de x.

para x=-2 e y=2

por ser x<0, entonces devolverá -Q(x,y). Asumiendo que Q(x,y) no tiene bugs y devuelve el valor absoluto1 correctamente, nos quedaría que Q(x,y) da 4.
Ahora, al aplicarle el signo menos, tenemos el terrible bug, quedando finalmente como resultado -4.

Analizando un poco más el algoritmo, observamos que el error sólo se produce cuando la base es negativa y el exponente, par.

Es evidente que el algoritmo falla, porque sólo considera el signo de la base, pero no tiene en cuenta si el exponente es par o impar. No analice el caso de exponentes fraccionales.

¿Qué les parece?

Aclaraciones:
1Podemos asegurar que Q(x,Y) devuelve siempre un valor mayor o igual a 0, porque si la analizamos:

Q(x,y) = exp(y*log(x) )

podríamos hacer una función compuesta, quedando:

Q(x,y) = exp(P(x,y))

donde P(x,y) = y*log(x)

Ahora, siendo que la funcion exp es e^x, y recordando que e es un número positivo, sabemos que no hay manera que e^P(x,y) de un resultado negativo.
Analizandolo si se necesita, tenemos que:
si P(x,y)>0, entonces el resultado será mayor a 0;
si P(x,y)=0, entonces el resultado será 1;
si P(x,y)<0, entonces el resultado será también mayor a 0; ya que e^(-P(x,y)) = 1/(e^P(x,y)) que es siempre positivo.

Queda demostrado entonces que Q(x,y)=exp(y*log(x) ) es siempre positivo,por lo que podríamos decir que devuelve el valor absoluto del resultado.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Nocturno en 08 de Diciembre de 2009, 02:46:01
Parece evidente que es un fallo.
Yo he tenido que eliminar todos los cálculos en float de un proyecto en el que estoy trabajando porque hacía cosas raras: a veces se colgaba, otras los servos empezaban a vibrar porque los timers no iban finos, etc...
Me costó encontrar el problema, pero desde que eliminé los float todo ha ido como la seda.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: BrunoF en 08 de Diciembre de 2009, 04:21:48
Que lástima. Lo que pasa es que yo no puedo eliminar los floats ya que los utilizo para todos los cálculos. :(

Me detuve ahora un ratito a ver por qué calculaba así la potenciación, y la respuesta salió rápidamente:

Hay una entidad de los logaritmos que dice que:

     y
ln(x ) =y*ln(x)

Entonces, puedo elevar "e" a cada lado de la ecuación , y la igualdad debería mantenerse...
          y    
    (ln(x )     (y*ln(x))
e^        =e^
                                     ln(f(x))
y ahora, sabiendo que e^            = f(x) nos queda que:

 y              (y*ln(x))
x         =e^                 = Q(x,y) = exp(y*log(x))  que es la que la librería usa.

Lo anterior está bien,PERO el dominio del lado derecho es siempre que X>0. Si x<=0, el logaritmo neperiano no exíste...Y acá está el problema del algoritmo.

Perdón por no usar LATEX pero me está metiendo un símbolo raro que no debería...:(

Ahora estoy estudiando cómo solucionar el algoritmo.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: BrunoF en 08 de Diciembre de 2009, 07:31:20
Bueno. He solucionado parcialmente el asunto.

Con parcial me refiero a que la funcion no acepta exponentes fraccionarios.

Entre a analizar en profundidad, y el problema es bastante amplio y difícil de solucionar algorítmicamente. He descubierto cosas asombrosas.

Como por ejemplo, que la calculadora de Windows tampoco podía resolver algo tan sencillo como (-8)^(1/3).

Si recuerdan algo de análisis, recordarán que eso es lo mísmo que raíz cúbica de -8, lo cual facilmente nos da -2.

Programas profesionales de calculo matemático tampoco pudieron resolverlo. El Derive tuvo que recurrir a números complejos para resolver el ejemplo anterior.

Por ahora, y por siempre seguramente, me conformo con corregir la función para exponentes enteros.

Código: C
  1. float32 pow(float32 x,float32 y)
  2. {
  3.    if(x>=0)
  4.      return(  exp(y*log(x)) );
  5.    else
  6.       if((int32)y%2){
  7.          return(  -exp(y*log(-x)) );
  8.       }else{
  9.          return(   exp(y*log(-x)) );
  10.       }
  11. }

A modificar la math.h... :D

Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: PalitroqueZ en 08 de Diciembre de 2009, 09:36:19
Bruno, y se supone que el C nos facilita la vida  :D

Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Suky en 08 de Diciembre de 2009, 11:52:19
Lo que pasa que la raíz de un numero negativo siempre va a tener resultados imaginarios, por ejemplo -81/3 tiene -2, 1 - 1.73i y 1 + 1.73i. Y si la calculadora no trabaja con números imaginarios no lo va a resolver  :mrgreen:

Después miren lo que dice la versión 4.093 de la función Pow:
Citar
Calculates X to the Y power.

 

Note on error handling:

If "errno.h" is included then the domain and range errors are stored in the errno variable. The user can check the errno to see if an error has occurred and print the error using the perror function.

 

Range error occurs in the following case:

·   pow: when the argument X is negative


Saludos!
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: BrunoF en 08 de Diciembre de 2009, 18:48:07
Bruno, y se supone que el C nos facilita la vida  :D

Ja ja! Pero qué cosa,eh! Uno renegando hasta con lo más "fácil".

Lo que pasa que la raíz de un numero negativo siempre va a tener resultados imaginarios, por ejemplo -81/3 tiene -2, 1 - 1.73i y 1 + 1.73i. Y si la calculadora no trabaja con números imaginarios no lo va a resolver  :mrgreen:

Muchísimas funciones tienen resultados tanto en los reales y en los complejos...

Está bien, pero si vos tenés un resultado dentro del dominio de los Reales, entonces deberías poder encontrarlo si realmente te haces llamar "calculadora". Yo no digo que está mal que la calculadora de Windows no arroje los resultados imaginarios. Digo que está mal que no arroje el -2 como resultado posible siendo que está dentro del dominio que supuestamente maneja. Lo mísmo para el Derive.
Obviamente que el impedimento debe estar en que para poder llegar al -2, las formulas utilizadas deben tener que usar números complejos para ello.

Después miren lo que dice la versión 4.093 de la función Pow:
Citar
Calculates X to the Y power.

 

Note on error handling:

If "errno.h" is included then the domain and range errors are stored in the errno variable. The user can check the errno to see if an error has occurred and print the error using the perror function.

 

Range error occurs in the following case:

·   pow: when the argument X is negative


Saludos!

Interesante eso! Entonces supuestamente no soportaba bases negativas! Jaaaa! Pero no era tan dificil aceptarlas,eh? :S
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Suky en 08 de Diciembre de 2009, 20:06:32
Lo que pasa que la raíz de un numero negativo siempre va a tener resultados imaginarios, por ejemplo -81/3 tiene -2, 1 - 1.73i y 1 + 1.73i. Y si la calculadora no trabaja con números imaginarios no lo va a resolver  :mrgreen:

Muchísimas funciones tienen resultados tanto en los reales y en los complejos...

Está bien, pero si vos tenés un resultado dentro del dominio de los Reales, entonces deberías poder encontrarlo si realmente te haces llamar "calculadora". Yo no digo que está mal que la calculadora de Windows no arroje los resultados imaginarios. Digo que está mal que no arroje el -2 como resultado posible siendo que está dentro del dominio que supuestamente maneja. Lo mísmo para el Derive.
Obviamente que el impedimento debe estar en que para poder llegar al -2, las formulas utilizadas deben tener que usar números complejos para ello.

Supongo que se implementa de esa manera para no mostrar resultados incompletos, que a los estudiantes puede llevarles a confusión  ;-)

Saludos!
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: ramiroreal en 17 de Diciembre de 2009, 05:58:53
Buenas!!! Les cuento una cosa muy curiosa: Resulta que necesito utilizar de la librería math.h, el problema es que necesito trabajar con el PIC 18F4550, puesto que con todas las operaciones que utilizo logro llenar la RAM del PIC 19F877A (segun el CSS). La historia viene cuando calculo el seno, con el 16F877A obtengo 0.841471, lo que viene siendo un resultado correcto  :), pero a la hora de trabajar con el 4550, obtengo 3 resultados distintos!! vamos que el seno es variable: 0.250971 , 0.500011 y 0.500008.

Les cuento que todo lo estoy haciendo con las respectivas versiones del PIC Simulator Idle y ambas programaciones están hechas bajo CCS C, abajo les dejo el código para que vean que es exáctamente igual, no puede ser un error en la MATH.H puesto que utilizo la misma en ambos proyectos.
Voy a probar ésto con un entrenador (el PIC SCHOOL) para salir definitivamente de dudas.
Les cuento mis resultados, saludos.


18F4550
Código: [Seleccionar]
#include "C:\Users\USUARIO22\Desktop\Brujula - Tarjeta nueva\18F4550,solo sin\prueba.h"
#include "C:\Users\USUARIO22\Desktop\Brujula - Tarjeta nueva\18F4550,solo sin\lcd.c"
#include "C:\Users\USUARIO22\Desktop\Brujula - Tarjeta nueva\18F4550,solo sin\math.h"


void main()

{
   double res;
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_oscillator(False);

   // TODO: USER CODE!!
   lcd_init();
   delay_ms(10);
   while(1)
  
   {
   delay_ms(5);
   res=sin(1);
   printf(lcd_putc "\f %4f",res);
   }
}

16F877A
Código: [Seleccionar]
#include "C:\Users\USUARIO22\Desktop\Brujula - Tarjeta nueva\16f877a\16f877a.h"
#include "C:\Users\USUARIO22\Desktop\Brujula - Tarjeta nueva\16f877a\lcd.c"
#include "C:\Users\USUARIO22\Desktop\Brujula - Tarjeta nueva\16f877a\math.h"


void main()
{
   double res;

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
  
  

   // TODO: USER CODE!!
   lcd_init();
   delay_ms(10);
   while(1)
  
   {
   delay_ms(5);
   res=sin(1);
   printf(lcd_putc "\f %4f",res);
   }

}
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: migsantiago en 17 de Diciembre de 2009, 12:50:38
Hola Ramiroreal, no creo que sea buena idea usar una variable declarada como double ya que CCS no la implementa con 8 bytes de precisión, hasta donde recuerdo la implementa como un float de 4 bytes. Además en la ayuda de CCS se comenta que solo es una palabra reservada...

double
 Is a reserved word but is not a supported data type.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: ramiroreal en 18 de Diciembre de 2009, 07:43:23
Buenas!!! gracias por contestar, resulta que mi predicción fué correcta, con un entrenador funciona a la perfección, de todas formas estoy usando la variable float.
Saludos.
Título: Optimización a rutina de escritura en EEPROM externa 24LCxxx y otras
Publicado por: BrunoF en 01 de Enero de 2010, 17:08:47
Bueno, estoy usando la versión 4.088 del CCS, y siempre he usado las librerías standard para leer/escribir en una EEPROM externa.

Ahora, optimizando mis algoritmos de lectura/escritura para el sistema de archivos (http://github.com/brunof/eepromfs) que estoy desarrollando para los PICs, me di cuenta de que podían mejorarse.

Pre-conceptos utilizados:
* Una memoria 24LCxxx tarda según el datasheet aproximadamente 5mS en escribir un byte;
* La memoria no responde a los comandos durante el proceso de escritura(no hay ACK);

Si miran las rutina de escritura, verán que el proceso de escritura se realiza siguiendo el siguiente orden:

1)Escribir en la EEPROM;
2)Esperar hasta que la memoria responda(aprox. 5ms);

El código:
Código: C
  1. void write_ext_eeprom(long int address, BYTE data)
  2. {
  3.    short int status;
  4.    i2c_start();
  5.    i2c_write(0xa0);
  6.    i2c_write(address>>8);
  7.    i2c_write(address);
  8.    i2c_write(data);
  9.    i2c_stop();
  10.    i2c_start();
  11.    status=i2c_write(0xa0);
  12.    while(status==1)
  13.    {
  14.    i2c_start();
  15.    status=i2c_write(0xa0);
  16.    }
  17.    i2c_stop();
  18. }

Algo completamente factible, pero no óptimo. Aprovechando que tanto la escritura como la lectura, comienzan enviando los mísmos comandos(y es aquí donde la memoria también responde(o no) si es que está en pleno proceso de escritura previo) se me ocurrió optimizarlo, haciendo:

Código: C
  1. void write_ext_eeprom(long int address, BYTE data)
  2. {
  3.    short int status;
  4.  
  5.    do{
  6.       i2c_start();
  7.       status=i2c_write(0xa0);      
  8.    }while(status==1);
  9.  
  10.    i2c_write(address>>8);
  11.    i2c_write(address);
  12.    i2c_write(data);
  13.    i2c_stop();
  14. }

Entonces, el orden ahora resulta en:
1) Verificar si se estaba grabando algo, esperar de ser necesario;
2) Grabar el dato(sin esperar a que finalice);

¿Dónde está la ganancia?
Bueno, primero: el código resultante es más corto.
Segundo: Esos 5mS que la rutina original se queda esperando, ustedes pueden aprovecharlos para ejecutar otros procesos con el PIC sin necesidad de esperar a la memoria...

Por otro lado, si optan por cambiar esta rutina, también deberán cambiar la de lectura, quedando:

Código: C
  1. BYTE read_ext_eeprom(long int address) {
  2.    BYTE data;
  3.    short int status;
  4.  
  5.    do{                           //wait if previous writing...
  6.       i2c_start();
  7.       status=i2c_write(0xa0);      
  8.    }while(status);
  9.    
  10.    i2c_write(address>>8);
  11.    i2c_write(address);
  12.    i2c_start();
  13.    i2c_write(0xa1);
  14.    data=i2c_read(0);
  15.    i2c_stop();
  16.    return(data);
  17. }

Porque la lectura, ahora, también debe contemplar el caso en que haya quedado una escritura previa, en la cual deberá esperar a que finalice antes de poder leer el byte solicitado.

En un caso práctico,si hacemos:

write_ext_eeprom(0x0000,0x88);
delay_ms(10);
write_ext_eeprom(0x0001,0xAA);
delay_ms(10);

con las rutinas originales, debería demorar en ejecutarse(aprox.): 5mS+10mS+5mS+10mS=30mS.

Con las rutinas que propongo, el mísmo código deberia demorar en ejecutarse(aprox.): 10mS+10mS=20mS.

Conclusión:
En el peor de los casos, el nuevo código tardará, a lo sumo, como el original que trae el compilador.
En el mejor de los casos, la escritura será prácticamente gratuita en cuanto a gasto de tiempo se refiere.(siempre y cuando entre escrituras, el uC aproveche los 5mS posterior a cada escritura haciendo otra cosa ajena a la memoria).

No es un bug, pero creo que puede servirle a varios. A mi me ha ahorrado mucho tiempo.

Saludos.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: AKENAFAB en 01 de Enero de 2010, 17:43:14
Tambien para ahorrar tiempo y en caso de que sean varios bytes , se puede escribir por pagina,lo mismo la lectura.

Esto lo conoci XD al trabajar con las imagenes para la GLCD que guardo en las eeprom, el tiempo se reduce muchisimo.

Saludos!

Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: BrunoF en 01 de Enero de 2010, 17:47:07
Claro que si!

Siempre hay que mirar los datasheets.

Las librerías que trae el CCS suelen ser muy básicas.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Nocturno en 02 de Enero de 2010, 03:15:09
Muy interesante optimización. Gracias don Bruno
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: PalitroqueZ en 02 de Enero de 2010, 16:57:05
anotado Bruno  :)

Gracias.



Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: migsantiago en 04 de Marzo de 2010, 17:32:47
Estoy casi seguro de que éste es un bug.

Este código funciona perfectamente en otros compiladores (AVR):

Código: [Seleccionar]
      for (char j=0; j<8; j++)
      {
        if (Hello_World[i][k] & 1<<(7-j))    //Should there be a letter pixel here?
        {
          LCD_Out(0x00, 0);            //yes - draw it in black
          LCD_Out(0x00, 0);           
        }
        else
        {
          LCD_Out(0xFF, 0);            //no - draw background in white
          LCD_Out(0xFF, 0);
        }
      }

La parte clave es el desplazamiento hacia la izquierda de 7-j veces.

Por ejemplo, si se tiene un uno y se rota j=1...

0x01 << (7-1)

El resultado es

0x01 << 6 = 0x40

Pero CCS hace otra cosa que no entiendo. No puedo depurarlo porque estoy trabajando con un PIC24 y una LCD 3595.

Cosa rara, pero ya le encontré un workaround y aquí queda...

Código: [Seleccionar]
    for (k=0; k<5; k++) //Scan Columns
    {
    m=0x80;
      for (j=0; j<8; j++)
      {
        if (Hello_World[i][k] & (m>>j))    //Should there be a letter pixel here?
        {
          LCD_Out(0x00, 0);            //yes - draw it in black
          LCD_Out(0x00, 0);           
        }
        else
        {
          LCD_Out(0xFF, 0);            //no - draw background in white
          LCD_Out(0xFF, 0);
        }
      }
    }

El problema es que el pedazo de código que no funcionaba debía dibujar HELLO WORLD en la LCD Nokia pero en vez de eso dibujaba esto:

http://img169.imageshack.us/img169/6757/abcd0003z.jpg
(http://img169.imageshack.us/img169/6757/abcd0003z.th.jpg) (http://img169.imageshack.us/img169/6757/abcd0003z.jpg)

Y con la corrección ya funciona bien:

http://img705.imageshack.us/img705/7476/abcd0004k.jpg
(http://img705.imageshack.us/img705/7476/abcd0004k.th.jpg) (http://img705.imageshack.us/img705/7476/abcd0004k.jpg)

Datos del bug:
PIC24FJ64GB002
CCS 4.104

Por cierto, la LCD 3595 vino de una donación a la caridad de parte del Sr. Akenafab XD. Gracias ^^
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: BrunoF en 31 de Marzo de 2010, 13:40:02
Voy a advertir sobre algo que ya me ha cansado con CCS, y que me ha fallado, desde la version 4.088(incluso puede ser desde antes, no lo recuerdo) hasta la 4.104 que es la que uso ahora.

Intentar utilizar un puntero de una estructura para recorrer un array de dicha estructura resulta en DESASTRE. El problema es bastante evidente. El CCS muchas veces, no acomoda los elementos del array de la estructura consecutivamente en la RAM. Esto hace que obviamente luego, al querer recorrerlos con un puntero, el puntero se ubique en posiciones de memoria que no corresponden a ningun elemento del array, generando estragos en la ejecución del programa.
Considerense advertidos...
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: BrunoF en 31 de Marzo de 2010, 13:46:24
Hola Santiago. Seguramente sea un error del CCS.

Podrias hacer sino tambien,

Código: [Seleccionar]
      char j;
      char m=128;
     
      for (j=0; j<8; j++)
      {
        if (Hello_World[i][k] & m)    //Should there be a letter pixel here?
        {
          LCD_Out(0x00, 0);            //yes - draw it in black
          LCD_Out(0x00, 0);           
        }
        else
        {
          LCD_Out(0xFF, 0);            //no - draw background in white
          LCD_Out(0xFF, 0);
        }
        m/=2;
      }

Para eliminar por completo errores asociados a la funcion << y hacer el bucle un poquito mas rapido(aunque consumiendo un byte mas de RAM)...

Saludos.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: migsantiago en 31 de Marzo de 2010, 13:48:31
Hola Bruno, es cierto que eliminaría el uso de <<, pero la división como tal introduciría más código rom... ¿?  :huh:
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: BrunoF en 31 de Marzo de 2010, 15:05:37
Hola Bruno, es cierto que eliminaría el uso de <<, pero la división como tal introduciría más código rom... ¿?  :huh:

No, para nada. El CCS lo traduce como una rotacion de 1 bit hacia la derecha(ya que recordemos que rotar 1 bit a la derecha es lo mismo que dividir el valor por dos). Es una optimizacion muy basica de los compiladores. Deberia solo generar 1 linea ASM en los PIC24(rotacion a la derecha sin carry, no se como sera en ese instruction set el nombre preciso)
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: migsantiago en 31 de Marzo de 2010, 15:53:01
OK, gracias.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: elperrov en 12 de Mayo de 2010, 00:19:04
Gracias Pocher por este aporte, hace dias que estoy luchando con esto, y no podia simular la logica. Te mereces un premio.

Saludos.

Maxi.

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

Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: BrunoF en 07 de Agosto de 2010, 21:19:11
La solución que propone Potcher para la interrupción de cambio de estado en [RB4;RB7] no es del 100% correcta en mi opinión.

Deberíamos intentar no recurrir al ASM dentro del compilador, debido a que movf port_b,0 es una instrucción que depende de la página actual donde se encuentre actualmente trabajando el programa. Si por algún motivo el programa está en otra página, podemos leer en lugar del PORTB el TRISB u otro dependiendo del uC en cuestión, fracasando en ese caso en la intención original de refrescar el latch interno del PORTB asociado a dicha interrupción.

Podríamos entonces, antes de hacer el movf, forzar el código al banco 0, pero si bien sirve para efectuar correctamente el movf, entramos ahora con un potencial problema, debido a que le hemos cambiado el banco al CCS, quien seguramente no contemple ésto, y cuando continúe con su código compilado puede afectar a las variables incorrectas debido al cambio de banco no contemplado por él. Entonces, completamente seguro sería guardar el banco que está usando el CCS en una variable auxiliar, pasar al banco0, leer el puerto y restaurar el banco antes de devolverle el control al compilador...

Personalmente yo uso:
   input_b();

y el mirando el código ensamblado hace precisamente éso. Lee el PORTB.

Un saludo.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: chasmam en 20 de Agosto de 2010, 20:33:59
hola a todos, he estado utlizando el compilador ccs 4.093 y 4.1 y veo que estos dos ultimos presentan problemas , he intentado probar el algoritmo ya implementado del la FFT y veo que presenta problemas en el calculo de los twid factors, debido a que utiliza las funciones seno y coseno para crearlos respectivamente.  si ha alguien le funciona perfectame este ejemplo hacerlo saber, gracias... el elemplo se llama EX_FFT, parece que a nadie le a funcionado :>( :shock:
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Mario en 05 de Noviembre de 2010, 12:35:36
Estoy trabajando con el PIC18F45K22 en la versión "actual"  ;-)


Se ha enviado un correo a los de CCS y se supone ya tomaron el caso, inclusive asignaron un número de identificación para el seguimiento.

El problema es con la nueva definición de estos k22 (1.8 hasta 5.5 de riel a riel) en sus registros. Para los k20 (3.3v) los registros no cambian.

Acá dejo lo que se envió (en el adjunto).


Ahora estoy teniendo problemas con el UART#1, ya que es posible enviar información pero cuando se pretende recibir, no prospera el asunto. Se publicarán los resultados pero quizá sea el domingo.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: facuenta en 18 de Diciembre de 2010, 13:11:46
Yo tuve un problema con la biblioteca flex_lcd.c. Estoy programando el nuevo PIC 16F1936 en CCS y cuando probé de usar el MPLAB SIM para medir los tiempos con el STIMULUS agregándole los dos canales ADC... en la simulación se me quedaba en la biblioteca flex_lcd.c como si hubiera un lazo infinito... la cuestión que me dijeron que el MPLAB SIM toma al LCD como si estuviera apagado entonces esa biblioteca(flex_lcd.c) tiene un bug ahí??? Alguien sabe como solucionar eso?


Me estoy volviendo loco para medir los tiempos que necesito calcular para agregarle a mi programa un reloj... y el "PIC SIMULATOR IDE" todavía no cuenta con este microcontrolador y la opción que me quedaba hasta donde se es el MPLAB SIM ya que los del CCS y del PROTEUS no son de tiempo exactos ya que dependen del reloj de la máquina.

Si hay algún experto que me lo pueda responder se lo voy a agradecer.

Saludos,
Facundo
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: richardjr en 28 de Diciembre de 2010, 20:30:22
Hola! ya postee mi duda por fuera de este hilo, pero quisiera pedir ayuda aca tambien, no repito el post, simplemente dejo el link de mi consulta, he estado pensando que podria ser un bug del CCS tambien... ustedes diran!

Consulta sobre PPS e intercambio de puertos para UART (http://www.todopic.com.ar/foros/index.php?topic=33321.0)

Gracias!!
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: PalitroqueZ en 29 de Diciembre de 2010, 16:13:57
en la simulación se me quedaba en la biblioteca flex_lcd.c como si hubiera un lazo infinito... la cuestión que me dijeron que el MPLAB SIM toma al LCD como si estuviera apagado entonces esa biblioteca(flex_lcd.c) tiene un bug ahí??? Alguien sabe como solucionar eso?



¿y lo has probado en físico?

recuerda que la lcd debe responder al pic, y si no le das esa respuesta manalmente por mplab-sim, siempre se quedará esperando

Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: facuenta en 30 de Diciembre de 2010, 08:17:42
Muchas gracias PalitroqueZ!
Voy a probar a ver si es eso.
Saludos,
Facundo
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: rodrigo_control2009 en 17 de Enero de 2011, 13:59:50
Hola tuve  algunos problemas con la recepción usb_cdc. Hice varias pruebas con el CCS 4.104 y  generaba problemas en la recepción usb_cdc, ya que la rx/tx  por el modulo serie funciona bien y lo que recibe por el modulo serie y retransmite por el usb_cdc funciona muy bien, quedando  solo  con problemas la recepción usb_cdc.
El problema se solucionó al compilar el mismo código, con una versión anterior de CCS 4.023.
Todo lo he realizado en win 7  64 bit
Este es el Cod

#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
#include <usb_cdc_HomeScada.h>                  //puede  ser  cualquier otro a gusto del usuario



char s;

void main(){
char c=0x00;
delay_ms(300);
usb_cdc_init();                         //esta  en  usb_cdc   y  configura  los  baudios, bit paridad etc
usb_init();                             // esta en pic18_usb llama  a usb_init_cs() q a su vez  llama a usb_task()
while(!usb_cdc_connected()) {}

enable_interrupts(global);
enable_interrupts(int_rda);


do{
 usb_task();                             //está en pic18_usb
 if (usb_enumerated())     {
 c=usb_cdc_getc();                     //if (c != 0x00){     // si lo  recibido por usb no  es NULL
 usb_cdc_putc(c);
 putc(c);
 c=0x00;                               // lo retransmite por rs232 y hace eco usb
                           }
 } while(true);
         }

#int_rda
void serie_isr(){
if (kbhit()){
   output_high(pin_c0);         //enciende led para  monitorea q entro en rutina de rx
   s=getc();
   putc(s);
   delay_ms(1);
   output_low(pin_c0);
   usb_task();                 //está en pic18_usb
 if (usb_enumerated()){ if (s != 0x00) usb_cdc_putc(s); s=0x00;}
}}
Título: Posibles "bugs" del Compilador C CCS v4.114
Publicado por: gmua en 30 de Enero de 2011, 20:42:45
Yo tuve problemas con la versión 4.114 y los LCD's de 16X2, el siguiente programa compilaba bien pero no mostraba nada en el ISIS, probé con otros ejemplos, busqué posibles soluciones en los foros de electrónica y nada, hasta que cambié a la versión 4.106 y todo funcionó correctamente, no he encontrado ninguna mención de este error en los foros, espero les sirva, saludos.

Código: [Seleccionar]
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

#include <lcd.c>

void main() {

   lcd_init();
   lcd_putc("\fReady...\n");
}
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: vdiazg en 07 de Marzo de 2011, 19:59:42
Una consulta, alguien sabe que significa cuando en la ventana de watch del MPLAB en algunos registros en la columna donde dice address sale una letra "P" verde y gordita, aveces sale cuando lo simulo paso a paso; la verdad no creo que me haya afectado en algo a mis programas pero siempre me queda esa duda, creo que me sale por lo general cuando los programas son extensos.

Uso MPLAB v8.40 y CCS 4.114

Muchas Gracias
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: MLO__ en 26 de Marzo de 2011, 22:11:25
Hola.

No se si será un bug ... pero me paso lo siguiente con la función memset():

Resulta que después de adquirir un string por la USART, aplicaba esa función para limpiar el buffer de recepción y me afectó la interrupción del Timer0 con la cual generaba un PWM. La solución: clarear las variables con un for

Saludos

Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Diego E. en 30 de Marzo de 2011, 14:38:27
Hola amigos, lo que me está sucediendo es verdaderamente incomprensible, sólo por configurar una variable (sin utilizarla siquiera), el programa se altera y se incrementa en 285 líneas (4%), el caso es este.

con esta configuración el programa se altera en algunas funciones y se incrementa 285 líneas
Código: [Seleccionar]
int con_grabar_memo;
int tiempo_menu;
int16 peso_bruto;

short ban_05seg;
short ban_1seg;

De esta forma el programa funciona bien y se disminuye 285 líneas
Código: [Seleccionar]
int con_grabar_memo;
int tiempo_menu;
//int16 peso_bruto;

short ban_05seg;
short ban_1seg;

Pues estos fantasmas no los entiende nadie, pero si alguien tiene algún comentario, bienvenido.

Saludos.

Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: PalitroqueZ en 30 de Marzo de 2011, 15:03:59
Diego eso si está raro  :shock:

¿que versión usas?

trata lo siguiente, para los bits que declaras mas abajo, declara un entero de 1 byte (int8) y luego defines los primeros dos bits a esos short, luego descomentas el int16 y compila a ver que sucede

Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Diego E. en 30 de Marzo de 2011, 18:17:03
Hola Pedro, yo utilizo la 4.119 pero probé este mismo programa con la versión 4.057 y sucede lo mismo, probé agrupando los short y pasa igual.

el programa se "arregló" al configurar otras cinco variables de las mismas, peso_bruto2, peso_bruto3, ... peso_bruto6, me da por pensar que como el PIC 16F876a tiene mapeada la RAM en varios bancos mi programa se encuentre en el límite de alguno de ello...???
Código: [Seleccionar]
int tiempo_menu;
int16 peso_total;
int16 peso_cero;
int16 peso_inicial;
int16 valor_ad;
int16 valor_temperatura;
int16 peso_total_alar;
int16 peso_bruto;
int16 peso_bruto2;
int16 peso_bruto3;
int16 peso_bruto4;
int16 peso_bruto5;
int16 peso_bruto6;
signed int16 peso_post_cero;
signed int16 peso_diferencia;
signed int16 peso_modi;
signed int16 res_peso_modi;
signed int16 memoria_actual;

Todas las variables que tengo definidas
Código: [Seleccionar]
char dato_recibido;

int dir_ad1100 = 0b10010000;
int pos_flecha;
int max_flecha;
int min_flecha;
int con_menu;
int res_con_menu = 255;
int reg_led;
int con_1seg;
int dec_hora; //Definicion de variables ds1307
int uni_hora;
int dec_minu;
int uni_minu;
int dec_seg;
int uni_seg;
int dia_sem;
int dec_dia;
int uni_dia;
int dec_mes;
int uni_mes;
int dec_anio;
int uni_anio;
int dec_hora_ini;
int uni_hora_ini;
int dec_minu_ini;
int uni_minu_ini; //variable peso inicial
int dec_dia_ini;
int uni_dia_ini;
int dec_mes_ini;
int uni_mes_ini;
int dec_anio_ini;
int uni_anio_ini;
int dec_h_tempo;
int uni_h_tempo;
int dec_m_tempo;
int uni_m_tempo;
int reg_configura;
int reg_peso_mover;
int con_cheq_mover = 4;
int respaldo_global;
int confi_decimal;
int segundos;
int numero_memo;
int con_grabar_memo;
int tiempo_menu;
int16 peso_total;
int16 peso_cero;
int16 peso_inicial;
int16 valor_ad;
int16 valor_temperatura;
int16 peso_total_alar;
int16 peso_bruto;
int16 peso_bruto2;
int16 peso_bruto3;
int16 peso_bruto4;
int16 peso_bruto5;
int16 peso_bruto6;
signed int16 peso_post_cero;
signed int16 peso_diferencia;
signed int16 peso_modi;
signed int16 res_peso_modi;
signed int16 memoria_actual;

short ban_05seg;
short ban_1seg;
short ban_tec_enc;
short ban_tec_menu;
short ban_tec_cero;
short ban_tec_incre;
short ban_tec_decre;
short ban_tec_enter;
short ban_tec_salir;
short ban_tec_p_ini;
short ban_tec_lb;
short ban_tec_m_peso;
short ban_tec_mover;
short ban_tec_tempo;
short ban_tec_egreso;
short ban_temperatura;
short ban_buzzer;
short ban_reloj;

const char los[] = "LOS";
const char pinos[] = "PINOS";
const char tecnologia[] = "TECNOLOGIA PARA UNA    VIDA MAS FACIL    www.lospinos-sa.com ";
//"TECNOLOGIA-PARA-UNA----VIDA-MAS-FACIL----www.lospinos-sa.com-"
const char peso[] = "PESO";
const char actu[] = "Actu.";
const char inic[] = "Inic.";
const char dife[] = "Dife.";
const char mover[] = " Mover";
const char egreso[] = "Egreso";
const char decimal[] = "Decimal";
const char memoria[] = "Memoria";
const char hora_fecha[] = "Hora fecha";
const char hh_mm[] = "hh:mm";
const char temporizar[] = "Temporizar";
const char configuracion[] = "Configuracion";
const char temporizador[] = "Temporizador";
const char cero[] = "Fijar cero y";
const char restablecer[] = "restablecer los";
const char registros[] = "registros ?";
const char p_inicial[] = "Fijar peso inic. ?";
const char peso_ini[] = "Peso ini.";
const char modi_peso[] = "Modificar peso ?";

char cadena_peso[] = "0000000";

Gracias.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Diego E. en 30 de Marzo de 2011, 18:52:35
Señores, lamento lo sucedido, al menos en esta oportunidad no hay un bug en CCS, es un error mío, estaba cargando un array definido con 8 caractares con igual número de datos no dejando espacio para el caracter nulo, entonces este se desbordaba en cualquiera variable.

He aquí la importancia y/o beneficio de la depuración paso a paso.

Muchas gracias.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: BrunoF en 31 de Marzo de 2011, 00:10:58
Aporto otro bug relacionado a la librería usb.c.

Estoy utilizando el CCS v4.110.

Utilizando modo HID en la librería, si el array  USB_CLASS_SPECIFIC_DESC[] = {data...} excede los 256 elementos, el uC falla al enviar el descriptor o parte de el a la PC y resulta en un fallo de instalacion en el sistema operativo.

La solución la encontré yendo al archivo USB.C y cambiando la linea 173:
int8 usb_getdesc_ptr; unsigned int8 usb_getdesc_len=0;             //for reading string and config descriptors

por esta:
int16 usb_getdesc_ptr; unsigned int16 usb_getdesc_len=0;             //for reading string and config descriptors

Y ahora si, todo rula de maravillas.

Este error solo sucede si se utilizan dispositivos HID, y con una tabla de descriptores con un tamaño mayor a los 256 elementos como he mencionado.

Saludos.


Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: KALLITOS en 15 de Abril de 2011, 19:01:24
Hola amigos, esta vez un bug, no del compilador en si, mas es en el editor. Y es que cuando realizo comparaciones utilizando el caracter { o } el orden de las ramas se pierde , y cuando cierro rama no la hace correctamente:

Código: [Seleccionar]
     
switch(buffer_teclado[++direccion_buffer_teclado])
         {
         case 'T':         ///CONFIGURACION QUE INDICA EL NUMERO DE TEXTO Y REALIZA LA DETECCION DE
               {
               if(buffer_teclado[direccion_buffer_teclado+2] == '}')                   ///DETECTA SI EL VALOR ES DE 1 CIFRA
                  {
                  if(isdigit(buffer_teclado[++direccion_buffer_teclado]))              ///SE ASEGURA QUE EL DATO ES UN NUMERO VALIDO
                     {
                     direccion = (buffer_teclado[direccion_buffer_teclado])-48;       ///SETEA EL VALOR DE LA DIRECCION EN LA KE SE
                     direccion *= 100;                                                 ///LOS PAKETES DE DIRECCIONES SON MULTIPLOS DE 100
                     ++direccion_buffer_teclado;                                       ///SE COLOCA EL BUFFER PARA QUE LEA LA SIGUIENTE {
                     itera_max++;                                                      ///SE AUMENTA EL CONTROL DE VECES MAXIMO QUE SE ESTA EN ESTA FUNCION
                     }
                  }
               }


Cuando cierro en case 'T' se me cierra hasta if(buffer_teclado[direccion_buffer_teclado+2] == '}') lo demas se keda fuera, mas la compilacion es correcta.

Algo parecido ocurre cuando se usa el caracter '.

saludos

Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: PalitroqueZ en 15 de Abril de 2011, 20:00:05
kallitos coloca la versión del IDE donde se presenta la falla
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: KALLITOS en 15 de Abril de 2011, 20:11:45
4.088

(http://img683.imageshack.us/i/iderk.jpg/)
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: MGLSOFT en 16 de Abril de 2011, 09:09:05
Es probable lo hayan resuelto en las nuevas versiones, mira en la lista de actualizaciones a partir de esa versión a ver si no lo encuentras resuelto...
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: KALLITOS en 16 de Abril de 2011, 12:22:31
Instale la 4.119 y lo mismo, pero me ocurrio un problema con usb cdc y me regrese a la anterior.

saludos
Título: bootloader pdfsusb no funciona en 4.114
Publicado por: electro_0x7c1 en 22 de Abril de 2011, 05:33:23
Saludos, he trabajado con el bootloader usb de Microchip, con la aplicacion PDFSUSB para descargar programas al PIC18F4550, hago los programas en CCS Version 4.023 y todo funciona bien, pero ahora quise instalar la version 4.114 compilo los programas y los grabo con el PDFSUSB el cual marca que todo se grabo bien pero creo que no los graba en realidad porque el PIC no hace nada.

Perdon por esta pregunta, es que ya llevo algun tiempo queriendo usar el bootloader de Microchip con esta version 4.114 y no encuentro el porque con esta version mas reciente no puedo usar el bootloader de Microchip y con la anterior si. He visto los archivos .HEX generados de las ambas versiones y son completamente diferentes.

Saludos.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: jhozate en 19 de Mayo de 2011, 19:47:56
no se si si ya lo han publicado como bug o es que estoy errado, uso la version 4.119 y andaba haciendo una temporizacion con el timer0 en un 18f4550, como bien se sabe el timer0 puede ser configurado a 8 o 16bit, por defecto esta a 16bit, pues bien quise configurarlo a 8bit con la funcion de ccs SETUP_TIMER_0() y en el .h del pic esta que se puede escribir  T0_8_BIT o tambien RTCC_8_BIT  y ninguna de las dos funciona, el timer sigue configurandose por defecto
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: BrunoF en 02 de Junio de 2011, 23:36:11
Bueno, me han respondido de CCS, diciendome que estan al tanto de mi reporte de bug, y que me agradecen el detalle del error ofrecido(les detalle todo :) ) y que lo estan investigando. Espero verlo solucionado en la próximas librerias usb :)
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Suky en 02 de Junio de 2011, 23:47:52
Bueno, me han respondido de CCS, diciendome que estan al tanto de mi reporte de bug, y que me agradecen el detalle del error ofrecido(les detalle todo :) ) y que lo estan investigando. Espero verlo solucionado en la próximas librerias usb :)

Heee... Pero que paguen, como los de facebook, para encontrar bug y le llena la casilla del correo!  :D :D :D
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: BrunoF en 02 de Junio de 2011, 23:49:15
Facebook paga por encontrar errores?  :shock: Yo ya vi unos cuantos... :)
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: RICHI777 en 03 de Junio de 2011, 00:04:31
Hola a todos los que aportan en este sub-foro deberían reclamarle a CCS que les pague un sueldo por ser excelentes beta-testers !!!, las cosas que leo no las puedo creer.

Saludos !
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Suky en 03 de Junio de 2011, 11:24:41
Facebook paga por encontrar errores?  :shock: Yo ya vi unos cuantos... :)

Si, al igual de Google: http://america.infobae.com/notas/26281-Facebook-pagara-por-detectar-sus-errores

Saludos!
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: pabloi en 21 de Junio de 2011, 12:35:36
hola muchachos!! estoy realizando en ccs una multipliacación entre un número positivo y uno negativo:

char Ki=5;
int error;
long iT;

iT=Ki*error; //Calcular termino integrativo i(kT)
printf("Integral_actual: %Ld\n\r", iTact); //%Ld Long signed int


Mi duda es la siguiente:
si error=1 y Ki=5 -> iT=5, hasta acá todo perfecto!

ahora el tema es cuando:
si error=-1 y Ki=5 -> iT debería ser -5
pero el valor que me devuelve es 251... esto es porque hace una representación en complemento A2??

5=101
si le hacemos el complemento A2: 1111 1010=250 + 1=251

es correcto estos?

Saludos y gracias!

Pablo.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: bmb en 21 de Junio de 2011, 13:58:17
Hola pabloi, lo que te devuelve (251) es correcto, ya que tienes declaradas tanto la variable Ki (char) y la variable error (int), que en CCS son variables enteras de 8 bits sin signo.  Lo mismo aplica para la variable iT (long) que en CCS es una variable entera de 16 bits sin signo.  Para obtener el resultado que deseas, debes declarar las variables con signo, por ejemplo:

Código: C
  1. signed int error;
  2. signed long iT;

Saludos!
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: pabloi en 21 de Junio de 2011, 15:19:51
Hola bmb, te agradezco muchisimo, ahora funciona perfecto.

Mi confusion estuvo cuando mire la ayuda del ccs que dice
C Standard Type   | Default Type
char                       unsigned int8
int                          int8
long                        int16

como vi que en el char le aclaraba que era sin signo, supuse que int ya era con signo como dice int8... yo tenia entendido que int8 es con signo y uint8 es sin signo, es correcto?

signed int es 7 bits mas el signo? -127 a 128
signed long es 15 bits mas el signo? -32768 a 32767

Muchas gracias!
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: bmb en 21 de Junio de 2011, 17:28:13
Hola pabloi, me alegra que te funcione el programa y bienvenido al foro!

Del manual de CCS:

Citar
Basic Types
                                                                                                  Range
                                                          ________________________________________________
Type-Specifier          Size                      Unsigned                               Signed                     Digits

    int1                    1 bit number                   0 to 1                                    N/A                          1/2
    int8                    8 bit number                   0 to 255                              -128 to 127                 2-3
    int16                 16 bit number                   0 to 65535                       -32768 to 32767             4-5
    int32                 32 bit number                   0 to 4294967295      -2147483648 to 2147483647    9-10
    float32              32 bit float                                  -1.5 x 1045 to 3.4 x 1038 7-8

C Standard Type Default Type
short         int1
char          unsigned int8
int             int8
long          int16
long long   int32
float          float32

Note: All types, except float , by default are unsigned; however, may be preceded by unsigned or
signed . Short and long may have the keyword INT following them with no effect. Also see #TYPE
to change the default size.

Saludos!
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: brutto en 30 de Junio de 2011, 15:30:36
me ocurre un problema con la interrupcion INT_RDA en CCS:
1. inicializo el micro, le pongo disable_interrupts(int_rda), muestro por el LCD un par de mensajes, y luego enable_interrupts(int_rda).
Si en el momento de los mensajes (con disable rda) recibo una transmision serie ya no funciona el puerto serie en todo el programa.

2. si dejo la interrupcion enable desde el principio del programa pero entre mensaje y mensaje hago un delay_ms(2000) y en esos delays recibo una trama por serie, tambien se queda sin funcionar el serie en el resto del programa.

3. si dejo interrupcion rda enable desde el principio y hago un bucle do while despues de cada mensaje (ya que tengo un timer de segundos) y en ese bucle do-while recibo una trama, esta si la lee y funciona ok el programa.

4. si deshabilito la interrupcion rda desde el cominzo, hago envio lcd los 2 mensajes con retardo do-while y recibo trama, activo interrupcion rda, ya no hace nada.

5. deshabilito interrupcion rda, envio trama, la habilito sin delays ni nada y se queda sin funcionar en el resto del programa.

alguien sabe porque solo me funciona en el modo 3?

pd: parece ser que no me funciona el disable_interrupts(int_rda), ya que si lo tengo deshabilitado y tengo desde el comienzo del programa el pin de recepcion como entrada no deberia de pasar nada no? o es porque configuras #use rs232(baud=9600, parity=N, xmit=PIN_C6, rcv=PIN_C7) //Configuracion RS232 desde el comienzo del programa?
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: BrunoF en 04 de Julio de 2011, 19:11:03
Debe ser por desbordamiento del buffer de entrada. Proba poniendo el modificador ERRORS en la configuracion del RS232.

Saludos.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: edaniel en 05 de Julio de 2011, 13:18:30
Hola saludos a todos... Soy nuevo en esto de pic m han comentado q el lenguaje C es mas facil q el amsembler para programar. yo quiero hacer un programa q me muestre en pantalla la temperatura transmitida por una pt100 y una termocupla para establecer diferencias entre las dos pero no se como hacer el programa en c. ya descargue un tutorial de C para conocer las variables y como se programa pero necesito una ayuda. Gracias.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: edaniel en 05 de Julio de 2011, 13:21:08
y lo que se me hace un poco dificil entender es la conversion del adc
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Suky en 05 de Julio de 2011, 13:29:58
y lo que se me hace un poco dificil entender es la conversion del adc

Primero que nada, publica tus preguntas en el hilo que corresponda, no desvirtúes los temas  :? Utiliza el buscador, coloca Módulo de conversión analógica, o modulo ADC, y saldrá bastante información para leer.


Saludos!
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: lectra en 20 de Julio de 2011, 21:13:18
A mi me toco utilizar el metodo del acumulador  por que no realiza la suma a pesar de trabajar con int16 ambas variables, gracias por la ayuda
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: brutto en 22 de Julio de 2011, 07:45:18
hola, gracias por lo de ERRORS no sabia de esa funcion, y la verdad funciono ok, asi que era error mio de programacion y no bugs del ccs.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: marvicdigital en 06 de Agosto de 2011, 20:44:54
Hola a todos.
No se si ya se halla comentado antes, pero no es muy buena idea usar el PIC Wizard con librerías ya que por ejemplo en la versión 4.120 si uso el wizard para usar LCD me declara más los pines, cosa que la librería no reconoce y a pesar de que compila bien no funciona el LCD...tremendo fallo por que me hizo perder buenas horas :D

Saludos
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: fenixariel en 18 de Noviembre de 2011, 18:54:23
Alguna vez podremos usar la ultima version sabiendo que en esta se solucionaron los problemas de la version anterior??

Yo me quede con la v4.084,  la que casi no me dio problemas......



Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Correia en 27 de Noviembre de 2011, 20:53:39
quiero preguntar algo, veran en una simulacion con un pic16f628a en proteus el cual tiene conectado un teclado matricial 3x4 y un display A.C, hago mi programa y cuando lo cargo y simulo, no me simula nada y me aparecen muchos mensajes que dice "el portb es despreciado por el 16628" me pueden decir que significa? o es necesario que suba el codigo de programacion.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: antoniopa en 29 de Diciembre de 2011, 15:40:20
OJO CON EL CÁCULO DE LOS PWM

(ver ejemplo ex_pwm de ccs)

he descubierto un pequeño error en la documentación del uso del módulo PWM, si os fijais en los elemplos, para el uso de la función set_pwmx_duty(value), que indica el ancho del pulso, nos indica que para variables long la formula es tiempo=value*(1/clock)*t2div, y si usas un int es tiempo=value*4*(1/clock)*t2div, pues bien, yo he usado un int32 y he tenido que usar la segunda, o sea la de int8.

PROBADISIMO
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: jeremylf en 29 de Diciembre de 2011, 16:58:32
OJO CON EL CÁCULO DE LOS PWM

(ver ejemplo ex_pwm de ccs)

he descubierto un pequeño error en la documentación del uso del módulo PWM, si os fijais en los elemplos, para el uso de la función set_pwmx_duty(value), que indica el ancho del pulso, nos indica que para variables long la formula es tiempo=value*(1/clock)*t2div, y si usas un int es tiempo=value*4*(1/clock)*t2div, pues bien, yo he usado un int32 y he tenido que usar la segunda, o sea la de int8.

PROBADISIMO

Con que version(es) has probado esto?
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: MLO__ en 29 de Diciembre de 2011, 18:34:43
quiero preguntar algo, veran en una simulacion con un pic16f628a en proteus el cual tiene conectado un teclado matricial 3x4 y un display A.C, hago mi programa y cuando lo cargo y simulo, no me simula nada y me aparecen muchos mensajes que dice "el portb es despreciado por el 16628" me pueden decir que significa? o es necesario que suba el codigo de programacion.

Eso es problema del ISIS ..
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: JuanEZWon en 30 de Diciembre de 2011, 17:19:36
Bueno, pues a mi me pasaba en el CCS que cuando activo 2 interrupciones, la del SPI y la del TIMER0 al tiempo, y llega a ocurrir alguna de estas mientras estoy tratando arrays de 16 bits, al regresar de la interrupcion el CCS no devolvia el valor correcto a los registros y los arrays terminaban totalmente corruptos. La solucion fue desactivar las interrupciones antes de entrar en el sector en el manipulaba los arrays. Pero no podia hacer eso porque eran interrupciones de altisima prioridad las cuales tenia que atender si o si. pero encambio no sucedia  si solo activaba una de las dos interrupciones. la solucion final fue dejar el CCS y comenzar a utilizar el C18 a el cual le he encontrado cosas que no me gustan nada como por ejemplo a la hora de usar _ASM _ENDASM el C18 ya no optimiza el codigo.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: proteus en 16 de Enero de 2012, 02:39:08
Hola compañeros, he estado trabajando con las versiones 4.088 y 4.120 y no he tenido problemas, claro que los PIC´s con los que he trabajado en la versión 4.120 son los PIC16F1936/37, claro está que algunas de las herramientas que configuro en el wizard no quedan en el código, por tanto recomiendo colocarlos manualmente, por ejemplo:

 setup_lcd(LCD_DISABLED);
 setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
 setup_timer_2(T2_DIV_BY_16,250,16); //16ms
 set_timer1(15536);
 setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
 disable_interrupts(INT_EXT);
 enable_interrupts(INT_RDA);
 disable_interrupts(INT_TIMER1);
 disable_interrupts(INT_TIMER2);
 disable_interrupts(INT_TIMER4);
 disable_interrupts(INT_TIMER6);
 enable_interrupts(GLOBAL);
 setup_oscillator(OSC_16MHZ|OSC_TIMER1|OSC_PLL_OFF,0);

y tratar de no olvidar nada en la configuración, porque en ocasiones eso que no se coloca hace que el micro se comporte de una manera diferente.

Con la versión 4.088 he trabajado el PIC16F84A, PIC16F628A, PIC16F877A, PIC16F676, PIC16F818, PIC12F629, PIC12F675 y otros que se me pasan por ahora.

Espero que esto sirva para aquellos que están empezando con el CCS como referente de con que micros, en algunas aplicaciones no se han presentado los famosos bugs.

Saludos.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: KALLITOS en 02 de Febrero de 2012, 08:21:10
Hola a todos, vengo con uno, una raya mas al tigre.

Se trata de la version 4.124, el error esta en la habilitacion de las Pullups, estoy simulando con un pic18f25k22 el registro WPUB asociado a las pullups tiene direccion diferente.

                      correcta       CCS apunta
pic18f25k22        0xF61             0xF7C

la direccion 0xF7C corresponde al IPR4, y hace que el micro no responda como debe ser.

saludos
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: MLO__ en 26 de Febrero de 2012, 13:08:22
Hola.

Otra mas para la version 4.124 ...  :( :( :(

A la hora de simular el USB con el ISIS en Win7 & VMware no funcan los drivers para el USB Host Virtual ..

Solucion: Reemplazar los archivos usb_cdc.h, pic18_usb.h, usb.h, usb.c por los de una version anterior que si funcionen.

Lo extra;o es que si funcionan en Hard ....  :z)

Saludos
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: proteus en 06 de Marzo de 2012, 02:25:34
Hola compañeros, llevo desde noviembre del año pasado una busqueda del mejor compilador de C, todos mencionan el CCS, el PIC C de Hi-Tech y el MikroC, como los más conocidos, tuve a cargo un desarrollo con un modem GPRS y se me presentó un inconveniente, pensando en los famosos bugs del CCS, decidí que era hora de pasarme a algo más confiable, pero me quedó grande, el PIC C de Hi-tech, no encontré mucha información, ni librerias para ponerme a la par de mis necesidades y tiempos, así que decidí hacerle frente al MikroC, pero hace varios años trabajé con este y no me pareció muy estable, no se ahora como está, por último seguir con el CCS.

El problema era que despues de mucho trabajar con el RS232 enviando y recibiendo mensajes, en algunos momentos no me recibía más datos,  :5]

Solución dada por Suky, no lo encontré en este foro y desafortunadamente la página se me cerró con otras tantas y no alcancé a copiar el link  :? ... pero bueno Suky muchas gracias, lo que hice fué revisar el bit del OERR del registro RCSTA y desactivar el periférico y volverlo a activar, algo así:

 if(bit_test(RCSTA,1))
 {
  bit_clear(RCSTA,7);
  bit_set(RCSTA,7);
 }

esto en la interrupción de receción del puerto serie, a que va todo esto?.... que hasta el momento y con mi poca experiencia empiezo a creer que probablemente muchos de los "bugs" del compilador sean bugs del programador, cosas que a veces pasamos por alto y en realidad debemos hacerlo, creo que el PIC C funciona mejor porque tenemos que hacerlo todo, en otras palabras dejamos menos para el compilador y sus librerias por tanto cuidamos mucho que no se nos pase nada, en cambio nos confiamos de que el CCS haga muchas cosas por nosotros, la fácilidad de la herramienta nos hace vulnerables a ciertas situaciones.

Como el corrector ortografico de los editores de texto, nos hace olvidar las reglas ortográficas y la caluladora nos hace olvidar la manera de resolver las operaciones básicas.

Espero haber podido demostrar mi punto, agradezco mucho a todos los que participan en el foro, no soy un participante muy activo, pero si debo aceptar que le chupo sangre en forma al foro cada vez que puedo, espero pronto poder devolver un poquito al menos de lo mucho que he aprovechado de aquí para que otros al igual que yo se beneficien y puedan sacar adelante sus proyectos.

no es más!!... :-/ ... De nuevo muchas gracias!!!
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Correia en 06 de Marzo de 2012, 11:24:06
buenas tardes comunidad de todopic, no quiero molestar, pero me veo en la necesidad de ayuda, me gustaria la respuesta de alguien que ya alla trabajado con CCS compiler, la presente es que hice la programacion de una cerradura electronica, entonces le quiero agregar una rutina de hora, en donde muestra el tiempo, para eso lo hice por interrupcion de desbodamiento del TIMER0, pero cuando defino #int_TIMER0 y abajo escribo la funcion con sentencia a realizar, me presentar error al compilar y me menciona alglo de direccion no valida kernel.dll, aparte me dice algo de que lineas de programacion muy largas para MAIN =/ si alguien me puede ayudar.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Diego E. en 06 de Marzo de 2012, 13:38:58
Citar
aparte me dice algo de que lineas de programacion muy largas para MAIN =/ si alguien me puede ayudar.

Hola, algunos micros tiene dividida su memoria ROM en porciones de 2000 líneas lo que significa que no podemos superar este número de instrucciones por rutina, es aconsejable crear subrutinas e irlas llamando de acuerdo a la necesidad

Saludos.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: jhozate en 08 de Abril de 2012, 18:24:55
bueno, no he leido el post completo para ver si el bug esta repetido :oops:
Version 4.128
Bug: Problema con el seteo de bits en el ADCON1 al configurar voltajes externos para el ADC

Resulta que he querido configurar el ADC del pic18f2550 con voltajes de referencias externos diferentes de 5v y 0V. El CCS no setea los bit completamente, al menos para este caso, he usado la instruccion
Código: CSS
  1. SETUP_ADC(ADC_CLOCK_INTERNAL|VREF_VREF);
Los bits quedan configurados por defecto, es decir vref+=5v y Vref-=0

Solucion planteda:
En el encabezado inicial del programa definir el registro ADCON1 y posteriormente los bit a setear, que son el bit4 y bit5, correspondientes a VCFG0 y VCFG1
Código: CSS
  1. #BYTE ADCON1 =0XFC1
  2. #BIT  VCFG1=ADCON1.5
  3. #BIT  VCFG0=ADCON1.4

En el programa principal:
Código: CSS
  1. VCFG1=1;
  2. VCFG0=1;

Cambio y fuera! ;-)


Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Diego E. en 25 de Mayo de 2012, 11:37:30
Hola amigos, me sucede algo muy extraño con el PIC 12F675, cuando ejecuto la función menset el puerto GPO,0 se pone en cero

Código: C
  1. set_tris_a(0b111110);
  2. bit_set(gpio,0);
  3. memset(dato_recibido, 0, sizeof(dato_recibido));

este es el programa completo, ven algo extraño ?

Código: C
  1. #include <12f675.h>
  2.  
  3. #use delay(clock=4000000, restart_wdt)
  4. #fuses xt,wdt,brownout,put,protect,nomclr
  5.  
  6. #byte   gpio = 0x05
  7.  
  8. #define led_tecla gpio,0
  9.  
  10. int dato_recibido[5];
  11.  
  12. void main()             //Rutina principal
  13. {
  14. set_tris_a(0b111110);
  15. bit_set(gpio,0);
  16. memset(dato_recibido, 0, sizeof(dato_recibido));
  17.  
  18. while(true)            
  19.         {
  20.                 delay_ms(10);
  21.         }
  22. }

Gracias por su interés.

Saludos
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Diego E. en 25 de Mayo de 2012, 13:56:31
Si utilizo el PIC16F876 esto no sucede, viendo el código desensamblado encuentro diferencias entre las funciones memset

PIC12F675

Código: ASM
  1. .................... memset(dato_recibido, 0, sizeof(dato_recibido));
  2. 0035:  CLRF   05
  3. 0036:  MOVLW  24
  4. 0037:  MOVWF  04
  5. 0038:  CLRF   20
  6. 0039:  MOVLW  05
  7. 003A:  MOVWF  21
  8. 003B:  GOTO   004

PIC16F876A

Código: ASM
  1. ....................    memset(dato_recibido, 0, sizeof(dato_recibido));         
  2. 019B:  MOVLW  2F
  3. 019C:  MOVWF  04
  4. 019D:  BCF    03.7
  5. 019E:  CLRF   77
  6. 019F:  MOVLW  05
  7. 01A0:  MOVWF  78
  8. 01A1:  CALL   0C7

En el PIC12F675 se ve que la función introduce CLRF 05 (limpiar el gpio), que será lo que sucede ?.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: MLO__ en 25 de Mayo de 2012, 20:13:42
Hola.

Yo tuve problemas con esa funcion en otros micros .. por eso no la volvi a utilizar ... mejor recurri a un ciclo for

Saludos
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Diego E. en 25 de Mayo de 2012, 22:54:39
Hola Miguel, si, me deja desconcertado esto y créame que me genera una gran desconfianza utilizarla.

Saludos.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: darck_khronos en 25 de Mayo de 2012, 23:13:58
Hola Miguel, si, me deja desconcertado esto y créame que me genera una gran desconfianza utilizarla.

Saludos.

que vercion tienes del CCS
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Diego E. en 25 de Mayo de 2012, 23:23:02
Hola amigo, tengo la versión 4.130, he probado con los siguientes PIC y funciona mal 12F675-629-676, con 628-676 funciona bien

Saludos.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: darck_khronos en 25 de Mayo de 2012, 23:40:45
Hola amigo, tengo la versión 4.130, he probado con los siguientes PIC y funciona mal 12F675-629-676, con 628-676 funciona bien

Saludos.

por que no regresas a la 4.084 es la mas estable que hay
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Diego E. en 26 de Mayo de 2012, 13:03:35
Porqué dices que esa versión es la más estable ?, la usas ?

Saludos
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: darck_khronos en 26 de Mayo de 2012, 13:08:11
Porqué dices que esa versión es la más estable ?, la usas ?

Saludos

si es con la que trabajo, instale la 0.94 hasta la 131, pero siempre hay algo que falla, y las pruebas las realizo con los Booloaders de microchip.

cuando compilo los ejemplos del CDC en proteus trabaja normal, pero al pasar el hex al micro no realiza nada siempre pasa eso con los bootloader, por lo mismo si sale algo nuevo y no trabajo con los boots y a se que alguna libreria o instruccion siempre handa mal.

con la 84 no he tenido ningun problema y hasta el momento no me ha fallado en nada
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Diego E. en 26 de Mayo de 2012, 13:45:23
Muchas gracias, lo tendré en cuenta

esto me responden en el foro de CCS http://www.ccsinfo.com/forum/viewtopic.php?p=162778#162778 (http://www.ccsinfo.com/forum/viewtopic.php?p=162778#162778)

Saludos.
Título: ayuda
Publicado por: swivels en 11 de Noviembre de 2012, 16:02:41
hola que tal, tengo una duda a ver si me pueden ayudar, quiero hacer un programa en c, para iluminar una escalera de mi casa con x cantidad de escalones sera un led por cada uno, tendre un interruptor (eso lo manejare externo, aparte con una compuerta)  al inicio y al final de la escalera, con un display 7 segmentos uno en cada extremo, con el selector activo la iluminacion de la escalera a traves de un interruptor, en el display cada numero es  una manera diferente de iluminar los escalones y asi quedara hasta que se desactive. habran 9 tipos diferentes de que se ilumine la escalera. bueno de antemano le doy las gracias!!! saludos
Título: Re: ayuda
Publicado por: ppyote en 11 de Noviembre de 2012, 22:25:54
hola que tal, tengo una duda a ver si me pueden ayudar, quiero hacer un programa en c, para iluminar una escalera de mi casa con x cantidad de escalones sera un led por cada uno, tendre un interruptor (eso lo manejare externo, aparte con una compuerta)  al inicio y al final de la escalera, con un display 7 segmentos uno en cada extremo, con el selector activo la iluminacion de la escalera a traves de un interruptor, en el display cada numero es  una manera diferente de iluminar los escalones y asi quedara hasta que se desactive. habran 9 tipos diferentes de que se ilumine la escalera. bueno de antemano le doy las gracias!!! saludos

no creo que este sea un buen sitio para pedir lo que buscas... hay subforos en los cuales estaria mejor este tema, ademas nadie te va ha hacer la faena, como es de comprender....

lo que te recomiendo es que expongas esquemas, codigo que tengas hecho y las dudas.... que ninguno se negara a ayudarte ante cualquier problema pero todos se negaran a dartelo masticado...
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: matyvico en 25 de Enero de 2013, 01:27:37
Voy a advertir sobre algo que ya me ha cansado con CCS, y que me ha fallado, desde la version 4.088(incluso puede ser desde antes, no lo recuerdo) hasta la 4.104 que es la que uso ahora.

Intentar utilizar un puntero de una estructura para recorrer un array de dicha estructura resulta en DESASTRE. El problema es bastante evidente. El CCS muchas veces, no acomoda los elementos del array de la estructura consecutivamente en la RAM. Esto hace que obviamente luego, al querer recorrerlos con un puntero, el puntero se ubique en posiciones de memoria que no corresponden a ningún elemento del array, generando estragos en la ejecución del programa.
Considerense advertidos...

Primero que nada este es mi primer posteo en el foro, aunque siempre lo segui muy de cerca por diversos motivos y siempre me sacaron del apuro sin necesidad de que posteara (usando el buscador, como corresponde). Perdón por resucitar el tema pero leyendo justo encontré algo similar a lo que me sucedió.

Volviendo un poquito mas atrás (perdón por eso), a al texto citado, escrito por BrunoF, quiero votar a favor del bug que encontró porque me parece que en una aplicación que estoy desarrollando (un generador de señales) me sucede que para un menú que genero para mostrar en un LCD de NOKIA 1100 genero una función para reutilizar código, ya que son muchas las posibilidades y los items de los menúes que pienso incluir. Con un botón (interrupción externa por RB0) se llama a la función menu(opc) que usa como parámetro un char global (o esa es la idea) donde se encuentran los nombres de los items a mostrar en el LCD, la función lo que hace es ubicar el "cursor" en el LCD y enviar a escribir el elemento sub-i de ese char. El programa es el siguiente:

Código: [Seleccionar]
char opc[7][15];

#INT_EXT NOCLEAR
void EXT_isr()
{
   char opc[7][15]={"Tipo de onda","Frecuencia","Periodo","","","",""}; //VECTOR GLOBAL
   while(!bit_test(PORT_B,0)){delay_us(200);}
   disable_interrupts(INT_EXT1 && INT_EXT2);
   clear_interrupt(INT_EXT);
   menu(opc);
}

void menu(char opc)
{
   int i;

   disable_interrupts(INT_EXT);
   disable_interrupts(INT_EXT1);
   disable_interrupts(INT_EXT2);
   lcd_clear();
   gotoxy(0,0);
   printf(print_char,">");
   for(i=0;i<=6;i++)
   {
         gotoxy(10,i);
         printf(print_char,opc[i]);
   }
}

Se que por ahí no tiene punto de comparación pero este "mismo" (muy muy muy similar) pedacito de código lo usé unos años atrás para un proyecto hecho en Borland C, de cualquier manera debería funcionar.

Yendo al grano, lo que me sucede es que en "la vida real" no se escribe el menú, y en el proteus , observando el contenido del array pasan cosas muy raras, o hace referencia (como un puntero) a la primera letra del primer elemento (en este caso "T"), o a veces me genera la matriz de 7 x 15 pero cuando se hace el llamado a la función menu() el array char pierde todo su contenido y la matriz completa (o el puntero) queda con valores de caracter nulo: '\0'. Lo que me asombra de todo esto, es que la variable que yo defino es de tipo GLOBAL! no debería cambiarse (a no ser que reemplace los valores, supongo... por lo que tengo entendido).

La forma que encontré de solucionarlo es generando el vector char opc[7][15]={"Tipo de onda","Frecuencia","Periodo","","","",""}; (o lo que sea que le quiera mandar a escribir) de forma LOCAL dentro de cada función que requiera a su vez llamar a la función menu() y escriba lo que sea que este en su vector opc en el LCD. Ejemplo de código (QUE FUNCIONA PERFECTO):

Código: [Seleccionar]
#INT_EXT NOCLEAR
void EXT_isr()
{
   while(!bit_test(PORT_B,0)){delay_us(200);}
   output_toggle(PIN_C2);
   disable_interrupts(INT_EXT1 && INT_EXT2);
   clear_interrupt(INT_EXT);
   menu();
}

void menu()
{
   int i;
   char opc[7][15]={"Estado","Tipo de onda","Amplitud","Frecuencia","Periodo","Duty cicle",""};

   disable_interrupts(INT_EXT);
   disable_interrupts(INT_EXT1);
   disable_interrupts(INT_EXT2);
   lcd_clear();
   gotoxy(0,0);
   printf(print_char,">");
   for(i=0;i<=6;i++)
   {
         gotoxy(10,i);
         printf(print_char,opc[i]);
   }
}

Esos dos pedazos de código los probé para las versiones 4.093 (actual) y 4.130 (los peores errores imaginables) y para la simulación el Proteus versión 7.8 SP2 (probé la 7.10 SP0 y fué desastrosa su estabilidad). El PIC es un 18F4550 y creo que no me olvido de ningún dato más...

Gracias de antemano y espero le encontremos solución!
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: BrunoF en 25 de Enero de 2013, 10:48:44
Hola matyvico,

tal vez no sea ayuda ni consuelo, pero podrías intentar forzando al CCS a que guarde el array justo alineado al inicio de un banco de RAM, de esa forma por ahi el CCS te lo pone secuencialmente de corrido. Había una sentencia en CCS para indicar la posición RAM pero no la recuerdo. Tal vez es tan evidente como #RAM. Si no la encontrás decime que la busco en algún proyecto pasado.

Un gusto haberte conocido la voz.

Saludos.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: matyvico en 25 de Enero de 2013, 20:00:51
Hola matyvico,

tal vez no sea ayuda ni consuelo, pero podrías intentar forzando al CCS a que guarde el array justo alineado al inicio de un banco de RAM, de esa forma por ahi el CCS te lo pone secuencialmente de corrido. Había una sentencia en CCS para indicar la posición RAM pero no la recuerdo. Tal vez es tan evidente como #RAM. Si no la encontrás decime que la busco en algún proyecto pasado.

Un gusto haberte conocido la voz.

Saludos.

BrunoF! Muchas gracias por la rapida respuesta! Si, es muy lógico lo que decís, y ademas le da sentido a algo que me sucedio al definir un char de la forma:
Código: [Seleccionar]
char imagen[9][96]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,240,240,240,240,240,240,240,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,240,240,240,
   240,240,240,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,240,240,240,240,240,240,240,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
   0,0,0,0,0,0,0,0,3,15,63,255,255,255,255,255,255,252,248,240,224,192,128,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,128,192,224,
   240,248,252,255,255,255,255,255,255,63,15,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,7,15,31,
   63,127,255,255,255,255,255,254,252,252,248,248,240,240,255,255,255,255,255,255,255,255,240,240,248,248,252,252,254,255,255,255,255,255,127,63,31,15,
   7,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,240,240,240,240,240,240,240,240,240,240,240,240,
   241,241,243,243,247,247,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,247,247,243,243,241,241,240,240,240,240,240,240,240,
   240,240,240,240,240,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,15,15,15,15,15,15,15,15,15,15,15,143,
   143,207,207,239,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,239,239,207,207,143,143,15,15,15,15,15,15,15,15,15,15,15,
   15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,192,224,240,248,252,254,255,255,255,255,255,127,
   63,63,31,31,15,15,255,255,255,255,255,255,255,255,15,15,31,31,63,63,127,255,255,255,255,255,254,252,248,240,224,192,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,240,252,255,255,255,255,255,255,63,31,15,7,3,1,0,0,0,0,0,0,0,0,255,255,255,255,
   255,255,255,255,0,0,0,0,0,0,0,0,1,3,7,15,31,63,255,255,255,255,255,255,252,240,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
   0,0,0,0,0,0,0,0,12,15,15,15,15,15,15,15,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,15,15,15,15,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,15,15,15,15,15,15,15,
   14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

Ese char almacena la información para enviar una imagen al LCD (muestra el logo de la universidad a la que voy como presentación), el problema es que si la defino SOLO con la habitual definición de char, aparecen unas líneas salidas de contexto de la imagen, por el contrario si lo defino como:

Código: [Seleccionar]
const char imagen[9][96]={...}
La cosa cambia, la imagen se muestra perfectamente y encima se ocupa menos RAM, ya que de la ayuda de ccs, se tiene para la definición de const lo siguiente:

Citar
const Data is read-only.  Depending on compiler configuration, this qualifier may just make the data read-only -AND/OR- it may place the data into program memory to save space.


Y a la vez el inconveniente es que se convierte en solo lectura (pasa a formar parte de la memoria de programa), imposibilitando su modificación. Lo raro de todo esto es que AVECES lo hace y otras no y supongo que ese comportamiento se debe a que quizás en alguna de esas veces alguna variable definida antes o algo raro que haga el CCS genera que ese char 'consiga' un banco propio de RAM y no se vea alterado...

Respecto a lo que haces mención sobre forzarl al CCS a que guarde el array alineado al inicio de un banco de la RAM, me parece que el comando #LOCATE serviría, de la ayuda del CCS:

Citar
#LOCATE

works like #BYTE however in addition it prevents C from using the area.

 
A special form of this directive may be used to locate all A functions local variables starting at a fixed location.

Use: #locate Auto = address


This directive will place the indirected C variable at the requested address.

No se que opinen, pero esto ya me esta desesperando, pregunte a otros amigos y no podían creer que no pudiera hacer lo que quería con un char global!

Nos vemos! Y gracias por recibimiento!  :mrgreen:
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: BrunoF en 26 de Enero de 2013, 14:08:23
Hola de nuevo,

estuve leyendo el código. Pensé que era un array de estructuras, como el caso en el que mencionaba que ocurre el bug, pero veo que tu caso es un simple array de dos dimensiones.


Creo que tenés varios errores en el código, por eso no te funciona.No logré que compile tu código, lo que tiene cierta lógica porque veo un par de cosas que no deberían poder compilar.

Qué es lo que debe hacer la subrutina menú? Imprimir el texto del número de opción seleccionada actualmente?
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: matyvico en 26 de Enero de 2013, 14:37:08
Creo que tenés varios errores en el código, por eso no te funciona.No logré que compile tu código, lo que tiene cierta lógica porque veo un par de cosas que no deberían poder compilar.

Si, estoy seguro que tiene miles de errores, igual ese pedacito de código que no me funcionaba un poco lo arme de memoria porque el código original que no me compilaba lo borre y en cambio hice lo que ahora si me funciona (que es declarar el array de dos dimensiones localmente para cada subrutina).

Qué es lo que debe hacer la subrutina menú? Imprimir el texto del número de opción seleccionada actualmente?

La subrutina menú debería imprimirme en el LCD el menú que a mi se me ocurra enviarle a través del array "opc[7][15]" y la forma en que yo quiero hacerlo es generando el array GLOBAL opc y que antes de llamar a la subrutina menú se le asigne lo que se quiere mostrar al array, de esta forma la subrutina ubica (con el gotoxy) el cursor en el LCD y envía uno de los elementos del array opc (primer elemento del array y por consiguiente del menu a ser escrito en el LCD), lo mismo con el segundo, y el tercer elemento del array y así sucesivamente hasta que se termine el contenido del array (por eso uso un for)...

No se si fui muy claro, y en todo caso si hay una mejor (mas eficiente o correcta) forma de hacerlo...
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: judio en 14 de Febrero de 2013, 07:52:24
Hola, espero alguien me pueda asesorar con la version 4.068 de CCS porque no puedo compilar todos los codigos fuentes abiertos cada uno en una pestaña diferente?, solo compila el de la primer pestaña!!

 :(
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: migsantiago en 15 de Febrero de 2013, 00:36:26
Hola de nuevo,

estuve leyendo el código. Pensé que era un array de estructuras, como el caso en el que mencionaba que ocurre el bug, pero veo que tu caso es un simple array de dos dimensiones.


Creo que tenés varios errores en el código, por eso no te funciona.No logré que compile tu código, lo que tiene cierta lógica porque veo un par de cosas que no deberían poder compilar.

Qué es lo que debe hacer la subrutina menú? Imprimir el texto del número de opción seleccionada actualmente?

Hola Bruno y Matyvico

Sí, hay varias cosas fuera de lugar en el código. Aquí una versión funcional del mismo, sin cosas de CCS para poderlo probar.

Código: [Seleccionar]
const char opc[7][15]={"Tipo de onda","Frecuencia","Periodo","1","2","3","4"}; //VECTOR GLOBAL

void menu(const char* str)
{
     printf("%s\n", str);
}

int main(int argc, char *argv[])
{   
     int i = 0;
     for( ;i < 7; ++i)
     {
            menu(&opc[i][0]);
     }
    system("PAUSE");
}

La salida:

Código: [Seleccionar]
Tipo de onda
Frecuencia
Periodo
1
2
3
4
Presione una tecla para continuar . . .

Bruno, un gusto leerte por los foros  :D

Saludos  :mrgreen:
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: BrunoF en 15 de Febrero de 2013, 13:42:00
Bruno, un gusto leerte por los foros  :D

El gusto es todo mío Santiago. :)

Saludos!
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: thegame en 18 de Febrero de 2013, 17:59:23
Que tal, no se si este bug este ya colocado igual lo pongo

version CCS 4.130
PIC utilizado PIC16F1933

en la rutina de interrupción para cambio de estado (INT_RB),nunca borra la bandera y por tanto se queda en la rutina en un ciclo infinito.

simulado con MPLAB y comprobado fisicamente.

Solucion:

Borrar manualmente la bandera al finalizar la rutina,similar a hitech o C18.

Eso pasa por confiarse del compilador jeje.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: KALLITOS en 18 de Febrero de 2013, 19:30:34
Que tal, no se si este bug este ya colocado igual lo pongo

version CCS 4.130
PIC utilizado PIC16F1933

en la rutina de interrupción para cambio de estado (INT_RB),nunca borra la bandera y por tanto se queda en la rutina en un ciclo infinito.

simulado con MPLAB y comprobado fisicamente.

Solucion:

Borrar manualmente la bandera al finalizar la rutina,similar a hitech o C18.

Eso pasa por confiarse del compilador jeje.

Hola thegame, esta particularidad del INT_RB ya ha sido tocado en el foro, no es problema de esa version pues se presenta en las muuuchas que he probado, la solución es dentro de la rutina de interrupcion leer el puerto b  input_b(); para que el flag sea borrado, también se puede usar clear_interrupt(INT_RB);.

Saludos.

Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: thegame en 25 de Febrero de 2013, 17:10:53
que tal Kallitos

bueno si es vdd que eso ya estaba mencionado en el foro,y precisamente realice eso mismo,poner input_b() y nada seguia sin borrar el flag,hice tambien lo de clear interrupt y tampoco la borro,lo hizo hasta que fui directamente al registro de banderas y puse un bit_clear, solo asi lo resolvi,desconozco porque pero eso me paso a mi
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: RedPic en 07 de Marzo de 2013, 08:41:55
Versión de CCS 4.140
Micro PIC18F2550
Bug: Posible cálculo erróneo del baudrate de la USART

¡Por favor que no me presenten personalmente a nadie de CCS! Porque termino en la cárcel, seguro.

Después de una semana luchando a brazo partido con un hardware que estoy desarrollando, alrededor de un 18F2550, no he sido capaz de comunicar con él por el puerto serie .... parece como si el baudrate estuviese loco y no transmite o recibe a una velocidad estándar ...

Tras revisar hasta el infinito el hardware y viendo que al menos en apariencia todo estaba perfecto se me ocurrió hacer una prueba, gato escaldado del agua fría huye, prueba que ya hice hace tiempo al ocurrirme un error similar ... compilé exactamente el mismo programa, sin tocar un punto y coma, pero con mi versión de referencia del CCS, la 3.242 ...

Y voilá todo funcionando. Sin problema alguno envía y recibe a su baudrate adecuado y sin mayor problema.  :5] :5] :5] :5] :5]

Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: MGLSOFT en 07 de Marzo de 2013, 08:59:11
Versión de CCS 4.140
Micro PIC18F2550
Bug: Posible cálculo erróneo del baudrate de la USART

¡Por favor que no me presenten personalmente a nadie de CCS! Porque termino en la cárcel, seguro.

Después de una semana luchando a brazo partido con un hardware que estoy desarrollando, alrededor de un 18F2550, no he sido capaz de comunicar con él por el puerto serie .... parece como si el baudrate estuviese loco y no transmite o recibe a una velocidad estándar ...

Tras revisar hasta el infinito el hardware y viendo que al menos en apariencia todo estaba perfecto se me ocurrió hacer una prueba, gato escaldado del agua fría huye, prueba que ya hice hace tiempo al ocurrirme un error similar ... compilé exactamente el mismo programa, sin tocar un punto y coma, pero con mi versión de referencia del CCS, la 3.242 ...

Y voilá todo funcionando. Sin problema alguno envía y recibe a su baudrate adecuado y sin mayor problema.  :5] :5] :5] :5] :5]



Mas que error del CCS, creo que es error del Diego... en este caso.
Si miras bien las funciones de comunicacion de CCS, veras que ya tiene muchos parametros mas, algunos de los cuales son por defecto y otros hay que declararlos, y no precisamente mantienen compatibilidad con las versiones viejas.
Por supuesto, estas refiriendote a la version mas estable que hasta ahora pudo tener el CCS, cuando hablas de la 3.249...
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: RedPic en 07 de Marzo de 2013, 09:37:14
Uffff no se que decirte.

Le he puesto todos los parámetros ó solo los imprescindibles y nada de nada ...

Código: CSS
  1. #include <18f2550.h>
  2. #fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN
  3. #use delay(clock=20000000)
  4. #use rs232(BAUD=115200, XMIT=PIN_C6, RCV=PIN_C7, BRGH1OK, BITS=8, STOP=1, PARITY=N)

Para el 3.242 solo tengo que quitarle el STOP=1 que no lo tiene, o sea que el 3.242 funciona con y sin todos los parámetros y el 4.140 ni con ni sin ellos, así que ya no se que pensar. ¿Qué mas necesitaría el 4.x?  :?
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: MGLSOFT en 07 de Marzo de 2013, 12:19:11
Mira las opciones de Use_Delay() .
Prueba ponerle Crystal en vez de Clock (esta opcion ahora es distinta) y despues me dices si hay resultado...
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: RedPic en 07 de Marzo de 2013, 16:15:26
Mira las opciones de Use_Delay() .
Prueba ponerle Crystal en vez de Clock (esta opcion ahora es distinta) y despues me dices si hay resultado...

Yes, tienes razón   :-/

Con esto ya me funciona ...

Código: CSS
  1. #use delay(clock=20000000,Crystal=20000000)

Muchísimas gracias  :mrgreen:
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: MGLSOFT en 07 de Marzo de 2013, 16:35:55
Estoy usando un PIC24HJ128GP504.
Ya renegue con esas opciones para conseguir transmitir por la USART, por eso ya lo aprendi.

Ahora estoy tratando de comunicar a traves del Bus CAN y me esta matando no lograrlo, je..je

Es maravilloso este micro, pero el tema de redireccionar los pines de varios modulos (el CAN es uno de ellos) no sabes lo que te hace sufrir... :D :D :D
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: RALF2 en 08 de Marzo de 2013, 00:07:05
Mira las opciones de Use_Delay() .
Prueba ponerle Crystal en vez de Clock (esta opcion ahora es distinta) y despues me dices si hay resultado...

Porque no trabaja con #use delay(clock= 20000000) y si con #use delay(crystal= 20000000),  MGLSOFT?

En que parte del manual habla de ello?
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: MGLSOFT en 08 de Marzo de 2013, 00:45:41
Ultimamente los nuevos PICs traen tantos perifericos nuevos que asustan... :oops: :oops:

Tan solo pensar que el PIC18F26K80 tiene 6 configuraciones posibles del Oscilador interno, mantiene las configuraciones del cristal externo y agrega la posibilidad de otra fuente de oscilador externo, y por ultimo puedes arrancar el micro con un cristal, y luego marchar con el otro, o pasar a usar el oscilador interno....  Uff, me agarro un mareo!!
No les pasa lo mismo ??

Como siempre hacen los de CCS, escriben codigo para que te sea facil e intuitivo hacer esta configuracion, que en C30 debe ser un kilometro de sentencias, seguramente.

En la misma sentencia que escribio Diego le dice que tiene cristal externo a xx Mhz y oscilador interno a la misma frecuencia.
Que hace Diego ?? Se asegura que el micro trabaje siempre a la misma velocidad de clock, de otro modo no le funcionan las comunicaciones. Simple. ((:-)) ((:-))
Por eso es un Maestro, y nosotros solo podemos ayudarlo a ser mas grande todavia... :D :D
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: RALF2 en 08 de Marzo de 2013, 09:29:36
Es bien extraño lo del #use delay, yo lo voy a probar con las dos versiones que te coloque para ver si me funciona la comunicacion o me falla como a Redpic  :mrgreen:
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: RALF2 en 08 de Marzo de 2013, 10:17:33
Ok lo probe en el proteus en el modo Debug para ver los registros y al parecer todo esta bien  :mrgreen:

Citar
#include <18f2550.h>
#use delay(clock= 20000000)
#fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN

#use rs232(baud=115200,xmit= pin_c6,rcv=pin_c7)

void main()
{
   printf("Hola Amigos del Foro");
   
   while(true);
}

Adjunto resultados de la simulacion.
SPBRG = 42, BRG16=1, BRGH=1  esos son los valores que deben tener los registros para operar a 115200 Baud   :mrgreen:

Y segun el data sheet el error es de 1.6% aprox   :D
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: MGLSOFT en 08 de Marzo de 2013, 10:45:18
No creo que Diego lo haya probado en Proteus, mas bien estoy seguro que lo ha hecho en una placa ya armada, y bien sabemos las diferencias entre simular y probarlo en la practica... :mrgreen:
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: RALF2 en 08 de Marzo de 2013, 10:55:34
Citar
No creo que Diego lo haya probado en Proteus, mas bien estoy seguro que lo ha hecho en una placa ya armada, y bien sabemos las diferencias entre simular y probarlo en la practica... Mr. Green

Exacto MGLSOFT, intentare probarlo en fisico luego a ver que sucede  :mrgreen:

Asi podemos ver si es un bug del CCS como cosa rara o no  :shock:
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: RedPic en 08 de Marzo de 2013, 11:01:57
Exacto. Yo no uso el Proteus (o similar) desde que era un bebé.  :mrgreen:

Lo que hemos estado tratando ha sido con un 18F2550 real como la vida misma y compilando con las dos versiones del CCS, la 4.140 y la 3.242, programando después el PIC y mirando los resultados con el SIOW.EXE

Con la configuración del USE DELAY con sólo el CLOCK no calcula bien el Baudrate en la versión 4.140, al añadirle el CRYSTAL ha salido funcionando perfectamente.

Imagino que tiene razón MGLSOFT ya que una cosa es el cuarzo físico que le ponemos al PIC y otra cosa muy distinta es el Clock al que éste va corriendo, este mismo 18F2550 tiene un montón de posibles frecuencias de funcionamiento para un mismo cristal externo, y creo que habrá otros con mas variaciones posibles.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: MGLSOFT en 08 de Marzo de 2013, 11:07:49
Di la verdad !!
El Proteus no existia cuando tu fuiste bebe !! :D :D :D :D
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: RALF2 en 08 de Marzo de 2013, 16:13:00
Bueno realizando las pruebas con un pic18f2550, temo decir que si uno no coloca
#use delay(crystal= 20000000) el circuito no furula  :?

Al colocar #use delay(clock= 20000000), no solo falla el RS232 como menciono Redpic, sino que tambien los delay y todos los que dependan de este se ven afectados, los probe poniendo a parpadear un led cada 500ms y tardaba mucho en parpadear si colocaba clock en vez de crystal  :shock:

Luego realice pruebas con un pic18F252 y este opera bien tanto con clock como crystal, asi qe por si las moscas creo que lo aconsejable sera usar crystal para ir seguro  :D
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: RALF2 en 08 de Marzo de 2013, 17:31:22
Los bits causantes del fallo son los del CONFIG1L
Cuando se seleccion clock estos toman el valor de 0x3F
Y cuando se coloca crystal toman el valor correcto de 0x04

Misterio resuelto  :-/
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: PalitroqueZ en 08 de Marzo de 2013, 22:36:27
por lo visto la directiva delay() permite 4 tipos de argumentos aparte de clock, que según la ayuda son: oscillator, internal, crystal y rc.

estos parámetros configuran los word configuration del micro de una forma que desconozco porque no está documentada

Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: RALF2 en 08 de Marzo de 2013, 22:55:42
Asi es Palitroquez!
La unica forma es realizando pruebas cambiando el tipo de opcion: crystal, internal,... y ver como se programan los fuses por parte del compilador  :mrgreen:
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: RedPic en 09 de Marzo de 2013, 07:16:48
Lo curioso es que yo he colocado los dos parámetros y así es como me ha funcionado.

Código: CSS
  1. #use delay(clock=20000000,Crystal=20000000)
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: MGLSOFT en 09 de Marzo de 2013, 08:20:34
Lo curioso es que yo he colocado los dos parámetros y así es como me ha funcionado.

Código: CSS
  1. #use delay(clock=20000000,Crystal=20000000)

Y funciona bien, porque le estas diciendo la frecuencia del cristal externo y la del oscilador interno.
Esta correcto en el codigo!!
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: murphy9 en 13 de Agosto de 2013, 12:24:37
Hola a todos, siguiendo con los problemas de usart, les comento que hace tiempo publiqué el siguiente mensaje; Problema con interrupción USART (http://www.todopic.com.ar/foros/index.php?topic=39492.msg329231#msg329231) y finalmente creí solucionarlos. El tema es que más adelante debí cambiar un poco el programa y ya nunca más pude realizar la comunicación utilizando interrupciones asi que tuve que usar la función kbhit(). Leyendo el foro veo que quizás mi problema estaba en la declaración del cristal, así que mi pregunta es la siguiente:
Si tengo configurado los siguientes FUSES, como debería configurar el #use delay si uso un PLL y un cristal de 20 MHz para que la comunicación pueda establecerse usando la interrupción por RDA?

#include <18f2550.h>
#fuses HSPLL,PLL5,PUT,CPUDIV1,NOPBADEN,NOVREGEN,WDT2048,wdt,NOPROTECT,NOLVP,NODEBUG,MCLR
#use delay(clock=48000000)
#use rs232(baud=1200,parity=n,xmit=PIN_c6,rcv=PIN_c7,bits=8)

Muchas Gracias
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: MGLSOFT en 13 de Agosto de 2013, 16:28:26
En velocidades tan bajas con ese cristal y HSPLL activo, no vas a comunicar bien...
Mira la hoja de datos de tu PIC y veras lo que digo.
CCS es bueno, pero no es magico !!
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Miquel_S en 22 de Agosto de 2013, 13:11:57
Hola compañeros, estoy probando la version 5.007 de CCs y tengo este codigo que no me funciona, me esta fallando en el set_tris_a (0x00) el cual no me configura dicho registro como salidas. A alguien mas le ha pasado o es error mio y no veo el fallo?
Código: CSS
  1. #include <16F873A.h>
  2. #fuses HS,NOWDT,NOPROTECT,NOLVP
  3. #use delay(clock=20000000)
  4. #use fast_io (A)
  5.  
  6. #define Red_Led pin_A0
  7.  
  8. void main ()
  9. {
  10.         set_tris_a (0x00);
  11.  
  12.         while(true)
  13.         {
  14.                 output_low (Red_Led);
  15.                 delay_ms (500);
  16.                 output_high (Red_Led);
  17.                 delay_ms (500);
  18.         }
  19. }


Gracias.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Nocturno en 22 de Agosto de 2013, 14:05:25
Asegúrate de desactivar el ADC
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: RALF2 en 22 de Agosto de 2013, 14:18:10
A mi me funciona tal cual como esta  :mrgreen:
Revisa bien las conexiones pero a nivel de simulacion funciona perfecto, te adjunto el programa.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Miquel_S en 22 de Agosto de 2013, 15:42:35
Gracias a los dos, pero sigue sin funcionar ni real ni simulado, voy a probar otras opciones.

Saludos!
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: RALF2 en 22 de Agosto de 2013, 16:38:25
Probaste simular el que te pase?
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Miquel_S en 22 de Agosto de 2013, 17:35:42
Hola RALF2 la verdad es que no porque no le veo diferencia con el mio, pero voy a probarlo, de todas modos probe de esta manera y tampoco funciona:
Código: CSS
  1. #include <16F873A.h>
  2. #fuses HS,NOWDT,NOPROTECT,NOLVP
  3. #use delay(clock=20000000)
  4. #byte trisa = 0x85              // TRISA en 85h
  5. #byte porta = 0x05              // PORTA en 05h
  6.  
  7. void main ()
  8. {
  9.         bit_clear(TRISA,0);             // A0 como salida
  10.         bit_clear(porta,0);             // Apaga led
  11.  
  12.         while(true)
  13.         {
  14.                 bit_set (porta,0);
  15.                 delay_ms (500);
  16.                 bit_clear(porta,0);
  17.                 delay_ms(500);
  18.         }
  19. }

Saludos!
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: RALF2 en 22 de Agosto de 2013, 17:46:45
Ok el que te coloque lo simule con el proteus y funciona bien  :mrgreen:
Pruebalo y nos comentas   :mrgreen:
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Miquel_S en 22 de Agosto de 2013, 18:01:33
Mismo perro pero diferente collar, probe como comenta Nocturno y tampoco:
Código: CSS
  1. #include <16F873A.h>
  2. #fuses HS,NOWDT,NOPROTECT,NOLVP
  3. #use delay(clock=20000000)
  4. #use fast_io (A)
  5.  
  6. #define Red_Led pin_A0
  7.  
  8. void main ()
  9. {
  10.         setup_adc_ports(NO_ANALOGS);
  11.         set_tris_a(0x00);
  12.  
  13.         while(true)
  14.         {
  15.                 output_low(Red_Led);
  16.                 delay_ms (500);
  17.                 output_high(Red_Led);
  18.                 delay_ms(500);
  19.         }
  20. }
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Miquel_S en 22 de Agosto de 2013, 18:48:48
Al parecer es un bug, cambie de version y problema resuelto  :mrgreen:

Gracias.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: Micom en 02 de Septiembre de 2013, 23:14:56
Ya he trabajado algunos programas con CCS pero aun me considero muy principiante, así que mi pregunta no se si cabe aquí en este tema o no, pero no quise abrir tema nuevo por considerar mi pregunta muy básica o no? La cuestión es que intente aplicarle directamente a el registro PORTB, previamente declarado, los operadores lógicos como >>,  *,  / y no surtieron efecto tuve que declara una variable, en ella si surtieron efecto y luego asignarla al PORTB ¿ Es esto normal o un bug ? mi pregunta es, porque en ensamblador es muy flexible el uso de instrucciones que afectan directamente al PORTB sin problemas, como RLF y otras. les agradezco su atención. Saludos
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: murphy9 en 03 de Septiembre de 2013, 23:17:34
Disculpen que vuelva sobre una pregunta anterior. Si deseo utilizar un cristal de 4 MHz y necesito utilizar el pll para que el micro trabaje a 4 MHz, como deberia configurar el #USE DELAY para que tome bien los tiempos? Deberia ser asi: #use delay(clock=48000000,Crystal=4000000)?
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: dogflu66 en 06 de Octubre de 2013, 21:33:17
Tienes que especificar la frecuencia real de trabajo.

Yo utilizo un cristal de 10Mhz y el Pll x4 así que especifico:

#use delay(clock=40000000)
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: dogflu66 en 06 de Octubre de 2013, 21:48:11
Al actualizar el CCS me han dejado de funcionar las interrupciones de un código que ya funcionaba con anterioridad. Esto sucede cada vez que utilizo el LCD, cuando envío datos al LCD las interrupciones globales se quedan deshabilitadas. ¿Esto puede ser un Bug o son cambios realizados a partir de cierta versión?.

Dejo la parte del código que he tenido que modificar para que vuelva a funcionar en parte, y digo en parte porque el LCD es un dispositivo muy lento y no me hace ninguna gracia que el CCS me deshabilite las interrupciones cuando lo utilizo.


   Enable_interrupts(GLOBAL);
//   _LcdClear();
   while(1){
      if (_Btimer0 == 1) {
         _rldbt(0, 200);    
         printf(LCD_PUTC, "\f\GIE=%u PEIE=%u", INTCON_GIE, INTCON_PEIE);      
         Enable_Interrupts(GLOBAL);
         printf(LCD_PUTC, "\nIE=%u IF=%u B:%u", PIE1_RCIE, PIR1_RCIF, _Buffer);
         Enable_Interrupts(GLOBAL);
      // LedA = !LedA;
      }

//      if (_Btimer1 == 1) {
//         _rldbt(1, 5);
         if (_Buffer == 0) LedV = 1;
         if (_Buffer > 0) {
            putc(_Receive());
            LedV = !LedV;
         }
//      }
      
      if (_Btimer2 == 1) {
         _rldbt(2, 500);
         LCD = !LCD;
      }


Nota: Al final he corregido el problema añadiendo Enable_Interrupts(GLOBAL); al principio de las funciones principales de la Flex_Lcd, pero me gustaria saber si se puede solucionar el problema de otra forma.
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: dogflu66 en 07 de Noviembre de 2013, 18:48:06
Con firmado, era un bug con printf, que han corregido a partir de las version 5.13.
He probado con la versión 5.14 y ya no se da ese problema.  ((:-))
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: carlostecno en 12 de Marzo de 2014, 08:51:32
amigos necesito una  ayuda   lo que pasas es que creo cualquier programa en picc y compilo y ejecuta bien pero voy a la carpeta donde guarde el archivo y no me crea el punto hex... ayuda
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: rivale en 12 de Marzo de 2014, 11:14:26
amigos necesito una  ayuda   lo que pasas es que creo cualquier programa en picc y compilo y ejecuta bien pero voy a la carpeta donde guarde el archivo y no me crea el punto hex... ayuda
Creo que eso no es un bug, pero puedes irte a "Options" luego a "project" y luego en "output files" y verifica que este activa la casilla del .hex, también verifica que no tengas errores, puede que por eso no genere el .hex
Título: Re: Posibles "bugs" del compilador de CCS
Publicado por: leoelectronic en 28 de Noviembre de 2014, 09:40:48
buenas amigos de TODOPIC, estoy empezando a trabajar con las nuevas versiones del compilador CCS 5.xxx  Smile y resulta que he tenido varios problemas   redhot  el principal cuando utilizo el asistente para crear un nuevo proyecto con el wizard resulta que configuro todo como normalmente se hace en las versiones 4.xxx (frecuencia tipo de oscilador, timers, interrupciones................)  Razz pero cuando genera los archivos el .h que es donde se guardan los fuses de configuración no aparecen todos  Shocked crea unos pocos y sobre todo no genera el del oscilador y cuando cargo el programa al PIC no corren los programas.......... redhot, no se porque y luego coloco el fuse manualmente y funciona, pero eso no debe pasar porque justamente para eso es el wizard no?.............. saludos
Título: Re:Posibles "bugs" del compilador de CCS
Publicado por: PalitroqueZ en 10 de Marzo de 2016, 19:09:49
no es un bug, creo que es como algo que olvidaron la gente del ccs. me refiero a la opción de intercambiar entre versiones de compiladores en el IDE PCW,

en las versiones 5.x se puede instalar versión sobre versión y clickando en about (dentro del IDE) se puede intercambiar entre compiladores, pero he aquí un detalle que descubrí,

si por ejemplo las librerías de los micros han sufrido cambios entonces puede que una versión diferente del último compilador instalado genere errores, tal como me sucedió con la librería 18f2550.h y con las versiones 4.130 y 5.xxx

la opción de permitir compilar seleccionando compiladores es excelente, pero olvidaron decir que el resto de los archivos se reemplazarán por completo a los antiguos que venían con una versión anterior.
Título: Re:Posibles "bugs" del compilador de CCS
Publicado por: Hernandiaz03 en 15 de Mayo de 2016, 22:22:45
Saludos,
Tengo un problema del cual no veo salida, programe en un 16f1823 la conversion de 2 ADC y la impresion por serial de esto.

pero cuando el resultado de las ADC son 1023, simplemente se queda congelado. se para por completo.

alguien tiene el indicio de que es lo que sucede?
Título: Re:Posibles "bugs" del compilador de CCS
Publicado por: mauroc146 en 25 de Agosto de 2016, 00:34:44
saludos.

Tengo un problema con el timer0 como temporizador de 0ms a 8ms, se retrasa al hacer un delay_ms en el void main() del programa.

Anteriormente hice un programa para controlar un triac usando el timer1 y no tuve inconvenientes, pero ahora lo quise hacer con el timer0, porque el timer1 lo usare para otro propósito, y no puedo hacerlo funcionar

He simplificado el código para encontrar en que estaba fallando y encontré que cuando pongo algún delay de cualquier valor en void main(), el timer0 deja de trabajar como debería.
Si quito los delay y lo simulo en el proteus funciona bien.

He leído que el timer0 es independiente del programa principal y es por eso que, no sé que estoy haciendo mal :( 
Gracias por su atención


#include <16F876A.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#use delay(crystal=4000000)
#use FIXED_IO( B_outputs=PIN_B4,PIN_B3,PIN_B2 )

#INT_EXT                                     
void  EXT_isr(void)
{                                                 //uso la interrupcion por pin_b0 para el cruce por cero de la red
set_timer0(120);                         // aqui cargo el valor del timer0 para el desbordamiento
enable_interrupts (INT_TIMER0);  // que sera de 0ms a 8ms para un control de 0º a 180º +-
}

#INT_TIMER0
void  TIMER0_isr(void)
{
   DISable_interrupts (INT_TIMER0);
      output_high(pin_b4);                 // cuando se desborde el timer0 activa al triac
          delay_ms(1);                         //   y espera a la interrupcion externa para activar y cargar
      output_low(pin_b4);                  //      nuebamente al timer0
       
}


void main()
{
       
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32|RTCC_8_bit);      //8.1 ms overflow
   enable_interrupts(INT_TIMER0);
   enable_interrupts(INT_EXT);     
   enable_interrupts(GLOBAL);

   while(TRUE)
   {
         
         output_high(pin_b4);   //activo una salida para que aga algo el programa
           delay_ms(1);            //el problema es cuando pongo un delay de cualquier valor
         output_low(pin_b4);    //el timer0 deja de funcionar periodicamente (hace cualquier cosa)
           delay_ms(1);           
         
   }

}

adjunto dos imagenes de la simulacion en proteus
Título: Re:Posibles "bugs" del compilador de CCS
Publicado por: KILLERJC en 25 de Agosto de 2016, 00:43:05
Voy a ser breve porque estoy desde el celular.

Nunca uses un delay en una interrupción.
No estás limpiando los flags antes de activar la interrupción, ya que el timer 0 nunca para.
Y luego es separar si el problema es el compilador o el simulador.

Aunque no debería causar lo que se ve.
Título: Re:Posibles "bugs" del compilador de CCS
Publicado por: Somag! en 03 de Febrero de 2017, 15:13:42
1er PROBLEMA CON INTERRUPCIÓN
Solución:

Al finalizar cualquier interrupción siempre se debe poner
clear_interrupt(INT_XXX);

eso yo lo hago y me funciona perfectamente :-)

#int_rb
void interrup()
   {
       output_toggle(pin_a1);
       c='1';
       v=read_adc();
       clear_interrupt(int_rb);
   }


Otro dato, es que en las interrupciones no deben de tener retardos de ningún tipo.
Deben ejecutar su tarea/función lo mas rápido posible
Título: Re:Posibles "bugs" del compilador de CCS
Publicado por: hayeker en 17 de Marzo de 2017, 12:00:43
Muy buen tema, los aplicare de ahora en adelante, pero veo que son muchos detalles que tiene este compilador, mmm creo que voy a intentar emigrar al de microchip.

Saludos.
Título: Re:Posibles "bugs" del compilador de CCS
Publicado por: RedPic en 17 de Marzo de 2017, 16:16:09
no es un bug, creo que es como algo que olvidaron la gente del ccs. me refiero a la opción de intercambiar entre versiones de compiladores en el IDE PCW,

en las versiones 5.x se puede instalar versión sobre versión y clickando en about (dentro del IDE) se puede intercambiar entre compiladores, pero he aquí un detalle que descubrí,

si por ejemplo las librerías de los micros han sufrido cambios entonces puede que una versión diferente del último compilador instalado genere errores, tal como me sucedió con la librería 18f2550.h y con las versiones 4.130 y 5.xxx

la opción de permitir compilar seleccionando compiladores es excelente, pero olvidaron decir que el resto de los archivos se reemplazarán por completo a los antiguos que venían con una versión anterior.

Muy cierto amigo Pedro.

Y otra cosa que me ha pasado y que me ha tenido loco unos cuantos días. Al compilar con un compilador 5.x mas moderno había algo que no iba bien, me decía que faltaban registros o constantes y no sabía donde mirar. Hasta que dí con el quid de la cuestión: el problema estaba en el fichero del proyecto, .CCSPJT, que no deja de ser un simple .INI de toda la vida.

Como en origen lo creé con una versión más antigua del compilador, que aún tenía instalado en mi PC,  este fichero de Proyecto contiene una sección de [Directories] en la que hay una entrada con los directorios de los Includes, tanto los estándar como los manuales que le hayamos añadido.

En el IDE me aparecían todos los includes de Devices y Drivers del compilador moderno pero como los Path eran muy largos no me daba cuenta de que también estaban los del compilador original ... y curiosamente utilizaba éstos, los antiguos, en vez de los modernos  :shock:

Nah, edité con el Notepad el fichero .CCSPJT y quité las referencias al antiguo y todo andando correctamente  :mrgreen: 
Título: Re:Posibles "bugs" del compilador de CCS
Publicado por: leoelectronic en 10 de Abril de 2017, 13:22:19
Pues que mal por la gente de CCS en vez de mejorar  :5].................. bueno  :-/ seguiremos esperando por esta solución, la ultima versión que probé 5.059 y seguía dando el error
Título: Re:Posibles "bugs" del compilador de CCS
Publicado por: MGLSOFT en 10 de Abril de 2017, 13:53:08
1er PROBLEMA CON INTERRUPCIÓN
Solución:

Al finalizar cualquier interrupción siempre se debe poner
clear_interrupt(INT_XXX);

eso yo lo hago y me funciona perfectamente :-)

#int_rb
void interrup()
   {
       output_toggle(pin_a1);
       c='1';
       v=read_adc();
       clear_interrupt(int_rb);
   }


Otro dato, es que en las interrupciones no deben de tener retardos de ningún tipo.
Deben ejecutar su tarea/función lo mas rápido posible

En ese ejemplo estas leyendo el conversor A/D que tiene retardos importantes (al menos para lo que representa dentro de la interrupcion), eso no debe hacerse asi.
Para hacerlo rapido, deberias actiuvar la interrupcion del A/D y dejar que ocurra para luego traerte el valor leido.
Ocupas menos el procesador y mejoras el codigo....

Respecto al archivo de proyecto, no es necesario editarlos afuera, tienes el ruteo que se puede editar directamente dentro del arbol del mismo CCS.
Se hace desde aqui:
 - Tienes que ingresar para ver archivos adjuntos -
Título: Re:Posibles "bugs" del compilador de CCS
Publicado por: elsela en 10 de Octubre de 2021, 12:22:40
Después de indagar por todos los caminos de la web sobre error 99 con el ccs compiler, y no ver una solución a dicho error en el cual desconoce la correcta configuración de los puertos, conseguí la solución, actualizando el CCS compiler a una versión mas reciente, aclaro que tengo instalado Windows 10, principal causante de incompatibilidad, con algunos programas no tan recientes de versiones actualizadas a la fecha, creo que esta condición es un dolor de cabeza para muchos programadores, que puedan pensar que lo están haciendo  mal.
Es muy importante estar atento, antes de profundizar en un desarrollo.
Felicidad para todos.
Saludos cordiales desde Venezuela
Antonio José Sandoval Doza
Título: Re:Posibles "bugs" del compilador de CCS
Publicado por: danywes en 16 de Febrero de 2022, 23:44:23
Hola que tal.

Note que con el pic #include <18F46K22.h> mi ccs versión 5.015
programador PicKit 2 V2.61

el fuse de protección de lectura funciona al revez. con:

#FUSES PROTECT     

Después de grabar el micro, al leerlo me muestra todo el código.

mientras que con:

#FUSES NOPROTECT     

después de grabar y al leer el pic con el programador me muestra todo ceros.

O sea, PROTECT no proteje, y NOPROTEC si proteje.

solo con este micro me lo hizo, con otros anda bien.

Título: Re:Posibles "bugs" del compilador de CCS
Publicado por: Nocturno en 17 de Febrero de 2022, 02:45:01
¡Qué raro!
Título: Re:Posibles "bugs" del compilador de CCS
Publicado por: remi04 en 17 de Febrero de 2022, 04:54:08
Hola que tal.

Note que con el pic #include <18F46K22.h> mi ccs versión 5.015
programador PicKit 2 V2.61

el fuse de protección de lectura funciona al revez. con:

#FUSES PROTECT     

Después de grabar el micro, al leerlo me muestra todo el código.

mientras que con:

#FUSES NOPROTECT     

después de grabar y al leer el pic con el programador me muestra todo ceros.

O sea, PROTECT no proteje, y NOPROTEC si proteje.

solo con este micro me lo hizo, con otros anda bien.

  Si usas mplab métete en pic memory view y ver configuration word. 

    Mira a ver cómo sale ese bit en la ventana de abajo cuando pones “PROTECT”.

  También puedes verlo en el fichero hex directamente. Esto para ver donde exactamente se produce el fallo.

 
Título: Re:Posibles "bugs" del compilador de CCS
Publicado por: danywes en 17 de Febrero de 2022, 20:37:46
Mplab lo usaba antes para assembler, pero en los últimos años solo vengo usando c con CCS.

si, si. la única diferencia en un bit en la palabra de fuses, se ve perfectamente al cargar el archivo para grabar con el PicKit.

No es un problema para mi, ahora que me di cuenta.
Pero reporto esto por que a alguien mas le puede pasar, que graba un pic en algún trabajo comercial pensado que esta grabado el pic protegido, y el pic sale sin proteger y cualquiera lo puede leer.