Autor Tema: LCD en PICC  (Leído 4368 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jagonru

  • PIC10
  • *
  • Mensajes: 12
LCD en PICC
« en: 06 de Febrero de 2006, 17:41:00 »
Hola amigos.
quisiera preguntaros una cosilla.
Resulta que estoy utilzando el PICC para hacer una aplicacion con el PICC y el 16f84.
Bien, en el programa  se ha de hacer uso de un LCD. Usando al libreria incluida en el compilador LCD.C, va muy bien, pero por ejemplo, me pongo a hacer un pequeño menu donde se hace bastante uso de la funcion lcd_putc(), y se come una barbaridad de memoria ROM del micro. Mirando el codigo generado, veo que no coge solamente el valor que toma la funcion lcd_putc() y lo lleva a la funcion comol tal, si no que mete mucho mas codigo.
Sabeis uds como optimizar este codigo? Es que ya es digo, es una pasada lo que me consume de memoria.

He probado tambien con la directica #separate, y nada.

Gracias por adelantado...

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: LCD en PICC
« Respuesta #1 en: 06 de Febrero de 2006, 23:53:00 »
Sí, puede que tu programa sólo use la función lcd_putc pero dicha función llama a lcd_send_byte, lcd_gotoxy. Y si tiras del hilo, verás como en lcd_send_byte también se invoca a  lcd_send_nibble y lcd_read_byte.
Vamos, que al final está entrando en juego toda la librería.

Desconectado jagonru

  • PIC10
  • *
  • Mensajes: 12
RE: LCD en PICC
« Respuesta #2 en: 07 de Febrero de 2006, 02:26:00 »
En efecto nocturno, asi es. Bueno, si no recuerdo mal, la funcion de inicio no llama a otras funciones, no como la lcd_putc(), que si llama.
Pero mi duda, es que vale, si esas funciones ya se instalan de la libreria, una vez que yo haga uso de ellas, lo unico que les ha de hacer es una llamada y darles un valor que se le pasa, nada mas, y no comprendo porque eso hac tanto uso de memoria. Es como si el codigo se repitiese, lo cual lo veo una incongruencia. Es que como os digo, nada mas que pasar de no tener ninguna llamada a estas funciones a llamarlas para generar una linea en el LCD, me pasa de aproximadamente un 30% de ROM a un 52%, lo cual lo veo a mi parecer desorbitado, me explico? Y eso solo para una linea.
Tenniendo en cuenta que debere hacer mas lineas, me como la memoria en un plis plas. Y si no, me obligaria posiblemente a usar un micro mayor, pero creo que el compilador por lo que sea me esta consumiendo demasiados recursos.
A ver que me decis.
Gracias.

Desconectado El_Coach

  • PIC12
  • **
  • Mensajes: 79
RE: LCD en PICC
« Respuesta #3 en: 07 de Febrero de 2006, 03:28:00 »
El ccs sólo incluye en el programa la parte de la librería que se utiliza.
Si no escribes ninguna línea en el lcd, el compilador solo incluirá en el programa la función de inicialización y ya está, ocupando un 30% de rom.
Pero al escribir tan sólo una línea en el display, el compilador debe incluir todo el código necesario, y eso son varias rutinas como lcd_send_byte, lcd_gotoxy o lcd_read_byte , como bien dice Nocturno66. Y entonces ocupa más rom, en tu caso un 22% más.
Pero lo lógico es que al hacer varias llamadas a lcd_putc, no aumente tanto el código porque las rutinas necesarias las debe incluir una vez, no por cada llamada a lcd_putc.
Espero estar en lo cierto.

Prueba a escribir varias líneas y nos dices que tal ha ido.


Suerte! RollEyes
"Hazlo o no lo hagas, pero nunca lo intentes"

Desconectado jagonru

  • PIC10
  • *
  • Mensajes: 12
RE: LCD en PICC
« Respuesta #4 en: 07 de Febrero de 2006, 06:10:00 »
Hola de nuevo Coach.

Gracias por la respuesta. Esta tarde si no pasa nada, pruebo eso y os lo comento con las estadisticas que da el compilador.

Hasta luego y gracias.


Desconectado omibaya

  • PIC12
  • **
  • Mensajes: 57
RE: LCD en PICC
« Respuesta #5 en: 07 de Febrero de 2006, 08:20:00 »
Mira jagonru, una pequeña solución que puede paliar en algo esto es que reduzcas las subfunciones, es decir por ejemplo que elimines el lcd_send_nibble y lo pongas dentro del lcd_send_byte, con esto tambien te estas ahorrando unas cuantas posiciones en la pila, yo lo hize asi y mejoro bastante mi codigo, si a alguien le interesa, lo puedo poner asi que avisa, y no es gran cosa

Desconectado jagonru

  • PIC10
  • *
  • Mensajes: 12
RE: LCD en PICC
« Respuesta #6 en: 07 de Febrero de 2006, 09:28:00 »
Hola amigos, bueno, ya he probado y os cuento.
El trozo de codigo que os digo es el siguiente:

if (PORTA&0b00000001) //entra en modo de menu
   {

   lcd_gotoxy(1,1);
   lcd_putc("M");
/*****
   lcd_putc("e");
   lcd_putc("n");
   lcd_putc("u");
   lcd_putc(" ");
   lcd_putc("P");
   lcd_putc("r");
   lcd_putc("o");
   lcd_putc("g");
   lcd_putc("r");
   lcd_putc("a");
   lcd_putc("m");
   lcd_putc("a");
   lcd_putc("c");
   lcd_putc("i");
   lcd_putc("o");
   lcd_putc("n");
****/
   }// Fin de modo menu


Dejando la mayorria de esas lineas como comentario, es decir eliminandolas, la compialcion se me queda al 29%.
Pero si quito los comentarios (es decir, se compilan las demas lineas de codigo), se queda al 52%, lo cual a mi parecer lo veo una pasada, no se.

a ver si se puede solucionar esto un poco mas.

Omibaya, gracias, si lo pones no estaria de mas.


Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
RE: LCD en PICC
« Respuesta #7 en: 07 de Febrero de 2006, 09:53:00 »
Y ¿si comentas la mitad de las lineas? digamos hasta la "o" antes de la "g" ¿en cuanto se te queda el compilado?

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
RE: LCD en PICC
« Respuesta #8 en: 07 de Febrero de 2006, 10:05:00 »
hablo de memoria pero creo otros compiladores usan otro tipo de técnicas como es la de entregar las librerias directamente en ensamblador. Si mal no recuerdo así lo hace el compilador en delphi para pics que habia por ahí. igual se podria llegar a portar.

1 saludo.

Desconectado jagonru

  • PIC10
  • *
  • Mensajes: 12
RE: LCD en PICC
« Respuesta #9 en: 07 de Febrero de 2006, 10:15:00 »
Hola redpic. Comentando desde la G, se me queda en el 40%.

MAs_vital, de delphi estoy pez, ni idea la verdad.

Desconectado El_Coach

  • PIC12
  • **
  • Mensajes: 79
RE: LCD en PICC
« Respuesta #10 en: 07 de Febrero de 2006, 10:28:00 »
Holaa!

Normalmente para mandar al display una línea se manda así:

lcd_putc( "Menu programacion" );

Y para enviar de letra en letra se utilizan comillas "simples":

lcd_putc("M");
lcd_putc("e");
lcd_putc("n");
lcd_putc("u");

Haciéndolo de cualquiera de estas dos formas el código ocupa un 25% de ROM.
Pero enviando carácter por carácter con comillas "dobles" ocupa el 45%.

La diferencia debe estar en como interpreta el compilador las dobles comillas.
Al pasar como argumento una cadena de caracteres el compilador debe generar un código diferente (más largo) al que haría pasando un solo caracter con simples comillas. Ya ves que cosas...

Pruebalo aver que tal Giño

Salu2
"Hazlo o no lo hagas, pero nunca lo intentes"

Desconectado jagonru

  • PIC10
  • *
  • Mensajes: 12
RE: LCD en PICC
« Respuesta #11 en: 07 de Febrero de 2006, 10:43:00 »
Hola Coach.

Gracias, porque si, ha salido.
En parte ahora veo que ha sido un despiste mio, y es que la comilla simple es para caracteres, y yo, ale, a poner comillas dobles, que se tratan cuando hablamos de cadenas de caracteres.

Lo que no sabia,  por eso lo hacia de una en una, es que con las comillas dobles, la funcion lcd_putc() podia admitor una cadena de caracteres para representar en el LCD.

Lo dicho Coach, muchisimas gracias a ti y a los que han participado en ayudarme Sonrisa

Desconectado yeikh

  • PIC10
  • *
  • Mensajes: 21
RE: LCD en PICC
« Respuesta #12 en: 07 de Febrero de 2006, 17:40:00 »
Hola chavales!!
 He estao rompiendome un poco la cabeza con esto del lcd y no soy capaz de hacerle rular, siempre me sale un error en  la libreira lcd.c de undefined identifier --set_tris_d

He estado buscando algun ejemplo de lcd escrito en c pero solo encuentro escrito en ensamblador. Alguien me puede decir donde puedo encontrar algun ejemplo o si me podeis pasar alguno.

Muxas gracias y un saludo que sois la lexe!!!!

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
RE: LCD en PICC
« Respuesta #13 en: 07 de Febrero de 2006, 19:05:00 »
Escrito originalmente por yeikh
Hola chavales!!
 He estao rompiendome un poco la cabeza con esto del lcd y no soy capaz de hacerle rular, siempre me sale un error en  la libreira lcd.c de undefined identifier --set_tris_d

He estado buscando algun ejemplo de lcd escrito en c pero solo encuentro escrito en ensamblador. Alguien me puede decir donde puedo encontrar algun ejemplo o si me podeis pasar alguno.

Muxas gracias y un saludo que sois la lexe!!!!



Creo que esa rutina que tienes debe estar modificada para que rule por el puerto d y espera una variable definida como tal. revisa o intenta reponer la rutina general.

A ver sobre pasar cadenas por dobles comilla o comillas simples.... en realida deberia dar exactamente igual. Tengamos en cuenta que para el ansi c no existen los string y estos no son mas que meros arreglos de tipo char, así que deberia dar igual pasar de un modo u otro. Lo que si debe ocupar más memoria es poner muchas veces put_c put_c...

1 saludo

Desconectado El_Coach

  • PIC12
  • **
  • Mensajes: 79
RE: LCD en PICC
« Respuesta #14 en: 08 de Febrero de 2006, 02:15:00 »
Holaa Sonrisa Gigante

Respecto al error set_tris_d, te sale porque el pic para el que estás compilando el programa no tiene puerto D.
Si tu pic tiene puerto B, prueba a poner esto:

#define use_portb_lcd TRUE

 ...justo antes del #include<lcd.c> en el programa principal.


Y lo de las comillas simples y dobles, no debe de dar lo mismo para el CCS. Debería, pero no es así.
Hice la prueba poniendo:


lcd_putc( "M" );
lcd_putc( "e" );
lcd_putc( "n" );
lcd_putc( "u" );
lcd_putc( " " );
lcd_putc( "P" );
lcd_putc( "r" );
lcd_putc( "o" );
lcd_putc( "g" );
lcd_putc( "r" );
lcd_putc( "a" );
lcd_putc( "m" );
lcd_putc( "a" );
lcd_putc( "c" );
lcd_putc( "i" );
lcd_putc( "o" );
lcd_putc( "n" );


Esto ocupaba el 45% de ROM en un 16F84A
Y de esta otra forma:


lcd_putc("M");
lcd_putc("e");
lcd_putc("n");
lcd_putc("u");
lcd_putc(" ");
lcd_putc("P");
lcd_putc("r");
lcd_putc("o");
lcd_putc("g");
lcd_putc("r");
lcd_putc("a");
lcd_putc("m");
lcd_putc("a");
lcd_putc("c");
lcd_putc("i");
lcd_putc("o");
lcd_putc("n");


Así solo ocupa el 22% de ROM, teniendo la misma cantidad de llamadas a lcd_putc.
Entonces no debe dar lo mismo " que " ,  aunque no debería ser así pero bueno...

Salu2 RollEyes
"Hazlo o no lo hagas, pero nunca lo intentes"