Puerto serie + Wifi en el Amstrad CPC

Avatar de Usuario
Gatuso
Mensajes: 149
Registrado: 06 Ene 2014 11:55
Agradecido : 1 vez
Agradecimiento recibido: 25 veces

Puerto serie + Wifi en el Amstrad CPC

Mensajepor Gatuso » 06 Nov 2015 19:54

Este pequeño montaje tiene como finalidad dotar al CPC de un puerto de comunicaciones serie, en su modalidad más simple (dos únicas líneas, TX y RX). Empezó siendo parte de un pequeño microordenador basado en el Z80 que me fui montando el año pasado al estilo de los del señor Grant Searle, utilizando una UART para poder cargar código desde el PC, y al ver que su manejo no era excesivamente complicado empecé a mirar como podía conectarla al Amstrad para darle un poquito de vidilla. Luego vino el chip wifi y aquello mas que vidilla se convirtió en vidorra ;)

El circuito se basa en una UART 16C550, un integrado bastante conocido usado por ejemplo en los puertos serie de los PC. Este chip tan solo necesita un cristal de 1.8432MHz para funcionar, un par de condensadores y poco mas. Y aunque proporciona una funcionalidad de comunicaciones completa (RTS, CTS, DTR, interrupciones…) solo he usado lo mínimo imprescindible para este ejemplo, sin señales de control y haciendo polling para comprobar el estado de la UART.

Buscando un poco por Google y revisando el datasheet encontré un esquema mínimo que me venía al pelo, sin usar las líneas que no necesitaba:

Imagen

El chip se activa a través de tres pines CS0, CS1 y /CS2, y mediante otras tres entradas A2, A1 y A0 seleccionamos cual de sus registros internos queremos leer o escribir, activando para ello el correspondiente pin de RD o WR. Ocho líneas de datos de entrada/salida conectarían directamente con el bus de datos del CPC.

Lo primero es decidir como vamos a acceder al chip desde el CPC, es decir, qué puertos de E/S vamos a asignar a la UART. En CPCTech viene muy bien explicado el direccionamiento parcial que hace el CPC, con los puertos que ya están en uso y los que tenemos disponibles. Por seguir la tradición he elegido el direccionamiento reservado para los periféricos del CPC: bit 10 = 0 en el bus de direcciones. Esto da un rango de puertos entre &F8 y &FB. Dentro del direccionamiento de los periféricos, el bit 5 = 0 se reservaba para los puertos serie, así que también lo elegimos y restringimos el rango de las operaciones IN y OUT a &FBD0..&FBDF.

Imagen

El chip se activaría por tanto cuando se produzca una operación IN o OUT (/IORQ = 0) y en el bus de direcciones encontremos A10 = 0 y A5 = 0. Asignando estas condiciones a las tres entradas CS0, CS1 y /CS2 tendríamos por ejemplo esta combinación (además de otras posibles):

Imagen

Conectando las ocho líneas del bus de datos y las líneas de control /RD y /WR a sus correspondientes entradas, ya tendríamos una línea serie operativa desde el CPC. En el otro extremo podemos conectar otro ordenador o el famoso chip wifi como veremos mas adelante.

OJO: los puertos RS232 trabajan a +/-12V y nos fríen el invento en un instante. Para conectarlo a un PC, un Amiga, etc. con este tipo de puerto necesitamos un inversor y adaptador de niveles, como los basados en el chip MAX232.

Otra forma mas sencilla de conectar a un PC es mediante uno de estos adaptadores USB a RS232-TTL, pero…

Imagen

OJO 2: estos suelen funcionar a 3.3V, con lo que también es recomendable adaptar el nivel TX de la UART para que no sufra el pobre adaptador. Eso lo conseguimos con un simple divisor de tensión conectado a la línea de transmisión de la UART (la de recepción no necesitaría nada ya que recibiría los 3.3V del adaptador):

Imagen

Ya estaría el hardware listo, pero antes de empezar a usarlo es necesario configurar un par de parámetros de la UART al inicio de nuestro programa (esto ya lo podemos hacer incluso desde el Basic). Aquí si que es necesario tirar de datasheet para ver qué significa cada bit de cada registro. Usando esta página como referencia podemos hacer:

