Entradas de la categoría ‘Desarrollo’
Cuando programar significaba mover interruptores

Hay una escena que el cine lleva décadas repitiendo mal: aparece un gran ordenador de los años cincuenta o sesenta, lleno de luces parpadeantes, y algún técnico con bata blanca pulsando interruptores de vez en cuando. La realidad era bastante más interesante, pues aquellos interruptores no estaban allí para decorar ni para impresionar a las visitas, y no se pulsaban cada media hora cuando el operario de turno hacía la ronda con una carpeta de pinza en la mano. En la mayoría de los casos eran literalmente «el teclado» de la máquina.
Las primeras computadoras electrónicas carecían de los sistemas de entrada que hoy damos por supuestos. No existían teclados ni ratones, no había interfaces gráficas ni terminales conectados permanentemente. Incluso antes de que una máquina pudiera leer una cinta de papel o una tarjeta perforada, había que cargar en memoria un pequeño programa inicial, y para introducir ese software se hacía necesario enviarlo bit a bit mediante los interruptores del panel frontal.
Imaginemos una máquina con un bus de 16 bits. En el frontal encontrábamos normalmente dieciséis palancas alineadas horizontalmente, cada una de ellas representando un bit. Interruptor hacia arriba significaba 1; interruptor hacia abajo significaba 0. Si el operador quería introducir el valor binario 0001001000110100, debía colocar exactamente cada interruptor en la posición correcta y, después, pulsar una tecla o palanca de carga para escribir ese valor en memoria. Luego cambiaba la combinación y repetía el proceso para la siguiente instrucción.

En máquinas como el IBM 1130, aquellos interruptores servían además para indicar direcciones de memoria concretas. El operador podía seleccionar una dirección, visualizar su contenido mediante los indicadores luminosos y modificarla manualmente. Era algo parecido a abrir hoy un editor hexadecimal, sólo que en lugar de una ventana tenías una consola metálica llena de bombillas.
El proceso de arranque, además, era especialmente delicado. Supongamos que el ordenador debía cargar el sistema desde una lectora de tarjetas perforadas, pero esa lectora todavía no podía utilizarse porque el equipo no sabía cómo comunicarse con ella. Por lo tanto, primero había que introducir mediante interruptores una rutina extremadamente pequeña, de apenas unas instrucciones en código máquina, que era capaz de leer unas pocas palabras desde la tarjeta. Lo leído contenía un cargador más potente que, a su vez, volcaba en memoria el resto del software. Era un proceso escalonado que los ingenieros llamaban bootstrap (arranque, en castellano), término del que deriva el actual boot de los sistemas operativos.

Un error de un solo bit podía arruinar la operación. Si el operador pretendía introducir una instrucción con valor hexadecimal 3A pero por descuido colocaba un interruptor incorrectamente y escribía 3B, el programa podía dejar de funcionar inmediatamente. No había mensajes explicativos ni depuradores sofisticados, y la solución habitual consistía en volver a revisar una por una las posiciones de los interruptores y compararlas con la documentación técnica.
Las luces del panel frontal eran igualmente importantes, pues no estaban pensadas para mostrar actividad de forma decorativa, como sucedería décadas después en muchos ordenadores domésticos. Habitualmente representaban el contenido de registros internos, direcciones de memoria o líneas de datos. Un operador experimentado podía observar el patrón de luces y deducir si el procesador estaba ejecutando instrucciones, atrapado en un bucle o esperando una entrada externa.
Algunos fabricantes llevaron la idea todavía más lejos. Los llamados sense switches permitían que los programas consultaran directamente el estado de determinados interruptores físicos durante la ejecución. En el IBM 701, por ejemplo, el software podía comprobar si un interruptor concreto estaba activado y tomar decisiones distintas en función de ello. En ciertos sistemas IBM, incluso el lenguaje FORTRAN incorporaba instrucciones específicas para leer estos interruptores y controlar luces del panel frontal. Esto daba lugar a situaciones que hoy resultan difíciles de imaginar, en las que, por ejemplo, un programa científico que llevaba horas ejecutándose podía modificar su comportamiento porque el operador había cambiado la posición de una pequeña palanca. También era posible activar modos de diagnóstico, solicitar información adicional o alterar estrategias de cálculo sin recompilar absolutamente nada, solo moviendo interruptores. En cierto modo, eran las opciones de configuración de una aplicación moderna, pero implementadas directamente en hardware.

