TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: vasconinicolas en 27 de Junio de 2008, 16:51:02

Título: memoria ROM insuficiente
Publicado por: vasconinicolas en 27 de Junio de 2008, 16:51:02
Hola masters, otra consultilla que quiero hacerles pues me desconcierta un poco el CCS.. El tema es simple, de momento mi programa ocupa el 54% de ROM y el 44% de ram...
De repente agrego una variable float y me dice que no hay mas espacio de ROM...
No entiendo? porque hace eso?
Un abrazo
N
Título: Re: memoria ROM insuficiente
Publicado por: vasconinicolas en 27 de Junio de 2008, 17:52:33
Perdon, quiero aclarar que uso el 16F877 y que mi programa ya cuenta con 11 variables float declaradas. O sea cuando declaro la numero 12 de 54% la rom se va al 100% Alguna idea de por donde buscar?
Estoy por empezar de nuevo el programa para ir viendo paso a paso donde se me desbanda la cosa..
Ta luego..
Título: Re: memoria ROM insuficiente
Publicado por: firepic en 27 de Junio de 2008, 19:00:58
Si estás agregando aparte de la declaración de la variable, código medio "pesado" para manejar la susodicha variable... seguramente se te está acabando la memoria de programa... debes tener un programa bien largo entonces...
Sería bueno que postearas el código a ver en dónde se puede simplificar un poco...
A mí me acaba salir ese mismo error y lo solucioné cambiando algunos "printf" por "puts", que consume menos memoria porque es una instrucción más sencilla. También quité algunos "delay" y traté de simplificar lo más posible..
Ahora ya no tengo el problema, pero estoy usando un 94% de ROM... así que ya no puedo meterle muchas más cosas de las que ya tengo.
Por cierto estoy usando el mismo micro que tú.
Espero que puedas solucionar tu problema.
Ok saludos, nos leemos!  :mrgreen:
Título: Re: memoria ROM insuficiente
Publicado por: LABmouse en 27 de Junio de 2008, 19:24:20
Sucede que la gama 16F tiene la memoria FLASH dividida en Bloques (PAGINAS), entonces, cuando se usa CCS y PICs tipo 16F hay que indicarselo para que este manpule los registros PCL y PCH para paginar toda la memoria de programa.

Agrega esto :
#device *=16 

Despues del #include <16f877A.h>..

De esa forma ganas mas espacio, pero la verdad C en un 16F..No creo te dure mucho.

SALUDOS!!
Título: Re: memoria ROM insuficiente
Publicado por: firepic en 27 de Junio de 2008, 20:43:31
PICmouse, he probado con la directiva que mencionas, pero el uso de ROM es el mismo porcentaje que sin colocar la directiva.
Sabes cuál puede ser la razón?  :?
Saludos, nos leemos!  :mrgreen:
Título: Re: memoria ROM insuficiente
Publicado por: Gonzalo_BlackHawk en 27 de Junio de 2008, 23:19:45
Hola chicos.

Bueno, los 16F877 tienen 8Kx 14 words de espacio de memoria de programa, y esto no se cambia por más código que agreguemos. La instrucción #device *=16 solo cambia el modo de acceder a la RAM, lo cual permite ciertas ventajas como por ejemplo poder manejar mas eficientemente ciertos sectores de esta memoria que de otra forma no se pueden usar (Este problema lo tienen algunos dispositivos como los 509, 57, 66, 67, 76 y 77 hasta donde yo sé). Para tu caso vasco esto no te sirve porque en general el manejo de punteros de 16 bits requiere mas ROM lo cual te empeora tu situación, CCS lo aclara en su manual y yo lo he comprobado en la realidad (tratandando de ahorrar memoria en un caso parecido al tuyo).

Me extraña que una sola variable float este desbordando tu capacidad de almacenamiento, habria que ver el código para poder depurarlo un poco. No entiendo tu error, el compilador te indica esto? "Out of ROM, A segment or the program is too large". Si es así el problema esta en que una función es muy larga y no hay suficiente ROM para ejecutarla. lo que se puede hacer en este caso es resignarte un nivel en el stack y cortar la función en dos con la instrucción #separate. Puedes verificar si hay alguna función esta desbordando la página de código mirando el Call Tree que genera CCS, es muy útil porque indica la RAM y la ROM que utiliza cada segmento del programa. Esperamos tu respuesta.

0x01 Saludo.
Título: Re: memoria ROM insuficiente
Publicado por: firepic en 28 de Junio de 2008, 01:36:09
Como siempre muy útil tu respuesta Dr. Gonzalo, muchas gracias!  :P
No sabía eso del "Call Tree"... a ver si lo consigo, me va a ser muy útil también a mí  :lol:
Ok saludos, nos leemos!  :mrgreen:
Título: Re: memoria ROM insuficiente
Publicado por: MGLSOFT en 28 de Junio de 2008, 08:09:26
Estas seguro que solo es una variable float (usa 4 bytes) o es un array de variables float lo que agregas??? :lol:
Título: Re: memoria ROM insuficiente
Publicado por: sander en 28 de Junio de 2008, 10:30:04
Las variables que declaras se guardan en la RAM , es decir, que al declarar una nueva variable te deberia salir un en la RAM, ahora dependiendo como utilizes esta variable te puede salir ese error de la memoria de programa (ROM), como solucionas este error?, bueno  una forma es ver  cuanta ROM te consume cada una de tus funciones , esto puedes verlo en el archivo de estadisticas que te genera el compilador, y dividir las funciones que sean muy largas, o probar poniendo la directiva #SEPARATE, en algunas de estas funciones,

