TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: bitpic 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
-
Esto no me funciona:
const char tabla[] = "Hola que tal?";
for(k=0;k<20;k++){
printf("%c",tabla[k]);
}
Esto si que funciona:
char tabla[] = "Hola que tal?";
for(k=0;k<20;k++){
printf("%c",tabla[k]);
}
-
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]);
}
-
prueba asi:
const char tabla[] = "Hola que tal?";
char value;
for(k=0;k < sizeof tabla;k++){
value=(char)tabla[k];
printf("%c",value);
}
-
Gracias por la ayuda, pero ninguna de las dos maneras me funciona, me siguen saliendo los caracteres null
-
¿Y te sigue funcionando bien en Proteus?
-
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?
-
He probado esto tambien:
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.
-
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.
:?
-
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).
-
Utiliza esta funcion (esta en string.h)
strcpypgm2ram(ram,rom);
-
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.
-
MerLiNz tengo incluida la libreria string.h, pero no me deja usar el strcpypgm2ram como mucho puedo usar el strcpy()
(http://imageshack.us/a/img211/9189/sinttulokcd.png)
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)
-
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).
-
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?
-
Supongo que tienes razón y no es problema de bancos, pero si que he visto en el datasheet que a partir de una posición de memoria de programa si intentas leer te devuelve un caracter null. He intentado poner el array en una posición no problematica añadiendo un @ 300 pero tampoco funciona.
En cuanto a lo debuggerar tendré que hacer otro programa solo para hacer el debugger, el programa que tengo ahora es muy largo y puede ser un lio (tampoco soy un experto debuggeando), eso si, lo raro es que con el Proteus va bien por lo que entiendo que el programa esta bien, se compila bien y el problema tiene que estar en el PIC o la memoria del PIC que no se pueda leer o algo así.
Me lo mirare detalladamente, pero me suena que hay unos fuses de protección de código... ¿esos fuses de protección de codigo afectan solo a intentar leer con el programador o tambien afectarian a leer con el propio PIC?
-
Puede ser un problema de fuses. Los PIC18 pueden impedir que se realicen accesos a tablas(que seguramente use en este caso para leer el array) desde otros bancos de la ROM. Podrías buscar el problema por alli. Permite que se puedan leer tablas desde otros bloques de la ROM, mediante los fuses correspondientes(EBTRB, EBTR0, EBTR1, EBTR2 y EBTR3)
-
Puede ser un problema de fuses. Los PIC18 pueden impedir que se realicen accesos a tablas(que seguramente use en este caso para leer el array) desde otros bancos de la ROM. Podrías buscar el problema por alli. Permite que se puedan leer tablas desde otros bloques de la ROM, mediante los fuses correspondientes(EBTRB, EBTR0, EBTR1, EBTR2 y EBTR3)
Si no me equivoco los tengo bien configurados:
/ CONFIG7L
#pragma config EBTR0 = OFF // Table Read Protection bit (Block 0 (000800-001FFFh) is not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF // Table Read Protection bit (Block 1 (002000-003FFFh) is not protected from table reads executed in other blocks)
#pragma config EBTR2 = OFF // Table Read Protection bit (Block 2 (004000-005FFFh) is not protected from table reads executed in other blocks)
#pragma config EBTR3 = OFF // Table Read Protection bit (Block 3 (006000-007FFFh) is not protected from table reads executed in other blocks)
// CONFIG7H
#pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot block (000000-0007FFh) is not protected from table reads executed in other blocks)
¿Me equivoco?
EDITOO!!!!!!!!!!!! : GRACIAS si que era eso, pero era #pragma config EBTRB = ON
GRACIAS GRACIAS GRACIAS ajajajaj
-
Adjunta el hex y lo miro. La verdad está allí.
Saludos.
-
BrunoF y todos los que habéis intentado echar un cable!!!! Muchas gracia a todos.
Era lo que decia BrunoF, el fuse EBTRB tiene que estar como ON, yo interpretaba que OFF era que podias acceder a la memoria.
Poniendolo así:
#pragma config EBTRB = ON
a funcionado al momento.
Ahora ya me funciona toda la tabla de mensajes que tenia guardada, sin limite de bytes por array (bueno si, la memoria que tengas disponible)
Un saludo a todos. :-/
-
Por eso, lo de ON y OFF es muy confuso a veces. Lo mejor es ir a la verdad pura de los ceros y unos en cada valor del registro y mirar el datasheet a ver que significa cada cosa.
Me alegro que lo hayas hecho andar. A disfrutar!
Saludos.
-
Me alegro mucho, ha sido una pelea dura.
Una lástima que Proteus siga teniendo esos fallos.
-
La concreta es en el micro. Lo del proteus es como decía un profesor de electrónica.
"Una cosa es con guitarra y otra distinta es con violín"
Tomo nota para cuando tenga problemas similares siempre mirar los fuses. Esos cabrones siempre están jodiéndole la vida a uno.
Ya se, ya se, ya se algo nuevo! Nuevo hack en mi biblioteca, así cuando alguien venga con el súper problema después de un mes, le puedo decir. ¿Ya miraste los fuses tales?
Humm y me huelo que a Bruno ya una vez le explotó la cabeza con un problema similar.
Un saludo
Reinier