Los paneles frontales también eran herramientas de mantenimiento. Cuando una máquina fallaba, los técnicos examinaban las luces para localizar el punto exacto del problema. Muchos manuales de servicio incluían tablas completas indicando qué combinación de indicadores correspondía a determinados errores. Hoy conectamos un depurador o revisamos un registro de eventos; entonces se observaba el comportamiento de las bombillas.
Lo más fascinante de todo es que aquellos operadores desarrollaban una comprensión extraordinariamente profunda de sus sistemas. No trabajaban sobre capas de abstracción, leían directamente los bits, las direcciones de memoria y los registros internos. Cuando un programa no funcionaba, podían seguir visualmente el recorrido de los datos por la máquina. La informática moderna nos ha dado herramientas infinitamente más cómodas, pero también nos ha alejado de esa relación casi física con el hardware.

Quizá por eso cuesta no sentir cierta admiración por aquellos pioneros. Mientras nosotros nos quejamos cuando un IDE tarda siete segundos en arrancar, ellos cargaban el programa inicial de un ordenador colocando docenas de interruptores en la posición correcta uno por uno. Y si se equivocaban en el último bit, tocaba empezar otra vez desde el principio. Eso sí que era programación de bajo nivel.
Desarrollo en MicroPython para Raspberry Pi Pico

El autor de este humilde blog se complace en presentarles su libro ‘Desarrollo en MicroPython para Raspberry Pi Pico‘, una obra de consulta y aprendizaje ideal para todos aquellos que se quieran iniciar o deseen profundizar en la programación de placas microcontroladoras Raspberry Pi Pico en lenguaje MicroPython.
Raspberry Pi Pico es una placa microcontroladora de desarrollo de bajo costo fabricada por Raspberry Pi Foundation, un circuito integrado programable, capaz de ejecutar las órdenes grabadas en su memoria. Pico ofrece un rendimiento sólido para una variedad de aplicaciones de hardware de bajo consumo, por lo que puede ser dedicada a una amplia gama de proyectos, desde sistemas embebidos simples hasta dispositivos IoT (Internet of Things, o Internet de las cosas) más complejos.
Python es un lenguaje de programación interpretado simple, de propósito general y orientado a objetos. Además, es también de código abierto. Por su lado, MicroPython es una implementación ágil y eficiente de Python 3.0 —su última versión mayor, por el momento— que incluye un pequeño subconjunto de las bibliotecas estándar del lenguaje padre, la sintaxis y funcionalidad completa, y que, además, está optimizado para ejecutarse en microcontroladores y en entornos restringidos, como en el interior de Raspberry Pi Pico, entre otros.
Con el libro ‘Desarrollo en MicroPython para Raspberry Pi Pico’ aprenderás de una forma sencilla e intuitiva cómo programar una tarjeta Pico o Pico W (o sus hermanas mayores, Pico 2 y Pico 2 W) para que haga lo que tú quieras. Las posibilidades son infinitas, desde un sensor ultrasónico para detectar presencia hasta un servidor web para tus proyectos o una sonda de temperatura Bluetooth, pasando por controlar una pantalla de segmentos, una impresora térmica, un panel LCD o un motor de corriente continua. ¡Y mil cosas más!