Saludos
Título: Re: memoria ROM insuficiente
Publicado por: vasconinicolas en 28 de Junio de 2008, 11:37:02
Hola todos, gracias por las respuestas. He mirado un poco el tree pero me surgen mas dudas aun... no se leerlo quizá. Por otro lado, el problema parece proesentarse al superar el 50% de la memoria rom.. Ahora estoy al 48%, pero si agrego una variable int32, por ejemplo, chau... Out of ROM, A segment or the program is too large    inicio
Aclaro que es una simple variable y no un arreglo. Adjunto el codigo completo por si lo quieren ver. El programa principal se llama robertacho4.c
Mil gracias..
Título: Re: memoria ROM insuficiente
Publicado por: MGLSOFT en 28 de Junio de 2008, 12:19:05
Una variable Int32 usa realmente 4 posiciones en ram... :mrgreen:
Título: Re: memoria ROM insuficiente
Publicado por: firepic en 28 de Junio de 2008, 12:22:09
Es cierto MGLSOFT,por eso es de lo más extraño lo que ocurre.
Probé el programa de vasconi, y es cierto... dice ROM 48% y luego cuando agregas la variable int32 te sale el error de que no hay ROM.
Si quieres pruébalo tú a ver si a tí si te funciona.
Esto se escapa a mi comprensión, no entiendo qué es lo que pasa.  :shock:  :?
Si vos encuentras la solución, no dejes de comunicarlo por favor, ten piedad de nosotros los ignorantes!  :D
Ok saludos, nos leemos!  :mrgreen:
Título: Re: memoria ROM insuficiente
Publicado por: MGLSOFT en 28 de Junio de 2008, 12:28:18
Je..je.. :D :D
Esa fue la razon por la cual migre de un PIC16F876 a un PIC18f252.... :mrgreen: :mrgreen: :mrgreen:
Título: Re: memoria ROM insuficiente
Publicado por: firepic en 28 de Junio de 2008, 12:32:06
Si, pues al parecer la solución será migrar a los 18F y mandar los 16F pal.... ya tú sabes dónde  :D
Bueno pues a mudarse todo el mundo se ha dicho!  :lol:
Con todo esto ya estoy decidido a no usar más los 16F... a menos que sea un proyecto pequeñito...
Saludos, nos leemos!  :mrgreen:
 
Título: Re: memoria ROM insuficiente
Publicado por: vasconinicolas en 28 de Junio de 2008, 12:48:33
Muchachos, ya me parecia... de los 16F el que me anda lindo es el 628A pero para este caso me quedo muy corto de memoria... En Fin, va la segunda pregunta. NUNCA trabaje con los 18F, alguna recomendación? Cual puedo usar que sea equivalente en memoria y salidas al 877? Tengo que modificar mucho mi programa?
Gracias amigos piclisteros por toda su ayuda.
Vasco
Título: Re: memoria ROM insuficiente
Publicado por: firepic en 28 de Junio de 2008, 13:43:24
No creo que exista gran diferencia en trabajar con un 18F. La organización de los pines es la misma, claro que muchos pines tienen más funciones interesantes. Lo que si veo bastante diferente es la organización de la memoria, pero no creo que haya problema con eso porque el compilador se encarga de todo.
Yo estoy en tu misma situación vasconi, en el proceso de migrar a los 18F... me he quedado loco con la cantidad de cosas adicionales que tienen.
Definitivamente, hay que progresar. No me puedo seguir estancando con los antiguos 16F  :D
Y la diferencia de precios, por lo menos en mi país, yo diría que es bastante ridícula... entre un 16F877 y 18F4550, que son equivalentes en pines... sólo como Bs.4, si comparas eso con la cantidad de ventajas del 18F... pues Bs 4 no es nada...  :lol:
Ok saludos, nos leemos!  :mrgreen:
Título: Re: memoria ROM insuficiente
Publicado por: MGLSOFT en 30 de Junio de 2008, 09:10:33
Muchachos, ya me parecia... de los 16F el que me anda lindo es el 628A pero para este caso me quedo muy corto de memoria... En Fin, va la segunda pregunta. NUNCA trabaje con los 18F, alguna recomendación? Cual puedo usar que sea equivalente en memoria y salidas al 877? Tengo que modificar mucho mi programa?
Gracias amigos piclisteros por toda su ayuda.
Vasco

Solo varios cambios.
Mas que nada debes revisar bien todos los fuses, algunos son diferentes.
Ademas como dice Firepic, deberas inicializar los perifericos adicionales, algunos para anularlos y otros para utilizarlos.

Sacando eso, lo que queda es una potencia impresionante a favor de los PIC18F... :mrgreen:
Título: Re: memoria ROM insuficiente
Publicado por: reiniertl en 30 de Junio de 2008, 14:24:35
Cual de las variables declaradas es la que da problemas?

Porque si es una variable global no debería darte problemas en la ROM sino en RAM, sea porque el compilador no puede asignarle una localización determinada o porque no puede direccionar la variable porque no se ha configurado adecuadamente el uso de PCL y PCH.

Ahora si lo que declaras es una variable global que luego inicializas, la cosa puede complicarse, prueba a declarar solo la variable y no la inicialices, luego nos cuentas.

Saludos
Reinier
Título: Re: memoria ROM insuficiente
Publicado por: firepic en 30 de Junio de 2008, 14:28:57
Gran reiniertl, podrías probar en tu compilador?
Porque lo que dices tiene absoluta lógica, yo también pensé lo mismo y no me lo podía creer... pero en efecto lo probé en mi compilador y es así... la ROM está cerca del 50% (o sea que debería dar para rato) y cuando agregué una variable (creo que local) int32 me dió el error de memoria insuficiente...
Tal vez se solucione agregando el #separate que mencionó Gonzalo, no lo he probado.
Saludos, nos leemos!  :mrgreen:
Título: Re: memoria ROM insuficiente
Publicado por: vasconinicolas en 30 de Junio de 2008, 14:38:18
SI, eso estoy haciendo... hasta ahora el programa anda de 10. Tengo que ponerme a ver las cosas extra que ofrecen estos pic pero sin dudas que son mucho mas potentes, partiendo de la base que en el mismo encapsulado del 877 tengo 32k de memoria con el 18F452.
Consulta quizá fuera del hilo. Es mejor utilizar el compilador de Microchip C18 que CCS? pregunto ya que estoy tratando de compilar el codigo para manejo de LCD sin retardos que pusieron hace poquito en este foro y aun no logro hacerlo andar... el codigo dice que es para C18 y otros mas pero no para CCS..
Volviendo al tema, por si a alguien le sirve, el Celsius Cordoba Argentina los venden a los 452 (sueltos por $34) o sino en Cika Cordoba pero el monto de la compra debe superar los u$S50 (a 9 + iva del 10.5% cada uno).
Saludos....
Título: Re: memoria ROM insuficiente
Publicado por: Gonzalo_BlackHawk en 30 de Junio de 2008, 16:29:12
Hola a todos. Bueno, me hice un hueco para poder revisar un poco el programa de vasco.

