Autor Tema: el pcl se desborda  (Leído 2193 veces)

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

Desconectado electroipod

  • PIC16
  • ***
  • Mensajes: 166
el pcl se desborda
« en: 21 de Noviembre de 2011, 13:03:23 »
Hola, mi problema es el siguiente, tengo conectado un teclado ps2 al pic 16f887 y al presionar una tecla aparecen los caracteres por un pantalla lcd, hasta ahi todo bien, pero ahora lo que quiero hacer es que por cada tecla me apraresca un texto en el lcd como veran de la 'a' a la 'z' hay mas de 25 teclas por lo tanto tendre mas de 25 textos que voy a mostrar en el lcd, el problema es que al compilarlos me parece que sobrepasa el valor del pcl osea 0xff y al compilarlo me da errores el ide que uso es el Microc pro, a mi parecer estoy usando mucha memoria RAM al poner tanto texto no lo se en todo caso que es lo que podria hacer, gracias por sus respuestas.

short dir;
void select_key(short key)
{
char *puntero;
switch(key)
    {

    case 'a':puntero="YA-34 ";dir=0;break;
    case 'b':puntero="2003-I";dir=1;break;
    case 'c':puntero="CA-7  ";dir=2;break;
    case 'd':puntero="VI-1  ";dir=3;break;
    case 'e':puntero="YA-6  ";dir=4;break;
    case 'f':puntero="VI-2  ";dir=5;break;
    case 'g':puntero="VI-3  ";dir=6;break;
    case 'h':puntero="VI-4  ";dir=7;break;
    case 'i':puntero="YA-29 ";dir=8;break;
    case 'j':puntero="VI-9  ";dir=9;break;
    case 'k':puntero="VI-10 ";dir=10;break;
    case 'l':puntero="VI-13 ";dir=11;break;
    case 'm':puntero="C/A   ";dir=12;break;
    case 'n':puntero="105   ";dir=13;break;
    //case 'ñ':lcd_out(1,9,"VI-14 ");break;
    case 'o':puntero="YA-30 ";dir=14;break;
    case 'p':puntero="YA-33 ";dir=15;break;
    case 'q':puntero="YA-1  ";dir=16;break;
    case 'r':puntero="YA-7  ";dir=17;break;
    case 's':puntero="YA-43 ";dir=18;break;
    case 't':puntero="YA-10 ";dir=19;break;
    case 'u':puntero="YA-27 ";dir=20;break;
    case 'v':puntero="2003  ";dir=21;break;
    case 'w':puntero="YA-2  ";dir=22;break;
    case 'x':puntero="107   ";dir=23;break;
    case 'y':puntero="YA-11 ";dir=24;break;
    case 'z':puntero="108   ";dir=25;break;
    }
    lcd_out(1,9,puntero);
}

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: el pcl se desborda
« Respuesta #1 en: 21 de Noviembre de 2011, 13:31:01 »
  ¿No podés definir los textos como const y luego hacer que tu variable apunte a las distintas constantes?

  Si no me equivoco, cuando defino constantes en HiTech las almacena en la memoria de programa y por lo tanto no me ocupan RAM.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado electroipod

  • PIC16
  • ***
  • Mensajes: 166
Re: el pcl se desborda
« Respuesta #2 en: 21 de Noviembre de 2011, 17:55:48 »
oye muy buena idea has tenido pero como lo hago y ademas el hi tech que mencionas es tambien para los pic de la seria 16fxxx?, gracias por el datazo buscare la forma de hacerlo ya que este pic tiene 8KB de memoria flash y tendria de sobra si los caracteres los pingo ahi, gracias.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: el pcl se desborda
« Respuesta #3 en: 21 de Noviembre de 2011, 18:40:18 »
oye muy buena idea has tenido pero como lo hago y ademas el hi tech que mencionas es tambien para los pic de la seria 16fxxx?, gracias por el datazo buscare la forma de hacerlo ya que este pic tiene 8KB de memoria flash y tendria de sobra si los caracteres los pingo ahi, gracias.

  Sí, hay HiTech para 16f y la versión lite es free. No tiene tanta optimización de código como la versión pro, pero tampoco tiene limites de espacio.


  Así lo utilizo con HiTech

Código: C
  1. const char * pantalla = "Mundo"; // defino cada texto
  2. char * puntero; // la variable que voy a usar en el programa
  3.  
  4. puntero = pantalla; // asi apunto el puntero a cada mensaje
« Última modificación: 21 de Noviembre de 2011, 18:48:13 por AngelGris »
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado electroipod

  • PIC16
  • ***
  • Mensajes: 166
Re: el pcl se desborda
« Respuesta #4 en: 21 de Noviembre de 2011, 21:06:09 »
no me funciona como me lo pusiste porque creo que un puntero no puede ser una constante ya que almacena direcciones de variables, el error que me sale es "Illegal pointer conversion".

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: el pcl se desborda
« Respuesta #5 en: 21 de Noviembre de 2011, 22:57:34 »
no me funciona como me lo pusiste porque creo que un puntero no puede ser una constante ya que almacena direcciones de variables, el error que me sale es "Illegal pointer conversion".

  Sí perdón, eso era de una prueba que estaba haciendo..... Me puse de vuelta a ver como era el asunto, pero sí te digo que si creas una constante la almacena en la memoria de programa

Código: C
  1. const char * primermensaje = "Hola Mundo"

  te subo una imagen de una la prueba donde muestro el comienzo de la memoria de programa, desde la dirección 0x0008 hasta la 0x0013 se encuentra almacenada la frase.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: el pcl se desborda
« Respuesta #6 en: 21 de Noviembre de 2011, 23:23:58 »
  Te dejo un ejemplo funcional. El texto de la constante mensaje queda almacenado en la memoria de programa

Código: C
  1. #include <htc.h>
  2. __CONFIG (LVPDIS & HS & WDTDIS);
  3.  
  4. void main(void)
  5. {
  6.   const char * mensaje = "Hola Mundo";
  7.   char array[20];
  8.   char * puntero;
  9.  
  10.   puntero = array;
  11.   while (*mensaje)  // mientras no se encuentre el caracter nulo
  12.   {
  13.     *puntero = *mensaje;
  14.     puntero++;
  15.     mensaje++;
  16.   }
  17.  
  18.   while(1);
  19. }

  También se podría cargar los datos directamente en la variable array, pero tengo entendido que al manejarlo por punteros es mas eficiente.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: el pcl se desborda
« Respuesta #7 en: 22 de Noviembre de 2011, 01:25:24 »
Ya que todas las cadenas son de 6 elementos, podrías implementar una solución de este tipo:

Código: C
  1. const char datos[]=
  2.     "YA-34 "
  3.     "2003-I"
  4.     "CA-7  "
  5.     "VI-1  "
  6.     "YA-6  "
  7. ;
  8.  
  9. void select_key(short key)
  10. {
  11.     char puntero[7];
  12.     strncpy(puntero, datos + 6 * (key - 'a'));
  13.     puntero[6] = 0;
  14.     lcd_out(1, 9, puntero);
  15. }

No hay comas entre una cadena y la otra (ansi c), el compilador las concatena sin un '\0', con lo que ahorras bastante espacio.
Si tienes problemas con strncpy utiliza un for, y si key puede caer fuera del rango a-z debes cerciorarte de forzarlo.
@fabianjsm is on twitter