Mostrando entradas con la etiqueta EEPROM. Mostrar todas las entradas
Mostrando entradas con la etiqueta EEPROM. Mostrar todas las entradas

miércoles, 9 de septiembre de 2020

Multi ROM para ZX Spectrum con EEPROM 49F002 o 39SF020


Multi ROM
ZX Spectrum

49F002 o 39SF020


El el anterior artículo había diseñado un grabador de EEPROM ardrom.html.
Este artículo se basa en:  http://trastero.speccy.org/cosas/droy/cartuchos/cartuchos_s.htm
En este caso voy a utilizar unas EEPROM de 256 Kytes (49F002 o 39SF020), por lo cual se conseguirán 16 páginas de 16 Kbytes, que serán las que sustituyan a la ROM original del Spectrum.
Las diferentes páginas (16) se van a seleccionar mediante 4 microinteruptores.
Estos microinterruptores tienen lógica inversa, por lo que para la página cero  debemos tener en ON los cuatro microinterruptores.
Cuando se inserta el cartucho se deshabilita la ROM interna del ZX Spectrum, mediante la colocación de la línea /ROMCS a 1.
El circuito detecta cuando las direcciones A14-A15 están a 0, además de que MREQ esta a 0 (acceso a memoria, tiene lógica inversa). En este caso se habilita la EEPROM, donde sustituye a la ROM original.


Esquema del circuito.




Circuito impreso, donde solo existe un puente con cable.



En mi caso he grabado 5 ROMS.

1111 -Rom original.
0111 -Rom gw03v33.rom , en esta ROM debemos teclear todos los caracteres del lenguaje Basic.
1011 -Rom 48-plus4.rom , ROM amstrad donde debemos teclear todos los caracteres del lenguaje Basic.
0011 -Rom CHESS.ROM .
1101 -Rom JETPAC.ROM .


Este pequeño ordenador me da aún juego después de 35 años, algo debe tener este ordenador.

Dibujo de pista C.I.


Bibliografía:

http://trastero.speccy.org/cosas/droy/cartuchos/cartuchos_s.htm

http://trastero.speccy.org/cosas/droy/droy.htm#cartuchos
https://k1.spdns.de/Vintage/Sinclair/82/Doityourself/IF2%20cartridges/
http://trastero.speccy.org/cosas/JL/InterfazROMexterno/InterfazROM.html



Saludos.
Juan Galaz




martes, 8 de septiembre de 2020

ARDUINO - Grabador de EEPROM , 49F002 o 39SF020



ARDUINO
Grabador de EEPROM

49F002 o 39SF020



He desempolvado el viejo ZX Spectrum y he visto algún artículo sobre como realizar cartuchos ROM para instalar en el Interface 2.
http://trastero.speccy.org/cosas/droy/cartuchos/cartuchos_s.htm
Yo poseo muchas memorias EEPROM procedentes de BIOS de placas base estropeadas.
En este caso voy a utilizar unas EEPROM de 256 Kytes (49F002 o 39SF020), por lo cual se conseguirán 16 páginas de 16 Kbytes, que serán las que sustituyan a la ROM original del Spectrum.
El caso es que no poseo ningún grabador de EEPROM, y no me quiero gastar 50€ en comprar uno a China.
Hace unos 10 años había realizado un programador EPROM utilizando un 8255 y que se conectaba al PC mediante el puerto paralelo.
En este montaje he utilizado un arduino junto con dos contadores 4040 para realizar este grabador EEPROM.
El coste de este proyecto si ya disponemos del arduino, no supera los 2 Euros, en mi caso ya tengo los 4040.
Debemos tener mucha paciencia en conectar todos los cables, de momento no he realizado el circuito impreso.


Versión 6


