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.
Hace muchos años en la revista Elektor
salió un artículo explicaba como realizar un trazador de curvas de
transistores.
Las curvas se podían visualizar en un osciloscopio, y era bastante
sencilla su realización.
Como era sencilla su realización, lo monté y pude ver las curvas en
mi osciloscopio. Circuito de la revista Elektor.
Han pasado muchos años desde entonces, pero su diseño sencillo me
cautivó.
El problema de visualizar las curvas en el osciloscopio es que no se
podían comparar unas con otras, además no se podían imprimir.
Ahora es fácil con los microcontroladores capturar los datos y poder
guardarlos.
Me puse manos a la obra y adapté el circuito para poder capturar los
datos con el arduino. Circuito trazador de curvas de transistores con arduino.
Voy a explicar un poco el funcionamiento del circuito.
El transistor Q2 produce una corriente constante que hace cargar
linealmente el condensador C1, una señal de diente de sierra lineal.
Esta señal que toma valores desde 0 a 5 V, se aplica al colector del
transistor a probar mediante el transistor Q1.
Para descargar la carga del condensador se utiliza el transistor Q3.
La carga y descarga del condensador se realiza con el Pin D13
del arduino.
Para generar las diferentes intensidades que se le aplica a la base
del transistor de prueba, utilizamos los Pin D2-D3-D4 del arduino.
Con las diferentes combinaciones de los Pin D2-D3-D4 podemos
mediante resistencias y diodos aplicar una intensidad al transistor
de prueba. Al ser 3 bits las combinaciones el número de curvas son
8.
La intensidad se mide mediante la resistencia R6, y es
capturado con el Pin A0. Circuito montado.
En la parte de programación en el Arduino el funcionamiento es el
siguiente:
-El Pin 13 se pone a 1, con lo que conseguimos dos cosas, descargar
el condensador C1 y anular el generador de intensidad constante.
-El pin 13 se pone a 0, anulamos la puesta a cero del condensador, y
activamos la cargar linealmente el condensador C1 .
-Mediante el Pin A0 medimos la corriente en el transistor 10 veces
durante la carga del condensador.
-El paso anterior se repite 8 veces, con las diferentes intensidades
en la base del transistor de prueba.
-Terminadas la medidas se mandad mediante el puerto serie.
Para representar las curvas se me ocurrió hacer un programa, pero me
lo pensé dos veces y he utilizado una hoja de cálculo con
representación gráfica. Solo tienes que copiar datos procedentes del
arduino y pegarlos en la hoja de cálculo. Es fácil y quedan bastante
bonitas, además de ahorrarme unas horas de programación.
Copiado de datos desde el terminal.
Pegado de datos a la hoja de cálculo. (BC547)
Alta ganancia
Darlington
Conclusiones y notas.
Después de muchas medidas con diferentes transistores y con iguales
modelos pero de diferentes fabricantes he obsevado que:
-Aunque sea el mismo tipo (BC547), las curvas son muy diferentes
entre los diferentes fabricantes.
-Hay transistores bastante especiales, 2SD2375 con una ganancia
enorme.
-Los Darlington como se puede ver tienen otro tipo de curvas, y su
tensión B-E es de 1.4V.
Mi conclusión es que se fabrican lotes de transistores comunes, y
dependiendo de los resultados en los test, los numeran con un numero
que se adapte a las tablas standard. Eso creo que pasaba en el
pasado, ahora creo que son más precisos a la hora de su fabricación.
Los transistores no funcionan igual con tensiones más altas de
5V, pero no he querido complicar el circuito para poder alimentarlo
a partir del Arduino.
También se podría hacer que la entrada A0 digitalizase más rápido
además de con más ganancia, pero he querido usar técnicas normales
del arduino.
Otra forma de medir la señal sería medir en la resistencia R7
e invertir la señal, pero he creído no necesario complicar las
cosas.
Es un sencillo montaje que permite observar el funcionamiento de los
diferentes transistores, no se pretende mucho más, no se quiere
hacer un instrumento de medida exacto.
Todos tenemos un pasado, y en mi pasado
está el ZXSpectrum, fue mi primer ordenador.
El estar cargando los programas desde las cintas es una experiencia
que la gente joven desconoce.
En el tiempo que tardaban los programas en cargar se podía uno
hacer un bocadillo, y aún sobraba tiempo.
Y estábamos contentos si no se producía ningún error de carga, las
cintas alguna vez daban problemas.
El caso que en estos días he estado cachareando con el Spectrum, y
en mi anterior montaje había realizado un cargador de programas
desde una SD. zxard.html
Como una cosa traen a otra, mirando por internet encontré un
programa que prometía reducir el tiempo de carga de los programas
del ZXSpectrum a 30 segundos. Esto me parecía bastante difícil, pero
había que probarlo.
El proyecto se encuentra en: https://code.google.com/archive/p/otla/wikis/ProyectoOtla.wiki
Existe una página que explica bastante bien todos los pasos: https://sites.google.com/site/hyperkingproject/tutoriales/modificaciones/compresiondejuegosdespectrumaaltavelocidadotla
Para crear el audio debemos utilizar el programa llamado O.T.L.A.
que transforma diferentes formatos a un fichero de mp3. El programa funciona en Windows, aunque yo lo he probado en Linux
con Wine y funciona perfectamente.
Soporta varios formatos, pero el que menos problemas me ha dado fue
el Z80, que es una imagen de memoria.
Como podéis observar no solo sirve para el Spectrum, funciona para
MSX, CPC y Z81.
Existen numerosas opciones, pero yo no he tocado nada respecto a las
que vienen prefijadas.
Cargamos el fichero en formato Z80 y luego lo transformamos en un
fichero MP3.
El fichero ya lo podemos utilizar tanto con la salida de audio del
PC como con un MÓVIL o TABLET.
Aquí me encontré el primer problema, los niveles de audio.
En algunos modelos de PC o MÓVIL las salidas de audio no suele
superar 1V, esto ya pasaba con algunos cassetes que no servían para
los Spectrum. He tenido que crear un adaptador/amplificador de
niveles de audio, solo emplea un transistor, condensadores y
resistencias, es el típico amplificador.
Para la alimentación he utilizado un conector USB, de esta forma
puedo utilizar un cargador común de Red, o una POWER-BANK como
en mi caso.
Circuito montado.
También podéis mirar en otros modelos de móvil si la salida tiene
suficiente nivel de audio, yo he encontrado uno que tenía retirado.
WIKO lubi3 , se puede encontrar desde 15€ y funciona de maravilla
para reproducir MP3.
Las pruebas son sorprendentes, nunca pensé que se pudiera cargar tan
rápido los programas, 30 segundos.
No he probado a modificar ninguna opción, me he quedado paralizado
por la sorpresa, me sobra cualquier otra prueba.
He reproducido los MP3 generados tanto en el PC como en un MÓVIL
funcionando perfectamente, eso sí, debemos de ajustar los niveles de
audio, pero eso ya nos pasaba cuando utilizábamos las cassettes. LARGA VIDA AL ZX SPECTRUM
En los años 80 compré mi primer
ordenador, el ZXSpectrum.
Era mi primer contacto con los ordenadores, y después de muchos años
aún sigo con la programación.
Aprendí a programar en Basic, por lo cual tengo mucho cariño
al Basic y sigo pensando que es muy buen lenguaje de programación.
El oír el audio de los programas cargando en el ordenador, aún me
emociono.
El otro día descubrí el proyecto TZXDuino, era una especie de casete
que transforma los ficheros TAP en audio que lee el Spectrum.
Es fácil de realizar y bastante barato. Se necesita un
arduino, LCD, SD, 5 botones, y algunos componentes mas.
El proyecto original utiliza un amplificador LM386, como no tenía
este Chip, he modificado el esquema y utilizo un transistor común.
El proyecto original está en: https://github.com/sadken/TZXDuino
También se han creado muchos proyectos paralelos para cargar
programas de MSX, Amstrad, C64, etc...
Este montaje solo lo he probado en ZXSpectrum, funcionando
perfectamente.
También he cambiado el módulo adaptador SD por unas resistencias que
adaptan los niveles de la SD al Arduino.
Como podéis ver lo he modificado para ser lo más simple y batato
posible. Con el adaptador SD
Con las resistencias adaptadoras de voltajes.
Se repite el esquema debido a que los esquemas que se hacen
con Tritzing son bastante malos.
He colocado un puente con un condensador para filtrar la señal de
salida, en el caso de Spectrum utilizado funciona igual, pero en
otros modelos puede ayudar a leer mejor los programas.
Me hubiese gustado colocar un potenciómetro en vez de las dos
resistencias, pero no he querido complicar el circuito. Con el filtro. sin el filtro.
Montado todo en un circuito impreso. Funcionando el circuito.
Tenemos que colocar todos los ficheros TAP en el directorio raíz de
la tarjeta SD.
Con los pulsadores de circuito seleccionaremos el fichero
correspondiente que se quiere reproducir.
Existe un menú con opciones que podremos seleccionar para las
diferentes configuraciones.
Como hay varias versiones del TZXDuino, incluyo los que he utilizado
en este montaje, y es la que he probado en el Spectrum..
La alimentación se puede realizar de diferentes formas, desde el USB
del arduino, con adaptador de un cargador común a la Red, con
una POWER-BANK como en mi caso. También mediante una pila de 9V
colocada al pin del arduino Vin, (admite entre 5 y 12V).
El consumo del circuito está entre los 30 a 35 mA.