Nesta aula, aprenderemos sobre a arquitetura de um microcontrolador e quais são as características de um microcontrolador AVR e um PIC.

Na aula anterior, aprendemos sobre a arquitetura dos microprocessadores e vimos seu funcionamento base.

Informações básicas

Na aula anterior, vimos muitos conceitos que serão utilizados aqui também. Isto porque, a base de funcionamento do microcontrolador é o microprocessador que fica dentro dele.

Enfim, um conceito importante de lembrar é o de registrador, que, no contexto de microcontroladores 8 bits, se refere a um espaço de memória que ocupa 1 byte (8 bits).

Além do registrador, a parte de endereçamento de memória também precisa ser lembrada. Nesta parte, existem duas nomenclaturas importantes, que são: Little Endian e Big Endian. Abaixo irei explicá-las.

Little Endian e Big Endian

Estas nomenclaturas designam formas de organizar os dados na memória. Antes de especificá-las, vamos contextualizar com um exemplo:

Imagine que o número 0x1A3D (hexadecimal) precise ser armazenado na memória. Este número é de 16 bits (2 bytes) e a memória é dividida em bytes únicos. Portanto, o número precisa ser guardado de forma segmentada. Isto é, cada byte do número deve ser armazenado em um espaço de memória separado.

E é mais lógico armazenar estes 2 bytes em espaços de memória sequenciais (1 logo após o outro) para facilitar a organização. Com isto, aparecem duas formas de armazenar estes bytes, que são o Little Endian e o Big Endian.

No caso do Little Endian, o BYTE menos significativo (0x3D) é o que aparece primeiro, seguido do BYTE mais significativo (0x1A).

Já no caso do Big Endian, é o contrário: o BYTE mais significativo aparece primeiro (0x1A), seguido do BYTE menos significativo (0x3D). Veja a imagem abaixo para entender melhor.

Little Endian e Big Endian

A princípio parece bobeira aprender estas organizações, mas mais a frente este conhecimento se tornará crítico. Em específico quando formos utilizar ponteiros (veremos o que é) na programação do microcontrolador.

Arquitetura de um microprocessador

Obs.: Vou utilizar a palavra programa para me referir a um código qualquer que o microcontrolador possa vir a executar.

Conforme vimos na aula 1, o microcontrolador é um dispositivo que contém um microprocessador, memórias e periféricos tudo em um mesmo circuito. Além disto, ele possui os circuitos adequados para interligar todas estas partes.

Isto quer dizer que o microcontrolador é capaz de funcionar e executar tarefas diretamente só necessitando de uma fonte de alimentação (além de um programa gravado em sua memória).

O único componente externo que AS VEZES é necessário para fazer o microcontrolador funcionar é um cristal. O cristal serve para gerar o clock do microcontrolador, que é o que permite a ele executar suas instruções internas. E o cristal é AS VEZES necessário, porque normalmente o microcontrolador possui um circuito interno para gerar um clock (menos preciso ou mais lento).

Só com a descrição do primeiro parágrafo já dá para ter uma boa ideia da estrutura do microcontrolador. Entretanto, adiante veremos ela em detalhes e, para isto, usaremos a imagem abaixo como referência.

Fonte: Scrigroup

A imagem acima é referente à arquitetura de um microcontrolador PIC16F887, mas ela ilustra bem uma arquitetura genérica de um microcontrolador.

Elementos do microcontrolador

Então, com base na imagem anterior, temos:

Alimentação

Parte inferior direita da imagem.

Os microcontroladores conseguem trabalhar em uma faixa de tensão de alguns volts. Entretanto, é comum alimentar os microcontroladores de 8 bits com 3,3V ou 5V.

Reset

Parte inferior direita da imagem.

O microcontrolador possui um pino que serve para reiniciá-lo a partir de um sinal de tensão que é aplicado no pino. Reiniciar nada mais é do que fazer o programa interno do microcontrolador voltar ao início.

Este pino pode receber o nome de RESET ou de Master Clear (MCLR).

CPU

Centro da imagem.

