Digamos que você tivesse um microcontrolador simples e pequeno e não tivesse interface, computador, depurador, compilador ou montador. Você poderia escrever seu código em montagem, convertê-lo (manualmente) em código de máquina e aplicar energia aos pinos apropriados usando uma fonte de tensão?
Entendo que você precisaria de E / S e memória apropriadas para realmente fazer alguma coisa, mas se você estivesse tão inclinado e tivesse tempo, poderia fazer isso? Eu acho que, historicamente, como isso foi feito quando não havia computador / compilador / montador para começar? Sinta-se à vontade para vincular-me a um recurso externo. Obrigado! :)
Respostas:
Sim!
O código pode ser escrito "fora de sua cabeça" em binário, se você desejar.
Há muito (muito tempo) atrás, foi assim que comecei a usar (então) microprocessadores.
Eu e meus amigos escrevíamos código em linguagem assembly, compilá-lo manualmente em código de máquina (algo que você pode fazer "por inspeção" após alguma prática) e depois inseri-lo no processador por vários meios. Em um sistema que construímos, configuraríamos o endereço nos comutadores binários (desligados) ou usaríamos um recurso de incremento automático do processador, inserir 8 bits de dados nos comutadores binários e pressionar um comutador "clock" para inserir os dados na memória.
A funcionalidade equivalente poderia ser alcançada com menos interruptores em um microcontrolador moderno usando a programação serial SPI - veja abaixo.
Sim!
Mas seria incrivelmente lento fazer isso!
Muitos microcontroladores modernos permitem o uso de uma interface "SPI" para programação.
Isso normalmente consiste em linhas de dados de entrada e saída e uma linha de "relógio" e, geralmente, uma linha de redefinição.
Muitos processadores permitem que o relógio e os dados SPI sejam "estáticos", o que significa que não há limite de quanto tempo você pode levar para configurar os dados entre os bits. Você pode programar esse processador usando uma linha de dados e uma linha de relógio que são acionadas por switches operados manualmente. A linha do relógio precisa ser "livre de rejeição" - você precisa configurá-la alta ou baixa em uma única transição por operação - portanto, uma interface mínima pode precisar incluir uma porta acionada por Schmitt. Você pode "se safar" apenas de um atraso de RC e de um botão, mas uma entrada acionada por Schmitt é mais segura. A linha de dados não precisa ser livre de saltos, pois seu estado é lido apenas na borda do relógio.
Algumas interfaces são interativas - os dados são emitidos pelo processador durante a programação (por exemplo, saída de dados = MISO = saída serial principal nos processadores AVR). Para ler isso, você precisará adicionar, por exemplo, um LED e um resistor (e talvez um buffer ou transistor, se a capacidade do inversor for REALMENTE baixa).
MC6800:
De memória semi-desbotada (quase 40 anos!)
LDI A, $ 7F ...... 86 7F ...... 1000 0110 0111 1111
STA, $ 1234 ...... B7 12 34 ... 1011 0111 0001 0010 0011 0100
LDI X, US $ 2734 .. CE 27 34 ... 1100 1110 0010 0111 0011 0100
...
fonte
Originalmente, em máquinas programáveis, os programas eram perfurados manualmente em fita de papel ou cartões. Mais tarde, eles usaram uma espécie de máquina de escrever para fazer a perfuração, e ainda mais tarde os computadores (como já eram conhecidos na época) podiam perfurar sua própria fita de papel.
Estava, literalmente, sentado ali com um cartão e manualmente fazendo buracos nele.
Cada coluna é uma instrução ou bit de dados que é interpretado pela máquina de estado da CPU para executar tarefas.
Agora, se é claro, é tudo memória flash e, sim, obter os dados lá em primeiro lugar normalmente precisa de um computador para isso. Mas isso não é estritamente 100% verdade.
Afinal, o que um programador de computador e hardware faz além de definir o estado dos pinos de E / S nos momentos certos? Portanto, se você é realmente bastante masoquista, pode criar um sistema que permita enviar as instruções corretas aos pinos de programação do microcontrolador da maneira correta para instalar algumas instruções na memória flash para execução.
Talvez algo que envolva muitos interruptores, alguns registros de turnos, um gerador de relógio etc.
Lembro que na faculdade tínhamos um novo sistema de programação baseado em Z80 - uma unidade do tamanho de uma mala com um Z80, uma pequena quantidade de RAM, um monte de displays LED de 7 segmentos e uma grande fila de switches. Programe-o carregando manualmente as instruções na RAM usando os comutadores.
fonte
Você disse "microcontrolador pequeno e não tinha interface, computador, depurador, compilador ou montador". Bem, você pode sobreviver sem o computador, depurador, compilador ou montador, mas você precisa ter algum tipo de interface para conectar-se ao microcontrolador para carregar o programa.
Antes de tudo, esqueça as linguagens de alto nível como C. Em seguida, a maneira mais fácil é escrever seu programa em linguagem assembly, mas não use o assembler para traduzi-lo para o código da máquina. Em vez disso, procure cada uma das instruções de montagem no manual de programação, encontre a codificação hexadecimal equivalente e anote-a.
Você terá que alocar suas próprias variáveis, para poder preencher os endereços apropriados na parte do operando das instruções. Também esqueça de usar a pilha e pilha, muito trabalho. Quando terminar, você terá um programa de máquina que pode ser carregado diretamente na memória flash do microcontrolador - também não é necessário vinculador.
Devido à falta de barramentos de endereço e dados externos em quase todos os microcontroladores (já que ocupariam muitos pinos necessários para portas e periféricos de E / S), praticamente todos os microcontroladores são programados por meio de uma interface especial como esta:
Normalmente, o "programador" à esquerda seria conectado a um PC, que faria o download de um arquivo de máquina gerado por um compilador / vinculador.
No entanto, se o programador tiver um teclado, como o abaixo:
então, é possível inserir os códigos hexadecimais de um programa gerado manualmente diretamente no programador e programar o dispositivo sem a necessidade de um compilador, vinculador ou PC que era o que você estava perguntando. (O teclado também é usado para editar arquivos hexadecimais e gerar somas de verificação.)
Concedidos muito poucos programadores têm teclados como este. Este não seria adequado para um hobby, pois provavelmente custa alguns milhares de dólares.
Esse programador em particular programa as peças antes de serem colocadas em uma placa; interfaces e soquetes estão disponíveis para vários PICs e também para Atmel AVRs, entre outros.
fonte
Por uma questão prática, algo como alternar manualmente os pinos JTAG seria muito propenso a erros. Inserir um programa de qualquer tamanho decente levaria milhares de alternâncias. Mas, teoricamente, é possível.
Se você puder preparar o microcontrolador com antecedência (ou escrever uma ROM de inicialização para ele), poderá implementar facilmente algo como as chaves de alternância externas usadas nos mainframes anteriores. Se você permitir lógica externa, poderá usar um teclado hexadecimal para acelerar as coisas.
Finalmente, embora não seja tão comum hoje em dia, você pode comprar um microcontrolador baseado em ROM com código personalizado. Você teria que oferecer algum dinheiro antecipadamente e garantir um certo volume, mas vi clientes fazer isso para economizar dinheiro em produção de alto volume. Nesse caso, não haveria sinais externos necessários para programar o microcontrolador. O código seria incorporado ao layout físico do chip.
Obviamente, você também pode usar um microcontrolador que executa código a partir de uma interface de memória externa, mas isso é trapaça. :-)
fonte
Absolutamente. De fato, o primeiro curso de microprocessador que fiz (por volta de 87) utilizou uma placa Motorola 68000. Nós elaboramos o código em assembly, procuramos o hexadecimal para o assembly e digitamos o hexadecimal em um terminal para programar a placa. Se você editou, tinha que garantir que o código inserido fosse mais curto que o código que estava substituindo e, em seguida, armazene o restante nos NOPs. Se o código fosse maior, você teria que redigitar tudo! Aprendemos a adicionar muitos NOPs.
fonte
Absolutamente. Depois de ter um formato binário das instruções reais (fácil de fazer para conjuntos de instruções bem especificados), tudo o que você precisa é implementar o protocolo de programação.
Por exemplo, considere algo pequeno como um AVR Tiny 4 . A Seção 14 detalha a interface de programação, incluindo o protocolo e a camada física. É relativamente simples e você só precisa de alguns botões e resistores pull / down para enviar / receber 1 ou 0. Se você estiver se sentindo ambicioso, adicione alguns LEDs para ler a saída.
O último problema restante é se você pode fazê-lo com rapidez suficiente, que felizmente * para o AVR Tiny 4 (seção 16), ele não tem frequência mínima quando se trata de programá-lo.
* nota: na medida em que a folha de dados especificar. Isso pode diferir na realidade ... Duvido que alguém tenha tentado programá-lo em velocidades de clock de mHz.
Sinta-se livre para automatizá-lo tanto / pouco do processo quanto desejado. Isto é o que a maioria dos dispositivos de programação faz de qualquer maneira: automatize o processo.
fonte
Por qualquer meio que você insira o programa no uC, você está "interagindo" com ele, porque é isso que significa interface. Mesmo um monte de opções que você aciona manualmente são uma "interface".
Então, tratarei essa pergunta como "como faço para fazer interface com um uC com hardware de interface amplamente mecânico (e não eletrônico) e da maneira mais legal possível"?
Para a minha resposta, insira o programa como um rolo de piano. A "barra rastreadora" do rolo de piano de um piano de jogador basicamente fornece pelo menos 65 bits (dependendo do formato) que você pode ativar e desativar de forma independente, com base nas perfurações do papel. O resto é um trabalho exigente com uma faca exacto. Mas pelo menos o seu programa, uma vez executado, é (um pouco) permanentemente armazenado (diferente da abordagem de acionar manualmente os interruptores).
fonte
Não é apenas possível programar um microcontrolador sem um computador, mas você pode realmente comprar um computador hoje projetado especificamente para ser programado com chaves de alternância de hardware. O kit é chamado de Cartão de Membro e é uma recriação do computador COSMAC Elf a partir da década de 1970. O kit foi descrito em um artigo recente na revista IEEE Spectrum . Também é possível programar versões mais recentes do Cartão de Membro a partir de um PC.
fonte
OK. Que tal isso: você escreve o programa no assembler e consulta os opcodes, como sugerido anteriormente. Como colocá-lo no computador: pegue um toca-fitas antigo, remova a cabeça de reprodução, mas deixe o cabrestante e o rolo de aperto. Este será o seu transporte. Se você possui um reprodutor de bobina para bobina, pode deixar a cabeça de reprodução no lugar.
Depois, pegue uma tira longa e estreita de papel ou, melhor ainda, fita transparente. É aqui que você codifica seu programa. Você usa quantas faixas tiver pinos para programar. Em uma faixa, você coloca pontos pretos em intervalos regulares; este é o seu relógio. Nas outras faixas, você coloca pontos ou tiras pretas e deixa espaços em branco de acordo com os dados e sinais. Você ilumina a coisa toda e a detecta com pequenos fototransistores (ou acende um LED na fita e detecta a luz com outros similares) e aciona o relógio e as linhas de sinal com transistores. Isso ocupa um pouco de espaço no toca-fitas, e é por isso que você pode precisar remover a cabeça de reprodução.
Claro que você também pode codificar os sinais como áudio, mas é um pouco mais complicado de decodificar. Ou você pode detectar a luz refletida em vez da transmitida. Ou você pode fazer furos em fita escura ou fita de papel, em vez de fazer marcas pretas em fita transparente. Tanto faz. O toca-fitas conduz a fita a uma velocidade constante, para que você possa inserir um sinal de relógio sem um computador.
fonte
Sim. O principal problema pode estar interagindo com a interface de programação. Se você possui um endereço simples e um barramento de dados, as coisas ficam um pouco mais fáceis. Você já viu alguns dos computadores realmente antigos? Os programas são inseridos uma instrução de cada vez na RAM com interruptores na frente.
fonte
Os mincomputadores PDP-8 da Digital Equipment de mais de 40 anos atrás não tinham capacidade de inicialização automática. Os programas eram geralmente carregados a partir de fitas de papel perfuradas, mas o carregador para carregar as fitas de papel precisava ser inserido manualmente nos interruptores do painel frontal.
Nos sites dos clientes da Digital e PDP-8, como OEMs, que os usavam como controladores incorporados da época, não era incomum os usuários memorizarem os carregadores de inicialização e competirem entre si pelo tempo mais rápido necessário para entrar na inicialização. carregador na máquina. As máquinas usavam memórias de núcleo magnético (enfiadas à mão em partes longínquas do mundo, por mulheres com dedos minúsculos, usando agulhas e fios finos).
Como o conteúdo da memória magnética não é volátil, os carregadores de inicialização sobreviveram a um desligamento e a entrada manual foi necessária apenas após a montagem inicial, o carregador foi eliminado por um bug do programa ou por um programa necessário para usar o espaço do carregador.
fonte
A resposta é sim , você pode programar um microcontrolador sem um computador, depurador, etc. O que você precisaria seria fornecer as várias tensões, dados, relógio e seqüências de programação especificadas pelo fabricante da uC (tarefa não fácil).
fonte