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

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

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Posibles "bugs" del compilador de CCS
« Respuesta #30 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

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re: Posibles "bugs" del compilador de CCS
« Respuesta #31 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.?
« Última modificación: 28 de Junio de 2009, 04:27:11 por Geo »
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Posibles "bugs" del compilador de CCS
« Respuesta #32 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.

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re: Posibles "bugs" del compilador de CCS
« Respuesta #33 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.
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado moronilehi

  • PIC10
  • *
  • Mensajes: 17
Re: Posibles "bugs" del compilador de CCS
« Respuesta #34 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: :-/
« Última modificación: 17 de Julio de 2009, 19:21:07 por moronilehi »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Posibles "bugs" del compilador de CCS
« Respuesta #35 en: 16 de Julio de 2009, 23:25:53 »
¿Y cuál es el error que tira?

Desconectado moronilehi

  • PIC10
  • *
  • Mensajes: 17
Re: Posibles "bugs" del compilador de CCS
« Respuesta #36 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

Desconectado moronilehi

  • PIC10
  • *
  • Mensajes: 17
Re: Posibles "bugs" del compilador de CCS
« Respuesta #37 en: 16 de Julio de 2009, 23:44:38 »
y los error que marca son 12 48

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Posibles "bugs" del compilador de CCS
« Respuesta #38 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.


Desconectado moronilehi

  • PIC10
  • *
  • Mensajes: 17
Re: Posibles "bugs" del compilador de CCS
« Respuesta #39 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
 :? :(
« Última modificación: 17 de Julio de 2009, 00:36:55 por moronilehi »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Posibles "bugs" del compilador de CCS
« Respuesta #40 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]

Desconectado PicMinor

  • PIC16
  • ***
  • Mensajes: 236
Re: Posibles "bugs" del compilador de CCS
« Respuesta #41 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?


Desconectado PicMinor

  • PIC16
  • ***
  • Mensajes: 236
Re: Posibles "bugs" del compilador de CCS
« Respuesta #42 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?

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Posibles "bugs" del compilador de CCS
« Respuesta #43 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!
No contesto mensajes privados, las consultas en el foro

Desconectado PicMinor

  • PIC16
  • ***
  • Mensajes: 236
Re: Posibles "bugs" del compilador de CCS
« Respuesta #44 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?
« Última modificación: 30 de Noviembre de 2009, 04:46:03 por PicMinor »