É o “cérebro” do microcontrolador. Esta parte abrange o conteúdo tratado na última aula.

Watchdog (WTD)

Centro da imagem próximo à CPU.

É um circuito interno de monitoramento (tanto é que chama “cão de guarda”). Este circuito consiste em um temporizador, que intencionalmente provoca um RESET no microcontrolador. Portanto, para que o microcontrolador funcione corretamente, o programa deve ficar reiniciando constantemente o Watchdog para evitar o reinicio.

A ideia deste circuito é que, se o programa, por algum motivo, ficar travado, o Watchdog agirá e tirará o microcontrolador da situação de erro.

O uso do Watchdog não é obrigatório e, em muitos casos, ele é desabilitado por padrão.

Memórias

Parte superior direita da imagem.

Existem 3 principais memórias:

  • Memória de dados:

RAM e registradores da CPU.

  • Memória de programa:

É comum de ser empregada a memória flash.

Costuma ser consideravelmente maior (em armazenamento) que a memória RAM.

  • EEPROM (pode ou não aparecer):

Memória para o programa armazenar qualquer tipo de dado que precise ser retido. Ex: dados de configurações do programa.

Oscilador

Parte superior esquerda da imagem.

O oscilador é o circuito que gera o clock do microcontrolador. Ele pode ser interno (normalmente um circuito RC) ou externo (normalmente um circuito com cristal).

Dependendo, o oscilador interno pode operar à mesma velocidade do externo, mas não possui a mesma precisão.

GPIO

Parte inferior da imagem.

É o periférico dos pinos de propósito geral (entradas e saídas digitais), sendo o mais comum dos microcontroladores.

Este periférico é o responsável pela CPU conseguir, por exemplo, acionar um LED ligado à um pino do microcontrolador. Seu circuito será estudado nas aulas futuras.

Os pinos são divididos em grupos (quantidade variável) e os grupos são indicados por letras: A, B, C, D… E a designação de um pino dentro de um grupo é feito por um número. Exemplo: PA0, PA1, PB2, PB5, PD7…

Timers

Parte superior da imagem.

Os microcontroladores possuem circuitos de timers. Estes timers podem ser utilizados pelo programa para criar contadores e temporizadores que rodam no hardware e deixam o programa livre para executar outras tarefas em paralelo.

Outros periféricos

A arquitetura de um microcontrolador pode possuir diversas outras estruturas internas, mas os elementos que foram citados são os mais comuns.

Alguns destes outros elementos, nós iremos estudar no curso, como é o caso do conversor AD e do periférico de PWM.

Exemplo de arquitetura de microcontrolador

Para deixar o último tópico menos abstrato, irei mostrar o circuito interno de um microcontrolador de forma mais concreta. O circuito que mostrarei é o das imagens abaixo. A imagem da esquerda está sem marcações para facilitar a visualização do circuito como um todo.

Esta estrutura é compartilhada por alguns ATmega e foi retirada do datasheet do ATmega328p (microcontrolador presente no Arduino UNO).

Microcontrolador arquitetura
Fonte: Datasheet do ATmega328p [pag 6]
Microcontrolador arquitetura indicada
Fonte: Foto adaptada do datasheet do ATmega328p [pag 6]

Praticamente todos os elementos acima já foram comentados no tópico anterior. O que vale ressaltar aqui é o circuito de programação indicado em amarelo na parte superior da imagem.

Este circuito é o responsável por interpretar os sinais externos e gravar o programa na memória flash interna do microcontrolador quando requisitado. Para gravar um programa na memória flash do microcontrolador é preciso seguir um passo a passo utilizando alguns dos pinos e isto será visto em detalhes nas aulas futuras.

Além da parte de gravar o programa, esta arquitetura possui um circuito chamado “debugWire” que serve para “debugar” o programa. Debugar envolve tanto rodar o programa passo a passo, quanto extrair dados de variáveis em tempo real (enquanto o microcontrolador executa o código).

Microcontrolador AVR

Família AVR

