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
.
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.