Interfaz interno teclado PS/2 AT - Spectrum. (English version)
Presentamos en este documento la descripción de un circuito adaptador que permite usar un teclado con protocolo PS/2 en un ZX Spectrum con carcasa de Spectrum Plus. El adaptador es lo suficientemente pequeño para poder ubicarse en el interior de la carcasa, y sustituye al teclado original, usando sus mismas líneas. No requiere modificaciones a la ROM y es compatible con cualquier software.

(C)2006-2008 Miguel Angel Rodríguez Jódar. Grupo de Robótica y Tecnología de los Computadores aplicada a la Rehabilitación. Dept. Arquitectura y Tecnología de Computadores. Universidad de Sevilla.

Creative Commons License
Esta obra está bajo una licencia de Creative Commons. Como autor me reservo el derecho de cambiar la licencia a otra sin previo aviso.

 

DECRIPCION Y MONTAJE

Después de estar experimentando durante unos días con una alternativa para reconstruir la membrana de teclado de un Spectrum "de gomas", quise hacer lo mismo para la membrana del Plus. La mecánica es la misma, pero la construcción resultó mucho más laboriosa: en lugar de dos circuitos separados por una plantilla aislante, la membrana del plus contiene cuatro circuitos y dos plantillas aislantes; todo para poder simular pulsando una sola tecla, el cierre de dos circuitos independientes.

La carcasa del Plus tiene sitio suficiente, a izquierda y derecha de la placa del Spectrum, para alojar pequeños circuitos impresos. Además el costado de la carcasa puede taladrarse para dejar pasar conectores y demás al exterior. Medí el espacio disponible y me fui a uno de los laboratorios de investigación de mi departamento a armarme con los materiales necesarios: dos sistemas de entrenamiento para microcontroladores: uno de Microchip y otro de Silicon Labs.

El de Microchip fue de hecho el primero que sopesé, dada la popularidad de los PIC's. Sin embargo al estudiar la documentación del entrenador de Silicon Labs vi rapidamente que no había color: los chips de la gama alta de la familia de los PIC son más o menos los equivalentes en potencia a los de la gama media-baja de Silicon Labs (la gama baja ronda los 12 MHz y la gama alta, los 100 MHz). Además, el IDE y las facilidades de depuración (no se usan recursos internos del micro tales como registros o zonas de memoria durante la depuración) y sobre todo, el que tres compañeros míos de departamento, con mucha más experiencia que yo, me aconsejaron vivamente el Silicon Labs muy por encima del PIC.

Material del entrenador de Microchip.

Material del entrenador de Silicon Labs

Otra de las cosas que me hizo decidirme por Silicon Labs fue un folleto, que en la foto se puede ver detrás del CD de instalación del IDE, donde en unos pocos pasos (haga esto, pinche aquí, cargue allá) hace que en poco menos de 5 minutos hayas cargado un programa, compilado, ejecutado, colocado puntos de ruptura, mirado variables durante la ejecución, estado de registros, puertos, etc... sin necesidad de ningún emulador.

Así, la interfaz que se propone está basada en un microcontrolador Silicon Labs modelo C8051F343, aunque la placa de circuito impreso es compatible con otro muy popular, el C8051F320. Ambos están basados en el core 8051, con 25 lineas de E/S, interfaz USB esclavo (que no usaremos en este caso), y soporte para SPI, UART, TImers, etc. La tensión de trabajo es de 3,3V, lo que lo hace muy apropiado para interfaz con memorias SD/MMC, y aún así puede manejar sin problemas tensiones TTL. La diferencia entre ambos es que el F343 puede llegar hasta los 48 MHz de frecuencia de reloj, y posee 4KB de XRAM, y el F320 llega hasta 25 MHz, con 2KB de XRAM. El firmware que se ha diseñado para este microcontrolador sólo usa 256 bytes de XRAM, y unas cuantas posiciones de la RAM de acceso directo. El oscilador es interno, y no hace falta cristal de cuarzo para trabajar a 25 o a 48 MHz. De hecho, en la placa final, el único componente activo es el microcontrolador; el resto son resistencias y condensadores.

El entrenador de Silicon Labs está basado en un chip con bus CAN, que yo no necesitaba. El IDE permite programar en C y en ensamblador. Previendo que iba a necesitar temporizaciones críticas, opté por el ensamblador, y una placa entrenadora hecha por nosotros mismos, basada en el F320.

Entrenador original de Silicon Labs, con el F040 (bus CAN), entrenador hecho por nosotros, con el F320, y placa de circuito impreso para la interfaz de teclado, con el F343.