A arquitetura do AVR (8 bits) é implementada em diversos microcontroladores diferentes, os quais são iguais na arquitetura mas diferentes em termos de capacidade de memória, quantidade de pinos, periféricos e velocidade.

Abaixo irei listar séries de alguns microcontroladores AVR de forma sucinta. A ordem da lista está da categoria mais simples para a mais avançada (mais recursos e periféricos).

Veja uma lista mais detalhada aqui.

Série ATtiny

  • Microcontroladores desta série possuem de 4 a 28 pinos de GPIO.
  • Até 32kbytes de memória flash, 2kbytes de SRAM e 512bytes de EEPROM.
  • Um exemplo conhecido é o ATtiny85.

Série ATmega

  • Microcontroladores desta série possuem até 100 pinos de GPIO.
  • Até 256kbytes de memória flash, 16kbytes de SRAM e 4kbytes de EEPROM.

Série ATxmega

  • Possuem até 100 pinos de GPIO.
  • Até 384kbytes de memória flash, 32kbytes de SRAM e 2kbytes de EEPROM.

picoPower

  • Alguns microcontroladores são destinados à aplicações que envolvem o baixo consumo de energia e recebem o nome de picoPower.
  • O nome possui uma letra P no final, como é o caso do microcontrolador utilizado no Arduino UNO: ATmega328P.

Características

Arquitetura da CPU

  • Arquitetura HARVARD:
    • Isto é, possui um barramento de dados separado do barramento de instruções.
  • RISC:
    • Possui um conjunto reduzido de instruções em que a maioria gasta apenas 1 pulso de clock para executar.
  • Barramento de dados 8 bits:
    • Por ser um microcontrolador de 8 bits, o barramento de dados é 8 bits. Embora, alguns registradores específicos tenham 16 bits ou mais, conforme veremos adiante.

Alimentação

A maioria dos microcontroladores possuem uma ampla faixa de alimentação de 1,8 a 5,5V.

Memórias

  • Os dados são armazenados na memória conforme a organização Little Endian.
    • LSByte primeiro

Possuem:

  • Memória flash:
    • Para armazenar o programa.
    • Possui uma seção separada para o Boot, que é um pedaço que pode conter um código de inicialização para o microcontrolador.
    • Sua organização está apresentada na imagem esquerda abaixo.
  • EEPROM:
    • Alguns poucos podem não possuir.
  • Memória de dados:
    • Dividida em SRAM e registradores internos da CPU.
    • Além dos registradores de dados temporários da CPU, a memória de dados possui registradores para controle dos periféricos, que são os I/O registers.
    • Os registradores de I/O podem ser estendidos em alguns casos formando os Extended I/O Registers que ocupam o espaço de memória de 0x0060 à 0x00FF.
    • Sua organização está apresentada na imagem direita abaixo.
Mapa da memória flash do AVR
Fonte: Datasheet do ATmega328p [pag 17]
Mapa da memória de dados do AVR
Fonte: Datasheet do ATmega328p [pag 18]
  • Fuse bits
    • Existem alguns espaços de memória para configurar os chamados “fuse bits”.
    • Estes “fuse bits” são configurações que ficam retidas após o desligamento do microcontrolador e envolvem, por exemplo:
      • Configuração de cristal (interno/ externo).
      • Habilitar/Desabilitar pino de RESET.
      • Habilitar/Desabilitar Watchdog.
      • etc.

Registradores

Conforme foi visto acima, o AVR possui 32 registradores de propósito geral. Estes servem para armazenar dados temporários da CPU, como resultados de operações aritméticas.

6 dos 32 registradores são organizados em pares para formar 3 registradores de 16 bits, chamados de X, Y e Z. Estes registradores são utilizados para endereçamento de memória (apontamento).

Além disto, existem os registradores dedicados, como é o caso do Program Counter. Ele pode possuir de 16 a 22 bits, sendo capaz de “acessar” de ~65kbytes a ~4Mbytes de espaços de memória.

Instruções