Como había comentado en la primera versión del grabador, el tiempo de lectura y escritura de la EEPROM era bastante alto.
Mi meta en esta versión era reducir los tiempos y hacer el programa muchos más sencillo.
Y como veréis lo he conseguido, ahora los tiempos de lectura se reducen a menos de 4 segundos, y los de escritura de 16 Kbytes, están entre los 35 segundos y los 60 segundos, dependiendo de la página de memoria que se escriba.
Para conseguir esto, he modificado las conexiones  A8-A17 y se las he conexionado al contador U2 del esquema.
Además la comunicación entre el PC y el arduino se realiza en bloques de 32 bytes.
También se puede reducir aún mas los tiempos, cambiando los tiempos entre pasos y aumentando la velocidad en Baudios, pero me conformo con los que he obtenido.
A modo de detección de errores he creado una especie de número de chequeo, no es el más preciso, pero para este pequeño proyecto funciona bien.
Cuando escribe la memoria EEPROM, vuelve a leerla devolviendo el numero de chequeo, que debe ser el mismo que el que se escribió.

Versión 6.





Diferentes paso en la creación del circuito.


Versión 6 del programa realizado en Gambas y funcionando en Linux Debian10.

Lo único que me falta es realizarlo para Windows, pero eso será otro rato.
Ahora estoy bastante contento con este montaje que me sirve para grabar las 16 ROM del spectrum que se seleccionaran mediante microinterruptores.

PROGRAMA VERSIÓN 6

 


VIDEO

 

 
Programa para Windows

El programa está realizado en Visual Basic 6 , por lo cual tiene una serie de problemas.
En Windows XP funciona perfectamente sin hacer ningún tipo de acciones.
Tanto en Windows 7 como Windows 10 debemos de realizar unos pasos previos.

En windows 32 bit copiar los dos archivos en system32 y luego registrarlos como administrador con la orden
regsvr32 c:\windows\System32\MSCOMM32.OCX
regsvr32 c:\windows\System32\COMDLG32.OCX

En windows 64 bit copiar los dos archivos en c:\windows\syswow64 y luego registrarlos como administrador con la orden
regsvr32 c:\windows\syswow64\MSCOMM32.OCX
regsvr32 c:\windows\syswow64\COMDLG32.OCX

Para hacer todo esto debemos abrir la consola en modo administrador.
Además de esto, si no reconoce el grabador a la primera, debemos deshabilitar los demás puertos COM.


Programa realizado en Visual Basic 6.

PROGRAMA WINDOWS


 

 

 



Versión 1



Esquema del grabador.


Circuito montado.

El circuito lee las ordenes que se le mandan desde el PC, y según la orden lee, escribe, direcciona y borra el CHIP.

DI n  -Coloca la dirección n para leer o escribir.
      -Devuelve DK y la dirección actual.

R     -Lee la dirección actual e incrementa el registro de direcciones.
      -Devuelve R n, donde n es el dato devuelto.

W n   -Escribe el dato n en la dirección actual e incrementa el registro de direcciones.
      -Devuelve W y el dato escrito.

ERASECHIP -Borra todo el CHIP

          -Devuelve ERASECHIP_OK


El programa en el PC esta escrito en Gambas, una especie de Visual Basic para Linux.
Para lo que no funcionen con Linux tendrán que esperar a que lo realice en wxwidgets que funciona en Windows y Linux.

Programa realizado en Gambas.

El programa solo graba bloques de 16384 bytes (el tamaño de la ROM del Spectrum), y la dirección de grabación se seleccionará desde las 16 posibles páginas.

El tiempo de lectura de los 16 Kbytes es de 55 segundos, y el tiempo de escritura es inferior a 6 minutos.
La mayor parte del tiempo es el proceso de comunicación entre el PC y el Arduino. La transferencia de datos es byte a byte con confirmación de transmisión, esto lo hace muy lento. Entre las cosas que quiero cambiar es la comunicación por bloques a 256 bytes, de esta forma se reducirá mucho el tiempo. Pero eso es para otro rato.
Como curiosidad debemos entender que para grabar este tipo de memoria, tenemos que mandar al CHIP una secuencia de 4 bytes.
También la forma en que he construido el grabador influye mucho en el tiempo de grabación, para direccionar una determinada dirección, debemos colocar la dirección en los contadores 4040, y esto se consigue contado hasta esa determinada dirección.
Otra forma mucho más rápida hubiese sido colocar tres 74LS373 para obtener  la dirección, pero deberíamos cablear mucho mas.
Y la forma más simple era usar un arduino Mega con suficientes entradas y salidas, pero esa no era mi meta.

En el próximo montaje veremos como podemos cargar diferentes páginas de EEPROM en el spectrum.



PROGRAMA

VIDEO



Bibliografía:

http://trastero.speccy.org/cosas/droy/cartuchos/cartuchos_s.htm



Saludos.
Juan Galaz





jueves, 23 de junio de 2016

Programación EEPROM 24cXX 24c01-24c02-24c04-24c08-24c16 con Arduino y Gambas

Página principal



Programación EEPROM 24cXX
24c01-24c02-24c04-24c08-24c16
con
Arduino y Gambas

xsetaseta@gmail.com


En el anterior montaje  (programación EEPROM 24c02 24c01) había realizado un grabador de memorias 24c01 y 24c02 de 128bytes y 256 bytes. Estos modelos tienen un direccionamiento de 1byte, 256 posiciones de memoria. El bus I2C se había diseñado para en principio para direccionar  256 tipos de dispositivos (Circuitos integrados), y era mas que suficiente. Pero que ocurrió que se utilizó para memorias EEPROM, y las memorias crecieron en capacidad, y ahora es fácil encontrar memoria de hasta 8Mbytes.
Para memorias de entre 256 bytes a 2Kbytes, quitaron los ping de selección de chip E0,E1,E2  para internamente utilizarlos como direccionamiento.
En memorias 24c32 al 24c256, 4Kbytes a 64Kbytes, se mandan dos bytes para sacar la dirección de la memoria. Cuando me lleguen estos modelos de chip actualizaré el programa. Recomiendo leer las hojas de características  de los chip para entender su funcionamiento.

Cuando empece a programar los chip 24c04-24c08-24c16 desde arduino no encontré ningún ejemplo, y el que vi resulto que direccionaba mal la memoria, mandando 2Bytes.
Tampoco entendía que en la librería Wire de arduino , asignaran para las memorias la dirección 0x50, #define EEPROM_I2C_ADDRESS 0x50 ,cuando en realidad era 0xA0  (0b10100000). Después de investigar, descubrí que desplazaba 1 bit a la derecha para eliminar el bit de escritura, claro está que luego la librería Wire, vuelve a desplazar a la izquierda para volver a colocar el verdadero valor.
Ahora entendido como se debía utilizar la EEPROM_I2C_ADDRESS como parte de direccionamiento de la memoria, se modifica la programación del arduino. Utilizo los bits A8,A9,A10 de la dirección de memoria, para colocarlos en el Device Select Code en la posición b1,b2,b3.  deviceaddress=deviceaddress | (eeaddress >> 8) ;




Conexionado de la memoria con el arduino nano para memorias 24c01-24c02-24c04-24c08-24c16 .


Circuito montado.


Adaptando los modelos  SO8 Pin Connections


Programa en gambas.

El programa en gambas (VB para Linux) es sencillo, pero tiene un poco de todo, lee, graba,compara, guarda, restaura, y un pequeño editor.
Para evitar ciclos de escritura, conviene leer la memoria a programar, y cuando se graban datos en dicha memoria se compara el dato que hay en esa posición de memoria y el dato que va se va ha escribir, sin son el mismo no graba nada. Esto evita muchas grabaciones innecesarias y hace grabaciones rápidas. A esto llamo WriteComparación.

Para empezar el programa debemos seleccionar el puerto, normalmente /dev/ttyUSB0 , y pulsamos start . Si todo nos va bien nos saldrá EMPIEZA 24C 01/02 .
Insertada la memoria, leemos sus datos con el botón Read, se visualizaran automáticamente. Si queremos cambiar el modo de visualización seleccionamos DEc , Char,  Hex .
Si queremos editar algún dato, pulsamos sobre la pantalla de los datos y mediante los cursores seleccionamos la dirección que queramos modificar. Ahora introducimos el valor en la casilla de Valor y pulsamos Enter, automáticamente cambia el dato e incrementamos la posición de memoria.
Ahora podemos grabar los datos en memoria o guardarlos en un fichero.

Espero que le sirva a alguien este programa.
Mi intención es actualizar el programa para grabar todo tipo de memorias

Programa

Saludos.
Juan Galaz