ATmega328: Arquitetura e Periféricos Essenciais

Classificado em Computação

Escrito em em português com um tamanho de 6,54 KB.

Visão Geral do Microcontrolador ATmega328

Arquitetura Harvard (RISC) vs. Von Neumann (CISC)

  • Harvard: Memória exclusiva para programa e barramento exclusivo.
  • Von Neumann: Programa e memória no mesmo local, acessados através do mesmo barramento.

Tipos de Memória no ATmega328

  1. Flash: Memória somente leitura – não volátil – 32KB. Armazena o programa.
  2. SRAM: Memória de leitura/escrita – volátil – 2KB. Usada para variáveis durante a execução.
  3. EEPROM: Memória de leitura/escrita – não volátil – 1KB. Para dados importantes e permanentes (gravador).

Interrupções Externas

  • EICRA: Registrador de controle. Bits ICN0 e ISCN1 controlam o gatilho da interrupção (*rising edge*, *falling edge*, *low level*, *any change*, etc.).
  • EIMSK: Registrador de máscara. Bits INT0 e INT1 habilitam as interrupções externas correspondentes.
  • No Arduino, pode-se usar a função attachInterrupt(interrupt, function, mode) para configurar facilmente.

Timers/Contadores

  • TCNTx: Registrador do contador. Guarda o valor atual da contagem (8 bits para Timer0 e Timer2, 16 bits para Timer1). Gera a interrupção TOVx (Timer Overflow) ao estourar.
  • OCRnxA/B: Registradores de comparação. Guardam o valor a ser comparado com TCNTx. Geram a interrupção OCnxA/B (Output Compare Match) quando há igualdade.
  • Pré-divisor (Prescaler): Permite dividir a frequência do clock principal por 8, 64, 256 ou 1024 para diminuir a velocidade do timer.
  • TCCRnA/B: Registradores de controle do Timer/Counter. Configuram modo de operação (Normal, CTC, PWM) e selecionam a fonte de clock (bits CSn[2:0]).
  • TIMSKx: Registrador de máscara de interrupção do Timer. Habilita as interrupções específicas do timer (OCIExA/B para comparação, TOIEx para overflow).
  • Modo CTC (Clear Timer on Compare): O contador (TCNTx) é zerado quando seu valor atinge o valor em OCRnxA (ou OCRnxB, dependendo da configuração).
  • WGMn[2:0]: Bits nos registradores TCCRnA/B que definem o modo de operação da forma de onda (Normal, CTC, PWM, Fast PWM, etc.).

Conversor Analógico-Digital (ADC)

Funciona com base no método das aproximações sucessivas:

  1. Pega o MSB (Most Significant Bit) do registrador de resultado digital e o seta para 1.
  2. Converte este valor digital parcial para um valor analógico e compara com a tensão de entrada (Vin).
  3. Se o valor convertido for maior que Vin, reseta o bit atual para 0; caso contrário, mantém em 1.
  4. Pula para o próximo bit (do MSB para o LSB - Least Significant Bit) e o seta para 1.
  5. Repete os passos 2 a 4 até que todos os bits tenham sido testados.

No Arduino (baseado no ATmega328), a resolução padrão é de 10 bits (valores de 0 a 1023). O ADC possui um pré-divisor para ajustar sua frequência de clock; porém, frequências mais altas podem implicar em menor precisão na conversão.

Registradores do ADC

  • ADMUX: Seleciona o canal de entrada analógica (pino), a referência de tensão (Vref - AVCC, interna de 1.1V, externa AREF) e o ajuste do resultado (esquerda ou direita).
  • ADCSRA: Registrador de controle e status do ADC. Contém bits para habilitar o ADC (ADEN), iniciar uma conversão (ADSC), habilitar auto-trigger (ADATE), habilitar interrupção do ADC (ADIE) e selecionar o fator do pré-divisor (ADPS[2:0]).
  • ADCL/ADCH (ou ADCW): Registradores que contêm o resultado da conversão digital de 10 bits.

Transmissão/Recepção Serial (USART/UART)

  • USART: Universal Synchronous/Asynchronous Receiver/Transmitter (opera nos dois modos).
  • UART: Universal Asynchronous Receiver/Transmitter (opera apenas no modo assíncrono).

O modo assíncrono é baseado numa taxa de transmissão (Baud Rate) pré-acordada entre os dispositivos. Ambos devem estar configurados com a mesma taxa para a comunicação funcionar.

Utiliza registradores de deslocamento internos para converter dados paralelos (do barramento do microcontrolador) em seriais (transmitidos bit a bit) e vice-versa.

Registradores e Configuração Serial

  • UBRRnL/UBRRnH: Registradores que definem o valor para o gerador de Baud Rate. Para modo assíncrono normal, a fórmula é: UBRR = (Fosc / (16 * Baud)) - 1, onde Fosc é a frequência do oscilador.
  • Formato do Frame (Assíncrono): A transmissão de cada byte geralmente segue esta ordem: 1 Start bit (nível baixo), 5 a 9 bits de dados (configurável via UCSZn), opcionalmente 1 bit de paridade (par ou ímpar, configurável via UPMn, usado para detecção de erros), e 1 ou 2 Stop bits (nível alto, configurável via USBSn).
  • UCSRnA: Registrador de controle e status A. Contém flags que indicam o término de transmissão (TXC), recepção completa (RXC), erro de paridade (UPE), etc. Também pode habilitar o modo de velocidade dupla (U2X).
  • UCSRnB: Registrador de controle B. Habilita o transmissor (TXEN), o receptor (RXEN), as interrupções de transmissão completa (TXCIE), recepção completa (RXCIE) e registrador de dados vazio (UDRIE). Também configura o 9º bit de dados (UCSZn2).
  • UCSRnC: Registrador de controle C. Seleciona o modo (síncrono/assíncrono - UMSELn), a paridade (UPMn), o número de stop bits (USBSn) e o tamanho dos dados (UCSZn[1:0]).
  • UDRn: Registrador de dados da USART. Escrever neste registrador inicia a transmissão; ler este registrador obtém o byte recebido.

Entradas relacionadas: