Muy buenas Picuino y demas gente:
Si al final veo muchos problemas de memoria, haré lo que tu pensabas, colocar el compilador en el PC.
En principio sino no son muchos comandos inclusive en la flash del microcontrolador, en C podria ser algo
parecido a esto.
char COMANDO [ ] = "WAIT";
if (strcmp(DATO_EN_RAM, COMANDO) == 0) { graba_codigo_hex_de_wait_en_RAM(); }
char COMANDO [ ] = "LED1";
if (strcmp(DATO_EN_RAM, COMANDO) == 0) { graba_codigo_hex_de_wait_en_RAM(); }
Si ya empiezan a ser muchos comandos se podria almacenar los textos en la eeprom o de pic o exterior y entonces
y crear una rutina que vaya buscando los datos en la eeprom comparandola con la variable DATO_EN_RAM
y cuando encuentre coincidencia grabe dato contiguo en la eeprom, que es el codigo hex del comando en la RAM.
Para ello a lo mejor habra que dar un tamaño de grabacion del texto del comando en la eeprom, esto es dar un
ancho por ejemplo de 8 caracteres estandar, si el comando tiene menos caracteres rellenarlos con espacios en blanco,
y lo mismo los datos del comando que vienen por el puerto serie y se almacenan en RAM.
De esta forma asegura la comparacion y la sincronizacion de los datos.
y de comunicación UART por interrupciones en 1430 words
Gracias a la interrupcion del puerto serie por que si no los datos se acaban perdiendo por falta de sincronizacion
entre PC y PIC.
Luego un intérprete se limita a llamar a las diferentes funciones según el código que se encuentre en la memoria
(una orden switch case)
A lo mejor si lo vas a grabar en la flash, entonces correrlo ya directamente en la flash.
Puede que en algunos casos si grabas flash de esta forma tengas que recolocar todo el programa flash del pic o parte.
Aunque seguramente antes de grabarlo en flash lo que querras probar en memoria.
En mi caso en ensamblador el este codigo seria algo parecido a esto:
;**********************************************************************
; SUBRUTINA EJECUCION PROGRAMA RAM EN BLOQUE 100 - 1FF
; LOS CODIOGOS DE COMANDOS YA ESTAN ALMACENADOS EN EN ESTE BLOQUE
; JUNTO CONLOS DATOS ANEXOS.
;**********************************************************************
RUNPROG
movlw 0x01 ; Inicializacion contador de program
movwf FSR0H ;
movlw 0x00
movwf FSR0L
movlw 0ffh
movwf COUNTER
LAZO
movf POSTINC0,W ; Mueve el dato de memoria a work y incrementa a la posicion
addwf PCL,1 ; Sumaselo a PCL para saltar al comando adecuado
bra COMANDO1 ; CARGA COMANDO 1 ENVIAR UN DATO POR EL PUERTO A
bra COMANDO2 ; CARGA COMANDO 2 ENVIAR UN DATO POR EL PUERTO B
bra COMANDO3 ; CARGA COMANDO 3 ENVIAR UN DATO POR EL PUERTO C
bra COMANDO4 ; CARGA COMANDO 4 PARA CONFIGURAR LAS VARIABLES DEL RETARDO
bra COMANDO5 ; CARGA COMANDO 5 HACER UN SALTO INCODICIONAL A UNA DIRECCION DE PROGRAMA.
bra COMANDO6 ; CARGA COMANDO 6 HACER UN SALTO CODICIONAL A UNA DIRECCION DE PROGRAMA.
bra COMANDO7 ; CARGA COMANDO 7 PARA EJERCUTAR LA FUNCION RETURN RETORNO LLAMADA CALL.
bra COMANDO8 ; CARGA COMANDO 8 ENVIO DE UN DATO BLOQUE 300-3FF A UNA POSICION DETERMINADA 200-2FF.
bra COMANDO9 ; CARGA COMANDO 9 CONFIGURACION ENVION DATOS COMANDO ANTERIOR -- COMANDO8.
bra COMANDO10 ; CARGA COMANDO 10 PARA CONFIGURACION PUERTO A TRISA
bra COMANDO11 ; CARGA COMANDO 11 PARA CONFIGURACION PUERTO B TRISB
bra COMANDO12 ; CARGA COMANDO 12 PARA CONFIGURACION PUERTO C TRISC
bra COMANDO13 ; CARGA COMANDO 13 CONFIGURA PUERTO I2C VIRTUAL.
bra COMANDO14 ; CARGA COMANDO 14 SACA DATO POR EL PUERTO I2C VIRTUAL.
bra COMANDO15 ; CARGA COMANDO 15 FIJA CONDICION DE START.
bra COMANDO16 ; CARGA COMANDO 16 INICIA CIRCUITO I2C
ETC...
salida
decfsz COUNTER
goto LAZO
return
COMANDO1 ; EJEMPLO
ETC..
ETC..
bra salida
COMANDO2
ETC..
COMANDO3
ETC..
Por ahora estoy liado con las estructuras de datos. Tengo que ponerlo todo en RAM, con la opción de guardar
programas en FLASH para recuperarlos más adelante.
¿Puede ser po los tamaños de los textos de los comandos como comente anteriormente? cual es el problema.
Que bonito, en definito es lo mismo que hace un ordenador o el Spectrump, que es compilar y descompilar o lo que
es lo mismo ensamblar y desensamblar.
Bueno si lo grabas en una eeprom, lo mismo que cuando compilas buscas la cadena y cuando lo encuentras salvas el
codigo del comando, cuando descompiles puedes hacer lo inverso, que es buscar el codigo de del comando y extraer
de la misma eeprom la cadena correspondiente.
La verdad es que todo esto es un buen trabajito.....jejeje, pero a mi me parece muy interesante.
Ademas Picuino cuando alguien crea un compilador, nadie lo crea todo a la vez, pasito a pasito, pienso que
nada es trabajo perdido, puede que en algun momento tengas que modificar muchas cosas pero aunque parezca
que no todo lo anterior vale.
Para mi que hago todas estas cosas por puro hobby el placer esta justo en el momento que estoy creando el codigo.
acabado esto queda satisfacion pero pasado el tiempo casi el olvido.
Un saludo.