1. Deshabilitamos las interrupciones para que la UART funcione en modo polling (Interrupt Enable Register)

OUT &FBD1, &0

2. Habilitamos y reseteamos las colas FIFO de envío y recepción (FIFO Control Register)

OUT &FBD2, &F

3. Activamos el Baud Rate Generator Divisor Register para configurar la velocidad de trabajo de la UART (bit 7 del Line Control Register activado):

OUT &FBD3, 80

4. En este modo usamos los registros 0 y 1 para enviar el byte menos significativo y el mas significativo del valor siguendo esta tabla. En este ejemplo seleccionamos 300 baudios (0x180):

OUT &FBD0, &80
OUT &FBD1, &1


Imagen

5.Configuramos el número de bits de datos, número de bits de parada y tipo de paridad usando también el Line Control Register. En este ejemplo seleccionamos 8 bits de datos, 1 de parada sin paridad (ver datasheet):

OUT &FBD3, &3

Con la UART ya configurada podemos enviar y recibir datos por fin, escribiendo y leyendo sobre el registro 0 (&FBD0). Pero antes es necesario comprobar si las colas de recepción y transmisión están preparadas para leer o escribir datos en ella. Esto se hace leyendo el registro 5 (Line Status Register), correspondiente al puerto &FBD5, y comprobando el valor de ciertos bits:

-Bit 0 activado = se ha recibido un dato y está listo para ser leído de la cola FIFO
-Bit 5 activado = la UART está preparada para aceptar un nuevo dato a enviar.

Con lo que ya podemos ir construyendo pequeñas rutinas para enviar y recibir datos:

Código: Seleccionar todo

1000 REM Espera indefinidamente a recibir un dato y lo devuelve en la variable A
1010 A = INP(&FBD5)
1020 IF (A AND 1) = 0 THEN GOTO 1010
1020 A = INP(&FBD0)


Código: Seleccionar todo

2000 REM Transmite el dato en C cuando la UART esté preparada
2010 A = INP(&FBD5)
2020 IF (A AND 32) = 0 THEN GOTO 2010
2030 OUT &FBD0, C


Con estas operaciones básicas ya podemos construir un pequeño programa que envíe cualquier pulsación del teclado y muestre en pantalla todo lo que vaya recibiendo, como si fuera un emulador de terminar tremendamente básico. Ojo, con este programa apenas se pueden conseguir 300 baudios de velocidad. Si configuramos la UART con una velocidad mayor corremos el riesgo de perder caracteres en la recepción (pero para una primera prueba va que chuta, y además eso de que vayan saliendo las letras despacito en pantalla es lo mas retro del mundo ;)

Código: Seleccionar todo

5 REM INICIALIZA UART
10 OUT &FBD1, &0
20 OUT &FBD2, &F
30 OUT &FBD3, &80
35 REM LSB DEL DIVISOR
40 OUT &FBD0, &80
45 REM MSB DEL DIVISOR
50 OUT &FBD1, &1
60 OUT &FBD3, &3
70 MODE 2
80 REM BUCLE PRINCIPAL
90 REM SI HAY UNA TECLA PULSADA, SE ENVIA
100 GOSUB 3000
110 REM SI HAY DATOS RECIBIDOS, SE IMPRIMEN
120 GOSUB 4000
130 GOTO 80
1000 REM ESPERA A RX PREPARADO
1010 A = INP(&FBD5)
1020 IF (A AND 1) = 0 THEN GOTO 1010
1030 RETURN
2000 REM ESPERA A TX PREPARADO
2010 A = INP(&FBD5)
2020 IF (A AND 32) = 0 THEN GOTO 2010
2030 RETURN
3000 REM COMPRUEBA SI HAY ALGUNA TECLA PULSADA Y LA ENVIA
3010 TECLA$=INKEY$
3020 IF TECLA$="" THEN RETURN
3030 GOSUB 2000
3040 OUT &FBD0, ASC(TECLA$)
3045 REM SI SE PULSA RETURN, ENVIAR TAMBIEN SALTO DE LINEA
3050 REM IF ASC(TECLA$)=13 THEN GOSUB 2000: OUT &FBD0, 10:PRINT
3060 RETURN
4000 REM COMPRUEBA SI HAY DATOS RECIBIDOS Y LOS IMPRIME
4010 A = INP(&FBD5)
4020 IF (A AND 1) = 0 THEN RETURN
4030 C=INP(&FBD0): IF C>=32 THEN PRINT CHR$(C);
4035 REM CHEQUEA RETORNO DE CARRO
4040 IF C=13 THEN PRINT
4050 RETURN


Si ejecutamos este programa en el CPC y abrimos un Putty o un CoolTerm en el PC podemos montar un mini chat entre ellos. Y si en el PC tenemos un Linux y lanzamos un getty, convertimos el CPC en un terminal tonto:

https://www.youtube.com/watch?v=8lNCj3wzYPs

Con el puerto serie funcionando viene la segunda derivada: utilizarlo para comunicarnos con el famoso ESP8266, que nos proporciona conectividad wifi mediante unos sencillos comandos. Conectamos TX con RX y viceversa manteniendo el divisor de tensión en el sentido UART->ESP8266, ya que este chip también funciona a 3.3V, y lo alimentamos convenientemente. Yo he usado una de esas placas MB102 que proporcionan 3.3 o 5V para las protoboards, a falta de buscar algo definitivo. Además le he añadido un par de leds a modo de indicador de actividad en las líneas TX y RX, que siempre queda bonito. Este es el esquema final con todo colocado:

Imagen

Importante configurar el chip wifi a la misma velocidad (y bits de datos, stop, paridad, etc) que esté usando la UART (con el comando AT+UART_DEF). Con el programilla terminal podemos enviarle los comandos al chip y de forma manual establecer alguna conexión con un server remoto. Un telnet, por ejemplo:

https://www.youtube.com/watch?v=ua03zySd4mM

Si dejamos el Basic y nos metemos en C o ensamblador ya podemos conseguir una velocidad mucho mas decente. En esta otra prueba se ha compilado el código de Yombo para el YomboNet usando el SDCC de la CPCtelera, y con unos pocos cambios se ha creado una versión cepecera del ZXChat. De esta forma es posible conectarse a un YomboServer a 9600 baudios (la verdad es que no he probado a más velocidad, lo mismo aguanta y todo).

https://www.youtube.com/watch?v=wVf1qsvtCCo

Dejo los fuentes listos para compilar con la CPCtelera. Es una versión tan beta que ni siquiera permite introducir otra URL a la que conectarse (está a fuego en el código), así que es necesario editar un par de líneas para meter la URL del servidor que se vaya a utilizar.

ZXChat.zip
ZXChat
(21.3 KiB) Descargado 42 veces


Por último una fotillo del circuito ya montado sobre una placa perforada, conectándose al CPC por medio de un cable plano al conector de expansión. Puede llegar a ser un poco incordio por la poca flexibilidad del cable, pero no tenía un conector edge a mano (y de todas formas hubiera quedado una placa muy grande para andar pinchándola en el puerto de expansión, que me da miedito que se pueda salir con todo enchufado).

Imagen

Imagen

Esos tres pines del centro junto a los leds corresponden a los dos etiquetados en el esquema como PIN TX y PIN RX y otro mas para GND. Al estar en medio de las líneas de comunicación me permite pinchar ahí el adaptador USB-232TTL y añadirle flexibilidad al montaje al poder utilizarlo de varias maneras:

- Conexión PC <-> ESP8266, sin necesidad de enchufar el Amstrad (por ejemplo para cambiar la configuración del chip wifi desde el PC).

- Conexión CPC <->PC, con el chip wifi apagado.

- Conexión CPC<->ESP8266, usando el PC como sniffer de una de las líneas (increiblemente útil a la hora de desarrollar y depurar cualquier programa que use este chip).

Y esto era lo que quería compartir con vosotros. Ya veis que es una cosa bastante simple (una UART, un 74LS04 y un ESP8266) y con el software adecuado puede dar mucho juego a aquellos que les guste el tema de las comunicaciones en cacharros antiguos. Imagino además que podría utilizarse en cualquier otro cacharro que usara un Z80 y proporcionara un bus de expansión como el del CPC, con solo usar el conector y pineado adecuados.

