Atmega328p Pu Bootloader Arduino Uno Atmel Atmega328 Avr: Manual Técnico Completo

ATmega328P-PU — manual técnico completo

Introdução

Neste manual, será apresentado como instalar, configurar e utilizar o microcontrolador ATmega328P-PU gravado com o bootloader do Arduino Uno. Se desejar adquirir este produto, clique aqui.

O ATmega328P-PU é um microcontrolador CMOS de 8 bits baseado na arquitetura AVR RISC (Reduced Instruction Set Computer) de alto desempenho e baixo consumo (tecnologia picoPower), fabricado originalmente pela Atmel e integrado ao portfólio da Microchip Technology. Fornecido em encapsulamento físico PDIP de 28 pinos (Plastic Dual In-line Package), esta versão vem gravada de fábrica com o firmware de inicialização Optiboot oficial do Arduino Uno, tornando o circuito integrado pronto para substituição direta (drop-in replacement) na placa Arduino Uno R3 ou para integração em circuitos dedicados em matriz de contatos (protoboard) e placas de circuito impresso proprietárias (standalone).

Este documento destina-se a engenheiros eletrônicos, desenvolvedores de sistemas embarcados, projetistas de hardware e hobbistas avançados que buscam implementar o núcleo do Arduino em projetos compactos e autônomos. Ao longo das seções a seguir, são apresentadas as especificações elétricas em regime contínuo, a arquitetura interna de memória e periféricos, o mapa detalhado de pinos (pinout), o esquema elétrico do circuito mínimo de polarização e oscilação de 16 MHz com interface serial USART, os parâmetros de gravação dos fusíveis (fuse bits) e códigos em linguagem C++ prontos para compilação na Arduino IDE.


Especificações técnicas

Principais especificações

As principais características construtivas, parâmetros de arquitetura e capacidades de processamento do ATmega328P-PU com bootloader Arduino Uno são sintetizadas na tabela técnica abaixo:

ParâmetroEspecificação Técnica
Microcontrolador CentralMicrochip / Atmel ATmega328P-PU
Arquitetura InternaAVR RISC de 8 bits (Harvard avançada com 32 registradores de uso geral)
Encapsulamento FísicoDIP-28 / PDIP-28 estreito (passo de 2,54 mm / 0,1 pol., largura 7,62 mm)
Frequência de Operação (Clock)16,0 MHz (com cristal de quartzo externo para padrão Arduino Uno)
Vetor de Instruções131 instruções de máquina (a grande maioria executada em 1 ciclo de clock)
Memória Flash de Programa32 kB no total (512 bytes alocados para o bootloader Optiboot; 31,5 kB livres)
Memória SRAM de Dados2 kB (2.048 bytes) estática interna
Memória EEPROM Não-Volátil1 kB (1.024 bytes) com retenção de dados mínima de 20 anos a 85 °C
Ciclos de Escrita/Leitura10.000 ciclos para memória Flash; 100.000 ciclos para memória EEPROM
Bootloader Pré-GravadoOptiboot v4.4+ (taxa de transmissão serial configurada em 115.200 bps)
Linhas Digitais de Entrada/Saída (I/O)23 pinos programáveis de uso geral (distribuídos nas portas PB, PC e PD)
Canais de Modulação PWM6 canais de hardware com resolução de 8 bits (D3, D5, D6, D9, D10 e D11)
Conversor Analógico-Digital (ADC)6 canais multiplexados de 10 bits de aproximações sucessivas (A0 a A5)
Interfaces de Comunicação Serial1× UART/USART (Hardware), 1× SPI (Master/Slave), 1× I2C/TWI (400 kHz)
Temporizadores / Contadores (Timers)2× Timers de 8 bits (Timer0 e Timer2) + 1× Timer de 16 bits (Timer1)
Mecanismos de SegurançaWatchdog Timer programável com oscilador interno, Detector Brown-out (BOD)
Temperatura Operacional de Trabalho-40 °C a +85 °C (Faixa Industrial Standard)

Características elétricas e operacionais

O dimensionamento correto do circuito de alimentação e das cargas conectadas aos pinos de entrada e saída é vital para evitar travamentos ou a degradação irreversível do silício. A tabela abaixo detalha os limites elétricos recomendados e as grandezas máximas absolutas extraídas da folha de dados (datasheet) do fabricante:

Grandeza ElétricaMínimoTípicoMáximoUnidade
Tensão de Alimentação (VCCV_{CC})4,505,005,50V
Tensão Máxima Absoluta no Barramento (VCC, maxV_{CC\text{, max}})-0,50—6,00V
Tensão em Qualquer Pino de I/O-0,50—VCC+0,50V_{CC} + 0,50V
Corrente Contínua Máxima por Pino de I/O (IOH/IOLI_{OH} / I_{OL})——40,0mA
Corrente Recomendada por Pino de I/O (Regime Contínuo)——20,0mA
Corrente Total Contínua nos Pinos VCCV_{CC} e GNDGND——200,0mA
Corrente Total Máxima da Porta B (pinos PB0 a PB5)——100,0mA
Corrente Total Máxima da Porta C (pinos PC0 a PC5)——100,0mA
Corrente Total Máxima da Porta D (pinos PD0 a PD7)——100,0mA
Corrente de Consumo Ativo (f=16 MHz,VCC=5Vf = 16\text{ MHz}, V_{CC} = 5\text{V})—9,212,0mA
Corrente de Consumo em Modo Power-down (VCC=5VV_{CC} = 5\text{V})—1,54,5µA
Tensão do Detector Brown-out (BOD configurado em fábrica)2,52,72,9V

O tempo de execução de um ciclo de instrução de máquina (tcyct_{cyc}) operando na frequência padrão de 16 MHz do cristal externo é dado por:

tcyc=1fosc=116×106 Hz=62,5 nst_{cyc} = \frac{1}{f_{osc}} = \frac{1}{16 \times 10^6\,\text{Hz}} = 62{,}5\,\text{ns}

Como a arquitetura AVR executa a maioria das instruções elementares em um único ciclo de clock, o chip atinge uma taxa de transferência de até 16 MIPS16\,\text{MIPS} (Million Instructions Per Second). A potência dissipada pelo núcleo em operação típica contínua pode ser calculada por:

PD=VCC×ICC=5,0 V×9,2×10−3 A=46,0 mWP_D = V_{CC} \times I_{CC} = 5{,}0\,\text{V} \times 9{,}2 \times 10^{-3}\,\text{A} = 46{,}0\,\text{mW}

Descrição do produto

O que é o ATmega328P-PU?

O ATmega328P-PU é o microcontrolador central consagrado internacionalmente pela plataforma Arduino Uno R3. Ele reúne, em uma única pastilha de silício de 28 pinos no formato DIP, uma Unidade Central de Processamento (CPU) RISC de 8 bits com registradores diretamente conectados à Unidade Lógica e Aritmética (ALU), 32 kB de memória Flash autoprogramável no sistema (In-System Programmable), conversores analógicos de precisão, temporizadores avançados e barramentos de comunicação industriais.

O sufixo -PU designa o encapsulamento PDIP (Plastic Dual In-line Package) em grau industrial comercial livre de chumbo (lead-free), enquanto a letra P indica a presença do subsistema picoPower, o qual viabiliza correntes de consumo em repouso na faixa de microamperes através do desligamento seletivo de módulos periféricos via registrador Power Reduction Register (PRR). A inclusão prévia do bootloader Optiboot permite que novos firmwares sejam descarregados diretamente pela porta serial assíncrona (USART) a 115.200 bps, eliminando a dependência obrigatória de gravadores ISP no fluxo de trabalho diário.

Para que serve?

  • Montagem de circuitos Arduino autônomos (standalone): viabiliza o desenvolvimento de produtos eletrônicos finais e placas de circuito impresso proprietárias de baixo custo e tamanho compacto, sem a necessidade de manter a placa Arduino Uno inteira na montagem.
  • Substituição direta de chips danificados (drop-in replacement): permite recuperar placas Arduino Uno R3 que sofreram sobretensão ou curto-circuito no chip principal, bastando retirar o CI defeituoso do soquete DIP-28 e encaixar a nova unidade pré-gravada.
  • Educação e aprendizado de arquitetura de computadores: serve como plataforma de excelência para o estudo de registradores internos, interrupções vetoriais, temporizadores de hardware e programação de baixo nível em Assembly AVR e linguagem C pura (AVR-GCC).

Por que devo usar?

  • Bootloader Optiboot pré-gravado: dispensa o uso de programadores externos como USBasp ou Arduino como ISP para carregar sketches, bastando conectar um conversor USB-Serial de 5V aos pinos TX/RX e ao pino de reset com auto-reset capacitivo.
  • Formato DIP-28 de fácil manuseio: permite prototipagem direta em matrizes de contato (protoboards), soquetes torneados e placas padrão perfuradas, facilitando testes de bancada e substituições rápidas sem necessidade de soldagem SMD.
  • Compatibilidade integral com o ecossistema Arduino: suporte a 100% das bibliotecas, exemplos, funções nativas (digitalWrite, analogRead, millis, etc.) e shields da Arduino IDE sem divergências de pinagem ou temporização.

Quando devo usar?

O ATmega328P-PU com bootloader é a escolha ideal quando o projeto exige um circuito microcontrolado confiável, imune a ruídos moderados, com consumo energético previsível de 5V, até 20 pinos de entrada e saída e facilidade de manutenção em campo. É altamente recomendado para temporizadores, leitores de sensores industriais e analógicos, controladores de relés, displays alfanuméricos e máquinas de estado locais.

Por outro lado, o chip não é recomendado para projetos que demandem conectividade de rede sem fio nativa (Wi-Fi/Bluetooth), processamento criptográfico, inteligência artificial na borda, captura de áudio ou vídeo, ou processamento matemático pesado de ponto flutuante. Nesses cenários, recomenda-se a migração para plataformas de 32 bits, tais como a família ESP32 (com Wi-Fi e Bluetooth integrados) ou placas com processadores ARM Cortex-M (STM32).

Pinout e diagrama de entradas/saídas

O encapsulamento PDIP-28 possui orientação determinada pelo chanfro semicircular (notch) localizado na borda superior do chip. A contagem dos pinos é realizada no sentido anti-horário, partindo do pino 1 (canto superior esquerdo) até o pino 14 (canto inferior esquerdo), e prosseguindo do pino 15 (canto inferior direito) até o pino 28 (canto superior direito).

A tabela a seguir apresenta o mapeamento completo dos 28 pinos do microcontrolador, correlacionando o número físico, o mnemônico do registrador AVR, a designação na Arduino IDE, a função principal e as funções secundárias multiplexadas de hardware:

Pino FísicoMnemônico AVRMapeamento ArduinoTipo de TerminalFunções Secundárias Multiplexadas de Hardware
1PC6RESETEntrada / ControlePCINT14 / RESET (Sinal de reinício ativo em nível lógico baixo; programável via ISP)
2PD0Digital 0 (RX)I/O DigitalPCINT16 / RXD (Recepção de dados da interface serial assíncrona USART)
3PD1Digital 1 (TX)I/O DigitalPCINT17 / TXD (Transmissão de dados da interface serial assíncrona USART)
4PD2Digital 2I/O DigitalPCINT18 / INT0 (Interrupção externa por hardware número 0)
5PD3Digital 3 (PWM)I/O DigitalPCINT19 / INT1 / OC2B (Interrupção externa 1; Saída PWM do Timer2 canal B)
6PD4Digital 4I/O DigitalPCINT20 / XCK / T0 (Clock externo da USART; Entrada de clock do Timer0)
7VCC5VAlimentaçãoTerminal positivo de alimentação do núcleo digital e das portas lógicas (+5V DC)
8GNDGNDAlimentaçãoTerminal de referência terra / neutro de 0V para o circuito digital
9PB6XTAL1 / TOSC1Oscilador / I/OPCINT6 / XTAL1 (Entrada do oscilador a cristal externo de 16 MHz)
10PB7XTAL2 / TOSC2Oscilador / I/OPCINT7 / XTAL2 (Saída do amplificador oscilador invertido para o cristal de 16 MHz)
11PD5Digital 5 (PWM)I/O DigitalPCINT21 / T1 / OC0B (Entrada de clock do Timer1; Saída PWM do Timer0 canal B)
12PD6Digital 6 (PWM)I/O DigitalPCINT22 / AIN0 / OC0A (Entrada positiva do comparador analógico; PWM Timer0 canal A)
13PD7Digital 7I/O DigitalPCINT23 / AIN1 (Entrada negativa do comparador analógico de hardware)
14PB0Digital 8I/O DigitalPCINT0 / CLKO / ICP1 (Captura de entrada do Timer1 de 16 bits; Saída de clock)
15PB1Digital 9 (PWM)I/O DigitalPCINT1 / OC1A (Saída PWM de 16 bits do Timer1 canal A)
16PB2Digital 10 (PWM)I/O DigitalPCINT2 / SS / OC1B (Linha Slave Select do barramento SPI; PWM Timer1 canal B)
17PB3Digital 11 (PWM)I/O DigitalPCINT3 / MOSI / OC2A (Master Out Slave In do barramento SPI; PWM Timer2 canal A)
18PB4Digital 12I/O DigitalPCINT4 / MISO (Master In Slave Out do barramento serial síncrono SPI)
19PB5Digital 13 (SCK)I/O DigitalPCINT5 / SCK (Serial Clock do barramento SPI; Conexão padrão do LED de bordo)
20AVCCAVCC (+5V)AlimentaçãoTensão de polarização do conversor A/D (deve ser conectada a VCCV_{CC} com desacoplamento)
21AREFAREFReferência AnalógicaPino de tensão de referência externa para o conversor A/D (filtro com capacitor de 100 nF)
22GNDGNDAlimentaçãoTerminal de terra analógico / referência 0V para o conversor A/D e portas adjacentes
23PC0Analógica A0Entrada AnalógicaPCINT8 / ADC0 (Canal analógico de entrada 0 com conversão de 10 bits)
24PC1Analógica A1Entrada AnalógicaPCINT9 / ADC1 (Canal analógico de entrada 1 com conversão de 10 bits)
25PC2Analógica A2Entrada AnalógicaPCINT10 / ADC2 (Canal analógico de entrada 2 com conversão de 10 bits)
26PC3Analógica A3Entrada AnalógicaPCINT11 / ADC3 (Canal analógico de entrada 3 com conversão de 10 bits)
27PC4Analógica A4 (SDA)Analógica / I2CPCINT12 / ADC4 / SDA (Linha Serial Data do barramento bidirecional I2C/TWI)
28PC5Analógica A5 (SCL)Analógica / I2CPCINT13 / ADC5 / SCL (Linha Serial Clock do barramento síncrono I2C/TWI)

Como fazer a ligação

Requisitos de instalação e alimentação

Para operar o ATmega328P-PU de forma estável fora da placa de desenvolvimento original (modo standalone), o circuito deve atender rigorosamente aos seguintes requisitos mínimos de hardware:

  1. Alimentação e Desacoplamento Capacitivo:

    • O barramento de alimentação deve fornecer 5,0 V DC regulados com capacidade de corrente de no mínimo 300 mA para o microcontrolador e os periféricos associados.
    • Os pinos 7 (VCCV_{CC}) e 20 (AVCCAVCC) devem ser conectados ao polo positivo (+5V). O pino AVCCAVCC alimenta o conversor analógico-digital e os circuitos de entrada da porta C; deixá-lo flutuando causa leituras analógicas incorretas e instabilidade no microcontrolador.
    • Devem ser soldados ou inseridos na protoboard capacitores cerâmicos multicamada de 100 nF posicionados o mais próximo fisicamente possível dos pinos 7 e 8, e entre os pinos 20 e 22, suprimindo ruídos de chaveamento em alta frequência.
  2. Rede de Oscilação de Clock (Cristal de 16 MHz):

    • Um cristal de quartzo de 16,000 MHz (modelo HC-49S ou equivalente) deve ser ligado entre o pino 9 (PB6/XTAL1) e o pino 10 (PB7/XTAL2).
    • Dois capacitores cerâmicos de disco de 22 pF devem conectar individualmente cada terminal do cristal ao barramento de terra (GNDGND). O cálculo da capacitância de carga CLC_L do cristal em função dos capacitores C1C_1, C2C_2 e da capacitância parasita da placa Cstray≈3 a 5 pFC_{stray} \approx 3\text{ a }5\,\text{pF} é expresso por:
CL=C1×C2C1+C2+Cstray=22×2222+22+4=11+4=15 pFC_L = \frac{C_1 \times C_2}{C_1 + C_2} + C_{stray} = \frac{22 \times 22}{22 + 22} + 4 = 11 + 4 = 15\,\text{pF}
  1. Circuito de Reset e Auto-Reset Serial:
    • O pino 1 (PC6/RESET) opera em lógica ativa baixa. Para mantê-lo em nível alto durante a operação normal, deve ser conectado um resistor pull-up de 10 kΩ entre o pino 1 e a linha de +5V.
    • Um botão táctil (push-button) momentâneo pode ser ligado entre o pino 1 e o terra (GNDGND) para reset manual.
    • Para permitir o envio automático de programas pela Arduino IDE sem a necessidade de pressionar o botão de reset manualmente, um capacitor de poliéster ou cerâmico de 100 nF deve ser inserido em série entre o sinal DTR do módulo USB-Serial e o pino 1 do ATmega328P. O sinal DTR gera um pulso negativo curto na borda de descida que dispara o bootloader no momento exato do upload.

Diagrama de ligação elétrica

O infográfico a seguir ilustra a arquitetura do circuito autônomo com o ATmega328P-PU montado em matriz de contatos, interligado aos 4 blocos de suporte essenciais (Fonte Regulada de 5V, Conversor USB-Serial para programação e telemetria, Rede do Oscilador de 16 MHz com Reset e Circuito de Teste com LED de bordo):

Diagrama de ligação elétrica do ATmega328P-PU

O diagrama estrutura a polarização completa em 5 blocos funcionais independentes:

  • Bloco Central: O microcontrolador ATmega328P-PU em encapsulamento DIP-28 inserido centralmente na protoboard, preservando as conexões livres para os componentes periféricos.
  • Bloco 1 (Fonte Regulada 5V DC): Responsável por fornecer alimentação estabilizada aos trilhos de distribuição da protoboard, alimentando as linhas lógicas e analógicas do microcontrolador.
  • Bloco 2 (Conversor USB-Serial): Adaptador USB para UART (com chips FT232RL, CH340G, CP2102 ou PL2303) fornecendo os canais TX/RX e o sinal de controle DTR para gravação e monitoramento serial.
  • Bloco 3 (Circuito Oscilador e Reset): Rede ressonante formada pelo cristal de 16 MHz, par de capacitores de 22 pF, resistor de pull-up de 10 kΩ e desacoplamento da linha analógica AREF.
  • Bloco 4 (Circuito de Teste LED PB5): Carga de prova formada por resistor de 220 Ω e LED difuso conectado ao pino 19 (D13), equivalente ao circuito do LED onboard do Arduino Uno.

Tabela de conexões dos terminais

A tabela abaixo descreve detalhadamente o guia de fiação ponto a ponto (“De →\to Para”) para a montagem completa do sistema:

Terminal de OrigemTerminal de Destino (ATmega328P-PU)Cor do FioTipo de SinalObservação
Fonte 5V (+) PositivoPino 7 (VCCV_{CC})VermelhoAlimentação DCAlimentação positiva do núcleo digital (+5V)
Fonte 5V (+) PositivoPino 20 (AVCCAVCC)VermelhoAlimentação DCPolarização obrigatória da seção analógica (+5V)
Fonte 5V (-) Negativo / TerraPino 8 (GNDGND)PretoReferência (0V)Terra comum do circuito digital
Fonte 5V (-) Negativo / TerraPino 22 (GNDGND)PretoReferência (0V)Terra de referência da seção analógica
Barramento +5V DCPino 1 (RESET)LaranjaPolarização / Pull-upConexão através de resistor de 10 kΩ
Sinal DTR (Conversor Serial)Pino 1 (RESET)AmareloSinal de ControleConexão em série através de capacitor de 100 nF
Pino TXD (Conversor Serial)Pino 2 / RXD (PD0)VerdeDados Seriais (RX)Sinal serial transmitido pelo PC para o chip
Pino RXD (Conversor Serial)Pino 3 / TXD (PD1)AzulDados Seriais (TX)Sinal serial enviado pelo chip para o PC
GND (Conversor Serial)Barramento GND ComumPretoReferência (0V)Equalização de potencial elétrico entre as partes
Cristal de Quartzo 16 MHz (Term. 1)Pino 9 / XTAL1 (PB6)MetálicoOscilador de ClockLigação curta direta; capacitor 22 pF ao terra
Cristal de Quartzo 16 MHz (Term. 2)Pino 10 / XTAL2 (PB7)MetálicoOscilador de ClockLigação curta direta; capacitor 22 pF ao terra
Capacitor 100 nF (Filtro ADC)Pino 21 (AREF)CinzaReferência AnalógicaFiltro de alta frequência desacoplado ao terra
Pino 19 / PB5 (Digital 13)Ânodo (+) do LEDAmareloSaída DigitalEm série com resistor limitador de 220 Ω
Cátodo (-) do LEDBarramento GND ComumPretoReferência (0V)Retorno de corrente do LED de diagnóstico

Cuidados e observações de segurança

⚠️ Atenção:

  • Inversão de Polaridade: O ATmega328P-PU não possui diodo de proteção interno contra inversão de polaridade nos pinos VCCV_{CC} e GNDGND. Ligar a fonte invertida destrói a pastilha semicondutora instantaneamente.
  • Conexão Obrigatória de AVCC: O pino 20 (AVCCAVCC) nunca deve permanecer desconectado, mesmo em aplicações puramente digitais. A ausência de tensão em AVCCAVCC polariza incorretamente a porta C e pode induzir travamentos intermitentes no microcontrolador.
  • Pino AREF: Nunca conecte uma fonte de tensão externa diretamente ao pino 21 (AREFAREF) se o código-fonte utilizar a instrução analogReference(DEFAULT) ou analogReference(INTERNAL). Conectar 5V externos enquanto a referência interna de 1,1V estiver ativa causa curto-circuito interno no seletor de tensão analógica.

⛔ Perigo:

  • Sobretensão nos Pinos de I/O: Os pinos de entrada e saída toleram tensões estritamente entre −0,5 V-0{,}5\,\text{V} e VCC+0,5 VV_{CC} + 0{,}5\,\text{V} (máximo de 5,5V). Conectar sinais de 12V ou 24V de sensores automotivos ou relés diretamente aos pinos destruirá o periférico interno e queimará o chip. Utilize divisores resistivos, diodos zener ou optoacopladores para condicionar sinais externos.
  • Curto-Circuito e Limite de Corrente: Cada pino digital é limitado a 40 mA de pico absoluto (20 mA contínuos). Acionar cargas que exijam correntes superiores (como motores DC, relés ou múltiplos LEDs sem resistor limitador) queima a saída correspondente.

Como usar

Guia de operação passo a passo

Após concluir a montagem física do circuito standalone na protoboard, siga o procedimento abaixo para programar e testar o ATmega328P-PU através da Arduino IDE:

  1. Conexão Física ao Computador:

    • Conecte o módulo conversor USB-Serial (FTDI ou CH340) à porta USB do computador.
    • Certifique-se de que o jumper de tensão do módulo USB-Serial esteja selecionado na posição 5V (e não 3.3V), garantindo compatibilidade com os níveis lógicos TTL do microcontrolador operando a 16 MHz.
  2. Verificação do Driver de Comunicação:

    • No sistema operacional Windows, acesse o Gerenciador de Dispositivos e verifique em “Portas (COM e LPT)” se o adaptador é identificado (ex.: Silicon Labs CP210x, FTDI USB Serial Port ou USB-SERIAL CH340 (COM4)).
    • Em distribuições Linux, execute ls /dev/ttyUSB* ou dmesg | grep tty no terminal para confirmar o ponto de montagem (geralmente /dev/ttyUSB0).
  3. Configuração da Arduino IDE:

    • Abra a Arduino IDE (versão 1.8.x ou 2.x).
    • No menu Ferramentas →\to Placa →\to Arduino AVR Boards, selecione Arduino Uno.
    • No menu Ferramentas →\to Porta, selecione a porta serial atribuída ao seu conversor USB-Serial (ex.: COM4 ou /dev/ttyUSB0).
    • Mantenha a configuração padrão do gravador (o programador padrão para placas Uno é o AVRISP mkII, porém ao clicar em “Carregar”, a IDE comunica diretamente com o bootloader Optiboot pela porta serial).
  4. Compilação e Upload do Sketch:

    • Carregue o código de teste no editor.
    • Pressione o botão Carregar (Upload). A Arduino IDE compilará o programa, acionará a linha DTR para reiniciar o microcontrolador no endereço do bootloader e transferirá os bytes compilados via serial a 115.200 bps.
    • Os LEDs indicadores de transmissão e recepção (TX/RX) do conversor piscarão rapidamente por alguns segundos, culminando na mensagem “Carregado com sucesso” (Done uploading).

Modos de operação e ajustes

Mecânica de Execução do Bootloader Optiboot

Quando o sinal de reset transita de nível lógico baixo para alto, o ponteiro de instruções do ATmega328P salta imediatamente para o endereço de inicialização do bootloader configurado nos fusíveis de inicialização (Boot Reset Vector):

Enderec¸o Base=0x7E00 (Word)=0x3F00 (Enderec¸o de Byte em Flash de 32 kB)\text{Endereço Base} = \text{0x7E00 (Word)} = \text{0x3F00 (Endereço de Byte em Flash de 32 kB)}

O Optiboot pisca brevemente o pino PB5 (D13) e aguarda por aproximadamente 1 segundo por um caractere de sincronização serial (STK_GET_SYNC - 0x30) vindo da porta USART a 115.200 bps:

  • Se receber o comando de sincronização, o bootloader assume o controle, apaga as páginas de memória Flash solicitadas e grava o novo sketch.
  • Se o tempo limite (timeout) expirar sem comunicação serial válida, o bootloader realiza um salto imediato para o endereço de memória 0x0000, iniciando a execução normal do programa de aplicação gravado pelo usuário.

Configuração Padrão dos Registradores de Fusíveis (Fuse Bits)

O chip fornecido pela RoboBuilders possui os seguintes fusíveis industriais pré-programados para total compatibilidade com o Arduino Uno:

Registrador de FusíveisValor HexadecimalDescrição da Configuração de Hardware
Low Fuse (lfuse)0xFFOscilador a Cristal Externo de Alta Frequência (8 a 16 MHz); Tempo de partida: 16K ciclos + 65 ms
High Fuse (hfuse)0xDEBootloader alocado em 256 palavras (512 bytes); Vetor de boot ativado (BOOTRST); Interface SPI habilitada
Extended Fuse (efuse)0xFD (ou 0x05)Detecção de Subtensão (Brown-out Detector - BOD) ativada no patamar nominal de 2,7 V
Lock Bits (lock)0x0FMemória protegida contra sobrescrita indevida da seção de bootloader por software

Exemplos práticos de uso

Exemplo 1: Teste Inicial de Diagnóstico, LED Não-Bloqueante e Telemetria Serial

Este código inicial valida a integridade do circuito oscilador de 16 MHz, o funcionamento da porta serial a 115.200 bps, o temporizador interno millis() e a leitura contínua do canal analógico A0, sem utilizar funções bloqueantes (delay):

/*
 * RoboBuilders - Manual Técnico ATmega328P-PU Standalone
 * Código 01: Teste de Diagnóstico de Hardware e Telemetria Serial
 * Microcontrolador: ATmega328P-PU (F_CPU = 16000000L)
 * Taxa Serial: 115200 bps
 */

#include <Arduino.h>

// Definição dos pinos físicos mapeados
const uint8_t PINO_LED_DIAGNOSTICO = 13; // Pino físico 19 (PB5 / SCK)
const uint8_t PINO_CANAL_ANALOGICO = A0; // Pino físico 23 (PC0 / ADC0)

// Variáveis de temporização não-bloqueante
unsigned long tempoAnteriorLed = 0;
unsigned long tempoAnteriorSerial = 0;
const unsigned long INTERVALO_LED_MS = 500;       // Alterna o LED a cada 500 ms (1 Hz)
const unsigned long INTERVALO_SERIAL_MS = 1000;   // Emite relatório serial a cada 1000 ms

// Variáveis de controle de estado
bool estadoLed = false;
uint32_t contadorCiclos = 0;

void setup() {
  // Inicialização do pino do LED como saída digital de baixa impedância
  pinMode(PINO_LED_DIAGNOSTICO, OUTPUT);
  digitalWrite(PINO_LED_DIAGNOSTICO, LOW);

  // Configuração do pino analógico como entrada
  pinMode(PINO_CANAL_ANALOGICO, INPUT);

  // Inicialização da porta serial em 115200 bps (padrão de alta velocidade)
  Serial.begin(115200);

  // Aguarda estabilização das linhas seriais
  while (!Serial && millis() < 2000);

  Serial.println(F("=================================================="));
  Serial.println(F("   ROBOBUILDERS - DIAGNOSTICO ATMEGA328P-PU      "));
  Serial.println(F("=================================================="));
  Serial.print(F("Frequencia de Clock (F_CPU): "));
  Serial.print(F_CPU / 1000000L);
  Serial.println(F(" MHz"));
  Serial.println(F("Bootloader Optiboot operacional em 115200 bps."));
  Serial.println(F("Inicializacao concluida com sucesso."));
  Serial.println(F("==================================================\n"));
}

void loop() {
  unsigned long tempoAtual = millis();
  contadorCiclos++;

  // 1. Gerenciamento do pisca-pisca do LED indicador (1 Hz)
  if (tempoAtual - tempoAnteriorLed >= INTERVALO_LED_MS) {
    tempoAnteriorLed = tempoAtual;
    estadoLed = !estadoLed;
    digitalWrite(PINO_LED_DIAGNOSTICO, estadoLed ? HIGH : LOW);
  }

  // 2. Leitura analógica e envio periódico de telemetria serial
  if (tempoAtual - tempoAnteriorSerial >= INTERVALO_SERIAL_MS) {
    tempoAnteriorSerial = tempoAtual;

    // Leitura do conversor A/D de 10 bits (resolução de 0 a 1023)
    int leituraAdc = analogRead(PINO_CANAL_ANALOGICO);
    
    // Cálculo da tensão correspondente com referência nominal de 5.0V
    float tensaoCalculada = (leituraAdc * 5.0f) / 1023.0f;

    // Emissão do relatório de diagnóstico
    Serial.print(F("[UPTIME: "));
    Serial.print(tempoAtual / 1000);
    Serial.print(F("s] | ADC0 (Pino 23): "));
    Serial.print(leituraAdc);
    Serial.print(F(" ("));
    Serial.print(tensaoCalculada, 3);
    Serial.print(F(" V) | LED D13: "));
    Serial.print(estadoLed ? F("LIGADO") : F("DESLIGADO"));
    Serial.print(F(" | Ciclos loop/s: "));
    Serial.println(contadorCiclos);

    contadorCiclos = 0; // Reinicia o contador para o próximo segundo
  }
}

Exemplo 2: Varredura de Barramento I2C (SDA = A4, SCL = A5)

Como o ATmega328P-PU dispõe de uma interface TWI (Two-Wire Interface) por hardware compatível com o protocolo I2C nos pinos 27 (PC4/SDA) e 28 (PC5/SCL), o código a seguir realiza uma varredura automática (I2C Scanner) no barramento para localizar sensores, relés ou displays conectados:

/*
 * RoboBuilders - Manual Técnico ATmega328P-PU Standalone
 * Código 02: Scanner de Dispositivos I2C / TWI
 * Barramento: Pino 27 (SDA) e Pino 28 (SCL)
 * Exige resistores pull-up externos de 4.7k ohms no barramento I2C
 */

#include <Arduino.h>
#include <Wire.h>

void setup() {
  // Inicialização da porta serial para exibição dos resultados
  Serial.begin(115200);
  while (!Serial && millis() < 2000);

  Serial.println(F("\n=========================================="));
  Serial.println(F("   ROBOBUILDERS - I2C BUS SCANNER        "));
  Serial.println(F("=========================================="));
  Serial.println(F("Iniciando barramento I2C por hardware..."));

  // Inicializa a interface TWI como Mestre (Master)
  Wire.begin();
  Wire.setClock(100000); // Frequência padrão de 100 kHz (Standard Mode)
}

void loop() {
  uint8_t totalDispositivos = 0;
  Serial.println(F("\nEscaneando enderecos no barramento (0x01 a 0x7F)..."));

  for (uint8_t endereco = 1; endereco < 127; endereco++) {
    // Tenta iniciar uma transmissão para o endereço de 7 bits
    Wire.beginTransmission(endereco);
    uint8_t statusErro = Wire.endTransmission();

    if (statusErro == 0) {
      Serial.print(F(" -> Dispositivo I2C localizado no endereco 0x"));
      if (endereco < 16) {
        Serial.print(F("0"));
      }
      Serial.print(endereco, HEX);
      Serial.print(F(" (Decimal: "));
      Serial.print(endereco);
      Serial.println(F(")"));

      totalDispositivos++;
    } else if (statusErro == 4) {
      Serial.print(F(" -> Erro desconhecido na comunicacao com o endereco 0x"));
      if (endereco < 16) {
        Serial.print(F("0"));
      }
      Serial.println(endereco, HEX);
    }
  }

  if (totalDispositivos == 0) {
    Serial.println(F("Nenhum dispositivo I2C foi detectado."));
    Serial.println(F("Verifique os resistores pull-up de 4.7k nas linhas SDA e SCL."));
  } else {
    Serial.print(F("Varredura concluida. Total de dispositivos encontrados: "));
    Serial.println(totalDispositivos);
  }

  Serial.println(F("Aguardando 5 segundos para novo escaneamento..."));
  delay(5000);
}

Projetos

Para quem deseja aprofundar suas habilidades na integração de microcontroladores da família AVR, gravação de firmwares e desenvolvimento de sistemas autônomos, o blog da RoboBuilders oferece tutoriais complementares essenciais:


Conclusão

O microcontrolador ATmega328P-PU gravado com o bootloader do Arduino Uno é uma das soluções mais eficientes, didáticas e econômicas para o desenvolvimento de hardware eletrônico embarcado. Sua arquitetura robusta e o ecossistema maduro de ferramentas garantem confiabilidade para protótipos e produtos industriais de pequeno porte.

Neste manual técnico completo, foram detalhados:

  • As especificações de memória, frequência de clock de 16 MHz e recursos internos da arquitetura AVR RISC;
  • Os limites elétricos absolutos de corrente e tensão para operação contínua segura;
  • A identificação funcional e mnemônica de cada um dos 28 pinos no formato PDIP;
  • O diagrama esquemático e a tabela de conexões De →\to Para para montagem em modo autônomo (standalone);
  • A dinâmica operacional do bootloader Optiboot e a tabela de configuração dos fusíveis (fuse bits);
  • Códigos práticos em C++ com temporização não-bloqueante e varredura de barramentos de comunicação I2C.

Com esses fundamentos dominados, você está plenamente capacitado a projetar placas dedicadas e projetos autônomos de alta estabilidade utilizando o coração do Arduino Uno.

Solução de problemas

Olá! Sou o assistente técnico da RoboBuilders. Descreva seu problema com o Atmega328p Pu Bootloader Arduino Uno Atmel Atmega328 Avr: Manual Técnico Completo e eu ajudarei a encontrar a solução.

O assistente usa IA e pode errar. Confirme informações críticas no datasheet oficial do fabricante.