terça-feira, janeiro 26, 2021

Microcontrolador 8051: Piscando um LED

Como é obrigatório, a primeira montagem tem que ser um LED piscando. Vamos ver o que precisamos para cumprir este requisito.



Hardware

O chip que vou usar é o AT89S51 da Atmel, que é bem próximo do 8051 original. A principal diferença, no contexto deste experimento, é que a memória de programa é do tipo Flash (o 8051 original usava ROM e o 8751 EPROM).

Para uma montagem mínima com um LED, vamos precisar conectar:

  • A alimentação de 5V.
  • Um resistor ligando o pino de Reset à terra e um capacitor ligando o pino de Reset à alimentação. O sinal de Reset do 8051 é ativo em nível alto, na operação normal precisa estar em nível baixo.
  • Um cristal para fornecer o clock. Vou usar um cristal de 12MHz, que era o valor tradicional com o 8051. Cabe notar que a maioria das instruções requer 12 pulsos do clock para executar, um clock de 12MHz equivale a, no máximo, 1 milhão de instruções por segundo. Já num AVR ou PIC, uma instrução requer, na maioria dos casos, apenas um pulso de clock. Um AVT ou PIC a 12MHz executa 12 milhões de instruções por segundo. Em cada pino do cristal precisa ser ligado um capacitor para terra.
  • Um resistor e LED em série, ligados a algum pino de E/S.
A montagem fica assim:



Software

Vamos fazer como nos "bons tempos"? Papel quadriculado, lápis e tabela de instruções em mãos, vamos escrever o código em Assembly e converter para código de máquina na mão:


O programa é o mais simples possível (dentro dos meus poucos conhecimentos de Assembly do 8051). Alternamos o bit do SFR P1 que corresponde ao LED (de 0 para 1 ou de para 0), aguardamos um tempo (através de loop de instruções) e voltamos ao começo.

Cabe destacar que as portas do 8051 não possuem controle de direção. Internamente existe um registrador para cada porta que armazena o último valor escrito. Após o reset todos os pinos são entrada e este registrador está com todos os bits em 1. Para mudar um pino para saída, basta escrever um zero no bit correspondente. Quando uma única instrução lê a porta, faz um cálculo e escreve novamente na porta, o valor lido é o último que for escrito. Já as instruções que leem a porta e colocam o resultado em um registrador irão ler o sinal no pino (se for entrada) ou o último valor escrito (se for saída). É um pouco confuso, principalmente se você quiser mudar dinamicamente o sentido da porta, mas para piscar um LED podemos considerar que colocando o bit em 1 o LED acende e colocando o bit em 0 o LED apaga.

Por quanto tempo o LED fica aceso e apagado? Aqui precisamos contar os pulsos de clock gastos no loop de temporização:

LOP2: 256*24
LOP1: 194*(12+LOP2+24)
LOP0: 3*(12+LOP1+24)
TOTAL = 24 + 12 + LOP0 + 24
TEMPO = TOTAL/12000 ms

O que dá praticamente 300 milissegundos.

Gravando o Software no 8051

Neste primeiro teste vamos apelar: o meu gravador de EProm sabe gravar o AT80S51. Bastou digitar o código de máquina na mão e mandar gravar.

Amanhã (27/1/2021) vai ter um vídeo no meu canal do YouTube (https://www.youtube.com/c/DanielQuadros) mostrando tudo isso.


É claro que traduzir na mão de Assembly para código de máquina é cansativo. No próximo post vamos ver algumas ferramentas para fazer isso.

2 comentários:

Luís Bulek disse...

Estou brincando com um velho AT90S8515 e o programador USBASP cm AVRDUDE.
Com o USBASP não é necessário o resistor de pulldown no RST, basta ligar o pin RST do USBASP e ligar ao do MCU.
O problema é que o AVRDUDE, não sabe lidar com os FUSES para o 8515, então tem que desabilitar com -u para não mostrar erro a cada leitura/gravação.

Daniel Quadros disse...

Luís, legal! Mais para frente vou examinar as várias opções de gravação de programa nos AT89.