Como um microcontrolador “lembra” de um programa?
Isso é algo que realmente me incomoda desde que me formei. Nós programamos os microcontroladores PIC16f877a em sala de aula, mas nunca entramos em detalhes sobre como funcionam, apenas como fazê-los funcionar. Digamos que eu escreva um programa que faz os LEDs piscarem em uma ordem específica e envie esse programa para o microcontrolador por meio desse adaptador especial para os pinos certos. O que você sabe, os LEDs começam a piscar conforme as instruções. Agora, eu desligo a energia e removo o PIC da placa de ensaio. Coloquei o PIC de volta no lugar correto, liguei a alimentação e os LEDs ainda piscam conforme programado anteriormente, sem precisar reprogramá-lo. Como isso está acontecendo? Como este microcontrolador essencialmente "lembra" o que eu disse para ele fazer?
Respostas
O PIC inclui um tipo de memória não volátil chamada " Flash EEPROM ". Quando você "envia seu programa para o microcontrolador", o adaptador especial está na verdade programando seu código nesta memória. A memória física é um tipo especial de transistor com uma porta flutuante que pode armazenar uma carga mais ou menos indefinidamente, mesmo sem energia aplicada. Na maioria dos dispositivos, "carregado" = 0, "sem carga" = 1.
Sempre que o PIC é reiniciado ou ligado, ele começa a executar seu código, obtendo-o diretamente desta memória.
No PIC, esta memória está integrada no mesmo chip que contém a CPU e o resto da lógica (periféricos, etc.). O mesmo tipo de memória é usado para armazenar o BIOS em seu PC desktop / laptop, mas é um chip separado da CPU. As primeiras telas que você vê ao ligar o PC vêm do BIOS, que carrega o sistema operacional do disco rígido ou SSD e o executa.
Existem algumas partes para fazer a mágica de programar um microcontrolador funcionar.
Sua cadeia de ferramentas de desenvolvimento (compilador, assembler, linker etc) traduz seu programa do código-fonte para uma série de instruções de máquina que serão armazenadas no microcontrolador.
O microcontrolador normalmente armazena o programa na memória flash (também existem microcontroladores apagáveis por UV e programáveis de uma só vez). Este é um tipo especial de memória projetada para reter dados mesmo quando a alimentação é desligada. Estes contam com uma estrutura conhecida como "mosfet de portão flutuante". Essencialmente, cada mosfet na matriz de memória tem um minúsculo capacitor em série com sua porta e a carga neste capacitor muda o comportamento do transistor.
O portão flutuante é cercado por material isolante e, portanto, em condições normais, a carga não pode entrar ou sair do portão flutuante. Isso permite que a porta flutuante retenha carga e, portanto, informações, mesmo quando o circuito é desligado.
No entanto, quando são aplicadas tensões suficientemente altas, os elétrons podem cruzar a camada isolante. Isso permite que a carga seja adicionada ou removida do portão flutuante. Geralmente, o mecanismo para carregar as portas (conhecido como "programação") pode ser feito em uma base de bit individual, mas o método para remover a carga (conhecido como "apagar) só pode ser feito para um bloco inteiro de memória de cada vez.
Quando você conecta seu adaptador de programação e informa ao software para programar o microcontrolador, ele coloca o microcontrolador em um "modo de programa" especial. Os detalhes disso variam entre os diferentes microcontroladores, mas em seu PIC16f877a isso normalmente é feito aplicando-se 13 V à linha Vpp / MCLR. Em chips flash mais antigos, o Vpp forneceria realmente a energia necessária para a programação, mas em seu PIC é apenas uma linha de sinal com todas as tensões necessárias para programar o array flash gerado internamente. Uma vez no modo de programa, o processador para de executar as instruções normais e, em vez disso, responde a comandos especiais enviados pela interface de programação. Em PICs, esta é uma interface serial síncrona com uma linha de relógio unidirecional PGC e uma linha de dados bidirecional PGD.
Uma vez no modo de programação, o software de programação enviará uma série de comandos seriais por meio do adaptador de programação para gravar seu programa em flash. Duas abordagens diferentes são possíveis, em uma abordagem os comandos "apagar e programar" são usados para apagar e reprogramar um bloco de cada vez. Na outra abordagem, todo o chip é apagado com um comando "bulk erase", então os comandos "program only" podem ser usados para programar os novos dados. Em ambos os casos, antes de emitir um comando "apagar e programar" ou "apenas programar", os dados devem primeiro ser carregados nos registradores de teste. Você pode encontrar os detalhes sangrentos emhttp://ww1.microchip.com/downloads/en/devicedoc/39589b.pdf
Comecemos pelo princípio ... você entende como funciona uma memória fusível programável de uso único? Como se eu tivesse um bilhão de pequenos fios e cada um eu escolhesse conectar a + V para uma lógica HI (ONE) e GND para uma lógica LO (ZERO), você entende como isso armazena um programa em si de uns e zeros ? Você poderia pegar um voltímetro e, para cada fio, medir se ele está conectado a + V ou GND para descobrir se o bit naquele local é HI ou LO. Um microcontrolador faz a mesma coisa.
Todo o resto é uma versão sofisticada e mais flexível desse conceito: como funciona a ROM?
Isso tende a levar à questão: "Como um microcontrolador pega o programa de uns e zeros e faz coisas com ele O que acontece no nível do hardware quando alimentamos um código?
O código do programa é armazenado na memória ROM dos microcontroladores (neste caso, flash). Os dados armazenados nessa memória são retidos após o desligamento. Seu microcontrolador tem 14 KB de memória flash, o código reside após a programação.
Essa memória é baseada em estruturas MOSFET, que retêm os dados depois que a energia é desconectada. Para obter mais informações sobre como a memória flash funciona, sugiro que você leia o artigo wiki .
Dependendo da safra do microcontrolador, ele é equipado com EPROM apagável por UV em uma embalagem de cerâmica com janela de vidro, EPROM 'programável uma vez' em embalagem de plástico (para produção) ou memória Flash (típica da maioria dos dispositivos atuais). Alguns podem até ser comprados com ROM programada por máscara para fabricação de alta quantidade.
Alguns programadores oferecem suporte a vários microcontroladores ou o fabricante do dispositivo pode ter algum EVB dedicado ou qualquer outro. A programação serial via SPI, USB, porta serial (old school) ou porta paralela também é suportada para alguns chips.
Eu gosto bastante da 'programação em circuito'.