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
- Flash: Memória somente leitura – não volátil – 32KB. Armazena o programa.
- SRAM: Memória de leitura/escrita – volátil – 2KB. Usada para variáveis durante a execução.
- 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:
- Pega o MSB (Most Significant Bit) do registrador de resultado digital e o seta para 1.
- Converte este valor digital parcial para um valor analógico e compara com a tensão de entrada (Vin).
- Se o valor convertido for maior que Vin, reseta o bit atual para 0; caso contrário, mantém em 1.
- Pula para o próximo bit (do MSB para o LSB - Least Significant Bit) e o seta para 1.
- 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.