Placa entrenadora C8051F320 y adaptador JTAG para descarga de programas y depuración

Placa entrenadora C8051F320 y adaptador JTAG para descarga de programas y depuración

Una de las ventajas del F320 (y del F343 ya que ambos tienen el mismo patillaje) es que aún siendo micros de 3,3V, no necesitan un regulador de tensión para conseguirlos, sino que pueden alimentarse externamente con 5V, convirtiéndolos a 3,3 internamente. Esto es porque al ser micros para ser usados en aplicaciones USB, tienen ya previsto precisamente el poder alimentarse de la tensión del cable USB. El entrenador utilizado en las primeras pruebas, de hecho, se alimentaba desde el PC con un cable USB, del que sólo se usaban las dos patillas de alimentación.

Primer prototipo. Obsérvese que sólo hay tres líneas que se usan del conector trasero del Spectrum: 5V, masa, y la señal de reset, que usamos porque el micro tiene la posibilidad de resetear al Spectrum desde el teclado (sí, sí, con Control-Alt-Suprimir :D )

Antes de conocer el F343, y creyendo que el F320 se me iba a quedar lento, barajé la posibilidad de usar el F352, que es algo más rápido que el primero (50 MHz) y con bastante XRAM, pero tiene dos "peros": que sólo tiene 17 lineas de E/S y que necesita del regulador. Llegué a hacer incluso una placa con este micro, pero usando el F343 se simplifica la cosa bastante.

Silicon Labs C8051F352. No he llegado a usarlo, pero el F343 tiene el mismo tamaño y número de patillas.

F352 con el regulador de tensión de 3,3V, también en formato SMD.

Este es el esquema correspondiente a la versión con el F343. Lo más espectacular del asunto es que no se necesita nada más, sólo el micro y unos cuantos componentes adicionales: un pequeño cricuito RC para el reset y la interfaz JTAG, condensadores de filtro, y resietencias de pull-up para el teclado y las líneas de dirección (semifilas).

Esquemático (hacer clic para ampliar)

Las señales de las semifilas (correspondiente al conector de 8 pistas del teclado) se configuran como colector abierto y las de datos (conector de 5 pistas), como push-pull. El conector SV1 lleva las tres únicas señales que habrá que cablear directamente en el Spectrum: 5V, masa y reset, esta última opcional, sólo si se quiere hacer uso del reset de teclado).

El conector de semifilas va directamente al puerto 2 del 8051, y el conector de datos a 5 de los 8 bits del puerto 1. El puerto 0 se deja para señales de control, en este caso, las dos señales que necesita el teclado (reloj y datos) y una señal de salida de reset directamente al Spectrum. El programa residente en el 8051 usa interrupciones para detectar los flancos de bajada de la señal de reloj y de esa forma leer el teclado, y las interrupciones externas sólo están disponibles en el puerto 0. El 8051 dispone de SPI, pero el formato de datos no es compatible con el usado por el teclado. Aunque se podría hacer aprovechado la interfaz existente y usar dos transferencias de SPI (bueno, una y media en realidad) he preferido al menos de momento, usar directamente las líneas de protocolo. Con una anchura de pulso de unos 84 microsegundos en el reloj de datos, no hay problema en que el micro pierda datos por interrupción no gestionada a tiempo (al F343 le da tiempo a ejecutar más de 1500 instrucciones entre pulso y pulso).

A la hora de construir la placa, lo más difícil puede parecer es soldar el microcontrolador, que es de montaje superficial. La verdad es que no es para tanto, y sólo se necesita un soldador de punta fina (1 mm). Los JBC 14S traen este tipo de puntas, o bien se pueden comprar aparte. Este es el aspecto del micro una vez soldado (al ser de montaje superficial, es de hecho lo primero que habrá de soldarse, después eso sí, de mecanizar las vías entre las dos caras).

Una vez terminada de montar (o casi), ofrece este aspecto:

Tiene dos orificios para atornillarse a la carcasa del Spectrum. Al hacer las medidas de la placa, vi que hay un hueco para tornillo que en el Plus no se usa, situado en el costado derecho de la carcasa. Necesitaba otro punto de apoyo para que al menos, la placa no girase cuando se hace fuerza para enchufar el teclado PS/2. Al final he optado por incluir una muesca que coincide con otro orificio, esta vez en la placa del Spectrum, al lado del altavoz, y que tampoco suele usarse en el Plus. El tornillo que pongamos aquí no es para sujetar la placa, sino simplemente como tope para que al empujar con el conector de teclado desde fuera, no gire.

