Digamos que tenía un microcontrolador bastante simple y pequeño y no tenía interfaz, computadora, depurador, compilador o ensamblador. ¿Podría escribir su código en conjunto, convertirlo (manualmente) a código de máquina y luego aplicar energía a los pines apropiados usando una fuente de voltaje?
Entiendo que necesitaría E / S y memoria apropiadas para hacer realmente cualquier cosa, pero si estuviera tan inclinado y tuviera tiempo, ¿podría hacerlo? Supongo que, históricamente, ¿cómo se hizo esto cuando no había computadora / compilador / ensamblador para empezar? Siéntase libre de vincularme a un recurso externo. ¡Gracias! :)
Respuestas:
¡Si!
El código se puede escribir "fuera de su cabeza" en binario, si lo desea.
Hace mucho (mucho tiempo) así es como comencé a usar (entonces) microprocesadores.
Yo y mis amigos escribiríamos código en lenguaje ensamblador, lo compilaríamos manualmente en código máquina (algo que puedes hacer "por inspección" después de un poco de práctica) y luego ingresarlo en el procesador por varios medios. En un sistema que creamos, configuraríamos la dirección en los interruptores binarios (en apagado) o usaríamos una función de incremento automático del procesador, ingresaríamos 8 bits de datos en los interruptores binarios y luego presionaríamos un interruptor de "reloj" para ingresar los datos en la memoria.
La funcionalidad equivalente se podría lograr con incluso menos interruptores en un microcontrolador moderno que utiliza la programación SPI en serie, ver a continuación.
¡Si!
¡Pero sería increíblemente lento hacerlo!
Muchos microcontroladores modernos permiten el uso de una interfaz "SPI" para la programación.
Esto generalmente consiste en líneas de datos de entrada y salida y una línea de "reloj", y generalmente una línea de reinicio.
Muchos procesadores permiten que el reloj SPI y los datos sean "estáticos", lo que significa que no hay límite en cuanto al tiempo que puede tomar configurar los datos entre bits. Puede programar un procesador de este tipo utilizando una línea de datos y una línea de reloj que funcionan con interruptores operados manualmente. La línea del reloj debe estar "libre de rebotes"; debe poder establecerla alta o baja en una sola transición por operación, por lo que una interfaz mínima puede incluir una puerta activada por Schmitt. Puede "salirse con la suya" con solo un retraso RC y un interruptor de botón, pero una entrada activada por Schmitt es más segura. No es necesario que la línea de datos esté libre de rebotes, ya que su estado solo se lee en el borde del reloj.
Algunas interfaces son interactivas: el procesador emite datos durante la programación (p. Ej., Salida de datos = MISO = Salida de entrada maestra en serie en procesadores AVR). Para leer esto, necesitaría agregar, por ejemplo, un LED y una resistencia (y tal vez un búfer o transistor si la capacidad del variador era REALMENTE baja).
MC6800:
De memoria semidesvanecedora (¡casi 40 años!)
LDI A, $ 7F ...... 86 7F ...... 1000 0110 0111 1111
STA, $ 1234 ...... B7 12 34 ... 1011 0111 0001 0010 0011 0100
LDI X, $ 2734 .. CE 27 34 ... 1100 1110 0010 0111 0011 0100
...
fuente
Originalmente, en máquinas programables, los programas se perforaban manualmente en cintas de papel o tarjetas. Más tarde utilizaron una especie de máquina de escribir para perforar, e incluso más tarde las computadoras (como se les conocía para entonces) podían perforar su propia cinta de papel.
Literalmente, estaba sentado allí con una tarjeta y haciendo agujeros manualmente en ella.
Cada columna es una instrucción o bit de datos que la máquina de estado de la CPU interpreta para realizar tareas.
Ahora, por supuesto, todo es memoria flash, y sí, para obtener los datos allí en primer lugar, normalmente se necesita una computadora para hacerlo. Pero eso no es estrictamente 100% cierto.
Después de todo, ¿qué hace una computadora y un programador de hardware sino establecer el estado de los pines IO en los momentos correctos? Entonces, si usted es realmente lo suficientemente masoquista, puede construir un sistema que le permita enviar las instrucciones correctas a los pines de programación del microcontrolador de la manera correcta para instalar algunas instrucciones en la memoria flash para su ejecución.
Tal vez algo que involucre muchos interruptores, algunos registros de desplazamiento, un generador de reloj, etc.
Recuerdo que en la universidad teníamos un nuevo sistema de programación basado en Z80: una unidad del tamaño de una maleta con un Z80, una pequeña cantidad de RAM, un montón de pantallas LED de 7 segmentos y una gran fila de interruptores. Prográmelo cargando manualmente las instrucciones en la RAM usando los interruptores.
fuente
Dijiste "microcontrolador pequeño y no tenía interfaz, computadora, depurador, compilador o ensamblador". Bueno, puedes sobrevivir sin la computadora, depurador, compilador o ensamblador, pero debes tener algún tipo de interfaz para conectarte con el microcontrolador para cargar el programa.
Antes que nada, olvídate de cualquier lenguaje de alto nivel como C. Luego, la forma más fácil es escribir tu programa en lenguaje ensamblador, pero no uses el ensamblador para traducirlo al código de máquina. En su lugar, busque cada una de las instrucciones de ensamblaje en el manual de programación, encuentre su codificación hexadecimal equivalente y escríbala.
Tendrá que asignar sus propias variables, para que pueda completar las direcciones apropiadas en la parte del operando de las instrucciones. También olvídate de usar la pila y el montón, demasiado trabajo. Cuando termine, tendrá un programa de máquina que se puede cargar directamente en la memoria flash del microcontrolador; tampoco se necesita un vinculador.
Debido a la falta de direcciones externas y buses de datos en casi todos los microcontroladores (ya que tomarían demasiados pines que los puertos y periféricos de E / S necesitan), prácticamente todos los microcontroladores están programados a través de una interfaz especial como esta:
Normalmente, el "programador" de la izquierda estaría conectado a una PC, que descargaría un archivo de máquina generado por un compilador / enlazador.
Sin embargo, si el programador tiene un teclado, como el siguiente:
entonces uno puede ingresar los códigos hexadecimales para un programa generado manualmente directamente en el programador, y programar el dispositivo sin necesidad de un compilador, enlazador o PC, que era lo que estaba preguntando. (El teclado también se usa para editar archivos hexadecimales y generar sumas de verificación).
De acuerdo, muy pocos programadores tienen teclados como este. Este no sería adecuado para un aficionado, ya que probablemente cuesta un par de miles de dólares.
Este programador particular programa partes antes de que se coloquen en un tablero; Las interfaces y los sockets están disponibles para varios PIC y también Atmel AVR, entre otros.
fuente
Como cuestión práctica, algo como alternar los pines JTAG manualmente sería muy propenso a errores. Para ingresar un programa de cualquier tamaño decente se necesitarían miles de conmutadores. Pero teóricamente, es posible.
Si se le permite preparar el microcontrolador de antemano (o escribir una ROM de arranque para él), podría implementar fácilmente algo como los interruptores de palanca externos utilizados en los primeros mainframes. Si permite la lógica externa, incluso podría usar un teclado hexadecimal para acelerar las cosas.
Finalmente, aunque no es tan común en estos días, puede comprar un microcontrolador basado en ROM con código personalizado. Tendría que ofrecer algo de dinero por adelantado y garantizar un cierto volumen, pero he visto que los clientes lo hacen para ahorrar dinero en la producción de alto volumen. En ese caso, no habría señales externas necesarias para programar el microcontrolador. El código se incorporaría al diseño físico del chip.
Por supuesto, también puede usar un microcontrolador que ejecuta código desde una interfaz de memoria externa, pero eso es trampa. :-)
fuente
Absolutamente. De hecho, el primer curso de microprocesador que tomé (circa 87) usó una placa Motorola 68000. Resolveríamos el código en el ensamblaje, buscaríamos el hex para el ensamblaje y escribiríamos el hex en un terminal para programar el tablero. Si editó, debe asegurarse de que el código que ingresó sea más corto que el código que estaba reemplazando, y luego almacenar el resto con NOP. Si el código fuera más largo, ¡tendría que volver a escribir todo! Aprendimos a agregar muchos NOP.
fuente
Absolutamente. Una vez que tenga un formato binario de las instrucciones reales (fácil de hacer para conjuntos de instrucciones bien especificados), todo lo que necesita es implementar el protocolo de programación.
Por ejemplo, tome algo pequeño como un AVR Tiny 4 . La Sección 14 detalla la interfaz de programación, incluido el protocolo y la capa física. Es relativamente simple y solo necesita algunos botones y resistencias pull-down para enviar / recibir un 1 o un 0. Si se siente ambicioso, agregue algunos LED para leer la salida.
El último problema pendiente es si puede hacerlo lo suficientemente rápido, que por suerte * para el AVR Tiny 4 (sección 16), no tiene ninguna frecuencia mínima cuando se trata de programarlo.
* nota: hasta donde lo especifica la hoja de datos. Esto puede diferir en la realidad ... Dudo que alguien haya intentado programarlo a velocidades de reloj de mHz.
Siéntase libre de automatizar tanto / poco del proceso como lo desee. Esto es lo que la mayoría de los dispositivos de programación hacen de todos modos: automatizar el proceso.
fuente
Por cualquier medio que ingrese el programa al uC, está "interactuando" con él, porque eso es lo que significa la interfaz. Incluso un montón de interruptores que activa manualmente son una "interfaz".
Así que trataré esta pregunta como "¿cómo me relaciono con un uC con hardware de interfaz en gran medida mecánico (en lugar de electrónico) y de la manera más genial posible?"
A lo que mi respuesta es, ingrese el programa como un piano roll. La "barra de seguimiento" del rollo de piano de un piano de jugador básicamente le proporciona al menos 65 bits (según el formato) que puede activar y desactivar de forma independiente según las perforaciones en el papel. El resto es un trabajo exigente con un cuchillo exacto. Pero al menos su programa, una vez que se ejecuta, está (algo) permanentemente almacenado (a diferencia de un enfoque de voltear los interruptores manualmente).
fuente
No solo es posible programar un microcontrolador sin una computadora, sino que también puede comprar una computadora hoy que está específicamente diseñada para ser programada con interruptores de palanca de hardware. El kit se llama una tarjeta de membresía , y es una recreación de la computadora COSMAC Elf de la década de 1970. El kit fue descrito en un artículo reciente en la revista IEEE Spectrum . También es posible programar versiones más recientes de la Tarjeta de Membresía desde una PC.
fuente
Bueno. Qué tal esto: usted escribe el programa en ensamblador y busca los códigos de operación usted mismo, como se sugirió anteriormente. Cómo introducirlo en la computadora: tome un viejo reproductor de cintas, retire el cabezal de reproducción, pero deje el cabrestante y el rodillo de presión. Este será tu transporte. Si tiene un reproductor de carrete a carrete, puede dejar el cabezal de reproducción en su lugar.
Luego tome una tira larga y estrecha de papel, o incluso mejor, una cinta transparente. Aquí es donde codificas tu programa. Utiliza tantas pistas como pines para programar. En una pista pones puntos negros a intervalos regulares; Este es tu reloj. En las otras pistas, coloca puntos o tiras negros y deja espacios en blanco de acuerdo con los datos y las señales. Usted enciende una luz en todo y lo detecta con fototransistores pequeños (o enciende un LED en la cinta y detecta la luz con otros similares) y maneja el reloj y las líneas de señal con transistores. Esto ocupa un poco de espacio en el reproductor de cintas, por lo que es posible que deba quitar el cabezal de reproducción.
Por supuesto, también puede codificar las señales como audio, pero es un poco más complicado de decodificar. O puede detectar la luz reflejada en lugar de la transmitida. O puede perforar agujeros en cinta oscura o cinta de papel, en lugar de hacer marcas negras en cinta transparente. Lo que sea. El reproductor de cintas conduce la cinta a una velocidad constante, por lo que puede ingresar una señal sincronizada sin una computadora.
fuente
Si. El problema principal puede estar interactuando con la interfaz de programación. Si tiene una dirección simple y un bus de datos, las cosas son un poco más fáciles. ¿Alguna vez has visto algunas de las primeras computadoras? Los programas se ingresan una instrucción a la vez en la RAM con interruptores en el frente.
fuente
Las minicomputadoras PDP-8 de Digital Equipment de hace más de 40 años no tenían capacidad de arranque automático. Los programas generalmente se cargaban desde cintas de papel perforadas, pero el cargador para cargar las cintas de papel tenía que ingresarse manualmente en los interruptores del panel frontal.
En los sitios de los clientes de Digital y PDP-8, como los fabricantes de equipos originales que los utilizaron como controladores integrados de la época, no era raro que los usuarios memorizaran los cargadores de arranque y compitieran entre ellos por el tiempo más rápido necesario para ingresar al arranque cargador en la máquina. Las máquinas usaban memorias de núcleo magnético (colgadas a mano en partes remotas del mundo, por damas con dedos pequeños, usando agujas y alambre fino).
Dado que el contenido de la memoria magnética no es volátil, los cargadores de arranque sobrevivieron a un apagado y la entrada manual solo fue necesaria después del ensamblaje inicial, el cargador fue borrado por un error del programa o un programa necesario para usar el espacio del cargador.
fuente
La respuesta es sí , podría programar un microcontrolador sin una computadora, depurador, etc. Lo que necesitaría sería proporcionar los diversos voltajes, datos, reloj y secuencias de programación especificadas por el fabricante del uC (no es un trabajo fácil).
fuente