Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Ya sé que el título del hilo no es muy descriptivo, pero ese compilador me tiene frito.
Uso el CCS 3,236, estoy adaptando unas rutinas para el control de displays LCD que usen el chip HD44780A (o sea la mayoría de los NO gráficos). Estas rutinas funcionan perfectamente con Keil para i8051, y también para PIC, peeeero no consigo que el CCS me compile esto:
LcdMsg ("Hola Heli");
Evidentemente quiero que el programa me salude tras inicializar el display, para ver que funciona. la función LcdMsg está definida como:
void LcdMsg (char *mensaje);
El error es: Attempt to create a pointer to a constant
¡Ya sé que estoy intentando crear un puntero a una constante, coño, para eso quiero un compilador, para que lo haga él y no lo tenga que ensamblar yo!!!
Seguro que es alguna manía del compilador, que con mi inexperiencia no consigo detectar. Con Keil y i8051 (que tiene memoria separada para código y datos) compila perfectamente y puedes trabajar lo mismo con constantes que con variables, el compilador genera el código adecuado para cada caso.
¿Alguien sabe como puedo enviar a una función una constante o una variable indistintamente? La función printf() funciona así y no da error.
En display.h hay:
/* Envía una cadena de caracteres al display */
void LcdMsg (char *mensaje);
En displah.c:
/*==========================================================================*/
/* Visualiza un mensaje en la posicion actual del cursor */
/*==========================================================================*/
void LcdMsg (char *mensaje)
{
while (*mensaje)
{
if ((cursor%ADISPLAY)==0)
LcdGoto();/* va a la posicion actual del cursor (cmmbia linea) */
LcdChar (*mensaje++);
}
}
En main.c
printf("rnReciclator1...rn");
LcdMsg ("Hola Heli"); //<<<<<< ¿Como lo hago?
while (TRUE) // Bucle principal
{
if (Kbhit()) ProcesaComando(); // Si hay comando en el puerto serie
}
Has probado ha hacer
char *var = "Hola Heli"
LcdMsg(var);
o bien
char var[10] = "Hola Heli"
LcdMsg(var);
S2
Ranganok Schahzaman
Gracias Ranganok por la idea, pero he probado de todo!!! Hasta las combinaciones más bizarras de "const char* (&(*..." pero nada.
Sin embargo he encontrado la solución simplemente dándome un paseito por el foro de ayuda de CCS:
http://www.ccsinfo.com/forum/
y he visto este mensaje:
http://www.ccsinfo.com/forum/viewtopic.php?t=29768
JA, JA es tan fácil como hacer
LcdChar ("HolaHeli");
¡Es que los programadores de CCS no saben lo que es el ANSI C!!!
Resulta que si a una función que toma como parámetro un char se le pasa un puntero a char el CCS automáticamente genera el código necesario para llamar a la función recursivamente mientras hay caracteres !!!!
O sea que mi función LcdMsg (char *msg) es innecesaria, el propio CCS genera una similar!!!
Además se puede hacer:
printf(LcdChar,"Hola Heli %d", numero);
y redirecciona la salida de printf a mi función LcdChar().
Es interesante (y práctico) pero NO ESTANDAR, y el problema de lo no estandar es que tienes que aprenderlo cada vez. Con lo contento que estaba yo con el ANSI después de haber sufrido el Whitesmiths para 6809...
Heli, ... comprar el keil con el CCS es como comparar un Ferrari con un Minardi 😉
La verdad es que conforme más lo uso más cómodo me siento con él (normal, me voy acostumbrando a sus manías..). Creo que genera un código poco óptimo (aunque en este tema no soy muy fiable porque conozco poco el assambler del PIC) y es poco ergonómico. Lo peor es que no es estándar, con lo que tienes que aprender C "versión CCS". Además no puedes crear proyectos (o yo no se hacerlo) con multiples ficheros y linkarlos luego, como haces con otros compiladores. Luego están los tipos de datos ¡¡int son 8 bits!!
Vale, aceptaré CCS como compilador de C, porque al fin y al cabo FUNCIONA y se pueden hacer cosas interesantes con él de forma rápida.
roboticsBCN ¿Has usado Keil? ¿Para que micros? Tengo algunos proyectos interesantes terminados y funcionando con ese compilador y i8051. Lástima de tiempo para documentarlos y colgarlos en la web.