En definitiva, que esto solo era mas que un pequeño experimento con dos objetivos: 1. Aprender y 2. emocionarme viendo a mi querido 6128 conectándose a internet 26 años después de entrar en casa. Espero no haberla cagado mucho, que mi electrónica es nivel parvulitos y no quiero que salga ardiendo nada :D

Avatar de Usuario
duca750
Mensajes: 1566
Registrado: 19 May 2015 10:52
Ubicación: Olivenza (Badajoz)
Agradecido : 414 veces
Agradecimiento recibido: 120 veces

Re: Puerto serie + Wifi en el Amstrad CPC

Mensajepor duca750 » 06 Nov 2015 20:16

Que maravilla, como le dijeras esto a alguien de los 80 te quemaban en la hoguera, jejeje. Parece de regreso al futuro.

En fín, dando mi opinión, me parece increíble que hayas conseguido esto en un CPC, mi felicitación por este proyecto y las gracias por compartirlo con todos nosotros.
-4mstr4d CPC464(7),472 Y 6128 (2) -sp3zy 16K&48K GOMAS,+2,+2A/2B +3 -cocbm1 64 Y -coam1** -0r1c 1 (2ud) y ATMOS** -m3s3x CANON V20, SPECTRAVIDEO 728,TOSHIBA HX10, PHILIPS VG8020,2 NMS 8250+GOTEK -j4tar1 STFM 800XL -3nt3r 64-ACORN ELECTRON -codrg1 32

Avatar de Usuario
Sinclair
Mensajes: 297
Registrado: 22 Jul 2013 10:43
Agradecido : 33 veces
Agradecimiento recibido: 30 veces

Re: Puerto serie + Wifi en el Amstrad CPC

Mensajepor Sinclair » 06 Nov 2015 21:01

Es increíble hasta dónde pueden llegar nuestros retrocacharros hoy en día gracias a lo accesibles y modulares que son los componentes electrónicos actuales, y por supuesto, a la dedicación y la genialidad de algunos, enhorabuena.
© 1982 Sinclair Research Ltd

Avatar de Usuario
ron
Mensajes: 18985
Registrado: 28 Oct 2010 14:20
Ubicación: retrocrypta
Agradecido : 2052 veces
Agradecimiento recibido: 1777 veces

Re: Puerto serie + Wifi en el Amstrad CPC

Mensajepor ron » 06 Nov 2015 21:29

Gatuso lo has bordado y te sales tio !!!

Fantástico post. Muchas gracias

Avatar de Usuario
Gatuso
Mensajes: 149
Registrado: 06 Ene 2014 11:55
Agradecido : 1 vez
Agradecimiento recibido: 25 veces

Re: Puerto serie + Wifi en el Amstrad CPC

Mensajepor Gatuso » 08 Nov 2015 23:34

Con gran regocijo confirmo que los MSX también son compatibles con este circuito, simplemente cambiando el direccionamiento de los puertos y poco mas. Y adaptando el pineado, lógicamente, sacando las líneas necesarias de uno de los slots de cartuchos. Es una forma un poco kamikaze de probarlo, pero ha valido la pena y no he roto nada (aunque me he hecho un poco de caquita pinchando los cables ahí dentro -grin

Imagen

https://www.youtube.com/watch?v=w72lQErUClQ

jojo073

Re: Puerto serie + Wifi en el Amstrad CPC

Mensajepor jojo073 » 10 Nov 2015 10:06

Vaya currele... Felicidades, muy interesante...

Avatar de Usuario
msxmakers
Mensajes: 35
Registrado: 12 Feb 2020 16:16
Agradecido : 41 veces
Agradecimiento recibido: 20 veces

Re: Puerto serie + Wifi en el Amstrad CPC

Mensajepor msxmakers » 04 Jul 2020 16:51

Jordi Solis
desde
-m3s3x makers :!:


Volver a “Lenguajes de Programación y herramientas Dev”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado