Gracias por la info KILLERJC
Bueno de todos modos descargue el GCC que viene incluido dentro de MinGW
me gustaría saber si es factible lo que expondré a continuación.
Quiero crear un archivo .c para después aplicar al compilador y poder obtener el .hex, y asi poder cargar el archivo a un pic o simularlo.
mi idea es la siguiente.
En el archivo .c creare un ejemplo básico de encender un led en pic16716, para eso necesito:
- Configurar los fuses
- Setear solo tres registros que son ADCON1, TRISA y PORTA.
El codigo, llamado
LED.c, seria algo asi:
// Fuses
Fuses(); // Aqui debiera ir la direccion de los fuses
// Direcciones de los registros a usar
#define ADCON1 (*((volatile unsigned int *) 0x9f)) // direccion de memoria ADCON1 pic16f716
#define TRISA (*((volatile unsigned int *) 0x85)) // direccion de memoria TRISA pic16f716
#define PORTA (*((volatile unsigned int *) 0x05)) // direccion de memoria PORTA pic16f716
void main(){
int* PUERTO = PORTA;
int* DIRECCION = TRISA;
int* ADC_CONFIG = ADCON1;
// AHORA SETEO REGISTROS
*PUERTO = 0X00; // Limpio puerto
*DIRECCION = 0X00; // Todos pines como salida
*ADC_CONFIG = 0XFF; //Todos digitales
//ENCIENDO UN LED
while(1){
*PUERTO |= 0x01; //Enciendo PIN0 puerto A
}
}
Encontré los comando que el compilador utiliza para crear archivos ->
https://iie.fing.edu.uy/~vagonbar/gcc-make/gcc.htmSegún el link nº1 el proceso del compilador es: pre-procesor-->compilador (crea un .s)-->ensamblador (crea un .o) y luego entra el LINKER.
Según la web debiera hacer lo siguiente (por la venta de comandos en windows):
- preprocesador: llamo a mi archivo
LED.c y utilizando
-E + nombre del archivo (que sera LED) obtengo el archivo
LED.cpp (esto no es de mucha utilidad, según yo xD)
- compilador: con el
LED.c y utilizando
-S + nombre de archivo (que sera LED) obtengo un archivo en ensamblador que con nombre LED.s
- ensamblador: llamo a mi archivo
LED.s creado y utilizando
-o + nombre del archvio a obtener (que tambien ser llamara led) creara mi archivo objeto llamado
LED.o. (según la web se puede saltar todo eso, usando
LED.c -o y me genera el
LED.o...¿que beneficio tiene saltar la creación del .s?)
Ahora viene el trabajo del
LINKER!!El link 2 y 3 que me enviaste entendí que debo "configurar" las direcciones de memoria donde el
linker pondrá el código objeto, que en mi caso sera el
LED.o. Según eso debiera dar los rangos de memoria de FLASH, que son:
-
page (esto no se que es)??
-
config (aqui van los fuses, segun datasheet del pic16f716 esta dentro de este rango de dirección de memoria de programa (2000h-3FFFh))
-
idlocs (esto no se que es)??
-
EEPROM (hay una memoria EEPROM en la memoria de programa??)
Luego los rangos de la memoria RAM. El pic que utilizo tiene 2 bankos, entonces debería escribir algo así (los rangos los saque de su datasheet):
DATABANK NAME=
BANK0 START=0x00 END=0x7F
DATABANK NAME=
BANK1 START=0x80 END=0x17F
Entonces por lo que entiendo, el linker como sabe los rangos de memoria tomara las direcciones de los registros y las "unirá" al respectivo banko (esto para la RAM) y para la memoria de programa tomara lo que esta dentro del main y lo "unirá" desde el 0x0000 de la memoria en adelante y así al final se tendrá el .hex (esta correcto esto???).
El LINKER debiera crearlo aparte, osea en un documento de texto (como el block de notas o notepad++) escribo el código (rango de direcciones de la RAM y FLASH) y al momento de guardar le cambio la extensión .lnk (¿?¿?)
Con el linker creado debiera enlazarlo con mi código objeto, pero el comando que debo utilizar no se bien como utilizarlo aun (la web habla de enlazado dinámico y estático).
KILLERJC me gustaría que pudieras ayudarme con lo que he escrito, verificando los pasos que he puesto si están bien o mal o le falta, etc.
PD: en el código de ejemplo los FUSES no se como se direccionan, ya que su dirección esta en la memoria de programa. Tengo entendido que los punteros "apuntan" a la RAM y no se si se puede hacer algo asi:
#define CONFIG (*((volatile unsigned long *) 0x2000))
Disculpa si es muy largo el texto pero quise ser lo mas explicito y claro posible. Me sera de mucha utilidad que me pudieras corregir y ayudar a construir un .hex
Gracias por la ayuda.