¿Podría programar un microcontrolador sin una computadora?

16

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! :)

idle_engineer
fuente
3
Eche un vistazo al Altair 1. Los interruptores del panel frontal y la programación manual de la máquina fueron la única forma de usarlo.
pjc50
@ pj50 Preguntó por un microcontrolador, no por un microprocesador. Los microcontroladores ejecutan su código nuestro flash que no es accesible sin una interfaz de algún tipo.
tcrosley
¿Cuántas unidades programadas necesitas? Muchos fabricantes suministrarán sus micros preprogramados con su código; sin embargo, esto no es práctico si necesita menos de un carrete completo.
Oleg Mazurov
2
En los años 70, habría construido un panel de interruptores y luces para poder ingresar al programa. Nunca trabajé con uno de los primeros microcontroladores, pero trabajé con varios microprocesadores diferentes, y así es como lo hiciste, por defecto. Y no hubo una diferencia fundamental entre los primeros microcontroladores y microprocesadores que no sean las capacidades de E / S y algunos de los detalles de cómo se configuró la memoria del programa.
Hot Licks el
Dejaré esto como un comentario porque no puedo encontrar la fuente de esta historia. Recuerdo hace un tiempo la historia de un niño que diseñó y construyó su propia computadora (solo la CPU realmente) a partir de transistores para una feria de ciencias basada exclusivamente en su comprensión de la lógica digital. No podía permitirse una computadora en ese momento y programó su creación a través de interruptores de palanca (creo que recuerdo que el reloj era solo un botón). Uno de los jueces quedó tan impresionado que le compró una computadora al niño.
slebetman

Respuestas:

37

¿Podría escribir su código en ensamblado, convertirlo (manualmente) a código de máquina,

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

... y luego aplica energía a los pines apropiados usando una fuente de voltaje?

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

Russell McMahon
fuente
1
+1 por mencionar el diseño estático, permitiendo que el reloj llegue hasta DC.
pericynthion
2
Esto trae recuerdos. De hecho, aprendí a ingresar el código Z80 usando botones en la escuela. Eso fue alrededor de 1990. Mi maestro insistió en que aprender a programar de la manera difícil es valioso. 25 años después tengo que estar de acuerdo.
Nils Pipenbrinck
@NilsPipenbrinck Estoy en este momento escribiendo código C y aplicando las lecciones que aprendí con Fortran :-) !!! - y que luego se perfeccionaron con sistemas integrados y lenguaje ensamblador. Estas lecciones reducen la posibilidad de errores al aplicar la tipificación mental a accesos variables y de puerto que de otra manera podrían hacer cosas que están permitidas pero no deseadas o útiles. Assembler es el arma afilada definitiva: una espada de doble punta sin protectores de manos. Después de eso, los idiomas de "nivel superior" parecen menos agudos :-). La entrada del botón Z80 actúa de manera similar en sus experiencias de aprendizaje ;-).
Russell McMahon
@Erbureth Gracias :-). Sí, ffff para 1111 fue evidente desvanecimiento cerebral. ... fue solo "se entiende la idea", pero completar la línea no hace daño.
Russell McMahon
Sí, se me ocurrió la idea, pero cuando estaba en eso ... :)
Erbureth dice Reinstate Monica
10

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.

ingrese la descripción de la imagen aquí

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.

Majenko
fuente
El Z80 no es un ejemplo válido. Preguntó por un microcontrolador, no por un microprocesador. Los microcontroladores ejecutan su código nuestro flash que no es accesible sin una interfaz de algún tipo. Al menos mencionó flash y una interfaz de programación en otra parte de su respuesta.
tcrosley
@tcrosley El Z80 era más para fines anecdóticos: ilustraba cómo las computadoras solían programarse antes de que Visual Studio eliminara todas las habilidades.
Majenko
Si bien no conozco ninguna máquina que haya sido construida para hacerlo, no sería difícil agregar algunos circuitos a un lector de tarjetas para programar un microcontrolador con código almacenado en una secuencia de tarjetas. Sin embargo, la cinta de papel podría ser más práctica.
supercat
2
Solía ​​cortar agujeros manualmente en esos. Solo es factible en circunstancias extremas (10 p.m., documentos a plazo que vencen mañana, una carrera de mainframe a la izquierda, la señora de la sala de ponche se fue por el día). Programar el mismo mainframe desde el panel frontal (un par de años después) fue realmente más rápido.
Oleg Mazurov
1
@Majenko: he visto la reconstrucción de la máquina de Babbage, y definitivamente no fue hecha con equipos telefónicos. Definitivamente ruidoso, sin embargo.
Hot Licks
7

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:

ingrese la descripción de la imagen aquí

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:

ingrese la descripción de la imagen aquí

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.

tcrosley
fuente
55
Has comentado sobre varias otras respuestas sobre su invalidez, pero esta respuesta es posiblemente menos válida que la mayoría de las que has comentado. Él dijo "... sin interfaz, sin computadora, ...". Como mínimo, su solución es "una computadora". Lo que significa "sin interfaz" es discutible. Pero, use algunos interruptores eliminados en la interfaz SPI y posiblemente tenga una solución.
Russell McMahon el
1
@RussellMcMahon ¿Quién dice que hay una computadora en el programador? Muchos de ellos solo usan FPGA (que podrían reemplazarse por lógica discreta). ¿Cómo va a programar un microcontrolador a través de una interfaz SPI, a menos que tenga un gestor de arranque? Si es así, ¿cómo se programa el gestor de arranque?
tcrosley
3
La interfaz de programación en serie estándar de bajo voltaje esencialmente libre de cargador de arranque en muchos (posiblemente la mayoría) de los microcontroladores utiliza algunas líneas en una interfaz esencialmente en serie. MOSI MCLK (Vdd Gnd Reset) es MISO mínimo absoluto si hay interacción. 3 interruptores (solo uno de los cuales) deben estar libres de rebote) y un LED para MISO y "estás apagado". Muy muy muy lentamente. Si se permite que un FPGA no cuente como una "computadora", entonces no sería un problema implementar muchos sistemas basados ​​en procesadores. Sospecho que "ninguna lógica combinatoria" satisfaría el espíritu de su solicitud.
Russell McMahon
Tengo que decir que los fuegos artificiales son el fondo incorrecto para usar cuando se trabaja con equipos electrónicos :)
Anonymous Penguin
6

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

Adam Haun
fuente
2
De hecho, construí un "clon" Imsai 8800 en 1976/77 y lo programaba rutinariamente en binario usando los interruptores de palanca. Tenía una secuencia de carga de arranque que tenía alrededor de 40 o 60 bytes (¡esto fue hace una vida!) Que leería una etiqueta de mi teletipo ASR-33 y me llevaría a un monitor de teclado. Antes de que el teletipo funcionara, programaría el 8085 (una de las diferencias entre mi "clon" y el Imsai) estrictamente en binario. Pero eso fue en paralelo, con una fila de interruptores. He usado una clave de telégrafo para hacer la codificación en serie y es REALMENTE propensa a errores, como ha dicho Adam.
user6297
3

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.

Scott Seidman
fuente
El 68000 no era un microcontrolador. Preguntó por un microcontrolador, no por un microprocesador. Los microcontroladores ejecutan su código nuestro flash que no es accesible sin una interfaz de algún tipo.
tcrosley
55
@tcrosley Eso no es estrictamente cierto. Hay microcontroladores que requieren ROM externa ya que no tienen ROM o Flash propios. Lo que los convierte en un microcontrolador no está integrado en RAM o ROM, sino en periféricos (puertos IO, UART, etc.).
Majenko
Sin embargo, muy pocos: debido a los periféricos de E / S que acaba de mencionar, muy pocos tienen direcciones externas y buses de datos porque requieren dos pines.
tcrosley
2

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.

helloworld922
fuente
2

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

Atsby
fuente
2

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.

Pinzón Craig
fuente
2

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.

Angus McG
fuente
1

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.

alex.forencich
fuente
Preguntó por un microcontrolador, no por un microprocesador. Los microcontroladores ejecutan su código nuestro flash que no es accesible sin una interfaz de algún tipo.
tcrosley
44
@tcrosley - Los primeros uC no tenían flash. Tenían RAM o ROM para la tienda de programas.
Hot Licks el
@HotLicks Correcto. Y con solo unas pocas excepciones, todos estos fueron microprocesadores, no microcontroladores. Ese era mi punto, no si la tienda de programas era flash, o ROM, o PROM, o EPROM, o EEPROM. El punto era si la tienda de programas estaba en chip (microcontrolador) o no (microprocesador). Incluso el 8048, el primer microcontrolador de Intel introducido en 1977, tenía ROM interna.
tcrosley
3
@Tcrosley ¿Quién eres? ¿Y qué has hecho con el tcrosley usualmente útil y objetivo? :-) | Su primera observación fue que podía interactuar con la interfaz de programación, que a menudo pero no siempre será válida. La dirección de "IF" y el bus de datos es un IF. Se aplica a algunos microcontroladores híbridos grandes y limítrofes, pero su IF original era lo suficientemente bueno (aunque duro y lento).
Russell McMahon
3
Tratar de mantener una distinción fuerte entre microprocesador y microcontrolador es más pedante que útil, especialmente cuando se trata de un comentario en cada respuesta.
pjc50
1

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.

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

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.

JRobert
fuente
Hace muchos años, cuando teníamos que caminar descalzos a la escuela en la nieve cuesta arriba en ambos sentidos, el PDP-8 en nuestra escuela secundaria tuvo que arrancarse al alternar el cargador de arranque desde el panel frontal como usted describe. Ninguno de los maestros sabía mucho acerca de la computadora, incluido el responsable. Pensó que arriba era 0 y 1 estaba abajo, por lo que nunca podría alternar en el gestor de arranque. Organizaría el bloqueo de la computadora cuando estaba en clase de inglés, así que me llamarían para reiniciar la computadora. Nunca le conté sobre su concepto erróneo de arriba contra abajo; fue demasiado útil para mí.
Olin Lathrop
Me encantó el PDP-8. Tuve acceso exclusivo a uno durante unos tres años, así que fue como tener una computadora personal mucho antes de que se inventara el término PC. Increíble lo que podría caber en 4K de memoria. Sin embargo, pasó por una gran cantidad de cinta de papel (no tenía DECtape) y papel de teletipo.
tcrosley
0

La respuesta es , 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).

Guill
fuente