Casi me da un infarto cuando abri el proyecto y automaticamente pude entender donde esta el problema, es en la organizacion del código, bueno mas bien en la falta total de organización del código  :mrgreen:.

El problema a tratar con multiples unidades de compilacion es que hay que saber muy bien que unidades usan que variables, como las usan y en que orden se ejecutan las funciones dentro de esas unidades y si lo hacen mas de dos veces, etc etc etc etc. En fin, hay que ser muy prolijo al tratar con programas de este tipo (ojo, tambien hay que ser prolijo aun cuando solo manejemos un unico .c).

Lamentablemente, no pude terminar de optimizar y organizar el código porque me llevaria horas, pero hasta donde pude hacer he eliminado el desbordamiento del uso de la ROM (Proba vasco de agregar una int32 ahora) y he disminuido sustancialmente el uso de RAM y de ROM (La RAM bajo de un 40 y pico a solo 19% y el uso de la ROM ahora esta en 41 % y no va causar mas problemas la declaración de nuevas variables). Vasco, te invito a que te tomes tu tiempo y que pruebes de organizar el código un poco más, descubrirás que el 16F877A te sobra en memoria para lo que quieres hacer (Aqui no es necesario cambiarse a un 18F).

Lo poco que pude hacer lo explico a continuación, de todas formas pueden contrastar los códigos para ver las diferencias:
- Las variables estaban mal declaradas, eran todas globales y ocupaban ROM durante todo el programa cuando a veces solo se necesitan una sola vez. Genere un archivo "Encabezado.h" que contiene todas las declaraciones y variables globales del programa (Como consejo, los proyectos con multiples .c deben tener siempre un encabezado donde se organice todo, para evitar problemas).
- Algunas variables en la RAM (Las cadenas de texto para el LCD) son constantes y por lo tanto deben ir en la ROM.
- Algunas variables solo se utilizan en una unidad de compilación y por lo tanto se deben declarar aqui (No en el Encabezado.h) y de forma estática (Mediante la declaración static). Esto no ahorra memoria pero es vital para evitar conflictos de nombres de variables y además indica el alcance correcto que debe tener la misma.
- Algunas funciones estaban siendo unidas en una sola (Una sola función que chupa ROM a lo loco) en forma automática por el compilador y por lo tanto deberian ser especificadas para que no sean inline, mediante la instruccion #separate (Yo solo separe una sola función, pero si te sobra stack separa algunas más).
- Algunas variables ni se estaban utilizando.
- Otras cosillas que no me acuerdo.

Bueno, vasco, olvidate de comprarte un 18F porque no lo necesitas (Bueno en realidad compratelo y experimenta un poco con el en tu tiempo libre) y dedicate a organizar tu código y veras como bajan las barritas verdes a la hora de compilar. Esperamos tu avances.

Saludos.
Título: Re: memoria ROM insuficiente
Publicado por: firepic en 30 de Junio de 2008, 17:12:12
Gonzalo, a veces dudo de que seas humano viejo!  :o
Naguará! Y dígame si tuvieses más tiempo programando en C!  :shock:
Ni me imagino lo que serás cuando tengas mayor edad... prodigioso, vas a ser una bestia mano!
En serio, ha sido una magistral explicación... en verdad gracias man!
Igual yo también trataré de experimentar con los 18F, pero sólo para actualizarme y conocer más juguetitos  :D
Ya veo que se puede lograr mucho con un poco más de orden. He aprendido muchas cosas que no sabía.
Enseguida me pondré a hacer un archivito .h para el proyecto que estoy haciendo, que me tiene el pic casi al tope de la ROM...
Ok saludos, nos leemos!  :mrgreen:
Título: Re: memoria ROM insuficiente
Publicado por: vasconinicolas en 30 de Junio de 2008, 17:51:22
Gonzalo, muchisimas gracias viejo. La verdad que recien empiezo con C pero tambíen en lo que respecta a programación y aqui es donde se nota la gente que programa de oficio como vos y saben hacer un analisis profundo del sistema antes de programar.
Estoy volviendo al 877 y prometo que hasta que no les saque el jugo al maximo no paso a los 18 jeje.
Gracias de nuevo, y los tendré al tanto de los avances.. Por el momento falta como medio programa o poco menos. Al final lo publico por si sirve..
Como dice fire, De que planeta viniste???!!!
Nos leemos....... :mrgreen:
Título: Re: memoria ROM insuficiente
Publicado por: PalitroqueZ en 02 de Julio de 2008, 16:04:40
puede suceder que al declarar la variable numero 12, se exceda la ram paginada en bank 0, y entonces el compilador te tira el error, intenta usar #locate, para asignar variables en otros bancos disponibles.


Título: Re: memoria ROM insuficiente
Publicado por: vasconinicolas en 02 de Julio de 2008, 16:18:34
He vuelto al 877 por sugerencia de Gonzalo ya que aun no lo agoto. Con el codigo optimizado no he tenido que usar el Locate aun... ahora, otra consulta. He avanzado un poco mas con mi programa y estoy ocupando el 47% de la rom. En proteus anda de primera, pero lo paso al protoboard y anda hasta un punto y se detiene, en realidad el programa sigue corriendo pero el LCD queda clavado.. Alguna idea? puede ser algun bug en mi programador
(es comprado pero ya encontre algun problemita una vez), o tendrá que ver con la organizaciòn del programa en los bancos 0 y 1 (aunque al 47% estaria sobre el banco 0 aun?).
Gracias....
Título: Re: memoria ROM insuficiente
Publicado por: vasconinicolas en 04 de Julio de 2008, 19:13:33
Muchachos, hoy me arte... creo que el CCS es un compilador sencillamente malo... Ya encontre varios bugs en mi primer proyecto.. Me voy a cambiar a C18 de Microchip..
Quiza este dormido pero este es el codigo y les explico que hace el simulador

