TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: dopoulo en 13 de Febrero de 2006, 10:10:00
-
Estoy intentando hacer un programa cargador para un PIC18F452 que lea los programas de una tarjeta MMC/SD.
El cargador irá en el ultimo KB de la memoria de programa aproximadamente. Estoy utilizando el compilador de Hi-Tech.
Mi duda consiste en como colocar el programa a partir de esa posicion.
En las opciones del compilador viene una opción que consiste en especificar un offset en la memoria ROM, he probado esto pero lo que hace es mover el programa completo hacia ese offset, con lo cual ahora en la direccion 0 de la memoria no esta el salto al comienzo del programa.
Lo que yo necesito es ubicar el programa a partir de la direccion que yo quiera, y que en la direccion 0x0000 de la memora haya un "goto" al comienzo de mi programa.
A ver quien pueda ayudarme. Gracias
-
La directiva "ORG" suele ser común para compiladores y ensambladores.Con ella puedes reservar posiciones de memoria y rangos completos,evitando que estas posiciones sean ocupadas.Búscala en la ayuda de tu compilador que seguramente vendrá algo.Ya nos cuentas.
Suerte
-
Con el compilador CCS lo que puedes hacer es lo siguiente:
#org 0x00,0x04
#asm
goto 0x1000
#endasm
....
...
....
...
//
//#org inicio_del programa, fin_del programa
#org 0x1000,0x13FF
void main()
{
.
.
.
}
¿Estas ocupando interrupciones?
-
Gracias a los dos.
Parece que he solucionado algo
Incluyendo esto: creo una "seccion del programa" en la direccion 0 que realiza un salto a BOOT_START (direccion donde comienza mi cargador)
#asm
psect redirect,abs
goto BOOT_START
#endasm
Pero ahora viene otro problema. Como quiero ubicar mi cargador en la parte alta de la memoria de codigo, en las opciones del linkador viene una opcion para especificar un offset. Pues bien, si el offset que especifico es mayor que 0x4000h cierta parte del codigo me lo coloca a partir de 0x4000h y si el offset indicado es menor, me desplaza el programa bien.
He aqui el resultado cuando especifico un offset de 0x6000 por ejemplo:
Psect Usage Map:
Psect | Contents | Memory Range
---------|--------------------------|--------------------
redirect | User defined psect | $000000 - $000003
text | Program and library code | $004000 - $004067
text | Program and library code | $004068 - $00408B
text | Program and library code | $00408C - $00409D
powerup | Power on reset code | $006000 - $006003
init | Initialization code | $006018 - $006031
end_init | Initialization code | $006032 - $006035
param | Parameter auto blocks | $0000FF - $0000FF
bigbss | Large RAM variables | $0005FF - $0005FF
rbit | Bit variables | $000000 - $000000
Memory Usage Map:
Program ROM $000000 - $000003 $000004 ( 4) bytes
Program ROM $004000 - $00409D $00009E ( 158) bytes
Program ROM $006000 - $006003 $000004 ( 4) bytes
Program ROM $006018 - $006035 $00001E ( 30) bytes
$0000C4 ( 196) bytes total Program ROM
RAM data $0000FF - $0000FF $000001 ( 1) bytes
RAM data $0005FF - $0005FF $000001 ( 1) bytes
$000002 ( 2) bytes total RAM data
Near bits $000000 - $000000 $000001 ( 1) bits total Near bits
Si os fijais, la seccion de codigo de inicialización queda a partir de 0x6000h pero la seccion de codigo de las librerias quedan a partir de 0x4000h (16384)
¿Sabe alguien que puede estar pasando?.
¿Tiene alguien algo de practica en reubicar programas?
Gracias
-
0x4000 son 16384 palabras,que es exactamente la memoria con la que cuenta el micro.Si tu cargador ocupa 1K como comentas,colocándolo a partir de la posición
0x3C00 te debería valer.
Saludos
-
Gracias, pero despues de mucho darle vueltas resulta que era un ¿bug? (¿se dice así?), vamos un fallo del compilador de Hi-Tech que con un parche que viene en su foro se soluciona, vamos para volverme loco.