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
}
el compilador de HiTech http://www.htsoft.com/ me recuerda a mi un poco mas al ANSI, mas que nada porque no tiene tantas "macros", y esque al final es como tu dices, esas cosas estan muy bien, ¡pero tienes que aprendertelas! mientras que si fuese 100% ANSI no tendrias que estar aprendiendo todo de nuevo 👿
Ja ja ja, Garrocha y su fiel defensa de HiTech!!!
La verdad es que llevo desde verano con CCS, y me ha resultado muy comodo, teneis mucha razon en que no es comodo tener que parender cosas especificas, pero es cierto que CCS te da muuuuchas facilidades que no te dan otros, de modo que te ahorras tener que escribir mucho codigo.
Heli, a que te refieres con trabajar con trabajar con varios archivos?
te refieres a las (mal llamadas) Librerias .h? se pueden crear tantas .h como desees e incluirlas en la cabezera de modo que puedes usar las funciones que hay dentro sin problemas... pero no se por que me da que la pregunta no iba por ahi, no?
No, mif, No me refiero a los ficheros de cabecera ".h". Me refiero a que se pueda hacer como en los demás compiladores, compilar los .C para que generen .ASM que se ensambla y genera .OBJ que se linka con las librerías .LIB y se genera el .HEX, o un .EXE.
Por ejemplo Builder lo hae a través de los proyectos, yo lo hago estilo Unix con makefile, pero la idea es la misma: separar en varios ficheros los proyectos, de forma que escribes en cada uno el código específico que luego es altamente reutilizable.
Por ejemplo para el autómata programable (PLC) que menciono aquí: http://heli.xbot.es/ecp/ecp.htm
el proyecto está dividido en varios ficheros .C:
ec.c es donde está el código de proceso del PLC
ec_com.c aquí esta lo referente a comunicaciones
display.c rutinas de acceso al dislpay LCD
DS1216.c rutinas para acceso al RTC DS1216
hard.c rutinas específicas para el acceso al hardware
Hay más pero no merece la pena detallarlo. Estos ficheros son reutilizables en otros proyectos sin a penas modificación.
Parece un rollo pero eso permite (junto con algunos #ifdef...) compilarlo para 5 micros distintos (i8051, DS5000, H8/534, H8/510, mc6809...) y, con solo variar el fichero hard.c también se puede cambiar el hardware: con o sin display, serie, paralelo, de 7 segmentos, 1 ó 2 puertos série, entradas y salidas serie o paralelo etc.
En CCS solo he encontrado una forma de hacerlo, que es con "include "nosequé.c". Eso limita un poco porque el fichero ha de ser "incluible" y al compilar procesa todos los ficheros, mientras que con makefile o similar sólo los que han sido modificados. Quizñas sea costumbre pero ese sistema me resultaba cómodo, y me lo soportaban todos los compiladores, que para los 5 micros son 3 distintos..
A ver si tengo tiempo y documento lo del PLC. ¿Alguien hace Industriales? El sábado llevo uno de los PLC caseros a Madrid, no es un robot pero puede ser interesante...
Heli, pues si que usé el keil hace unos cuantos añitos y los recuerdos que tengo son muy buenos y también lo usé para alguna versión del 8051. Por cierto, ahora que mencionas un RTC de Dallas: ¿has obtenido buena precisión? Lo digo pq hace unos meses yo usé uno y obtenia una desviación de aproximadamente 1segundo por cada 24 horas ¿y sabes como lo compensé? a las 24:00 le restaba un segundo jejej hasta la fecha el truco ha funcionado, o por lo menos no me han dicho nada.
Yo tb me uno a la defensa del HiTech de Garrocha, eso si es un compilador ANSI C 😉
Si, he conseguido muy buena precisión con el ds1216. De hecho no recuerdo haber tenído que poner ninguno en hora después de instalados (mi software cambia la hora verano/invierno de forma automática). Los problemas con los RTC suelen ser debidos a los cuarzos de 32,768 Khz y las capacidades parásitas de la placa. La pega es que es dificil determinado porque son circuitos de muy alta impedancia y al poner el osciloscopio dejan de oscilar. Como el DS1216 viene ya montado con el circuito impreso, el cristal, la batería de lítio y un DS1215 no hay problemas. El DS5000T también lleva RTC interno basado en el DS1215 y funciona muy bién.
Usando el DS1215 suelto es cuando puedes encontrar sorpresas.
Instalé el HiTech C, pero no lo he probado. Otra cosa más a aprender...