TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: pablo en 25 de Abril de 2007, 20:25:33
-
Hola gente:
Tengo un inconveniente. Arme un controlador para mi acuario con bastantes opciones y menues, esto me quito demasiada memoria ROM, en este momento estoy trabajando con el pic mas grande el 18F452 16k de ROM y estoy en el 96%.
Existe alguna forma de utilizar alguna memoria extra para poder seguir programando en el PIC.
Desde ya muchas gracias.
Saludos.
Pablo
-
18f4520 es la version ampliada del 452 y tiene 32k, en cuanto a la memoria externa para programa no hay manera
-
Muchisimas gracias por el dato.
Saludos
-
Perdoname, ,... pero con que estas programando ???, un programa complicado, no me ocuma mas de 1k en assembler.
Te recomiendo revisar tus rutinas, posiblemente estes repitiendo cosas o algo por el estilo, cualquier cosa avisame y le pego una mirada a tu codigo, saludos Jorge
-
Es un programa que tiene menues y demasiadas configuraciones, varias entradas a/d y control de LCD de 20x4, esos sumado a que no se programar en asembler, solo se programar en Picc y supongo que la suma de todo esto equivale a programa muy grande.
Gracias.
-
Con 16k ya debe ser enorme tu progrma, hay pic's de la familia 18 que si se puede agrandar su memoria de programa externamente.
Suerte!!! ;)
-
epas, pense que usabas una pantala grafica con iconos en la flash, asi si consumis a lo pavote memoria pero con un 20*4 consumir tanto no es normal che
-
La verdad es que si es posible llenar la memoria a punta de mensajes para la pantalla LCD. A mi me paso y luego busque la forma de reciclar mensajes y crear palabras y combinarlos para crear los mensajes.
Ahora lo raro es que sea en ASm que lo llenaste eso si me sorprende. Mi proyecto de grado necesitaba como 50 mensajes para una LCd de 2x16 y no se lleno la memoria del PIC16F877A llegue como al 80%. Debes revisar y depurar el codigo que tienes a lo mejor si hay cosas redundantes.
-
No lo hice en C, si lo hubiera hecho en asm seguramente me hubiera ahorado unos cuantos k pero no tengo idea de asembler.
-
Pablo , si usaste el picc de ccs posiblemente no esta manejando tus subrutinas bien, me explico, el ccs trata de colocar las funciones que utilizas ,"inline ", es decir, no reusa las funciones sino que las pones seguidas, por ejemplo , si tienes una funcion llamada menu que ocupe por decir 100 posiciones de memoria y la llamas diez veces en diferentes partes del programa muchas veces el ccs copia esta funcion en esas partes para evitar saturar la pila y esto da por resultado que esa funcion en realidad usa 1000 posiciones de memoria , esto puedes evitarlo usando la directiva #separate que permita reusar la funcion y asi ahorras posiciones de memoria .
Te digo esto pero a mi me paso algo similar , llego un momento en el cual el ccs me decia que no tenia suficiente memoria y al ir colocando #separate en diferentes funciones resulto que solo ocupaba el 50 % de la memoria. espero que te sirva de ayuda
Saludos
-
:) ya lo hice asi y todo ocupaba 96% pero no sabia que estaba el 4520 con 32k. Asi que ahora no me preocupa mucho la capacidad.
Igualmente gracias por el dato.
Saludos.
Pablo
-
18f4520 es la version ampliada del 452 y tiene 32k, en cuanto a la memoria externa para programa no hay manera
No , esto no es así, es un error. El 18F452 y el 18F4520 ambos tienen 32KBytes o 16KWords. Las diferencias estan en otras cosas, como en mayor cantidad de A/Ds de parte del 18F4520, oscilador interno, mayor velocidad de programación, la posibilidad de usar el RA6 y RA7 , modulo de comparación multiplexable y alguna otra cosa que se me está escapando.
Pablo, te sugiero reveas tu código, trates de reutilizar tu código lo más posible agrupando en funciones que contengan varias cosas juntas. Los menúes, si son texto, definelos como constantes en ROM en vez de que sean una mera asignación de código en el programa. Definirlos como constante en ROM, te garantiza (si el compilador funciona bien) que tengas 1 caracter por cada byte de la memoria de programa. Si armas el menú por código, te verás en graves problemas de optimización.
Si aún así no te cierra la idea, te sugiero bajes la Product Selection Guide de la página de Microchip, ahí verás toda la gama de pics y podrás elegir la que mejor se ajuste a tu aplicación.
-
Si lo que mas me ocupo k fue toda la parte de menues y sus submenues.
Sabes programar en picc? Las de claraciones de los menues las hice asi. No tengo idea como declarar en Rom, si sabes C tirame una idea.
const char* MenuD[5][20] = {"Conf. Temperatura ","Calibrar PH ","Timers ","Conf. General ","Volver "};
Ahora veo lo de la pagina de microchip.
Muchas gracias.
Pablo
-
Si lo que mas me ocupo k fue toda la parte de menues y sus submenues.
Sabes programar en picc? Las de claraciones de los menues las hice asi. No tengo idea como declarar en Rom, si sabes C tirame una idea.
const char* MenuD[5][20] = {"Conf. Temperatura ","Calibrar PH ","Timers ","Conf. General ","Volver "};
Ahora veo lo de la pagina de microchip.
Muchas gracias.
Pablo
No uso PICC, ni tampoco sé si esté bien hecha esa declaración. Nunca vi algo así. Un puntero a un arreglo completo? Eso es nuevo para mi, o al menos no lo considero de gran utilidad.
En C18 es
rom const char MenuD[5][20] = {"Conf. Temperatura ","Calibrar PH ","Timers ","Conf. General ","Volver "};
Luego defines un puntero a la rom y vas leyendo byte a byte.
Otra ayuda es que si usas mucho los espacios, es que directamente hagas la rutina "borre" todo el display y luego comience a escribir cada linea de display hasta encontrar un #0 . Ese #0 es un caracter ascii #0 o en un 0 en binario. Es lo que se usa en lenguajes de alto nivel para terminar las cadenas de caracteres
-
18f4520 es la version ampliada del 452 y tiene 32k, en cuanto a la memoria externa para programa no hay manera
No , esto no es así, es un error. El 18F452 y el 18F4520 ambos tienen 32KBytes o 16KWords. Las diferencias estan en otras cosas, como en mayor cantidad de A/Ds de parte del 18F4520, oscilador interno, mayor velocidad de programación, la posibilidad de usar el RA6 y RA7 , modulo de comparación multiplexable y alguna otra cosa que se me está escapando.
Pablo, te sugiero reveas tu código, trates de reutilizar tu código lo más posible agrupando en funciones que contengan varias cosas juntas. Los menúes, si son texto, definelos como constantes en ROM en vez de que sean una mera asignación de código en el programa. Definirlos como constante en ROM, te garantiza (si el compilador funciona bien) que tengas 1 caracter por cada byte de la memoria de programa. Si armas el menú por código, te verás en graves problemas de optimización.
Si aún así no te cierra la idea, te sugiero bajes la Product Selection Guide de la página de Microchip, ahí verás toda la gama de pics y podrás elegir la que mejor se ajuste a tu aplicación.
tenes raxon maunix, garrafal error el mio, eso me pasa porque justo ese dia estaba viendo la pagina de cika y en est figura asi:
018018F452-2 PIC18F452-I/L MICRO CTRL 16KF 1K5R 256E 34I/O ADC10 MICROCHIP U$ 10.6 10.5 > 27 unid.
018018F4520 PIC18F4520-I/PT 32 KB Enh Flash, 3804 RAM,36 I/O,Pb Free MICROCHIP U$ 12 10.5 > 160 unid.
Gracias por la correcion :)
-
Pablo , en cual PICC estas programando ??, en el de ccs , hit-tech , otro??
saludos
-
En ccs para colocar una tabla en la ROM se hace de la sge. forma:
byte const char MenuD[5][20] = {"Conf. Temperatura ","Calibrar PH","Timers","Conf. General","Volver"};
Pero hacerlo de esta forma es ineficiente puesto q malgastas espacio en ROM ya que no todas las lineas de tu menu no tienen la misma longitud y habrá espacio de ROM sin utilizar
Te conviene usar un array por cada linea y agruparlos en una estructura:
struct menus {
byte const char Menu1[16]={"Conf. Temperatura"};
byte const char Menu2[11]={"Calibrar PH"};
byte const char Menu3[6]={"Timers"};
byte const char Menu4[13]={"Conf. General"};
byte const char Menu5[6]={"Volver"};
} Menu;
De esta forma ahorras espacio. Y como te lo indico maunix escribe linea por linea sin necesidad de agregar espacios en blanco que tb son caracteres y estos ocupan espacio.
Saludos
-
tenes raxon maunix, garrafal error el mio, eso me pasa porque justo ese dia estaba viendo la pagina de cika y en est figura asi:
018018F452-2 PIC18F452-I/L MICRO CTRL 16KF 1K5R 256E 34I/O ADC10 MICROCHIP U$ 10.6 10.5 > 27 unid.
018018F4520 PIC18F4520-I/PT 32 KB Enh Flash, 3804 RAM,36 I/O,Pb Free MICROCHIP U$ 12 10.5 > 160 unid.
Gracias por la correcion :)
No hay de que... sabía la respuesta porque he usado el 18F452 y ahora uso el 18F4520 con mucha frecuencia.
Moraleja: así como no hay que confiar en todo lo que wikipedia y sitios personales nos dicen, hay que hacer lo mismo con las páginas de los vendedores... hay que ir a la fuente. Esto lo traigo a colación porque a veces los artículos en wikipedia (aclaro que no hablo de la wikipic) traen errores garrafales. y las páginas personales... bueno... ejem... :? :shock: :(
-
Muchas gracias. La verdad no se me habia ocurrido. Lo de la estructura lo pruebo ya, con respecto a trabajar con un un puntero a la rom me me doy cuenta como es si podes orientarme mas te lo agradeceria, sino investigo un poco.
Por lo pronto voy a probar lo de la estructura.
Muchisimas gracias por la ayuda.
Saludos
-
Bueno acabo de probarlo.
Lo de rom no se como usarlo despues.
Probe esto y no cambio nada
byte const char MenuD[5][20] = {"Conf. Temperatura ","Calibrar PH","Timers","Conf. General","Volver"};
Despues probe esto y me marco un error: expecting an identifier
struct menus {
byte const char Menu1[17]={"Conf. Temperatura"};
byte const char Menu2[11]={"Calibrar PH"};
byte const char Menu3[6]={"Timers"};
byte const char Menu4[13]={"Conf. General"};
byte const char Menu5[6]={"Volver"};
} Menu;
Voy a seguir probando pero si se dan cuenta del error por favor avisenme.
Gracias
Pablo
-
Hola, algo que te falta poner es el caracter nulo "\0" en las cadenas, lo puedes hacer quitándole los números y dejando solo los corchetes [], el compilador creará al final de la cadena el caracter nulo.
Los tamaños de las cadenas serían 18+1,11+1,6+1,13+1,6+1.
-
Existe otra posibilidad para no ocupar tanta memoria de programa con las cadenas de caracteres y es utilizar una memoria externa, la cual podemos leer via I2C o SPI o cualquier otro procedimiento. Cuando necesitamos una cadena, la leemos de la memoria la ponemos en la memoria RAM del micro y la visualiamos. De esta forma no tendremos limitaciones y como los tiempos no son criticos aunque la lectura sea un poco lenta, no tendras mas problemas.
Un saludo.
-
Bueno acabo de probarlo.
Lo de rom no se como usarlo despues.
Probe esto y no cambio nada
byte const char MenuD[5][20] = {"Conf. Temperatura ","Calibrar PH","Timers","Conf. General","Volver"};
Despues probe esto y me marco un error: expecting an identifier
struct menus {
byte const char Menu1[17]={"Conf. Temperatura"};
byte const char Menu2[11]={"Calibrar PH"};
byte const char Menu3[6]={"Timers"};
byte const char Menu4[13]={"Conf. General"};
byte const char Menu5[6]={"Volver"};
} Menu;
Voy a seguir probando pero si se dan cuenta del error por favor avisenme.
Gracias
Pablo
Disculpame pablo por haberte dado una respuesta sin antes realizar una adecuada verificacion del codigo.
Prueba esto....(ya lo he compilado... 8) y me resultó)
struct menus
{
char submenu1[18];
char submenu2[12];
char submenu3[7];
char submenu4[14];
char submenu5[7];
};
typedef struct menus _menu;
_menu const Menu ={"Conf. Temperatura","Calibrar PH","Timers","Conf. General","Volver"};
Otra opcion es escribir en la EEPROM interna del micro y luego enviarlos al LCD...
Espero haberte ayudado mejor
Saludos
-
Creo que hacer structs con strings de tamaño fijo, para rutinas que serán de menús que no siempre tengan el mismo tamaño en cada una de las palabras, nos ata mucho a tener que modificar mucho código si algo del menú cambia o si por otra parte queremos agregar otra linea.
A mi modo de verlo, lo haría más simple, más como al principio, donde se definan solamente strings en ROM , de largo variable terminadas con un nulo y listo. Es simple, actualizable y no rígido.
Saludos
-
Muchas gracias. Ya optimice un poco el codigo y baje un 10%.
Les agradezco, voy tratar de ir probando tambien lo de la eeprom.
Muchas gracias por la ayuda.
Saludos
Pablo