terça-feira, janeiro 12, 2021

Microcontrolador 8051: Introdução

Embora profissionalmente já tenha feito programas para microcontroladores baseados na arquitetura 8051, não tinha ainda brincado com eles. Um post de uma conhecida despertou a minha curiosidade. Vendo que alguns modelos estão disponíveis por preço acessível, que existem ferramentas livres para programação em assembly e C e que a gravação de programas neste modelos parece simples, não deu para segurar o clique do mouse...

Meus novos brinquedos


Se não me engano, já tinha ouvido falar no 8051 desde de recém formado. Acho que ele foi usado no teclado do Nexus, mas posso estar confundindo com o 8048/8035. Com certeza um microcontrolador baseado no 8051 era utilizado nos coletores de dados da empresa italiana Idware (depois comprada pela Datalogic), que eu programei no final dos anos 90 e começo dos anos 2000.

O coletor Formula 734

Estes terminais Idware eram bastante simples e as bibliotecas do fabricante rudimentares. Uma esquisitice era que quando a tela era apagada (para economia de energia) o seu conteúdo era perdido e tinha que ser refeito pela aplicação quando ela voltasse a ser ligada. A ferramenta oficial de programação era o compilador C da Keil.

Acordos de NDA me impedem de dar detalhes sobre os projetos seguintes com 8051, já neste século. O que posso dizer é que era um microprocessador voltado para comunicação por rádio frequência que usava a arquitetura 8051. A maior parte da programação foi em C (novamente com o Keil), mas desta vez cheguei a escrever algumas linhas em assembly como parte do bootloader.

Mas vamos voltar ao início. O 8051 foi lançado pela Intel (com o nome MCS-51) em 1980. É um microcontrolador de 8 bits, com vias internas separadas para as memórias de programa e dados (como é costume nos microcontroladores de 8 bits). Ao contrário dos PICs e AVRs as instruções seguem a filosofia CISC, com instruções que realizam tarefas complexas específicas.

No próximo post vamos ver a arquitetura com mais detalhes, mas um ponto que vale adiantar é o endereçamento da memória de dados, que pode ser feita de três formas:

  • Diretamente, através de um endereço de 8 bits. O primeiro modelo lançado tinha 128 bytes de Ram com endereços de 0x00 a 0x7F (as primeiras posições são usadas por algumas instruções como registradores). Os endereços 0x80 a 0xFF foram dedicados aos registradores de controle (SFR - Special Function Registers), portanto eventual Ram nestes endereços não podem ser endereçada diretamente.
  • Indiretamente, através de um endereço de 8 bits contido em um registrador (R0 ou R1). Esta forma permite acessar qualquer um dos primeiros 256 bytes da Ram.
  • Através da instrução MOVX, para acesso da chamada "memória externa" (que, dependendo do modelo, pode estar dentro do microcontrolador). A memória externa usa uma faixa separada de endereços também iniciando do zero.
O compilador C da Keil (e sua biblioteca) tem recursos para o programador usar ponteiros para uma área específica (otimizando tamanho e velocidade de código) ou ponteiros "genéricos" (onde um byte adicional informa qual região é apontada, permitindo usar as instruções corretas em tempo de execução).

Nenhum comentário: