Hola nuevamente
Me tardé en responder este tema por un problema con la conexión a internet, pero aquí estoy otra vez.
Antes de continuar quiero aclarar que el programa que había hecho era para un procesador intel 8085 en lenguaje ensamblador, este programa lo eliminé porque quería mejorarlo y optimizarlo.
Bueno, pero de algunas cosas me acuerdo, las mencionaré para ver si ayuda de algo.
El programa estaba diseñado para trabajar con 12 memorias distintas, todas bajo el mismo protocolo de comunicación, o sea que todas usan el mismo algoritmo para cada tarea, lo único que varía es la longitud de la dirección, ya que unas eran de 16 bits de dirección, otras de 18, de 14 y así, por lo que si una dirección usada era 5555h para un bus de 16 bits, para uno de 14 por ejemplo sería la dirección 555h.
Cuando seleccionas la memoria, según yo y mis no muy amplios conocimientos en programación, la identificación de la memoria era mediante el acceso a la dirección de la memoria RAM que hemos introducido con el teclado hexadecimal.
Supongamos que elegimos la EEPROM 39SF020 y en el menú te dice que para trabajar con esta memoria debes presionar "5", entonces presionas 5 (0101) y el programa accederá a la dirección 5 de la memoria RAM, leerá la dirección almacenada ahí (estas direcciones han sido cargadas al inicio del programa) y la colocará en la pila para realizar un salto a esa dirección. Antes de que me digan porque solo 4 bits y no los 16 bits de dirección, ah, pues el resto de bits son puros unos o ceros, dependiendo si esas direcciones están "muy lejos" de la primera.
Cuando salta a esa dirección, cargará la biblioteca de algoritmos y el archivo donde de están los datos de la EEPROM como matrícula, capacidad, fabricante, etc..., en la memoria RAM
Al cargar todo esto, en el menú te aparecerá que deseas hacer, por ejemplo grabar datos, copiar datos de una ROM a otra, borrar sectores, "formatearla", protegerla...
Al igual que la selección de la memoria, si quieres grabar un byte que es así como te permite la
grabación este tipo de memorias EEPROM, pues debes pulsar la tecla de acuerdo a la función que quieras.
Por ejemplo si quieres grabar un byte, pulsas la tecla "A" del teclado hexadecimal y aquí se viene lo bueno
Al grabar el primer byte, según el datasheet de esta EEPROM con la que hemos estado "trabajando" dice así:
El datasheet dice que antes de programar un byte cualquiera hay que introducir una pequeña secuencia de datos hexadecimales que escribiremos tal y como dice la tabla en nuestro programa programador
Entonces, dice que para introducir esta secuencia necesitaremos 4 ciclos de reloj o cuatro estados de los buses de direcciones y datos, entonces esto es lo que haría el programa:
1. Seleccionar comando "Grabar byte"
2. Cargar archivos en la RAM
3. Comenzar secuencia de grabación:
En la secuencia de grabación, una vez que han sido cargados los datos que se usan para la secuencia (55h, AAh, 2Ah, A0h), para el primer ciclo de la secuencia el programa pasará a cargar el bus de direcciones con el dato 5555h.
Aquí el programa envía la dirección donde se ubica el byte 55h al par de registros H y L para cargar el dato en el par de registros D y E.
MVI H, data
MVI L, data
Ejemplo*
MVI H, 2Ah
MVI L, B5h
Donde el dato 55h lo obtiene de la misma dirección de la memoria RAM (dirección ejemplo 2AB5h)
El dato obtenido será almacenado en los registros D y E, mientras que nuevamente los registros H y L son cargados con la dirección almacenada en el programa (dirección ejemplo: F550h):
MVI D, data
MVI E, data
Ejemplo*
MVI D, F5h (dirección del byte AAh)
MVI E, 50h (dirección del byte AAh)
Ya que se ha cargado la dirección, será leída y el dato será cargado en el acumulador:
MOV A, M*
Donde M es la dirección cargada previamente en los registros D y E y el dato en el acumulador será el
byte AAh.
¿Por qué leer los datos desde la RAM y no cargarlos directamente desde la memoria del programa?
Porque el programa trabaja con estos bytes todo el tiempo hasta que termines de grabar por completo una EEPROM, y hacer eso requiere más instrucciones, ya que retornas, realizas saltos y todo para acceder a los mismos datos, además que tardas más en acceder a memoria del programa que a la memoria RAM.
Sigamos
Una vez cargado el dato AAh y la dirección 5555h, el programa enviará esos datos a la EEPROM (STAX D)
Pero, aquí la instrucción dice que la dirección y el dato va destinado a la memoria RAM. Aquí se debe implementar un circuito para que deshabilite la RAM durante esta instrucción y el dato y la dirección estén presentes para la EEPROM y no para la memoria RAM.
Cuando ha sido enviado el primer "paquete de datos" a la EEPROM, se repite todo este proceso pero ahora con los datos marcados en la tabla del datasheet donde dice 2nd Bus Write Cycle.
Ese es el algoritmo para un ciclo de escritura, en total son 4 para los 4 ciclos de escritura para
grabar un byte.
Se me olvidaba, al llegar al cuarto ciclo de escritura, la tabla del datasheet dice:
Addr: BA
Data: Data
Esto que quiere decir?
Esto significa que aquí el programa solicitará tu dato y dirección donde quieras grabar el byte.
Supongamos que quieres grabar en la dirección FFFFh y el dato 10h, aquí el programa lee primero la dirección y la almacenará en el par de registros D y E y luego almacenará el dato en el acumulador. Al almacenarse te pedirá que presiones Enter para grabarlo en la memoria, presionas Enter y se ejecuta la instrucción (STAX D), pero el circuito que se debe implementar deberá deshabilitar la memoria para que los datos no sean almacenados en la RAM, sino que vayan directo a la EEPROM.
Una vez grabados, el programa lee la dirección donde se grabó el byte y lo almacena en el registro B, los compara el introducido por ti y el leído y si está correcto retorna a donde vuelve a ejecutar el algoritmo de escritura (Byte Program) para grabar otro byte.
Si el dato grabado es incorrecto, saltará a otra dirección notificandote el error.
Esta secuencia puedes hacerla de forma que sea un solo archivo donde el programa accederá desde una determinada dirección y ahí ya sabrá que hacer con el resto.
Las normas generales son:
1. Las secuencias son exactamente las mismas para todas las EEPROM que maneja
2. El algoritmo de grabación y las demás son las mismas para todas las EEPROM que maneja
3. La identificación de comandos era acceder directamente a la RAM con el dato proveniente del teclado hexadecimal o con un algoritmo de comparación con múltiples bytes para acceder a la dirección donde se encontraban los datos. O en algunos casos se accedía a la memoria RAM para saltar a la dirección contenida ahí leyendo el teclado y sumandole una cantidad fija para acceder en caso de que la dirección que se obtenía al pulsar solo una tecla ya estuviera ocupada por otro dato.
Finalmente, al terminar, el programa retornaba hasta donde te pide seleccionar la memoria EEPROM con la que trabajarás.
---------------------------------
Perdón si me exageré en la respuesta, pero no entiendo otro lenguaje de programación para tratar de hacerlo más simple
Es lo poco que recuerdo del programa, ya que era algo grande, con una memoria de 65.536 apenas cubrías el espacio necesario para el programa (64.000 bytes aprox.)
La parte más "pesada" es donde arrancaba y le tocaba cargar todas las direcciones de las subrutinas y saltos para todas las memorias, menús, algoritmos y otras cosas que necesitara durante su ejecución.
Una vez cargado ya se volvía "ligero" el trabajo, aunque algo laborioso
Espero sirva de algo, al menos para dar una idea de como sería, dudas? aquí estoy y espero no tardarme
Salu2!