Estás ante el manual de programación en MicroPython para Raspberry Pi Pico en español más completo del mercado. Cuenta con 377 páginas, fotografías, esquemas gráficos, ejemplos de código fuente y aplicaciones prácticas:
- Explicaciones detalladas, amenas y muy completas de todas y cada una de las características de la tarjeta Raspberry Pi Pico y de sus componentes, así como del lenguaje MicroPython.
- Infinidad de ejemplos prácticos de código fuente en MicroPython que sirven de explicación a cada uno de los capítulos, epígrafes y apéndices de información contenida en el libro.
- Rigurosos esquemas de conexión que explican los pormenores de la interacción de Raspberry Pi Pico con elementos externos, cables, pinzas, placas protboard, placas de pruebas, etcétera.
- Descripción minuciosa de proyectos completos de aplicación con fotografías, código fuente, explicaciones, conexiones y hojas de especificaciones de componentes.
Disponible, en Amazon, en dos formatos, a saber: Tabla blanda y versión Kindle.
CONTENIDO GENERAL DE CAPÍTULOS PRINCIPALES.
CAPÍTULO I • LA PLACA RASPBERRY PI PICO.
CAPÍTULO II • PROGRAMANDO PICO.
CAPÍTULO III • LENGUAJE PYTHON PARA PRINCIPIANTES.
CAPÍTULO IV • ¡HOLA, MUNDO!
CAPÍTULO V • LOS PINES DE PICO, QUÉ PODEMOS CONECTAR EN ELLOS Y CÓMO HACERLO.
CAPÍTULO VI • DESARROLLO BÁSICO DE APLICACIONES PRÁCTICAS.
CAPÍTULO VII • MÁS SOBRE LOS PINES DE PICO: EL MÓDULO machine y LAS CLASES Pin Y Signal.
CAPÍTULO VIII • ENTRADAS Y SALIDAS ANALÓGICAS: LAS CLASES ADC Y PWM.
CAPÍTULO IX • COMUNICACIÓN SERIE DÚPLEX: UART Y USART.
CAPÍTULO X • PROTOCOLO SERIE SÍNCRONO PARA PERIFÉRICOS: SPI.
CAPÍTULO XI • EL PROTOCOLO SERIE DE DOS HILOS: I2C.
CAPÍTULO XII • EL PROTOCOLO SERIE PARA AUDIO DIGITAL: I2S.
CAPÍTULO XIII • CONEXIÓN WI-FI CON RASPBERRY PI PICO W.
CAPÍTULO XIV • RASPBERRY PI PICO W Y CONEXIONES BLUETOOTH.
CAPÍTULO XV • IMPLEMENTANDO RASPBERRY PI PICO COMO DISPOSITIVO USB.
CAPÍTULO XVI • CONTROLANDO LOS TIEMPOS: LAS CLASES RTC, Timer y WDT del módulo machine.
CAPÍTULO XVII • EL SISTEMA DE ARCHIVOS LOCAL DE RASPBERRY PI PICO.
CAPÍTULO XVIII • NEOPIXEL.
CAPÍTULO XIX • FUNCIONES ESPECÍFICAS DE RASPBERRY PI PICO: EL MÓDULO rp2.
APÉNDICE A • ENTORNO DE PROGRAMACIÓN REPL.
APÉNDICE B • REFERENCIA DEL LENGUAJE PYTHON.
APÉNDICE C • SECUENCIAS DE ESCAPE.
APÉNDICE D • COMPILAR MICROPYTHON.
APÉNDICE E • RASPBERRY PI PICO|PICO W FRENTE A RASPBERRY PI PICO 2|PICO 2 W.
APÉNDICE F • ECONOMIZAR MEMORIA A LA HORA DE PROGRAMAR.
APÉNDICE G • DEPURACIÓN CON RASPBERRY PI PICO.
APÉNDICE H • CÓDIGOS DE ERROR DE PYTHON.
APÉNDICE I • ESCRIBIR BUENOS MANEJADORES DE INTERRUPCCIONES.
¡Disfrútalo, y a desarrollar para Raspberry Pi Pico!
Manual de desarrollo en MicroPython para la placa BBC micro:bit

El autor de este humilde blog se complace en presentarles su libro ‘Manual de desarrollo en MicroPython para la placa BBC micro:bit‘, una obra de consulta y aprendizaje ideal para todos aquellos que se quieran iniciar o deseen profundizar en la programación de tarjetas micro:bit en lenguaje MicroPython.
La placa o tarjeta micro:bit es un sistema de hardware integrado, de código abierto, basado en la arquitectura informática ARM y diseñado por la BBC británica con un objetivo eminentemente educacional. Es una computadora de bolsillo que te introducirá en el mundo del desarrollo informático, interactuando de manera conjunta con el software y el hardware.
Python es un lenguaje de programación interpretado simple, de propósito general y orientado a objetos. Además, es también de código abierto. Por su lado, MicroPython es una implementación ágil y eficiente de Python 3.0 —su última versión mayor, por el momento— que incluye un pequeño subconjunto de las bibliotecas estándar del lenguaje padre, la sintaxis y funcionalidad completa, y que, además, está optimizado para ejecutarse en microcontroladores y en entornos restringidos, como en el interior de micro:bit, entre otros.
Con este ‘Manual de desarrollo en MicroPython para la placa BBC micro:bit’ aprenderás de una forma sencilla e intuitiva cómo programar una tarjeta micro:bit para que haga lo que tú quieras. Las posibilidades son infinitas, desde un sensor de humedad para tus plantas hasta un detector de CO2 para controlar el aire que respiras, pasando por un timbre inalámbrico, un medidor de pasos, un generador de voz, mover un motor o encender luces led. ¡Y mil cosas más!