void calado(void)
{
   if (vcalado==0)
   {
      vcalado=100;
      if (vrep==0)
      {
      vrep=8;
      reloj_progresivo();
      }
      else
      vrep--;
   }
   vcalado--;
}

Segun entiendo la funcion reloj_progresivo(); deberia ejecutarse cuando vcalado y vrep llegan a 0, pues no, se ejecuta cada ves que entro al if, es mas, se decrementan vcalado y vrep tambien cada entrada al if principal!!..... No entiendo nada------
No quiero ser mala onda pero entiendan que un dia entero sin avanzar ni una linea me tiene mal..
Despues les cuento como me va con el C18..
Abrazo
Título: Re: memoria ROM insuficiente
Publicado por: firepic en 04 de Julio de 2008, 20:14:12
Saludos vasco.
Viejo entiendo que el CCS tiene varios bugs que hay que tener en cuenta... el maestro pocher hasta ha creado un hilo donde se han ido explicando muy bien. Pero tampoco es que sea malo. Yo he hecho varios proyectos bastante complejos, usando i2c, spi, serial, interrupciones externas, y manejo de varios componentes... y me ha ido bastante bien.

Claro, eso no quiere decir que me haya funcionado a la primera programada. Muchas veces me pasa que no hace lo que quiero y tengo que sentarme y con mucha paciencia examinar todo el código hasta encontrar el problema.. a veces son "detalles" que causan muchos daños, como variables mal declaradas, y otras cosas inherentes a la propia programación.

Es por eso que yo uso el CCS integrado al mplab, de esa forma puedo simular línea por línea e ir viendo los registros del micro... también puedo dar valores a las variables importantes y ver el funcionamiento de las condicionales.
Los if es muy raro que tengan problemas. Debe ser algo que está mal en el resto del código.

Vasconi, la programación no es cosa fácil. Pero creo que debes ser más persistente. Prueba con el mplab y así puedes ver los registros vcalado y vrep... y el funcionamiento de las condicionales.
Claro que tú tomas la decisión final. Pero si es un error en la programación (que es lo más probable) lo vas a arrastrar al c18 y vas a tener retrabajo innecesario. No lo tomes a mal vasco, es sólo una sugerencia que te doy con toda buena intención.

Saludos, nos leemos!  :mrgreen:

P.D. Mis proyectos "complejos" son en realidad una tontería en comparación con otros proyectos que han hecho otros integrantes del foro usando este mismo compilador.
Título: Re: memoria ROM insuficiente
Publicado por: jfh900 en 04 de Julio de 2008, 20:31:39
Muchachos, hoy me arte... creo que el CCS es un compilador sencillamente malo... Ya encontre varios bugs en mi primer proyecto.. Me voy a cambiar a C18 de Microchip..
Quiza este dormido pero este es el codigo y les explico que hace el simulador

void calado(void)
{
   if (vcalado==0)
   {
      vcalado=100;
      if (vrep==0)
      {
      vrep=8;
      reloj_progresivo();
      }
      else
      vrep--;
   }
   vcalado--;
}

Segun entiendo la funcion reloj_progresivo(); deberia ejecutarse cuando vcalado y vrep llegan a 0, pues no, se ejecuta cada ves que entro al if, es mas, se decrementan vcalado y vrep tambien cada entrada al if principal!!..... No entiendo nada------
No quiero ser mala onda pero entiendan que un dia entero sin avanzar ni una linea me tiene mal..
Despues les cuento como me va con el C18..
Abrazo

Yo no estaría tan seguro de que el CCS tiene un Bug. Mi experiencia me dice que el 90% de los errores son humanos y no del compilador.

Si quieres que te ayudemos pon todo el prgrama, ya que no vemos la declaración de las variables, ni los valores iniciales que le asignas.

Un saludo
Título: Re: memoria ROM insuficiente
Publicado por: vasconinicolas en 04 de Julio de 2008, 22:22:35
//VARIABLES GLOBALES///////////////////////////////////////////////////////////

unsigned int vrep=8;
int32 vcalado=100;

Aqui las variables y su tipo.. El tipo int32 es porque en realidad lo valores que necesito manejar son grandes, pero para el ejemplo los puse chicos y podes ver el problema mas rapido..
Título: Re: memoria ROM insuficiente
Publicado por: jfh900 en 04 de Julio de 2008, 22:35:53
¿La función es llamada varias veces?

Un saludo
Título: Re: memoria ROM insuficiente
Publicado por: vasconinicolas en 04 de Julio de 2008, 22:43:18
Si, digamos que el codigo esta adentro de un bucle for infinito.. se llama la funcion cada vez que las variables se ponen a 0, es una forma de retardo que uso para no perjudicar la interrupcion del TMR1, que tambien uso para otras funciones del programa que son mas prioritarias...
Espero explicarme bien..
Saludossssss

Título: Re: memoria ROM insuficiente
Publicado por: firepic en 04 de Julio de 2008, 22:44:44
Vasco, no creo que esa información que proporcionas sea suficiente para detectar dónde esta el problema. Habría que ver el código completo.
A veces los errores estan por donde uno menos está buscando.
Te recomiendo que hagas lo que te digo, trabaja con el ccs pero desde mplab. Allí puedes simular línea por línea y ver los valores de todos los registros y las variables del programa. Para mí es la mejor forma de trabajar en C.
Saludos, nos leemos!  :mrgreen:
Título: Re: memoria ROM insuficiente
Publicado por: Gonzalo_BlackHawk en 04 de Julio de 2008, 22:45:35
Hola a todos.

