TL; DR: Diversión, porque ni siquiera era mi trabajo.
=== advertencia, esto va a ser muy largo. Me dejé llevar un poco ===
Era el año 1985. Trabajaba como ingeniero electrónico con una responsabilidad especial para los diseños analógicos de RF (radiofrecuencia), lo más lejos posible de la informática. La compañía para la que trabajé estaba dando sus primeros pasos en el mundo del diseño embebido, y tenía un interés natural en esto, ya que parecía ser el camino hacia el futuro. Ya usaba un C64 en casa y me había enseñado a mí mismo ensamblador a programarlo, porque muy pronto me di cuenta de que BASIC era un factor limitante severo.
De todos modos, la compañía contrató a un par de nuevos graduados nuevos cuyo trabajo sería escribir el código para los futuros productos que usarían un microcontrolador incorporado. Los productos en cuestión estaban en el campo de la seguridad física. La decisión que tomaron fue utilizar el 8051 MCU. No sabía nada sobre ese chip, ya que el C64 usaba el 6502, y eso es todo lo que sabía, aunque otro producto no diseñado internamente usaba un Z80, y también tuve un poco de exposición a eso. .
Por el bien de mi propia carrera, así como por mi interés personal, decidí que me ‘acompañaría’ tanto como pudiera para no quedarme atrás. En ese momento ya tenía unos 7 años de experiencia diseñando hardware de producción en varias formas, aunque eso era casi todos los diseños digitales analógicos o discretos. Los nuevos graduados, siendo los sabelotodos típicos con títulos pero sin experiencia en absoluto, fueron muy condescendientes. (Más tarde también descubrí que les pagaban mucho más que a mí, lo cual era difícil de tragar). Es cierto que solo conocía el ensamblador C64, que consideraban un juguete y no tenía valor. Pero su actitud despectiva al hacer preguntas sobre la codificación del 8051 (que sin duda eran ingenuas, como era de esperar cuando eres nuevo en un tema) solo sirvió para hacerme más decidido a aprenderlo.
Así que estudié en casa, y me quedaba hasta tarde en la noche para usar el sistema de desarrollo que permitía escribir, ensamblar y probar el código en el circuito. En esto, fui apoyado por mi jefe inmediato que alentó cualquier cosa que aumentara el arsenal de un ingeniero, y otro ingeniero en una oficina diferente que había escrito un sistema anterior basado en la CPU 6800. (La compañía tenía una estructura complicada en ese momento, ya que acabábamos de fusionarnos con otra compañía, por lo que había una mezcla de productos que usaban diferentes tecnologías y entraron un grupo de ingenieros de la otra compañía). Fue este otro ingeniero el que me enseñó todo sobre las trampas del código de interrupción que necesita un mutex con código ‘normal’ para garantizar la integridad de los datos que se pasan entre ellos. En aquellos días teníamos que codificar esos mutexes nosotros mismos: no había soporte dentro del chip o del lenguaje en sí. Otra cosa que me mostró fue un buen truco para implementar una gran declaración de tipo de interruptor / caso en el ensamblador (no conocía C en ese momento, por lo que no lo habría reconocido así). Había una tabla de salto de direcciones de rutina, y una función de selector usaría el índice de función para empujar la entrada de la tabla a la pila, luego realizaría un ‘RTS’, que arrastraría esa dirección a la PC y, por lo tanto, saltaría a la dirección. Esto funcionó alrededor del 8051 al no tener forma de mover directamente un valor a la PC.
Capítulo 1: La Odisea y la Ilíada
Tenía dos proyectos no oficiales sobre la marcha en los que decidí que usaría el 8051. Uno era una alarma de automóvil, con un reloj digital / pantalla de estado y un teclado, y el otro era un amplificador / receptor de alta fidelidad controlado digitalmente, También con una pantalla para frecuencia sintonizada y muchas otras cosas. Ambos proyectos me interesaron personalmente y eran directamente análogos a los tipos de productos en los que la compañía estaba involucrada en la producción, por lo que todo lo que aprendí sobre ellos sería directamente transferible. (nota de la barra lateral: los proyectos personales no oficiales se conocían como ‘jonrones’, es decir, proyectos domésticos. El nombre en clave del amplificador era Odyssey y la alarma del automóvil era Iliad. Homer, geddit?)
Así que rápidamente descubrí cómo configurar el 8051 y ejecutar el código, estableciendo interrupciones para escanear el teclado, devolviendo el código clave (con mutex) al código principal, controlando la pantalla y, en el caso del receptor, cómo maneje un sintetizador de frecuencia con un código binario para establecer la frecuencia sintonizada, y a partir de eso calcule el valor decimal sintonizado equivalente para mostrar en la pantalla. ¡Ese código de conversión ocupó la mitad del programa almacenado! (Mirando hacia atrás, es probable que haya una solución mucho más eficiente allí, pero en ese momento fue lo mejor que pude hacer, al menos funcionó. Pero tenga en cuenta otra limitación del 8051: no hay instrucciones de multiplicar o dividir).
Hubo beneficios secundarios de esto, así como aprender a codificar el 8051: mezclar una CPU ruidosa con un sistema de alta fidelidad me enseñó mucho sobre cómo garantizar que el ruido digital no se filtre en las cosas analógicas, por ejemplo, o cómo hacer un microcontrolador no falla cuando funciona con el sistema eléctrico de un automóvil, incluso mientras arranca el motor.
De todos modos, todo eso fue divertido, y tenía dos proyectos de trabajo que mostrar por mis esfuerzos, y sentí que había comenzado a entender el 8051 razonablemente bien. Mientras tanto, los graduados no habían producido una sola cosa que hiciera otra cosa que ejecutar funciones de prueba ultra simples. Esto fue casi 2 años después. Se quejaban constantemente del sistema de desarrollo y de tener que codificar en ensamblador; querían obtener un compilador de C para él, que estaba disponible, pero era una opción extremadamente costosa para ese sistema en ese momento. Los jefes lo criticaron, ya que ya habían gastado decenas de miles en el sistema y no tenían nada que mostrar, aunque estaban al tanto de mis proyectos no oficiales, no eran secretos, y eso demostraba claramente que el sistema de desarrollo era útil. como lo fue para hacer cosas de trabajo.
Debido a que los graduados siempre estaban hablando de C, y cuando comencé a aprender a programar el Mac (en BASIC, como otro jonrón), un día me pregunté en voz alta si debía aprender C. No estaba satisfecho. con BASIC en Mac, al igual que con el C64 anterior, era muy limitante. Era C o Pascal. En su habitual forma condescendiente, dijeron que C sería “demasiado difícil” para que mi pequeño cerebro esponjoso lo entendiera, así que debería seguir con BASIC. Así las cosas, terminé yendo por Pascal en ese momento, lo cual fue una buena opción para el Mac de 1987, aunque finalmente fue un callejón sin salida. No me gustaba ser patrocinado de esa manera, pero no había mucho que pudiera hacer al respecto: tenían su trabajo y yo el mío, y había una clara demarcación entre ellos, oficialmente. Pero, como siempre, no me senté y me molesté, solo construí cosas. Supongo que pensé que al final, los hechos valen más que mil palabras, y hacer que las cosas reales y de trabajo siempre hablen más fuerte. No me daba cuenta del hecho de que debían sentirse amenazados por esto, de que un ‘simple’ ingeniero de RF podría dominar 8051 y Pascal en unos pocos meses y realmente usarlo para hacer cosas, mientras que simplemente hablaban y aparentemente lo encontraban demasiado difícil. .
Capítulo 2: Coulda debería haber sido.
En el ’87, nos embarcamos en un diseño completamente nuevo para un sistema de seguridad inalámbrico. Este sería el primer proyecto combinado para las empresas fusionadas, y estaba destinado a ser de vanguardia. El concepto era utilizar pequeños módulos de transmisor de radio para cada sensor en el sistema: contactos de puertas y ventanas, sensores infrarrojos pasivos, detectores de rotura de ventanas, teclados remotos, etc., y un receptor basado en microcontrolador. El sistema presentaba muchos desafíos: garantizar una vida útil de la batería extremadamente larga en los sensores, garantizar la integridad de los datos, la manipulación y la resistencia a los atascos, así como un panel de control mucho más fácil de usar en el receptor. Fui el desarrollador principal de este proyecto y, como tal, responsable de gran parte del diseño básico, incluidos todos los protocolos de transmisión utilizados entre los sensores y el receptor. El receptor usaría un MCU 8051, pero la tarea de codificarlo se delegó a los graduados. Ese era su trabajo después de todo.
Desarrollé un prototipo de transmisor utilizando lógica CMOS discreta, que requería entre 60 y 80 chips. La idea era que una vez que resolviéramos los problemas, transferiríamos ese diseño a un IC personalizado que se usaría en cada transmisor diferente. (Por razones de costo, el mismo chip tenía que usarse en cada variante TX, por lo que tenía bastante versatilidad incorporada). Mientras trabajaba en eso, se les pidió a los graduados que desarrollaran software para recibir el protocolo de transmisión y decodificarlo. En primera instancia, el código se usaría para controlar una pantalla de estado en un receptor de prueba, para que pudiéramos ver lo que se estaba recibiendo.
Terminé el hardware de mi transmisor y lo arreglé todo para transmitir códigos de prueba. Le había demostrado esto a varios jefes y hasta ahora estaban impresionados: uno de los logros clave fue reducir el tiempo de transmisión de un solo mensaje a algo muy breve, mientras transmitía muchos más bits (necesarios para la corrección de errores y tener un rango ampliado de direcciones del sistema). Un sistema de radio anterior (no desarrollado por mí) transmitió solo 11 bits de información, ¡y cada mensaje tardó 2 segundos en transmitirse! La razón de esto fue que utilizó la activación y desactivación de la codificación con una codificación NRZ, por lo que la velocidad de datos tenía que ser muy lenta para evitar interferencias de radio. Fue un diseño extremadamente tonto, y una gran razón por la que tuvimos que idear algo mucho mejor. Mi diseño envió alrededor de 204 bits de datos con corrección de errores en 170 ms utilizando la modulación GPSK de una subportadora que luego se transmitió mediante FM. Hizo una buena demostración para configurar el sistema antiguo y el nuevo lado a lado con la alimentación de datos a un altavoz. Cuando se activan juntos, el mío “chirria” y el otro “blip-blip-blip-blip-blip” … durante 2 segundos. Era fácil demostrar que cuando se golpeaban varios transmisores juntos o en una sucesión rápida, un escenario bastante realista, era mucho más probable que el chirrido pasara que los blips, dado que todos los blips se transmitían ciegamente uno encima del otro. ; Un sistema de autointerferencia.
De todos modos, los jefes necesitaban ver el sistema funcionando como un todo, porque todos sabían que esos chirridos eran solo un ruido. Necesitaba demostrar que el chirp podía decodificarse de manera confiable incluso cuando la señal se deterioraba o se interfería, o si se activaban dos transmisores a la vez. Aún quedaban muchos problemas por resolver. La presión estaba en los graduados para que algo funcionara. Día tras día no lo lograron. Las excusas abundaban. La falta de un compilador de C era una que seguía apareciendo. Finalmente, los jefes cedieron y les compraron el maldito compilador de C. Ahora tenían la excusa de que era nuevo para ellos y tenían que descubrir cómo usarlo, y comenzaron a reescribir las cosas en C. Me estaba frustrando mucho: el proyecto se estaba estancando debido a su incapacidad para hacer cosas.
Entonces hice lo que tenía que hacer. No era para probar un punto, era solo para que pudiera progresar en el proyecto. Teníamos un prototipo de hardware que tenía una pantalla de 2 líneas y un controlador 8051, y tenía un receptor de radio y un demodulador GPSK en hardware que demodulaba los bits de datos sin procesar y los alimentaba al 8051. Estaba todo allí, aparte del software. Por las noches, cuando los graduados se iban a casa y dejaban solo el sistema de desarrollo, escribí mi propio decodificador y controlador de pantalla. No tenía que ser de calidad final, solo tenía que funcionar para poder hacer una demostración del sistema y comenzar a analizarlo. Lo tuve trabajando en dos o tres noches. Creo que la primera vez que los graduados se dieron cuenta de que algo estaba pasando fue cuando dejé de molestarlos para que me dieran algo. Luego notaron que tenía una placa receptora que funcionaba y estaba probando cosas como tasas de error, resolución de conflictos y otras cosas. Uno de ellos me preguntó qué código estaba usando, y solo dije que lo había escrito después del trabajo para poder continuar. Realmente no me importaba si eso era vergonzoso para ellos, realmente se les había dado cada oportunidad.
Resultó que mi decodificador rápidamente amarrado no necesitó mucha revisión: funcionó bastante bien y cumplió con todas las especificaciones sin demasiados ajustes. También entregó sus datos decodificados de una manera muy limpia (una pequeña cola de registros de transmisores recibidos) que estaba completamente separada del código del controlador de pantalla. Entonces, después de mostrarlo a los jefes y presentar los resultados, me preguntaron cuál era el siguiente paso. Fui completamente honesto con ellos y dije que el decodificador del receptor era algo que había atacado como aficionado en mi propio tiempo, y que los graduados seguramente tendrían algo mejor “muy pronto”. Dios sabe por qué incluso intenté cubrir sus traseros: ¿conciencia culpable? Los jefes preguntaron qué harían los suyos que los míos no harían, dado que los míos cumplían con las especificaciones, y realmente no tenían una respuesta. Creo que hubo algunos murmullos acerca de que no estaba en C, por lo que sería más difícil de mantener, lo cual fue un punto justo, pero en 1987 esas cosas no fueron un problema tan grande y todas estas cosas de codificación todavía eran bastante nuevas para la compañía de todos modos. Entonces se les dijo que usaran mi código tal como estaba y que siguieran escribiendo las cosas de nivel superior que impulsaban la pantalla del usuario, etc.
Tal vez se sintieron aliviados de que el viejo y retorcido decodificador ya no estuviera en su plato, pero también estaban bastante molestos por haberlos tropezado y avergonzado. Si bien esa nunca fue mi intención, fue muy satisfactoria. Me gusta pensar que cuando realmente vieron el código que había escrito, el hecho de que usaba interrupciones con mutex adecuados, usaba tablas de salto ordenadas, se mantenía muy bien separado y les presentaba los datos en una forma directamente utilizable. seguramente me habría dado cuenta de que mis habilidades no debían subestimarse, como siempre lo habían hecho. Sin embargo, eso es probablemente una ilusión ya que nunca lo mencionaron; Es la manera británica.
Luego diseñé el chip real para el transmisor y una especie de ‘GUI’ para el receptor, del cual escribí una simulación en la Mac (en BASIC, no había llegado al Pascal para entonces) para mostrar cómo funcionaría y se vería. Todavía tengo una copia del código fuente para todos estos proyectos.
Captura de pantalla, impresa en papel, del simulador. Lo real no habría sido pixelly como este, pero en ese momento fue lo mejor que pude simular. El panel de la izquierda habría sido una pantalla LCD personalizada con todos estos símbolos prediseñados. En uso, no los verías todos encendidos a la vez de esa manera.
Mirando hacia atrás, ese período fue probablemente uno de los períodos más intensos de aprendizaje por los que pasé, igualado solo por mi posterior adopción de C y C ++. También fue cuando me expuse a la codificación del mundo real por primera vez, y resultó que era bastante bueno en eso. Ciertamente podría entregar, que al final es lo que le importa a un empleador que paga. Desafortunadamente, esa compañía nunca apreció realmente mis habilidades, aunque ciertas personas y mi jefe inmediato lo hicieron. Ese proyecto finalmente se canceló por razones que hasta el día de hoy son difíciles de entender: funcionó bien, cumplió con sus especificaciones y limitaciones presupuestarias, se completó en un 95% para el momento en que se desconectó el tapón (incluidas las molduras personalizadas, la producción personalizada TX IC) y se adelantó a su tiempo; Todavía creo que hubiera sido un ganador en el mercado. Años más tarde vi algo similar publicado por un competidor, pero no fue tan bueno. El motivo fue la política de la empresa posterior a la fusión en lugar de los problemas técnicos. Después de tanto trabajo, mi jefe inmediato y yo estábamos devastados por la decisión, y ambos nos fuimos en 1989. Pero todas las habilidades que había adquirido fueron útiles de muchas maneras en los años siguientes.
Gracias por leer. ¡Dudo que muchos hayan llegado tan lejos!