Estás ante el manual de programación en MicroPython para micro:bit en español más completo del mercado. Cuenta con 284 páginas, fotografías, esquemas gráficos, ejemplos de código fuente y aplicaciones prácticas:
- Explicaciones detalladas, amenas y muy completas de todas y cada una de las características de la tarjeta micro:bit y de sus componentes, así como del lenguaje MicroPython.
- Infinidad de ejemplos prácticos de código fuente en MicroPython que sirven de explicación a cada uno de los capítulos, epígrafes y apéndices de información contenida en el libro.
- Rigurosos esquemas de conexión que explican los pormenores de la interacción de micro:bit con elementos externos, cables, pinzas, placas protboard, placas de pruebas, etcétera.
- Descripción minuciosa de proyectos completos de aplicación con fotografías, código fuente, explicaciones, conexiones y hojas de especificaciones de componentes.
Disponible, en Amazon, en tres formatos, a saber: Tabla blanda, tapa dura y versión Kindle.
CONTENIDO GENERAL DE CAPÍTULO PRINCIPALES.
CAPÍTULO 1. La placa BBC micro:bit
CAPÍTULO 2. Programando la placa micro:bit
CAPÍTULO 3. Lenguaje Python para principiantes
CAPÍTULO 4. ¡Hola, mundo!
CAPÍTULO 5. El objeto display
CAPÍTULO 6. El objeto accelerometer y la gravedad
CAPÍTULO 7. Orientación: el objeto compass
CAPÍTULO 8. Los botones de micro:bit, la clase Button y sus dos instancias
CAPÍTULO 9. Generando sonido (los módulos audio y music) y captándolo
CAPÍTULO 10. El módulo speech, porque micro:bit habla y canta.
CAPÍTULO 11. Manejando el tiempo: el módulo utime
CAPÍTULO 12. El sistema de archivos local de micro:bit
CAPÍTULO 13. Administración del sistema de archivos local: el módulo os
CAPÍTULO 14. Los pines de entrada y salida: analógicos, digitales, I2C, SPI y UART
CAPÍTULO 15. Temperatura y otros asuntos internos de micro:bit
CAPÍTULO 16. Comunicación entre dispositivos: redes cableadas y redes inalámbricas
CAPÍTULO 17. Entorno de programación REPL
APÉNDICE A. Referencia del lenguaje Python
APÉNDICE B. Secuencias de escape
APÉNDICE C. Conectividad Bluetooth
APÉNDICE D. El runtime de micro:bit
APÉNDICE E. Actualizar el firmware de micro:bit y compilar MicroPython
APÉNDICE F. WebUSB en micro:bit
APÉNDICE G. Especificaciones técnicas de micro:bit V2 (frente a V1)
APÉNDICE H. Economizar memoria a la hora de programa
BIBLIOGRAFÍA
¡Disfrútalo, y a desarrollar para micro:bit!
El concurso retro BASIC 10Liners

BASIC 10Liners
Uno de los aspectos más destacados de la escena retroinformática es el concurso BASIC 10Liners, una competición promovida por la web alemana HOMEPUTERIUM que pretende llevar a la máxima expresión la programación en cualquier dialecto de BASIC de los antiguos sistemas de 8 bits. Hace unas horas se acaba de anunciar su séptima edición.
Este año, los organizadores han cambiado algunas reglas basándose en los comentarios y quejas recibidas en la edición anterior. El cambio más importante es para la categoría ‘PUR-80’, donde sólo se permitirán las variantes de BASIC integrado (built-in BASIC), decisión que, probablemente, afectará más a los programadores de Atari Turbo Basic XL. Se puede visualizar el conjunto total de reglas en la web del concurso (en alemán y en inglés).
Las tres categorías principales son ‘PUR-80‘, ‘PUR-120‘ y ‘EXTREME-256‘. ‘PUR-80’ consiste en programar un juego en 10 líneas con un máximo de 80 caracteres por línea lógica; en ‘PUR-120’ hay que programar un juego en 10 líneas con un máximo de 120 caracteres por línea lógica; y en ‘EXTREME-256’ tenemos que programar un juego en 10 líneas con un máximo de 256 caracteres por línea lógica. En todas las modalidades se permiten abreviaturas.
Existen otras dos categorías anejas: ‘FREE‘ y ‘WILD‘. La primera de ellas es la única en la que se permite utilizar código máquina, siempre que se pueda escribir con un editor de BASIC. La segunda, por su lado, admite otro tipo de programas que no sean juegos. En ambas, el máximo de líneas es también de diez.
La fecha límite para las presentaciones es el sábado, 24 de marzo de 2018, a las 18:00 CET. La ceremonia de entrega de premios tendrá lugar dos semanas después, el sábado 7 de abril, en la ciudad alemana de Lübeck.
En los seis años anteriores del BASIC 10Liners se han recibido 246 contribuciones de 10 líneas, todas ellas pequeñas obras de arte jugables (se pueden descargar desde el sitio web del consurso). Además, son piezas de código increíbles que podemos analizar, admirar, disfrutar, y de las que podemos aprender a condensar código en un continente minúsculo.
¡No te lo puedes perder!.
El código fuente que llevó al hombre a la Luna (y dónde descargarlo)

