ARDUINO
LTC6904 - LTC6903
Generador de frecuencia
1KHz a 68MHz
Hace un año realicé un generador de
frecuencia con el CHIP DS1077. Junto con este Chip había pedido el
LTC6904 / LTC6903, otro generador de frecuencia.
El LTC6904 es Programmable Oscillator 1kHz to 68MHz .
El problema de este chip es el encapsulado, 8-Lead Plastic MSOP, es
diminuto, de los chip más difíciles que he soldado.
Después de mucho trabajo, he realizado un adaptador a DIP-8 normal.
El segundo problema es descubrir el modelo, I2C o SPI, en mi
caso es LTAES , que corresponde al bus I2C. LTC6904.
En teoría admite direcciones I2C , 22 o 23 seleccionado por
el pin ADR.
En mi caso solo funciona con el pin ADR a Vcc y con la dirección 22,
o está estropeado el chip, o tengo un error en algún sitio.
Para controlar la placa he creado dos programas, en GAMBAS (VB para
Linux) y con la librería Wxwidgets, que funciona en Linux y Windows.
Además he creado un portable Linux que funciona bajo cualquier
distribución Linux (32bits o 64bits) .
Realizado en GAMBAS (VB para Linux)
Librería Wxwidgets -Linux
Librería Wxwidgets - Windows 10
El programa del arduino reconoce la orden FREQ frecuencia
, transmitida por el PC a través del puerto serie.
Existe dos rutina, la creada por mi que no utiliza coma flotante, y
otra que utiliza coma flotante, de donde he sacado la mía.
El resultado es bastante bueno, y tenemos un oscilador programable
mucho mejor que se utilizamos el DS1077.
Como he dicho anteriormente, lo más difícil de este montaje es
soldar el chip.
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.
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.
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.
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.