Apesar da arquitetura de 8 bits, as instruções do AVR são de 16 bits. A maioria delas gasta 1 ciclo de clock. Entretanto, uma parcela pequena pode gastar 2 ciclos e pouquíssimas instruções gastam 3 ou 4 ciclos de clock.

Acesse este link para conferir as instruções.

Microcontrolador PIC 8 bits

Família PIC

A arquitetura do PIC (8 bits) é implementada em diversos microcontroladores diferentes, os quais são iguais na arquitetura mas diferentes em termos de capacidade de memória, quantidade de pinos, periféricos e velocidade.

Abaixo irei listar categorias de alguns microcontroladores PIC. A ordem da lista está da categoria mais simples para a mais avançada (mais recursos e periféricos).

Veja uma lista mais detalhada aqui.

PIC10

  • Possuem 6 pinos de GPIO.
  • Até 896bytes de memória flash, 64bytes de RAM e 128bytes de EEPROM.
  • São mais baratos.
  • Entram na categoria “Baseline” ou “Mid-Range”.

PIC12

PIC16

PIC 18

  • Possuem até 100 pinos de GPIO.
  • Até 128kbytes de memória flash, 8kbytes de RAM e 1kbytes de EEPROM.
  • Também são bem comuns.
  • São mais caros.
  • Entram na categoria “High-End”.

Características

Apesar das 4 categorias mencionadas acima (Baseline, Mid-Range, Enhanced Mid-Range e High-End) pertencerem a arquitetura de 8 bits do PIC, elas diferem muito em alguns pontos. Portanto, vou descrever as características de forma mais genérica e superficial.

Arquitetura da CPU

  • Arquitetura HARVARD.
  • RISC.
  • Barramento de dados 8 bits.

Alimentação

A maioria dos microcontroladores possuem uma ampla faixa de alimentação de 1,8 a 5,5V.

Memórias

  • Os dados são armazenados na memória conforme a organização Little Endian.

Possuem:

  • Memória flash:
    • Para armazenar o programa.
  • EEPROM:
    • Alguns poucos podem não possuir.
  • Memória de dados:
    • Dividida em RAM e registradores internos da CPU.
    • Além dos registradores de dados temporários da CPU, a memória de dados possui registradores para controle dos periféricos.
  • Fuse bits
    • Existe um espaço de memória para configurar os chamados “fuse bits”.
    • Estes “fuse bits” são configurações que ficam retidas após o desligamento do microcontrolador e envolvem, por exemplo:
      • Configuração de cristal (interno/ externo).
      • Habilitar/Desabilitar pino de RESET.
      • Habilitar/Desabilitar Watchdog.
      • etc.

Registradores

Um espaço limitado da RAM é dedicado para todos os registradores. E o espaço que não é utilizado pelos registradores dedicados pode ser utilizado pelos registradores de propósito geral. Por conta disto, podem ter de 25 (PIC12) a mais de 3000 (PIC18) registradores de propósito geral.

Instruções

O tamanho da instrução depende da categoria do PIC:

  • Baseline: 12 bits
  • Mid-Range: 14 bits
  • Enhanced Mid-Range: 14 bits
  • High-End: 16 bits

A maioria delas gasta 1 ciclo de instrução. PORÉM 1 ciclo de instrução equivale a 4 ciclos de clock. Ou seja, as instruções acabam gastando 4 ciclos de clock para executar. Isto ocorre porque o PIC divide o clock por 4 para gerar outros 4 clocks auxiliares.

De todo modo, em alguns PICs é possível multiplicar o clock por 4 utilizando um circuito chamado PLL (Phase-Locked Loop). Com isto, a instrução passa a gastar 1 ciclo de clock.

Acesse este link para conferir as instruções dos PICs da categoria “Mid-Range”.

Observações finais

Esta aula serviu para termos um panorama geral de um microcontrolador. Com isto, na hora de criar os programas do AVR e PIC, poderemos entender mais a fundo o que ocorre por trás do código.

Na próxima aula, estudaremos sobre o firmware (programa) mostrando quais são os requisitos para começar a criar programas para os microcontroladores AVR e PIC.