Autor Tema: problema con Array en memoria de programa  (Leído 4166 veces)

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

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
problema con Array en memoria de programa
« en: 18 de Mayo de 2013, 05:06:07 »
Hola,

Tengo definido un array así (en la memoria del programa):

const char tabla[] = "Hola que tal?";

y lo quiero mostrar en un LCD de la siguiente manera:

    for(k=0;k<20;k++){
        printf("%c",tabla[k]);
    }

pero me muestra todos los valores nulos.

En cambio si muestro en el LCD de esta forma printf("%s",tabla); o la declaro solo como char (en RAM):

char tabla[] = "Hola que tal?";

si que me funciona. El problema es que necesito que el array esté en la memoria de programa en lugar de la RAM y quiero imprimir con el bucle for :?

¿Que hago mal? ¿Porque si accedo carcter a carter me lo muestra como null?


Estoy trabajando con un PIC18F4550 y XC8
« Última modificación: 18 de Mayo de 2013, 05:36:30 por bitpic »
BitPIC

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: problema con Array en memoria de programa
« Respuesta #1 en: 18 de Mayo de 2013, 06:48:34 »
Esto no me funciona:

Código: [Seleccionar]
   const char tabla[] = "Hola que tal?";
    
    for(k=0;k<20;k++){
        printf("%c",tabla[k]);
    }


Esto si que funciona:

Código: [Seleccionar]
   char tabla[] = "Hola que tal?";
    
    for(k=0;k<20;k++){
        printf("%c",tabla[k]);
    }


« Última modificación: 18 de Mayo de 2013, 06:51:51 por bitpic »
BitPIC

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: problema con Array en memoria de programa
« Respuesta #2 en: 18 de Mayo de 2013, 12:59:36 »
Hola!

No veo motivo por el cual no deba funcionar, excepto algo raro relacionado a que estas recorriendo el array mas allá de su tamaño. Podrías probar haciendo:

const char tabla[] = "Hola que tal?";
   
    for(k=0;k < sizeof tabla;k++){
        printf("%c",tabla[k]);
    }
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: problema con Array en memoria de programa
« Respuesta #3 en: 18 de Mayo de 2013, 15:30:07 »
prueba asi:

const char tabla[] = "Hola que tal?";
char value;
   
    for(k=0;k < sizeof tabla;k++){
value=(char)tabla[k];
        printf("%c",value);
    }

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: problema con Array en memoria de programa
« Respuesta #4 en: 19 de Mayo de 2013, 03:50:05 »
Gracias por la ayuda, pero ninguna de las dos maneras me funciona, me siguen saliendo los caracteres null
BitPIC

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: problema con Array en memoria de programa
« Respuesta #5 en: 19 de Mayo de 2013, 05:40:42 »
¿Y te sigue funcionando bien en Proteus?

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: problema con Array en memoria de programa
« Respuesta #6 en: 19 de Mayo de 2013, 05:58:40 »
Si Nocturno, en proteus no tengo ningún problema. Eso es lo raro.

¿Hay algún fuse que pueda bloquear la rom y por eso no pueda leer la memoria?
BitPIC

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: problema con Array en memoria de programa
« Respuesta #7 en: 19 de Mayo de 2013, 06:14:36 »
He probado esto tambien:

Código: [Seleccionar]
    char texto[];
    char const tabla[] = "Hola que tal?";

    strcpy(&texto,&tabla);
 
    printf("%s",texto);


Pero lo mismo, en Proteus funciona, pero en el display no.
BitPIC

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: problema con Array en memoria de programa
« Respuesta #8 en: 19 de Mayo de 2013, 06:47:46 »
Buscando información y mirando en manuales, he encontrado un que dice que solo se pueden hacer arrays de 256 bytes.  :shock:

¿es eso cierto?

El array que quiero usar tiene 28 mensajes X 4 idiomas X 20 caracteres (Array 3 dimensiones) = 2240 bytes. De ahí que quiera meterlo en la Flash de programa, porque en la RAM no me cabe, pero claro, si el XC8 me va a limitar el array a 256bytes tengo dos problemas, uno resolver el tema de "const char" y otro es donde meter todos estos mensajes y poder acceder a ellos.

 :?
BitPIC

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: problema con Array en memoria de programa
« Respuesta #9 en: 19 de Mayo de 2013, 11:48:11 »
Buscando información y mirando en manuales, he encontrado un que dice que solo se pueden hacer arrays de 256 bytes.  :shock:

¿es eso cierto?

El array que quiero usar tiene 28 mensajes X 4 idiomas X 20 caracteres (Array 3 dimensiones) = 2240 bytes. De ahí que quiera meterlo en la Flash de programa, porque en la RAM no me cabe, pero claro, si el XC8 me va a limitar el array a 256bytes tengo dos problemas, uno resolver el tema de "const char" y otro es donde meter todos estos mensajes y poder acceder a ellos.

 :?

Lo limita por bancos, aun asi habia una forma de hacer todos los bancos en uno editando un archivo (no recuerdo cual pero era algo de la memoria).

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: problema con Array en memoria de programa
« Respuesta #10 en: 19 de Mayo de 2013, 11:51:54 »
Utiliza esta funcion (esta en string.h)

strcpypgm2ram(ram,rom);

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: problema con Array en memoria de programa
« Respuesta #11 en: 19 de Mayo de 2013, 12:03:14 »
Si Nocturno, en proteus no tengo ningún problema. Eso es lo raro.

¿Hay algún fuse que pueda bloquear la rom y por eso no pueda leer la memoria?

es posible que sea algo relacionado con los fuses o la configuración de los puertos, checa también el contraste de la pantalla.
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: problema con Array en memoria de programa
« Respuesta #12 en: 19 de Mayo de 2013, 12:50:45 »
MerLiNz tengo incluida la libreria string.h, pero no me deja usar el strcpypgm2ram como mucho puedo usar el strcpy()



Con el strycpy me ocurre lo mismo, me funciona en el Proteus, pero en el PIC no.

El LCD funciona bien, si pongo printf("hola mundo"); o en lugar de hacer un const char ango un char el mensaje aparece correctamente, es algo de la memoria.

EDITO: Leyendo manuales de C veo que tienes razón, tengo que usar el strcpypgm2ram(), pero ¿porque no me deja usarlo y me aparece como comentado en la librería? parece como si tuviese el PIC mal declarado, de echo en ocasiones tengo problemas con algunas librerias y tengo que añadir un #define __PIC18F4550 (ahora mismo lo tengo en el codigo)
« Última modificación: 19 de Mayo de 2013, 13:12:37 por bitpic »
BitPIC

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: problema con Array en memoria de programa
« Respuesta #13 en: 19 de Mayo de 2013, 13:26:17 »
Llevo todo el fin de semana dándole vueltas y siempre con los mismo resultados. Creo que va a ser un tema de Bancos.

Parece como si no direccionase bien donde esta el array, como si guardara el array en un banco y a la hora de mostrar el mensaje en el LCD fuese a la misma posición de memoria pero de un banco diferente y por eso aparecen los caracteres como null.

He probado con punteros, pero me ocurre lo mismo. ¿Alguna idea de como direccionar correctamente al banco donde esta el array?

He probado con char const tabla[] @10 = "Hola que tal?"; pero me ocurre lo mismo, quizá lo que me falta es decirle en que banco está (aunque tampoco se en que banco lo esta guardando).
BitPIC

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: problema con Array en memoria de programa
« Respuesta #14 en: 19 de Mayo de 2013, 14:59:19 »
el C no trabaja con bancos esto es automatico y lo translada a asm. De todas formas cuando declaras una constante la estas declarando en la ROM por lo cual ahi no hay nada de bancos.
Has probado a debuggear y ver los valores que toman las variables de la ram al hacer por ejemplo el strcpy?


 

anything