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.
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.
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).
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.
- 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
- Possuem de 5 a 8 pinos de GPIO.
- Até 3,5kbytes de memória flash, 256bytes de RAM e 128bytes de EEPROM.
- Entram na categoria “Baseline”, “Mid-Range” ou “Enhanced Mid-Range”.
PIC16
- Possuem de 8 a 64 pinos de GPIO.
- Até 56kbytes de memória flash, 4kbytes de RAM e 256bytes de EEPROM.
- São bem comuns.
- Entram na categoria “Baseline”, “Mid-Range” ou “Enhanced Mid-Range”.
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.
Firmware e IDE – Aula 4 – MC