Puerto serie + Wifi en el Amstrad CPC

Proyectos de hardware con sus esquemáticos y si llevan software en fuente

Moderadores: cacharreo, Fundadores

Reglas del Foro
Aquí solo tienen cabida proyectos de hardware que incluyan siempre al menos sus esquemáticos para poder reproducirlos si llevan componentes electrónicos, y si es posible los ficheros del programa en que se hacen, los diseños de las placas, los gerber, etc. Si llevan algún tipo de software asociado debe estar diponible el código fuente

Para los que no cumplen estas condiciones se debe postear en el foro de proyectos generales.
Avatar de Usuario
Gatuso
Le gustan las llamas
Le gustan las llamas
Mensajes: 54
Registrado: 05 Mar 2015, 00:47

Puerto serie + Wifi en el Amstrad CPC

Mensaje por Gatuso »

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:



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:



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).



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
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
No tiene los permisos requeridos para ver los archivos adjuntos a este mensaje.
Avatar de Usuario
sinclair200 España
Moderador
Moderador
Mensajes: 10000
Registrado: 28 Mar 2014, 18:25
Ubicación: Madrid
Has thanked: 8 times
Been thanked: 178 times

Re: Puerto serie + Wifi en el Amstrad CPC

Mensaje por sinclair200 »

Joer, pues si tu electrónica es a nivel de parvulitos, ande me encontraré yo, vamos que ni salgo...jajajaja :))
Imagen
Z80 INSIDE.........
WANTED:…………. CPC 6128 british
Avatar de Usuario
tactica
Demonio segundo orden
Demonio segundo orden
Mensajes: 1893
Registrado: 20 Ene 2015, 20:39
Ubicación: La Coruña
Has thanked: 11 times
Been thanked: 17 times

Re: Puerto serie + Wifi en el Amstrad CPC

Mensaje por tactica »

Increíble.

¿Quién es el siguiente? ¿El MSX? Porque el C64 ya se lo he visto a alguien en red por Youtube...

Sois la monda B-)
Avatar de Usuario
flopping
Fundador
Fundador
Mensajes: 9974
Registrado: 29 Mar 2013, 15:26
Ubicación: Valencia
Been thanked: 124 times
Contactar:

Re: Puerto serie + Wifi en el Amstrad CPC

Mensaje por flopping »

Muy chulo, esto se puede exportar mas o menos fácilmente a otros sistemas, spectrum, commodore, MSX, oric, etc..
No me hago responsable de mis post pues estan escritos bajo la influencia del alcohol y drogas psicotropicas, por la esquizofrenia paranoide.
(C) 1982-2024, 42 años de ZX Spectrum.
http://www.va-de-retro.com/ un foro "diferente".

Mi juego, que puedes descargar desde aqui
Avatar de Usuario
Scooter !!Va-de-Retro
Demonio tercer orden
Demonio tercer orden
Mensajes: 969
Registrado: 27 Feb 2014, 11:33
Ubicación: Alicates
Has thanked: 1 time
Been thanked: 12 times

Re: Puerto serie + Wifi en el Amstrad CPC

Mensaje por Scooter »

Poner una uart de verdad le viene de cine a cualquier retrosistema. La pega es integrarlo en el firmware porque a base de un, out, peek y poke se hace muy pesado

Enviado desde mi fnac 5.7 mediante Tapatalk
Solo se que no se nada (algunos no saben eso)
Avatar de Usuario
wilco2009 !Sinclair 1
Hermano de Lucifer
Hermano de Lucifer
Mensajes: 8156
Registrado: 01 Abr 2013, 23:47
Ubicación: Valencia
Has thanked: 47 times
Been thanked: 107 times

Re: Puerto serie + Wifi en el Amstrad CPC

Mensaje por wilco2009 »

Scooter escribió:Poner una uart de verdad le viene de cine a cualquier retrosistema. La pega es integrarlo en el firmware porque a base de un, out, peek y poke se hace muy pesado

Enviado desde mi fnac 5.7 mediante Tapatalk
En un CPC eso se puede hacer bastante fácil (para el que sepa claro) con una ROMBOX y comando |RSX
"Aprender a volar es todo un arte. Aunque sólo hay que cogerle el truco. Consiste en tirarse al suelo y fallar".

Douglas Adams. Guía del autoestopista galáctico.
Avatar de Usuario
Scooter !!Va-de-Retro
Demonio tercer orden
Demonio tercer orden
Mensajes: 969
Registrado: 27 Feb 2014, 11:33
Ubicación: Alicates
Has thanked: 1 time
Been thanked: 12 times

Re: Puerto serie + Wifi en el Amstrad CPC

Mensaje por Scooter »

Claro, la clave es "para el que sepa"

Enviado desde mi fnac 5.7 mediante Tapatalk
Solo se que no se nada (algunos no saben eso)
Avatar de Usuario
Gatuso
Le gustan las llamas
Le gustan las llamas
Mensajes: 54
Registrado: 05 Mar 2015, 00:47

Re: Puerto serie + Wifi en el Amstrad CPC

Mensaje por Gatuso »

Esta tarde se me ha ocurrido probarlo en un MSX (un HB-101P) y después de mirar un poco el listado de puertos para elegir un nuevo rango y hacer malabarismos para pinchar cables en el slot de cartuchos, al final el resultado ha merecido la pena. Usando el mismo programa en Basic, con mínimos cambios, he podido pasarle el clásico test de hacerle un telnet al telehack.com.

Imagen

Avatar de Usuario
tactica
Demonio segundo orden
Demonio segundo orden
Mensajes: 1893
Registrado: 20 Ene 2015, 20:39
Ubicación: La Coruña
Has thanked: 11 times
Been thanked: 17 times

Re: Puerto serie + Wifi en el Amstrad CPC

Mensaje por tactica »

Pues venga, el siguiente tiene que ser el ZX81 :D
Avatar de Usuario
yombo
Demonio tercer orden
Demonio tercer orden
Mensajes: 737
Registrado: 01 Ago 2014, 21:21

Re: Puerto serie + Wifi en el Amstrad CPC

Mensaje por yombo »

Se me había olvidado comentar aquí :)

Madre mía, pensar lo fácil que hubiera sido usar este chip en Yombonet en vez del cpld y el atmega... :~(
Imagen
Responder

Volver a “Proyectos de hardware abiertos”