Detalle de uno de los tornillos de sujección, LED de testigo de encendido, conector JTAG, y conector de alimentación/reset (el pin de enmedio que está libre)

Detalle del otro tornillo, que no está enroscado del todo, sólo lo suficiente para dejar la placa horizontal, y evitar que se mueva al empujar en el costado del conector PS/2.

Una vez alojado en el interior de la carcasa del Plus, tiene esta pinta:

El conector de 8 pines que queda al lado del altavoz está acodado e inclinado ligeramente hacia arriba. De esa forma, el conector hembra HDC que viene del Spectrum no chocará con el altavoz. Si este conector se pusiera vertical (como están los otros dos) chocaría con la pieza de plástico que protege al teclado original).

Por cierto, en el diseño de la placa se ha cuidado el evitar tener que soldar componentes por la cara de componentes. El único que no se ha librado (aparte claro está del microcontrolador) es el pack de resistencias que se ve en primer plano.

Para el otro extremo del cable de conexión de semifilas y datos, se ha optado por tiras de pines acodados. Así también evitamos que choque con la misma pieza de plástico mencionada. Cortamos dos tiras: una de 8 pines y otra de 5.

Y las soldamos a los cables de señales por el lado "acodado". Se insertan sin problemas en los conectores originales del teclado (o se pueden soldar directamente en lugar del propio conector de teclado).

Llevamos alimentación y masa desde el Spectrum hasta la placa con el 8051 (en este caso he elegido la línea de 5V del modulador y el disipador de aluminio del regulador para la masa) y por supuesto, abrimos un hueco en el costado para sacar el conector PS/2.

Abrir el hueco para el conector PS/2 fue sencillo porque da la casualidad que justo donde va el teclado hay un círculo que forma parte de la serigrafía original de la carcasa.

Detalle del orificio para el conector PS/2. Es más grande porque el conector que quería utilizar tiene un reborde que me impide insertarlo del todo si el agujero es justo el tamaño del conector hembra.

Durante el funcionamiento, el conector JTAG queda libre. Sölo se usa durante la programación de la flash y la depuración. Podemos cerrar la carcasa del Spectrum, y olvidarnos para siempre de la dichosa membrana. Así queda, con la carcasa montada y funcionando con un teclado inhalámbrico de Labtec.

Para la imagen de la siguiente prueba se pulsaron en el teclado inhalámbrico la seiguiente secuencia: 1 2 3 4 5 6 7 8 9 0 Q W E R T Y U I O P A S D F G H J K L Z X C V B N M , . - y seguidamente, las teclas numéricas con las mayúsculas pulsadas: ! " · (que da un #) $ % & / ( ) = ? ¿ (que da un !).

Aunque no se muestra, también funciona la tecla de acento grave (que da el símbolo ^, es decir SYMBOL SHIFT + H), la tecla + y * (con las mayúsculas pulsadas), la cedilla da, en modo E, el símbolo de copyright (este tipo de pulsaciones son las que me llevan en este momento por la opción de cincoporar macros de teclado al firmware del microcontrolador). El bloque numérico remeda las teclas de números y los signos + - * / . y la tecla Intro que es ENTER. Al igual que pasa con la cedilla, la tecla de los ordinales (a la izquierda del 1 en el teclado español) da, en modo E, el símbolo \ .


MODO DE OPERACION

Al encender el Spectrum con el teclado, el microcontrolador lo resetea y para indicar que todo ha ido bien, deja encendida la luz de Bloq Num. A partir de ese momento, el teclado está listo para ser usado.

  • Se reconocen todas las teclas alfabéticas.
  • Las dos teclas de mayúsculas aplicadas sobre una tecla alfabética dan el mismo caracter en mayúsculas, aplicadas sobre un número u otra tecla del bloque de teclado principal, dan el carácter que tengan serigrafiado.
  • Se usa el modelo de teclado español de 101/102 teclas.
  • Las teclas del cursor están mapeadas a las propias del Spectrum (ej: cursor abajo corresponde a CAPS SHIFT + 6)
  • La tecla ESC corresponde a CAPS SHIFT + SPACE
  • La tecla de Bloq. Mayús corresponde a CAPS SHIFT + 2
  • La tecla Alt Gr corresponde a CAPS SHIFT + 9 (modo G en el Spectrum)
  • La tecla F2 (tecla de edición en muchas aplicaciones de Windows) corresponde a CAPS SHIFT + 1 (EDIT en el Spectrum)
  • El tabulador corresponde a CAPS SHIFT + SYMBOL SHIFT (modo E en el Spectrum)
  • La tecla Backspace (borrar) es CAPS SHIFT + 0 (DELETE en el Spectrum)
  • Control izquierda está mapeada a CAPS SHIFT y Control derecha a SYMBOL SHIFT.
  • El bloque numérico se comporta como si siempre estuviera activado el bloqueo numérico, esto es, no se emulan cursores en este bloque.
  • La tecla Bloq Despl activa/desactiva la conmutación entre el modo cursores (el normal) y el modo joystick Sinclair. En este modo, el indicar Bloq Despl se enciende y las teclas del cursor pasan a ser las correspondientes direcciones en un joystick norma Sinclair. Cualquiera de las dos teclas de Control actúan como disparo (para asemejar un poco a cómo están dispuestas estas mismas teclas en el MAME).
  • Por último, si la línea de reset está conectada desde nuestra placa hacia el Spectrum, la combinación Ctrl-Alt-Supr provoca que el microcontrolador dispare un pulso bajo de unos 200 microsegundos en la línea de reset, permitiendo así reiniciar el Spectrum desde el teclado.

PROGRAMA INTERNO DEL MICROCONTROLADOR

Esta sección aún no está documentada. La razón fundamental es que quiero pulir un poco más el programa y añadirle algunas funciones que me parecen interesantes. Entre las cosas a pulir, la más importante es soportar el scan mode 2, que es el más habitual. Ahora mismo sólo se soporta el scan mode 3, que es el más fácil de depurar. Entre las cosas menos importantes, hacer más robusta la función de enviar comandos al teclado y un fallejo intermitente cuando se conmuta de modo joystick a modo normal.

Entre las cosas a añadir, pues la que tengo ahora en mente es la posibilidad de grabar y reproducir macros de teclado, que el propio programa almacenaría en flash para que no se pierdan cuando el micro se apague. De esa forma, podemos tener comandos directos, tales como LOAD "gens3" CODE 26000: RANDOMIZE USR 26000 en una sola tecla, o incluso pequeños programas escritos en BASIC, que el microcontrolador teclearía por nosotros.

NOTA: La capacidad de grabación y reproducción de macros existe desde la versión 1.1.

De todas formas, para los impacientes, se suministra la versión actual del programa, con las limitaciones expuestas.

Hay un detalle técnico que tiene que ver con un comportamiento de la ULA que no conocía, que ha condicionado en buena medida el diseño del firmware. Lo comentaré en breve.


LISTA DE MATERIALES Y COSTE ESTIMADO

Parte
Nombre
Notas
IC1 C8051F343 1/4 W. También vale el C8051F320. En ese caso, soldar R1
R1 1K 1/4 W. No necesario para el F343.
R2 10K 1/4 W
R3 10K 1/4 W
R4 1K 1/4 W
R5 1K 1/4 W
R6 470 ohm. 1/4 W
C1 100 nF Poliester
C2 100 nF Poliester
C3 100 nF Poliester
C4 1 uF Poliester o tántalo
C5 1 uF Poliester, tántalo o electrolítico
C6 1 uF Poliester o tántalo
RN1 Red de resistencias 4,7K Equivalente a 8 resistencias de 4,7K unidas entre sí por uno de sus bornes.
PS/2 Conector hembra mini DIN 6 pin PCB  
SV1 Conector tiras de pines acodado 3 pines
SEMIFILAS Conector tira doble de pines acodados 4+4 pines (en la placa hay dos pines sin soldar)
COLUMNAS Conector tira doble de pines vertical 4+4 pines (de los 8 sólo se usan en realidad 5. Hay dos pines sin soldar en la placa)
POW_LED LED miniatura 2mm Color al gusto de cada uno (total, no se va a ver una vez montado todo)
Conector semifilas HDC 4x2 pines, hembra Conector hembra desde el Spectrum hasta la placa (semifilas)
Conector datos HDC 4x2 pines, hembra Conector hembra desde el Spectrum hasta la placa (datos o columnas)

El C8051F343 sale por $7,79 y se puede pedir directamente desde Mouser Electronics, a través de la página web de Silicon Labs. Los gastos de envío salen por unos $10,70 enviando por USPS, que es lo más barato. Llega a España en unos 5-6 días laborales.

Una PCB del tamaño y disposición como la presentada aquí, sale en Futurlec por unos 7€ aproximadamente, dependiendo de si se incluye máscara de soldadura, serigrafía, etc. sale más caro. Si se la hace uno mismo, pues ya el coste estará en función de más factores.

