Disclaimer: No me hago responsable de cualquier daño producido al MSXVR o cualquier periférico o accesorio conectado al mismo por una mala utilización de esta documentación.
Seguimos con la serie de artículos para aprender el funcionamiento del MSXVR, en esta ocasión veremos el uso de los LEDs, los pulsadores POWER, RESET, PAUSE, VCC y alguna señal mas que veremos por encima ya que se explicarán en profundidad en próximos artículos.
Para controlar esto, el MSXVR utiliza el mismo modelo de integrado que en los puertos DB9 pero la dirección para comunicarnos con el en este caso es la 0x21. Su configuración son 4 pines como entrada para los pulsadores y el resto como salida para encender los LEDs, controlar los relés y la protección contra escritura de la memoria eeprom. En la siguente imagen podemos ver como están conectados:
El puero A está dedicado por completo a los LEDs y por eso, todo el banco está configurado como salida. En cambio el puerto B, se utiliza para los pulsadores (Entrada) y para controlar algunos relés y la protección de la memoria eeprom (Salida).
- Configurando el expansor.
Primero desactivamos el modo secuencial escribiendo en el registro 0x0A (IOCON) el valor 0x20, esto activa el bit 5 del registro desactivando así el modo secuencial.
Luego configuramos la dirección de los pines utilizando el registro 0x00 (IODIRA), enviamos 0x00 para configurar los pines del puerto A como salida. Para el purto B en cambio enviaremos el valor 0x0F al registro 0x01 (IODIRB), configurando así los pines del 0 al 3 como entrada y del 4 al 7 como salida.
Desactivamos todas las resistencias pull-up del puerto A, ya que al usarse como salida para controlar los LEDs, no son necesarias. Enviamos el valor 0x00 al registro 0x0C (GPPUA) para desactivarlas. En el puerto B activaremos las resistencia pull-up solo en los pines que usamos como entrada para los pulsadores, entonces enviaremos el valor 0x0F al registro 0x0D (GPPUB).
Por último activamos la protección contra escritura de la memoria eeprom que está conectada a GPB6, enviamos el valor 0x40 al registro 0x13 (GPIOB).
Nota: La memoria eeprom tiene un sistema de protección para que no podamos borrar accidentalmente el número de serie de nuestro MSXVR. El problema es que está mal implementada, ya que por defecto la protección está desactivada y es el software del VR el que la activa al arrancar. Esto quiere decir que si arrancamos nuestro ordenador con una distribución que no sea la original, la memoria eeprom está siempre desprotegida y podriamos borrar el serial de nuestro equipo por accidente. Una solución a esto podría haber sido colocar una puerta inversora entre el GPB6 del expansor y el pin WP de la eeprom, consiguiendo así que por defecto la eeprom siempre estuviera protegida incluso al usar distribuciones no oficiales que no hagan uso del hardware del MSXVR. En nuestro caso como ya conocemos esta información hemos protegido la memoria eeprom al configurar el expansor
Y aqui dejo un resumen de la secuencia de comandos que hemos hecho para configurar el expansor:
write to 0x21 data: 0x0A 0x20 IOCON 0010 0000 Desactiva modo secuencial
write to 0x21 data: 0x00 0x00 IODIRA 0000 0000 Configura los pines del puerto A (0=Output 1=Input)
write to 0x21 data: 0x01 0x0F IODIRB 0000 1111 Configura los pines del puerto B (0=Output 1=Input)
write to 0x21 data: 0x0C 0x00 GPPUA 0000 0000 Configura resistencia pull-up en puerto A (0=des 1=act)
write to 0x21 data: 0x0D 0x0F GPPUB 0000 1111 Configura resistencia pull-up en puerto B (0=des 1=act)
write to 0x21 data: 0x13 0x40 GPIOB 0100 0000 Habilitamos la protección contra escritura de la EEPROM
- Comprobando el estado de los pulsadores.
El software del MSXVR comprueba el estado de estos pulsadores cada 250ms. Podemos verlo en la siguiente imagen donde con un analizador lógico capturamos la actividad de la linea i2c.
Capturar el estado de los pulsadores cada 250ms es el motivo por el cual si los pulsamos muy rápido, el MSXVR no detecta la pulsación.
Por eso hay que mantenerlo presionado un tiempo para que la detecte.
Como curiosidad os dejo esta imagen que se monitoriza una comprobación de estado de los pulsadores completa y se puede ver que en hacerlo solo tarda aproximadamente 88us
Como podemos ver en la imagen, para comprobar el estado de los pulsadores leemos el registro 0x13 (GPIOB) que en este caso nos devuelve el valor 0xCF. Solo nos interesan los bits del 0 al 3, si pasamos 0xCF a binario b1100 1111, comprobamos que no hay ningún pulsador presionado.
bit 0 Pulsador VCC
bit 1 Pulsador PAUSE
bit 2 Pulsador RESET
bit 3 Pulsador POWER
Los estados son 0 si está pulsado y 1 si no está pulsado... Si lo se, está al revés
- Controlar los LEDs.
Para encender los LEDs es muy sencillo, solo deberemos enviar el estado de los LEDs al registro 0x12 (GPIOA). Donde 0 será apagado y 1 encendido.
bit 0 LED PAUSE
bit 1 LED UD3
bit 2 LED UD2
bit 3 LED UD1
bit 4 LED FDD
bit 5 LED KANA
bit 6 LED CAPS
bit 7 LED UD4
Por lo tanto si queremos encender el led CAPS y que el resto esten apagados enviaremos el valor 0x40 al registro 0x12 (GPIOA), y para apagarlo enviaremos nuevamente 0x00 y quedrán todos los leds apagados.
Y es tan sencillo como esto, dejo un script de python para que podais ver y comprobar el funcionamiento de lo explicado en este artículo.
Sobre los pines que quedan (VCC_RELAYS, REM_RELAY y EEPROM_WP) los veremos con mas profundidad en sus artículos correspondientes.
Un saludo! y a trastear con el MSXVR...