La NASA envía el Apollo 11 a la Luna
Cuando los programadores del laboratorio de instrumentación del MIT se dispusieron a desarrollar el software de vuelo para el programa espacial Apollo 11 —a mediados de los años sesenta del siglo pasado—, la tecnología necesaria no existía, por lo que tuvieron que inventarla. Así pues, se les ocurrió una nueva manera de almacenar programas informáticos en dispositivos ROM, a la que llamaron «memoria de núcleos cableados«, y que era un paso siguiente a la memoria ordinaria de núcleos magnéticos de ferrita del momento.
También, tuvieron que inventar una versión especial del lenguaje ensamblador que llevaba en su interior miles de líneas de código; y todo ello para el computador Apollo Guidance Computer (AGC), el alma de la misión, esencial para la navegación del módulo de mando y, también, del módulo lunar; y uno de los primeros ordenadores basados circuito integrados.
En la siguiente imagen podemos ver a Margaret Hamilton, directora de ingeniería de software del proyecto, mostrando la montaña de listados de código que conformaban los archivos fuente de las distintas aplicaciones.

Margaret Hamilton
El código del AGC ha estado disponible para el público general desde hace bastante tiempo, concretamente desde el año 2003, cuando el investigador en tecnología Ron Burkey se preocupó de colgarlo en Internet después de haber transcrito (mecanografiado), a mano, una a una las líneas que aparecían en las imágenes escaneadas de las copias impresas originales del MIT. Aquellas copias fueron digitalizadas originalmente —en Colorado— por un piloto aeronáutico llamado Gary Neff. Posteriormente, el MIT se hizo con aquellos documentos y los puso en línea en forma de imágenes de página, pero la falta de fortuna quiso que muchas de ellas quedaran mutiladas al punto de ser ilegibles en algunos lugares de las fotografías. Burkey reconstruyó manualmente las partes que se podían rescatar, utilizando sus habilidades en ingeniería para rellenar los huecos en blanco. Algo después, consiguió reunirse con Gary Neff y logró hacerse con los escaneos originales, completando el paquete de documentos al cien por cien.
Aunque esta documentación de tan enorme proyecto ha estado un poco escondida y confinada a reductos universitarios, a mediados del año 2016, el extrabajor de la NASA Chris Garry comenzó a colgar completamente en GitHub la totalidad de los archivos fuente del software espacial. Estos archivos se han ido actualizando hasta hace un par de meses, y podemos asegurar que la integridad del proyecto está hoy a la disponibilidad del total de los internautas que deseen consultarlo.
Una de las cosas que más ha llamado la atención de este código fuente es la ristra de comentarios humorísticos que acompañan al código del ACG a modo de chistes, mensajes y referencias locales a los sesenta estadounidenses. Un buen ejemplo se corresponde con los comentarios iniciales del archivo llamado BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc (imagen siguiente).
O el fichero denominado LUNAR_LANDING_GUIDANCE_EQUATIONS.agc, en el que parece que dos líneas de código destinadas a ser temporales acabaron siendo permanentes, en contra de las esperanzas de un desolado programador.
Todo un ejemplo de ingeniería e ingenio de los primeros programadores espaciales. Ron Burkey, incluso, utilizó el código para crear un simulador del ACG. Podemos, pues, y para terminar, verlo y disfrutarlo en el siguiente vídeo.