El resto de componentes son muy baratos. Quizás entre todos no lleguen ni a 6-7€. En total, el coste en componentes y placa ronda los 20-25€, que viene a ser además el precio que se pide hoy día por una membrana de Spectrum Plus en eBay. Hay cosas como las placas o los microcontroladores, que si se piden en cantidades, sale más barata la unidad al repartirse los gastos de envío. A modo de ejemplo, 4 microcontroladores C8051F343 costaron, gastos de envío incluidos, $41,86. Cada microcontrolador salió por tanto por $10,46, que vienen a ser 8,26€.


ARCHIVOS

Esquemático, placa PCB y librería con componentes de Silicon Labs, para Eagle (NOTA: la PCB aquí está sin planos de masa) Descargar
Esquemático en formato PNG, alta resolución Ver / Descargar
Fotolito placa, cara de pistas, sin plano de masa (PNG, 600 dpi) Ver / Descargar
Fotolito placa, cara de pistas, sin plano de masa (PNG, 600 dpi) Ver / Descargar
Fotolito placa, cara de componentes, sin plano de masa (PNG, 600 dpi) Ver / Descargar
Fotolito placa, cara de componentes, con plano de masa (PNG, 600 dpi) Ver / Descargar
Mapa de posición de componentes Ver / Descargar
Mapa de posición de vías Ver / Descargar
Fuente del firmware residente en el F343, v1.1 Descargar
Fuente del firmware residente en el F343, v1.0 Descargar

HISTORICO DE CAMBIOS

  • 11/10/2006. Se soporta scan mode 2 y scan mode 3. Primera versión con soporte de macros de teclado. Versión 1.1 del firmware.
  • 26/09/2006. Primera puesta en público. Versión para F343. Se soporta sólo scan mode 3. Versión 1.0 del firmware.

OTROS ADAPTADORES DE TECLADO PARA SPECTRUM

  • IMAR-3 (de "Droy", del Trastero del Spectrum). Descripción completa, y todo lo que se necesita para construir uno.
  • Proface AT (externo). Comercializado por Sintech (¿dónde se enchufa el teclado aquí?).
  • Proface AT (interno). Comercializado por Sintech (¿lo llaman interno porque está metido en una caja?).

ENLACES DE INTERES

Los he ido recopilando a medida que me ha hecho falta tal o cual información para desarrollar este proyecto.

  • El bus de expansión del Spectrum. Me vinieron muy bien estos digramas para la primera versión del prototipo, que cogía las señales del bus de expansión. Artículo cortesía del Trastero del Spectrum.
  • The PS/2 keyboard interface. Pues eso, todo lo que necesitaba saber acerca de la interfaz del teclado.
  • El juego de instrucciones del 8051. En los datasheets de Silicon Labs sólo viene el nombre de la instrucción y los ciclos que tarda. En esta pagina comentan un poco "de qué va" cada instrucción.
  • Registro de teclados de IBM. Completísimo catálogo de "layouts" de teclados de todas las nacinalidades que fueron normalizados en su día por IBM.
  • Datasheet y guía de usuario del C8051F343. Disponible en la web de Silicon Labs.
  • IDE y Configuration Wizard de Silicon Labs. IDE muy completo que permite trabajar en ensamblador y/o C, más una utilidad que permite mediante asistentes, generar código en C o ensamblador para programar en el micro una configuración determinada de puertos, osciladores, timers, interrupciones, etc...

AGRADECIMIENTOS

A todos mis compañeros del grupo de investigación y en especial a:

  • Rafa y Claudio: por sugerirme el C8051 sobre el PIC y picarme en el tema de los microcontroladores.
  • Miguel Gutierrez (tocayo y paisano): por enseñarme a usar la fresadora de circuitos impresos y enseñarme a soldar (y des-soldar) componentes SMD
  • Angel, Carlos y Ramón: por todos sus buenos consejos para mejorar el invento y sobre todo, por aguantar el ruidazo del compresor de la fresadora en horas de trabajo.
  • Gabriel: por lo mismo, por sus consejos a la hora de arreglar los fallejos de las primeras versiones del circuito.

A todo es.comp.sistemas.sinclair, ya que esto es esencialmente, para vosotros, para los que mantienen viva la "escene" del Spectrum.


CONTACTO

Por e-mail a la dirección: rodriguj@atc.us.es poniendo en el asunto "Sobre el adaptador PS/2 para Spectrum"