Totalmente de acuerdo con Jfh900, la mayoria de la gente da por sentado muchas veces ciertos bugs del compilador cuando en realidad son errores de inherentes al código y no al programa que lo compila. Es una tipica conducta humana de justificar cosas a algo que nos evita la responsabilidad y en la mayoria de los casos no entendemos. Para citar un ejemplo, pasa lo mismo con los fenomenos paranormales, ahora tratan de explicarlos haciendo alarde de la mecánica cuántica, cuando en realidad nada tiene que ver y que la mayoria de la gente no tiene los conocimientos suficientes como para comprenderla. No lo tomes a mal vasco, no te estoy echando la culpa de nada, hoy es Viernes y me la agarro con la sociedad que a veces me irrita :D :D. Mil perdones si te he ofendido.

Bueno, me fui del tema. Desde mi experiencia, he visto solo 2 o 3 bugs comprobados del CCS y todos se han corregidos o se esta trabajando en ello, creo que el problema con CCS en realidad radica en el pobre manual que incluye y con él, es imposible aveces conocer los alcances y funcionamiento de las funciones built-in que trae y por lo tanto uno las utiliza para algo que no fueron diseñas y ahi mete la pata. Eso sería un bug? No lo creo, es simplemente una mala aplicación del código, en tal caso seguiria siendo culpa de la persona que escribe el programa, pero como ya dije, con un manual tan pobre como el que trae CCS es imposible saber con certeza como va a responder el código. Gracias al foro oficial de CCS, este foro y el MPLAB uno pude conocer un poco más acerca de como "piensa" este compilador. Obviamente CCS nunca puede llegarle al C18, por el simple hecho de que el segundo lo hizo la misma empresa que fabrica los microcontroladores, no hace falta decir más.

Yo todavia no agoto el CCS, pero con el C18 se puede hilar mucho más fino y es extremadamente potente is estas utilizando los PIC18xxxx.
Tengo entendido que el C18 solo compila para esta gama de PICs y si tu estas trabajando con PIC16xxxx vasco no se si servirá. Microchip habia lanzado un compilador C16 pero luego lo discontinuo, no se que habrá pasado. Además C18 no tiene soporte para punto flotante asi que manejar floats no debe ser tan sencillo. Tal vez Maunix o algun otro experto en C18 se pueda extender más que yo.

printf("Saludos"); :mrgreen:
Título: Re: memoria ROM insuficiente
Publicado por: vasconinicolas en 04 de Julio de 2008, 23:30:33
Gonzalo, totalmente de acurdo contigo jejeje, esto del viernes nos pega a varios y el cansancio acumulado de la semana piorrrrr.. jaja. En fin, mi pequeñisima experiencia con programas de nivel mas bajo como estos me trajo aparejado complicaciones por desconocimiento de la misma herramienta tal cual decis vos.. Tengo el manual en español pero es pobre y falto de ejemplos lo que ayuda a meter una y otra vez la pata. Quiza un poco mas en frio, despues de tomar un descanso, admito que de ningun modo he agotado el CCS... Y volviendo a seguir tus consejos voy a revisar otra vez el codigo para tratar de ver que esta pasando alli...
Aprovecho tu amable intervencion para consultarte a cerca de la instruccion #separate, que me incluiste en el codigo que desbordaba la memoria ROM.. Como funciona esa instruccion? Sabes que, si la comento, sigue compilando bien, muy seguramente porque has ordenado el codigo declarando las variables en ese archivo .h que creaste... Por cierto, Que diferencia hay en crear las variables dentro del codigo o en ese archivo .h??
Se que son muchas preguntas pero creo que pueden ser de utilidad para muchos entusiasmados como yo que se ven frenados por no conocer a fondo la herramienta..
Lejos de ofenderme, pido disculpas por mi calentura jajajaja y muchas gracias por su tiempo...
Nos leemos..
Título: Re: memoria ROM insuficiente
Publicado por: Gonzalo_BlackHawk en 05 de Julio de 2008, 08:21:06
Hola vasco, mira, yo cada vez que tengo que utilizar algo en CCS que no conozco o bien algo no funciona como me gustaria me echo una pasadita por el foro (http://www.ccsinfo.com/forum/index.php) oficial de CCS (Sin animo de despreciar a todopic, por favor). Ahi seguramente alguien ha tenido la misma duda o bien una parecida, hay muchisimos ejemplos, y si realmente te parece que descubriste un bug, lo posteas y te responden si esto puede ser asi o si te has equivocado tu. Obviamente esta en el idioma anglosajón. Otra forma de descubrir como funciona CCS es agarrando MPLAB, tal como te lo ha dicho Fire. Otra forma es revisando la lista C/ASM  (el archivo con el formato .lst) que genera el compilador junto al .hex. Es un archivo que puedes abrir en el mismo CCS y que contiene el ASM del programa para cada parte del mismo, verás primero el lenguaje en C en forma de comentario y luego las lineas de ASM que lo representa, es muy útil, sobre todo para optimización.

las directivas #separate y #inline no forman parte del programa en sí que se va a ejecutar en el PIC, sino que le indican al compilador como generar el .hex. Las funciones que tu escribes pueden compilarse en forma INLINE, es decir, dos o más funciones se ejecutan como una sola, solo se utiliza un nivel de stack, estas se ejecutan más rápido y si deben llamarse más de una vez durante el programa el compilador simplemente copia y pega el código de estas cuantas veces se necesite. Salta a la vista que aunque este método ahorra stack y tiempo, no hace lo mismo precisamente con la ROM.

La contraparte son las funciones separadas (Que se definen con la directiva #separate), que se ejecutan en niveles diferentes de stack, y por lo tanto se pueden lograr funciones más pesadas en código que si son inline, para que te des una idea, el código dentro de las interrupciones serían funciones #separate por defecto ya que el programa tiene que saltar hacia otro nivel de stack para ejecutarlas, una vez que termina de ejecutarse la interrupción, el contador del programa vuelve el mismo hacia la función donde estaba y sigue ejecutandose con normalidad.

Ahora bien, te preguntarás ¿Porque a mi CCS nunca jamas me pidio definir como se compilan las funciones? ¿Porque habria de interesarme si yo escribo solo las funciones y el código se compila correctamente? ¿Entonces el código se compila siempre inline, o siempre separate?  :-) . Bueno, en realidad, por defecto, el compilador lo hace automáticamente, es decir, lo decide por él mismo. Supongamos dos funciones:

Código: C
  1. void Inicio() {
  2.    // Codigo.
  3. }
  4.  
  5. void Main() {
  6.    Inicio();
  7.    // Sigue el codigo.
  8. }

Si no incluimos en la linea anterior a la declaración de la función Inicio ni #separate ni #inline, el compilador se hace cargo de definir si la función será inline o separada, y como lo hace?, bueno, el algoritmo que decide esto lo desconozco, pero sé por experiencia que se rige bajo ciertas reglas básicas: Si la función Inicio solo se llama una vez durante todo el código es probable que el compilador decida hacerla inline, porque siendo separate no se hace más que desperdiciar tiempo y no se ahorra memoria.
Si la función se llama X veces durante el código, entonces es más factible que el compilador la defina separada, porque de lo contrario hay que utilizar aproximadamente X veces más ROM que la que necesita Inicio(), pues el compilador no hace más que repetir en memoria el código original.

En forma explícita, nosotros podemos indicarle si queremos compilar las funciones como inline (colocando #inline antes de la declaración de la función) o como separada (colocando #separate antes de la declaración de la función), con todos los riesgos que esto supone. Cuando yo definí una de las funciones en tu código como #separate, lo hice sabiendo que el compilador la estaba poniendo inline al procedimiento main y que ambas dos sumadas consumian una cantidad de ROM que te estaba desbordando la capacidad del PIC (Me di cuenta muy rapido mirando el call tree). Colocandola separadas, tendrías mucho mas margen antes de obtener el error al generar el .hex.
Entonces, porque ahora quitas el #separate y el programa sigue funcionando bien?, bueno, eso es porque has optimizado el código lo suficiente como para que ambas funciones sean inline y aun ási te sobre ROM.  Dado el caso, entonces no hay razón alguna para dejarla #separate, quita esta directiva y ahorraras un nivel de pila.

Ojo con implementar los #separate por solo el gusto de utilizarlos cada vez que nos falta ROM. El compilador te va a separar las funciones por mas que no tengas stack para hacerlo, eso lo aclara CCS en una parte de su manual. Primero optimiza y si no queda más remedio ahi usas el #separate.

Sigo en otro post el tema de los archivo header. No me tardo. :mrgreen:
Título: Re: memoria ROM insuficiente
Publicado por: Gonzalo_BlackHawk en 05 de Julio de 2008, 08:45:33
Con respecto a tu pregunta sobre el archivo .h, utilizar este formato de archivo es más bien una convención que una necesidad para el PIC. El PIC solo entiende el hex asi que definir variables dentro de un archivo .c o .h es indiferente a nivel de micro, si dos variables son del mismo tipo y tienen el mismo alcance en un archivo .c que en uno .h el PIC no reconoce la diferencia. Lo respondo de esta forma porque tal vez puede suponerse que el uso de .h radica por su simple defínición en un comportamiento distinto del micro. Esto no es cierto.

¿Por que hay que utilizar los archivos de cabecera (header o .h)?? Para mantener el código organizado. Yo no lo hice en tu programa, solo cree el .h, pero lo correcto es colocar en uno o varios archivos .h todas las definiciones necesarias para tu programa que se van a utilizar en varios .c o en todos. Por ejemplo es lo mejor definir todas las variables globales, los fuses, los registros especificos y los pines del micro y hasta funciones generales (funciones de manejo de formato o de perifericos) que vamos a utilizar en archivos .h(si te fijas bien, los archivos que incluyen todas las constantes y definiciones para cada uno de los modelos del micro son archivos header, por ejemplo "16F628A.h").
Una vez creado el .h o los .h los colocas en los .c que los vas a utilizar mediante la directiva #include. Ahora bien, podría pensarse con mucha lógica que colocar los header en cada uno de los .c es una forma bastante creativa de desperdiciar memoria ROM, pero en realidad al compilar el programa CCS elimina las librerias que estan duplicadas y por lo tanto no ocupan ROM extra y su alcance sigue siendo para todas las unidades donde has colocado el #include.

En realidad el tema no es tan simple y no se si me he explicado bien, los .h se rigen más bien por convenciones de programación y puedes obtener los mismo resultados sin utilizarlos, aunque yo no lo recomiendo por un tema de prolijidad y orden a la hora de programar. Yo siempre los uso y cuando te acostumbras realmente simplifica mucho la organización del código.

Espero haber sido claro. Saludos.



Título: Re: memoria ROM insuficiente
Publicado por: firepic en 05 de Julio de 2008, 11:27:16
Recontra claro! Gonzalo, gracias por la explicacion!
Saludos, nos leemos!  :mrgreen:
Título: Re: memoria ROM insuficiente
Publicado por: vasconinicolas en 06 de Julio de 2008, 14:07:22
Gonzalo, como siemple, un maestro. Admiro tu dedicación, vocación, experiencia y el hecho de volcarlo hacia la comunidad desinteresadamente. Soy de los que le gusta construir las cosas con sus propios recursos y no comprar hecho aunque esto ultimo sea mas facil. Estoy en algunos foros de aficionados (a la astronomia), y promulgamos esto, aunque la mayoría habla de las características de los instrumentos comprados, nosotros seguimos luchando por construir. Sobre todo para aprender.
Voy a revisar mi codigo para ver si encuentro el error y cuando lo haga, reporto aquí por si sirve a otros..
Hasta pronto, nos leemos  :-)
Título: Re: memoria ROM insuficiente
Publicado por: vasconinicolas en 08 de Julio de 2008, 10:28:55
El problema me parece que viene por la cantidad de IF anidados. Alguien podria decirme si existe un limite a nivel de instrucciones IF o simplemente a nivel de la pila del micro, y en todo caso como puedo "visualizar" la pila para tener en cuenta estos detalles en la programacion??
Muchas gracias..
vasco
Título: Re: memoria ROM insuficiente
Publicado por: firepic en 08 de Julio de 2008, 10:52:07
Vasconi, en ese trozo de código no más tienes un If dentro de otro, no creo que sea ese el problema. Yo he tenido dos anidados dentro de otro y me ha funcionado al pelo. Aunque siempre trato de minimizar la cantidad de if usando dos condiciones dentro de un mismo if, con las sentencias AND u OR.... por ejemplo:
Código: C
  1. if(condicion1&&condicion2) //usando AND
  2. if(condicion1||condicion2)//usando OR
Pero es no más mi modo de trabajar, para tener más organizadito el código.
De verdad no creo que sea ese el problema, aunque si estoy en un error algún experto ya me corregirá. Por cierto, seguiste mi sugerencia de usar el MPLAB? Alli puedes simular paso por paso, es un tiro!
Ok saludos, nos leemos!  :mrgreen:
Título: Re: memoria ROM insuficiente
Publicado por: vasconinicolas en 08 de Julio de 2008, 12:14:29
Fire, gracias por tu pronta respuesta. He leido tus aportes y me parecen muy buenos. Voy a trabajar con los AND y OR para economizar IF jeje.. Por otro lado te comento que, si bien como vos decis, solo tengo un if dentro de otro, este último tiene metido adentro una funcion "reloj_progresivo()" que es a su vez:

void reloj_progresivo(void)
{
   if(seg>60)
   {
      seg=seg-60;
         if(min==59)
         {
            min=0;
            if(hor==23)
            {
               hor=0;
               min=0;
            }
            else
            {
            hor++;
            }
         }
         else
         {
         min++;
         }
   }
   else
      seg=seg+sspp;
}

De modo que hay unos cuantos if en todo el asunto.. quiza venga por aca la macana...
Con respecto al MPLAB, lo estoy por probar ahorita mismo como simulador.
Saludosssss
Título: Re: memoria ROM insuficiente
Publicado por: firepic en 08 de Julio de 2008, 12:29:26
Vasco, a veces no es necesario anidar tanto. No he podido analizar completamente tu código, pero si lo que quieres es hacer un reloj, se me ocurre algo así:
Código: C
  1. void reloj()
  2. {
  3.     seg++;
  4.     if(seg==60)
  5.     {
  6.           seg=0;
  7.           min++;
  8.     }
  9.     if(min==60)
  10.     {
  11.          min=0;
  12.          hora++;
  13.     }
  14.     if(hora==24) hora==0;
  15. }

Lo único que tendrías que hacer sería llamar a la función cada vez que pase un segundo, bueno o lo que quieras que haga. Nota que no estoy anidando ningun if, sino todos en secuencia. Claro que tendrías que inicializar las variables y demás. Entonce, si el segundo llega a 60, se hace cero y a la vez incrementa el minuto... si el minuto estaba en 59 se incrementa y llega a 60, entonces entra en el otro if, se hace cero e incrementa la hora... y así sucesivamente. Ojalá esto te ayude.

Un cordial saludo!  :mrgreen:
Título: Re: memoria ROM insuficiente
Publicado por: vasconinicolas en 08 de Julio de 2008, 13:03:49
Una masa fire, ya lo cambie y ahora lo pruebo para ver los resultados je.. En el simulador anda de lujo, vamos a ver el el protoboard.
vasco
Título: Re: memoria ROM insuficiente
Publicado por: vasconinicolas en 08 de Julio de 2008, 14:09:59
Perdon Fire, una consulta, Estoy usando el CCS para compilar, como lo abro con el mplab para simular? Abris el .hex? y en ese caso, como me oriento? me refiero adentro del .hex para saber donde estoy parado..
Graciassss
vasco
Título: Re: memoria ROM insuficiente
Publicado por: firepic en 08 de Julio de 2008, 14:19:34
Vasco no hace falta, puedes usar directamente el mplab con editor de C. Así lo uso yo.
Creas un proyecto nuevo, y antes de adicionar el archivo fuente, le das en "Project>Select language toolsuite" y en "active toolsuite" seleccionas CCS Pic Compiler. Más abajo, en "location" colocas la dirección en tu pc donde tienes el CCS, específicamente el ejecutable CCSC.EXE
Para estar más seguro, le das en "Project>select language tool location" y nuevamente eliges CCS, y verificas si en el "ejecutable" está configurado el CCSC.EXE que colocaste anteriormente.
Y eso es todo. Adicionas al proyecto el archivo fuente .c y podrás editar el archivo. Luego con el MPLAB SIM puedes simular el código línea por línea, ver los registros, etc.
Ok saludos, nos leemos!  :mrgreen:

EDITO: Olvide mencionarte que haciéndolo así puedes compilar desde mplab el archivo en c, pues lo que haces es llamar al compilador CCS (el ccsc.exe) que tienes en la pc. Lo que no vas a usar es el editor que trae el CCS. Para compilar le das F10 y listo.
Título: Re: memoria ROM insuficiente
Publicado por: vasconinicolas en 08 de Julio de 2008, 16:20:56
Me tira:

A #DEVICE required before this line

Cuando trato de complilar.. Aclaro que los archivos .c fueron todos Add al proyecto incluso los .h en la carpeta Headers... Se que es una tontera pero no se como definir eso..
vasco

EDITO: lo solucione poniendo #device PIC16F877 en cada libreria .c Ahora el problema es que no me reconoce instrucciones del CCS como lcd_putc.. me tira:
Undefined identifier  -- lcd_putc
Salute
Título: Re: memoria ROM insuficiente
Publicado por: firepic en 08 de Julio de 2008, 17:43:18
Fíjate en "Configure>Select Device" a ver si el micro que aparece allí es el mismo que tú estás usando, si no es igual elige el correcto, o te dará errores.
Tienes que colocar en "Headers files" el archivo .h del micro, 16f877.h... y si tienes otro archivo de cabecera .h también añadelo ahí.
Luego en "Source Files" colocas el .c principal.
Muy importante: recuerda crear el proyecto en la misma carpeta de PICC\projects... y allí en esa misma carpeta coloca los .c que estás usando... luego cuando coloques los #include, debes tener cuidado con saber dónde está el archivo. Si, por ejemplo, estás usando la librería LCD.C que se encuentra en PICC\Drivers, entonces debes colocar:

Código: C
  1. #include <lcd.c>

Ahora bien, si vas a incluir otro archivo que está dentro de la misma carpeta PICC\projects, debes colocar:
Código: C
  1. #include "archivo.c"

Y además, si por ejemplo, estás definiendo alguna cosa que es necesaria para alguno de los archivos incluidos, las definiciones deben estar antes del #include. Por ejemplo, yo ahora estoy usando la librería flex_lcd.c, y estoy definiendo los pines a usar con el lcd en el programa principal, entonces coloco:

Código: C
  1. #include <16f877.h>      
  2. #include <float.h>              
  3. #device ADC=10
  4. #fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT
  5. #define LCD_DB4   PIN_B4
  6. #define LCD_DB5   PIN_B5
  7. #define LCD_DB6   PIN_B6
  8. #define LCD_DB7   PIN_B7
  9. #define LCD_RS    PIN_B1
  10. #define LCD_E     PIN_B2
  11. #define led                     PIN_B3
  12. #define Rg                      PIN_C3
  13. #use fast_io(A)
  14. #use fast_io(B)
  15. #use fast_io(C)
  16. #use fast_io(D)
  17. #use fast_io(E)
  18. #use delay(CLOCK=20000000)
  19. #use rs232 (BAUD=4800,RCV=Rg,FORCE_SW,STREAM=GPS)
  20. #use rs232 (BAUD=19200,UART,STREAM=PC)
  21. #include <flex_lcd.c>

Nota que la directiva para incluir flex_lcd.c está después de todos los define. También debe estar después del #use delay, pues ese archivo usa retardos. Vasco se paciente y no te desanimes, trabajar con CCS desde mplab para mí es lo mejor, te ayuda a mantener más ordenado el programa y como te he dicho ya varias veces puedes evaluar mejor cómo está trabajando el micro y cómo ejecuta las instrucciones.

Para saber si están todos los archivos incluidos correctamente, dale: "View>Project" y te saldrá el árbol del proyecto, con los .h y .c que están añadidos. Desde allí también los puedes añadir dandole click derecho del mouse sobre las carpetas.

Espero que puedas pronto resolver tu problema. Cualquier cosa la puedes postear.
Saludos, nos leemos!  :mrgreen:
Título: Re: memoria ROM insuficiente
Publicado por: vasconinicolas en 08 de Julio de 2008, 17:57:14
Fire, que mano que me estás dando, te lo agradezco muchisimo. Yo antes trabajaba con mplab en asm y me parecia lo mejor, pues simulo paso a paso.. luego podemos verlo en proteus claro está. De modo que en un ratito me pongo a revisar tus sugerencias y les cuento...  Repito, cuando trabajé en mplab me parecio de lo mejor solo que ahora recien me avivo que puedo combinarlo con el ccs..
Un abrazo!
vasco
Título: Re: memoria ROM insuficiente
Publicado por: firepic en 08 de Julio de 2008, 18:10:28
Tranquilo viejo, para eso estamos. Bueno ya por hoy es todo lo que podré ayudarte porque tengo que salir...
Si llego temprano reviso a ver si has posteado algo, si no tendrá que ser para mañana en la mañan que me vuelva a conectar.
Te deseo éxito con tu proyecto! Y es cierto, o por lo menos también es mi opinión: lo mejor es el mplab. Espero puedas resolver los inconvenientes y empieces a divertirte programando C en mplab con el CCS... ya verás que es una gozada!
Saludos, nos leemos!  :mrgreen:
Título: Re: memoria ROM insuficiente
Publicado por: vasconinicolas en 08 de Julio de 2008, 20:38:01
Un éxito Fire, una maraviliaa, incluso ya voy encontrando errorcitos que estaban ocultos jejej. Gracias viejo, nos leemos en el próximo post.
Ta luegoooo
vasco
Título: Re: memoria ROM insuficiente
Publicado por: firepic en 09 de Julio de 2008, 10:08:45
Felicitaciones Vasco!  :-/  :-/  :-/
Avisa cuando tu programa funcione ya correctamente. Con el mplab te será todo más fácil.
Saludos, nos leemos!  :mrgreen:
Título: Re: memoria ROM insuficiente
Publicado por: Simon21 en 15 de Enero de 2013, 19:46:06
Hola a todos, tengo un problema con que me quedo sin lugar en la ROM.
Estuve leyendo este hilo y me fije en el call tree de ccs, alguien me puede explicar
como leer esto ??

Se ven todas las funciones e interrupciones y tengo varias columnas: Item, Page, Rom, Ram

Como debo leer dicha información para darme cuenta donde tengo el error en el programa
y poder optimizar el codigo en dicha zona ??

Saludos a todos, muy interesante todo lo que escribieron antes !
Título: Re: memoria ROM insuficiente
Publicado por: ppyote en 15 de Enero de 2013, 20:02:52
Simon21... dale a donde pone rom y te ordenara de mayor a menor o de mensor a mayor todas las funciones que tengas, ordenadas respecto a la relacion de rom consumida por estas
lo mismo puedes hacer con la ramy demas...
Título: Re: memoria ROM insuficiente
Publicado por: Simon21 en 15 de Enero de 2013, 20:06:16
Pero como interpreto esos numeros ??

Que sucede con las que dice "inline" ??