Você está na página 1de 294

Machine Translated by Google

ATmega328P

Microcontrolador AVR de 8 bits com 32K bytes no sistema


Flash programável

FICHA DE DADOS

Características

• Microcontrolador AVR® de 8 bits de alto desempenho e baixo consumo

• Arquitetura RISC avançada

• 131 instruções poderosas – execução na maioria dos ciclos de clock único •


32 ÿ 8 registradores de trabalho de uso geral • Operação totalmente estática •
Taxa de transferência de até 16MIPS a 16MHz • Multiplicador de 2 ciclos no
chip • Segmentos de memória não voláteis de alta resistência • 32K bytes de
in - memória de programa flash autoprogramável do sistema • EEPROM de 1
Kbytes • SRAM interna de 2 Kbytes • Ciclos de gravação/exclusão: 10.000 flash/
100.000 EEPROM • Seção de código de inicialização opcional com bits de trava
independentes • Programação no sistema por programa de inicialização no chip •
Leitura verdadeira- operação durante a gravação • Bloqueio de programação para
segurança de software • Recursos periféricos • Dois temporizadores/contadores de
8 bits com pré-escalonador e modo de comparação separados • Um temporizador/
contador de 16 bits com pré-escalonador separado, modo de comparação e
captura

modo
• Contador em tempo real com oscilador separado •
Seis canais PWM • ADC de 8 canais e 10 bits em
pacote TQFP e QFN/MLF
• Medição de temperatura
• USART serial programável • Interface
serial SPI mestre/escravo
• Interface serial de 2 fios orientada a bytes ( compatível com Philips I2 C) •
Temporizador de watchdog programável com oscilador no chip separado •
Comparador analógico no chip • Interrupção e ativação na troca de pinos •
Recursos especiais do microcontrolador

• Reinicialização ao ligar e detecção programável de perda de energia


• Oscilador calibrado interno
• Fontes de interrupção externas e internas • Seis
modos de suspensão: Inativo, redução de ruído ADC, economia de energia, desligamento, espera e
espera estendida

7810D-AVR-01/15
Machine Translated by Google

• E/S e pacotes
• 23 linhas de E/S programáveis
• TQFP de 32 derivações e QFN/MLF de 32 derivações

• Tensão de operação:
• 2,7 V a 5,5 V para ATmega328P
• Faixa de temperatura:
• Faixa de temperatura automotiva: –40°C a +125°C
• Grau de velocidade:

• 0 a 8MHz a 2,7 a 5,5V (faixa de temperatura automotiva: –40°C a +125°C) • 0 a 16MHz a


4,5 a 5,5V (faixa de temperatura automotiva: –40°C a +125°C)
• Baixo consumo de energia
• Modo ativo: 1,5mA a 3V - 4MHz
• Modo de desligamento: 1µA a 3V

2 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

1. Configurações de pinos

Figura 1-1. Pinagem


Vista superior do TQFP

PCINT18)
(INT0/
PD2 PCINT17)
(TXD/
PD1 PCINT16)
(RXD/
PD0 PCINT14)
(RESET/
PC6 PCINT13)
(ADC5/
SCL/
PC5 PCINT12)
(ADC4/
SDA/
PC4 PCINT11)
(ADC3/
PC3 PCINT10)
(ADC2/
PC2

32 31 30 29 28 27 26 25

(PCINT19/OC2B/INT1) PD3 1 24 PC1 (ADC1/PCINT9)


(PCINT20/XCK/T0) PD4 2 23 PC0 (ADC0/PCINT8)
GND 3 22 ADC7
VCC 4 21 GND
GND 5 20 AREF

VCC 6 19 ADC6

(PCINT6/XTAL1/TOSC1) PB6 7 18 AVCC

(PCINT7/XTAL2/TOSC2) PB7 8 17 PB5 (SCK/PCINT5)

9 10 11 12 13 14 15 16

32 MLF Vista Superior

(PCINT4/
MISO)
PB4
(PCINT1/
OC1A)
PB1
(PCINT23/
AIN1)
PD7

(PCINT2/
OC1B)
PB2
SS/

(PCINT21/
OC0B/
PD5
T1)

(PCINT0/
CLKO/
ICP1)
PB0

(PCINT3/
OC2A/
MOSI)
PB3

(PCINT22/
OC0A/
AIN0)
PD6

PCINT18)
(INT0/
PD2 PCINT17)
(TXD/
PD1 PCINT16)
(RXD/
PD0 PCINT14)
(RESET/
PC6 PCINT13)
(ADC5/
SCL/
PC5 PCINT12)
(ADC4/
SDA/
PC4 PCINT11)
(ADC3/
PC3 PCINT10)
(ADC2/
PC2

32 31 30 29 28 27 26 25

(PCINT19/OC2B/INT1) PD3 1 24 PC1 (ADC1/PCINT9)


(PCINT20/XCK/T0) PD4 2 23 PC0 (ADC0/PCINT8)
GND 3 22 ADC7
VCC 4 21 GND
GND 5 20 AREF

VCC 6 19 ADC6

(PCINT6/XTAL1/TOSC1) PB6 7 18 AVCC

(PCINT7/XTAL2/TOSC2) PB7 8 17 PB5 (SCK/PCINT5)

9 10 11 12 13 14 15 16

NOTA: A almofada inferior deve ser soldada ao terra. (PCINT23/


AIN1)
PD7
(PCINT1/
OC1A)
PB1
(PCINT4/
MISO)
PB4

(PCINT2/
OC1B)
PB2
SS/

(PCINT21/
OC0B/
PD5
T1)

(PCINT0/
CLKO/
ICP1)
PB0

(PCINT3/
OC2A/
MOSI)
PB3

(PCINT22/
OC0A/
AIN0)
PD6

ATmega328P [FICHA DE DADOS] 3


7810D–AVR–01/15
Machine Translated by Google

1.1 Descrições de pinos

1.1.1 VCC
Tensão de alimentação digital.

1.1.2 GND
Chão.

1.1.3 Porta B (PB7:0) XTAL1/XTAL2/TOSC1/TOSC2


A porta B é uma porta de E/S bidirecional de 8 bits com resistores pull-up internos (selecionados para cada bit). Os buffers de saída da Porta B têm características de
unidade simétricas com alta capacidade de dissipador e fonte. Como entradas, os pinos da porta B que são puxados externamente para baixo fornecerão corrente se os
resistores de pull-up forem ativados. Os pinos da Porta B são tri-state quando uma condição de reset se torna ativa, mesmo se o relógio não estiver funcionando.

Dependendo das configurações do fusível de seleção do relógio, o PB6 pode ser usado como entrada para o amplificador oscilador inversor e entrada para o
circuito operacional do relógio interno.

Dependendo das configurações do fusível de seleção do relógio, o PB7 pode ser usado como saída do amplificador oscilador inversor.

Se o oscilador RC calibrado interno for usado como fonte de clock do chip, PB7..6 é usado como entrada TOSC2..1 para o Timer/Counter2 assíncrono se o bit AS2 no
ASSR estiver definido.

Os vários recursos especiais da porta B são elaborados na Seção 13.3.1 “Funções Alternativas da Porta B” na página 65 e na Seção 8. “Opções de Relógio e
Relógio do Sistema” na página 24.

1.1.4 Porta C (PC5:0)


A porta C é uma porta de E/S bidirecional de 7 bits com resistores pull-up internos (selecionados para cada bit). Os buffers de saída PC5..0 possuem características de
unidade simétricas com alta capacidade de dissipador e fonte. Como entradas, os pinos da Porta C que são puxados externamente para baixo fornecerão corrente se os
resistores pull-up forem ativados. Os pinos da porta C são tri-state quando uma condição de reset se torna ativa, mesmo se o relógio não estiver funcionando.

1.1.5 PC6/RESET
Se o fusível RSTDISBL estiver programado, o PC6 é usado como pino de entrada. Se o fusível RSTDISBL não estiver programado, o PC6 é usado como entrada de reset.
Um nível baixo neste pino por mais tempo que o comprimento mínimo de pulso irá gerar um reset, mesmo se o relógio não estiver
corrida. A duração mínima do pulso é fornecida na Tabela 28-4 na página 261. Pulsos mais curtos não são garantidos para gerar uma reinicialização.

Os vários recursos especiais da porta C são elaborados na Seção 13.3.2 “Funções Alternativas da Porta C” na página 68.

1.1.6 Porta D (PD7:0)


A porta D é uma porta de E/S bidirecional de 8 bits com resistores pull-up internos (selecionados para cada bit). Os buffers de saída da porta D têm características de
unidade simétricas com alta capacidade de dissipador e fonte. Como entradas, os pinos da porta D que são puxados externamente para baixo fornecerão corrente se os
resistores pull-up forem ativados. Os pinos da porta D são tri-state quando uma condição de reset se torna ativa, mesmo se o relógio não estiver funcionando.

Os vários recursos especiais da porta D são elaborados na Seção 13.3.3 “Funções Alternativas da Porta D” na página 70.

1.1.7 AVCC
AVCC é o pino de tensão de alimentação para o conversor A/D, PC3:0 e ADC7:6. Deve ser conectado externamente ao VCC, mesmo que o
ADC não seja usado. Se o ADC for usado, ele deve ser conectado ao VCC através de um filtro passa-baixa. Observe que PC6..4 usa tensão de
alimentação digital, VCC.

1.1.8 AREF
AREF é o pino de referência analógico para o conversor A/D.

4 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

1.1.9 ADC7:6 (somente pacote TQFP e QFN/MLF)


No pacote TQFP e QFN/MLF, o ADC7:6 serve como entradas analógicas para o conversor A/D. Esses pinos são alimentados pela fonte analógica e
servem como canais ADC de 10 bits.

1.2 Isenção de responsabilidade

Os valores típicos contidos nesta folha de dados são baseados em simulações e caracterização do ATmega328P AVR® real
microcontroladores fabricados com a tecnologia de processo típica. Os valores mínimos e máximos automotivos são baseados na
caracterização de microcontroladores ATmega328P AVR reais fabricados em toda a excursão do processo (corrida de canto).

1.3 Grau de Qualidade Automotiva


Os ATmega328P foram desenvolvidos e fabricados de acordo com os mais rigorosos requisitos da norma internacional ISO-TS-16949. Esta folha de
dados contém valores limite extraídos dos resultados de extensa caracterização (temperatura e tensão). A qualidade e confiabilidade do ATmega328P
foram verificadas durante a qualificação regular do produto conforme AEC-Q100 grau 1. Conforme indicado no parágrafo de informações de pedido, os
produtos estão disponíveis em apenas uma temperatura.

Tabela 1-1. Identificação do grau de temperatura para produtos automotivos

Temperatura Identificador de temperatura Comentários

–40°C; +125°C Z Faixa de temperatura automotiva completa

ATmega328P [FICHA DE DADOS] 5


7810D–AVR–01/15
Machine Translated by Google

2. Visão geral

O Atmel® ATmega328P é um microcontrolador CMOS de 8 bits de baixa potência baseado na arquitetura RISC aprimorada do AVR®. Ao
executar instruções poderosas em um único ciclo de clock, o ATmega328P atinge taxas de transferência de aproximadamente 1MIPS por MHz,
permitindo que o projetista do sistema otimize o consumo de energia versus a velocidade de processamento.

2.1 Diagrama de Blocos

Figura 2-1. Diagrama de bloco


GND VCC

cão de guarda
Poder debugWIRE
Cronômetro
Supervisão
POR / BOD
e
cão de guarda REDEFINIR Programa
Oscilador Lógica

Oscilador
Circuitos/
Instantâneo SRAM
Relógio
Geração

CPU AVR
EEPROM

AVCC

AREF

GND

2
8 bits T/C 0 T/C 1 de 16 bits Conv. A/D

Analógico interno 6
T/C 2 de 8 bits
BARRAMENTO
DADOS
DE

Comp. Bandgap

USART 0 SPI TWI

PORTO D (8) PORTO B (8) PORTO C (7)

REDEFINIR

XTAL[1..2]

PD[0..7] PB[0..7] PC[0..6] ADC[6..7]

6 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

O núcleo AVR® combina um rico conjunto de instruções com 32 registradores de trabalho de uso geral. Todos os 32 registradores são conectados
diretamente à unidade lógica aritmética (ALU), permitindo que dois registradores independentes sejam acessados em uma única instrução executada
em um ciclo de clock. A arquitetura resultante é mais eficiente em termos de código, ao mesmo tempo em que alcança rendimentos até dez vezes
mais rápidos do que os microcontroladores CISC convencionais.

O Atmel® ATmega328P fornece os seguintes recursos: 32K bytes de flash programável no sistema com recursos de leitura durante a gravação, 1K bytes
EEPROM, 2K bytes SRAM, 23 linhas de E/S de uso geral, 32 registradores de trabalho de uso geral, três temporizadores flexíveis /Contadores com
modos de comparação, interrupções internas e externas, um USART programável serial, uma interface serial de 2 fios orientada a byte, uma porta serial
SPI, um ADC de 6 canais de 10 bits (8 canais em pacotes TQFP e QFN/MLF), um temporizador de watchdog programável com oscilador interno e cinco
modos de economia de energia selecionáveis por software. O modo ocioso para a CPU enquanto permite que a SRAM, Temporizador/Contadores,
USART, interface serial de 2 fios, porta SPI e sistema de interrupção continuem funcionando. O modo de desligamento salva o conteúdo do registro, mas
congela o oscilador, desabilitando todas as outras funções do chip até a próxima interrupção ou reinicialização do hardware. No modo de economia de
energia, o temporizador assíncrono continua a funcionar, permitindo que o usuário mantenha uma base de temporizador enquanto o restante do
dispositivo está dormindo. O modo de redução de ruído ADC para a CPU e todos os módulos de E/S, exceto temporizador assíncrono e ADC, para
minimizar o ruído de comutação durante as conversões ADC. No modo de espera, o oscilador de cristal/ressonador está funcionando enquanto o restante
do dispositivo está dormindo. Isto permite um arranque muito rápido combinado com um baixo consumo de energia.

O dispositivo é fabricado com tecnologia de memória não volátil de alta densidade Atmel. O flash ISP no chip permite que a memória do programa
seja reprogramada no sistema por meio de uma interface serial SPI, por um programador de memória não volátil convencional ou por um programa
de inicialização no chip executado no núcleo AVR. O programa de inicialização pode usar qualquer interface para fazer download do programa aplicativo
na memória flash do aplicativo. O software na seção de flash de inicialização continuará a ser executado enquanto a seção de flash do aplicativo for
atualizada, fornecendo uma verdadeira operação de leitura durante a gravação. Ao combinar uma CPU RISC de 8 bits com
flash autoprogramável no sistema em um chip monolítico, o Atmel ATmega328P é um microcontrolador poderoso que fornece uma solução altamente
flexível e econômica para muitas aplicações de controle embarcado.

O ATmega328P AVR é compatível com um conjunto completo de ferramentas de desenvolvimento de programas e sistemas, incluindo: compiladores
C, montadores de macro, depuradores/simuladores de programas, emuladores de circuito e kits de avaliação.

ATmega328P [FICHA DE DADOS] 7


7810D–AVR–01/15
Machine Translated by Google

3. Recursos

Um conjunto abrangente de ferramentas de desenvolvimento, notas de aplicação e folhas de dados estão disponíveis para download
em http://www.atmel.com/avr.

4. Retenção de dados

Os resultados da qualificação de confiabilidade mostram que a taxa de falha de retenção de dados projetada é muito menor que 1 PPM ao longo de 20
anos a 85°C ou 100 anos a 25°C.

5. Sobre exemplos de código


Esta documentação contém exemplos de código simples que mostram brevemente como usar várias partes do dispositivo. Esses exemplos de código
pressupõem que o arquivo de cabeçalho específico da parte seja incluído antes da compilação. Esteja ciente de que nem todos os fornecedores de
compiladores C incluem definições de bits nos arquivos de cabeçalho e o tratamento de interrupções em C depende do compilador. Confirme com a
documentação do compilador C para obter mais detalhes.

Para registros de E/S localizados no mapa de E/S estendido, as instruções “IN”, “OUT”, “SBIS”, “SBIC”, “CBI” e “SBI” devem ser substituídas por
instruções que permitem acesso a E/S estendida. O. Normalmente “LDS” e “STS” combinados com “SBRS”, “SBRC”, “SBR” e “CBR”.

8 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

6. Núcleo da CPU AVR

6.1 Visão geral

Esta seção discute a arquitetura principal do AVR® em geral. A principal função do núcleo da CPU é garantir a execução correta
do programa. A CPU deve, portanto, ser capaz de acessar memórias, realizar cálculos, controlar periféricos e lidar com interrupções.

Figura 6-1. Diagrama de Blocos da Arquitetura AVR


Barramento de dados de 8 bits

Instantâneo Programa Estado e


Contador Ao controle
Programa
Memória

Interromper
32 x 8
Unidade
Em geral
Instrução
Propósito
Registro
Registros SPI
Unidade

Instrução
Decodificador cão de guarda
ULA Cronômetro

Endereçamento
direto Endereçamento
indireto

Linhas de controle Analógico


Comparador

Módulo de E/S 1

Dados
SRAM

Módulo de E/S 2

Módulo de E/S n
EEPROM

Linhas de E/S

Para maximizar o desempenho e o paralelismo, o AVR usa uma arquitetura harvard – com memórias e barramentos separados
para programa e dados. As instruções na memória do programa são executadas com um pipelining de nível único. Enquanto uma
instrução está sendo executada, a próxima instrução é pré-buscada na memória do programa. Este conceito permite que as instruções
sejam executadas em cada ciclo de clock. A memória do programa é uma memória flash reprogramável no sistema.

ATmega328P [FICHA DE DADOS] 9


7810D–AVR–01/15
Machine Translated by Google

O arquivo de registro de acesso rápido contém 32 registradores de trabalho de uso geral de 8 bits com um único tempo de acesso de ciclo de clock. Isso permite
a operação da unidade lógica aritmética (ALU) de ciclo único. Em uma operação ALU típica, dois operandos são emitidos do arquivo de registradores, a operação
é executada e o resultado é armazenado de volta no arquivo de registradores – em um ciclo de clock.

Seis dos 32 registros podem ser usados como três ponteiros de registro de endereço indireto de 16 bits para endereçamento de espaço de dados – permitindo
cálculos de endereço eficientes. Um desses ponteiros de endereço também pode ser usado como um ponteiro de endereço para consultar tabelas na memória
de programa flash. Esses registradores de função adicionados são os registradores X, Y e Z de 16 bits, descritos posteriormente nesta seção.

A ALU suporta operações aritméticas e lógicas entre registradores ou entre uma constante e um registrador. As operações de registro único também podem
ser executadas na ALU. Após uma operação aritmética, o registro de status é atualizado para refletir as informações sobre o resultado da operação.

O fluxo do programa é fornecido por instruções de salto e chamada condicionais e incondicionais, capazes de endereçar diretamente todo o espaço de
endereçamento. A maioria das instruções AVR® tem um único formato de palavra de 16 bits. Cada endereço de memória de programa contém um endereço de 16 ou
instrução de 32 bits.

O espaço de memória flash do programa é dividido em duas seções, a seção do programa de inicialização e a seção do programa aplicativo. Ambas as seções
possuem bits de bloqueio dedicados para proteção contra gravação e leitura/gravação. A instrução SPM que grava na seção de memória flash do aplicativo deve
residir na seção do programa de inicialização.

Durante interrupções e chamadas de sub-rotinas, o contador de programa de endereço de retorno (PC) é armazenado na pilha. A pilha é efetivamente
alocada na SRAM de dados gerais e, consequentemente, o tamanho da pilha é limitado apenas pelo tamanho total da SRAM e pelo uso da SRAM. Todos os
programas do usuário devem inicializar o SP na rotina de reset (antes que subrotinas ou interrupções sejam executadas). O ponteiro de pilha (SP) é acessível
para leitura/gravação no espaço de E/S. A SRAM de dados pode ser facilmente acessada através dos cinco modos de endereçamento diferentes suportados na
arquitetura AVR.

Os espaços de memória na arquitetura AVR são todos mapas de memória lineares e regulares.

Um módulo de interrupção flexível tem seus registros de controle no espaço de E/S com um bit de habilitação de interrupção global adicional no registro de status.
Todas as interrupções têm um vetor de interrupção separado na tabela de vetores de interrupção. As interrupções têm prioridade de acordo com a posição do
vetor de interrupção. Quanto menor o endereço do vetor de interrupção, maior a prioridade.

O espaço de memória de E/S contém 64 endereços para funções periféricas da CPU como registradores de controle, SPI e outras funções de E/S.
A memória de E/S pode ser acessada diretamente, ou como as localizações do espaço de dados seguindo as do arquivo de registro, 0x20 - 0x5F. Além disso, o
ATmega328P ampliou o espaço de E/S de 0x60 - 0xFF na SRAM onde somente as instruções ST/STS/STD e LD/LDS/LDD podem ser usadas.

6.2 ALU - Unidade Lógica Aritmética


A ALU AVR de alto desempenho opera em conexão direta com todos os 32 registradores de trabalho de uso geral. Dentro de um único ciclo de clock, são
executadas operações aritméticas entre registradores de propósito geral ou entre um registrador e um imediato. As operações da ALU são divididas em três
categorias principais – funções aritméticas, lógicas e de bits. Algumas implementações da arquitetura também fornecem um multiplicador poderoso que
suporta tanto a multiplicação com sinal/sem sinal quanto o formato fracionário. Consulte a Seção “” na página 281 para obter uma descrição detalhada.

6.3 Registro de Status


O registrador de status contém informações sobre o resultado da instrução aritmética executada mais recentemente. Essas informações podem ser
usadas para alterar o fluxo do programa para realizar operações condicionais. Observe que o registrador de status é atualizado após todas as operações da
ULA, conforme especificado na referência do conjunto de instruções. Isso, em muitos casos, elimina a necessidade de usar as instruções de comparação
dedicadas, resultando em um código mais rápido e compacto.

O registro de status não é armazenado automaticamente ao entrar em uma rotina de interrupção e restaurado ao retornar de uma interrupção. Isso deve
ser tratado por software.

10 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

6.3.1 SREG - Registro de Status AVR

O registrador de status do AVR – SREG – é definido como:

Pedaço 7 6 5 4 3 2 1 0

0x3F (0x5F) EU T H S V N Z C SREG


Ler escrever R/W R/W R/W R/W R/W R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

• Bit 7 – I: Ativação de interrupção global

O bit de habilitação de interrupção global deve ser definido para que as interrupções sejam habilitadas. O controle de habilitação de interrupção individual é então
executado em registros de controle separados. Se o registro de habilitação de interrupção global for limpo, nenhuma das interrupções será habilitada
independente das configurações individuais de habilitação de interrupção. O bit I é limpo pelo hardware após a ocorrência de uma interrupção e é definido pela instrução
RETI para habilitar interrupções subsequentes. O bit I também pode ser definido e apagado pela aplicação com as instruções SEI e CLI, conforme descrito na referência do
conjunto de instruções.

• Bit 6 – T: Armazenamento de Cópia de Bit

As instruções de cópia de bits BLD (bit LoaD) e BST (Bit STore) usam o bit T como origem ou destino do bit operado. Um pouco
de um registrador no arquivo de registradores pode ser copiado para T pela instrução BST, e um bit em T pode ser copiado para um bit em um registrador no arquivo
de registradores pela instrução BLD.

• Bit 5 – H: Sinalizador de meio

transporte O sinalizador de meio transporte H indica um meio transporte em algumas operações aritméticas. Half carry É útil na aritmética BCD. Consulte a seção
“”
na página 281 para obter informações detalhadas.

• Bit 4 – S: Bit de Sinal, S = Nÿÿ V

O bit S é sempre um exclusivo ou entre o sinalizador negativo N e o sinalizador de estouro de complemento de dois V. Consulte a Seção “” na página 281 para obter
informações detalhadas.

• Bit 3 – V: Flag de estouro de complemento de dois

O sinalizador de estouro de complemento de dois V suporta aritmética de complemento de dois. Consulte a Seção “” na página 281 para obter informações detalhadas.

• Bit 2 – N: Sinalizador Negativo

O sinalizador negativo N indica um resultado negativo em uma operação aritmética ou lógica. Consulte a Seção “” na página 281 para obter informações detalhadas.

• Bit 1 – Z: Sinalizador Zero

O sinalizador zero Z indica um resultado zero em uma operação aritmética ou lógica. Consulte a Seção “” na página 281 para obter informações detalhadas.

• Bit 0 – C: Sinalizador de Transporte

O sinalizador de transporte C indica um transporte em uma operação aritmética ou lógica. Consulte a Seção “” na página 281 para obter informações detalhadas.

ATmega328P [FICHA DE DADOS] 11


7810D–AVR–01/15
Machine Translated by Google

6.4 Arquivo de Registro de Uso Geral


O arquivo de registro é otimizado para o conjunto de instruções RISC aprimorado do AVR®. Para obter o desempenho e a flexibilidade necessários, os
seguintes esquemas de entrada/saída são suportados pelo arquivo de registro:
• Um operando de saída de 8 bits e uma entrada de resultado de 8 bits

• Dois operandos de saída de 8 bits e uma entrada de resultado de 8 bits

• Dois operandos de saída de 8 bits e uma entrada de resultado de 16 bits

• Um operando de saída de 16 bits e uma entrada de resultado de 16 bits

A Figura 6-2 mostra a estrutura dos 32 registradores de trabalho de uso geral na CPU.

Figura 6-2. Registros de Trabalho de Uso Geral da CPU AVR

7 0 Endereço

R0 0x00
R1 0x01
R2 0x02

R13 0x0D
Em geral R14 0x0E

Propósito R15 0x0F

Trabalhando R16 0x10

Registros R17 0x11



R26 0x1A Byte baixo do registro X
R27 0x1B Byte alto do registro X
R28 0x1C Byte baixo do registro Y
R29 0x1D Byte alto do registro Y
R30 0x1E Byte baixo do registro Z
R31 0x1F Byte alto do registro Z

A maioria das instruções que operam no arquivo de registradores tem acesso direto a todos os registradores, e a maioria delas são instruções de ciclo único.

Conforme mostrado na Figura 6-2, cada registrador também recebe um endereço de memória de dados, mapeando-os diretamente nas primeiras 32
localizações do espaço de dados do usuário. Apesar de não ser implementada fisicamente como localizações de SRAM, esta organização de memória
oferece grande flexibilidade no acesso aos registradores, pois os registradores X-, Y- e Z-pointer podem ser configurados para indexar qualquer registrador do
arquivo.

12 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

6.4.1 O registro X, registro Y e registro Z


Os registradores R26..R31 possuem algumas funções adicionais ao seu uso geral. Esses registradores são ponteiros de endereço de 16 bits para
endereçamento indireto do espaço de dados. Os três registradores de endereço indiretos X, Y e Z são definidos conforme descrito na Figura 6-3.

Figura 6-3. Os registros X-, Y- e Z-

15 XH XG 0

Registro X 7 0 7 0

R27 (0x1B) R26 (0x1A)

15 YH YL 0

registro Y 7 0 7 0

R29 (0x1D) R28 (0x1C)

15 ZH ZL 0

Registro Z 7 0 7 0

R31 (0x1F) R30 (0x1E)

Nos diferentes modos de endereçamento, esses registradores de endereço têm funções como deslocamento fixo, incremento automático e decremento
automático (consulte a referência do conjunto de instruções para obter detalhes).

6.5 Ponteiro de Pilha


A pilha é usada principalmente para armazenar dados temporários, para armazenar variáveis locais e para armazenar endereços de retorno após
interrupções e chamadas de sub-rotinas. Observe que a pilha é implementada crescendo de locais de memória mais altos para mais baixos. O registrador de
ponteiro de pilha sempre aponta para o topo da pilha. O ponteiro de pilha aponta para a área da pilha de dados SRAM onde as pilhas de subrotina e interrupção
estão localizadas. Um comando stack PUSH diminuirá o ponteiro da pilha.

A pilha na SRAM de dados deve ser definida pelo programa antes que qualquer chamada de sub-rotina seja executada ou interrupções sejam habilitadas.
o valor inicial do ponteiro de pilha é igual ao último endereço da SRAM interna e o ponteiro de pilha deve ser definido para o ponto acima do início da SRAM,
consulte a Figura 7-2 na página 18.

Consulte a Tabela 6-1 para obter detalhes do ponteiro de pilha.

Tabela 6-1. Instruções do Ponteiro de Pilha

Instrução Ponteiro de pilha Descrição


EMPURRE Decrementado em 1 Os dados são empurrados para a pilha
LIGAR
EU CHAMO Decrementado em 2 O endereço de retorno é colocado na pilha com uma chamada ou interrupção de sub-rotina
RCALL

POP Incrementado em 1 Os dados são retirados da pilha


RETIRAR O endereço de retorno é retirado da pilha com retorno da sub-rotina ou retorno da interrupção
Incrementado por 2
RETI

O ponteiro de pilha AVR é implementado como dois registradores de 8 bits no espaço de E/S. O número de bits realmente usados depende da
implementação. Observe que o espaço de dados em algumas implementações da arquitetura AVR® é tão pequeno que apenas o SPL é necessário. Neste caso,
o registro SPH não estará presente.

ATmega328P [FICHA DE DADOS] 13


7810D–AVR–01/15
Machine Translated by Google

6.5.1 SPH e SPL – Stack Pointer High e Stack Pointer Low Register

Pedaço 15 14 13 12 11 10 9 8
0x3E (0x5E) SP15 SP14 SP13 SP12 SP11 SP10 SP9 SP8 SPH
0x3D (0x5D) SP7 SP6 SP5 SP4 SP3 SP2 SP1 SP0 SPL
76543210
Ler escrever R/W R/W R/W R/W R/W R/W R/W R/W
R/W R/W R/W R/W R/W R/W R/W R/W
Valor inicial RAMEND RAMEND RAMEND RAMEND RAMEND RAMEND RAMEND RAMEND RAMEND
RAMEND RAMEND RAMEND RAMEND RAMEND RAMEND RAMEND RAMEND

6.6 Tempo de Execução de Instrução


Esta seção descreve os conceitos gerais de tempo de acesso para execução de instruções. A CPU AVR® é acionada pelo clock da CPU clkCPU,
gerado diretamente da fonte de clock selecionada para o chip. Nenhuma divisão de relógio interno é usada.

A Figura 6-4 mostra as buscas de instruções paralelas e execuções de instruções habilitadas pela arquitetura harvard e o conceito de arquivo de
registro de acesso rápido. Este é o conceito básico de pipeline para obter até 1MIPS por MHz com os resultados exclusivos correspondentes para
funções por custo, funções por clocks e funções por unidade de potência.

Figura 6-4. As buscas de instruções paralelas e execuções de instruções


T1 T2 T3 T4

clkCPU

1ª Busca de Instrução

1ª Instrução Executar
2ª Busca de Instrução

2ª Instrução Executar
3ª Busca de Instrução

3ª Instrução Executar
4ª Busca de Instrução

A Figura 6-5 mostra o conceito de tempo interno para o arquivo de registro. Em um único ciclo de clock, uma operação ALU usando dois operandos
de registrador é executada e o resultado é armazenado de volta no registrador de destino.

Figura 6-5. Operação ALU de Ciclo Único


T1 T2 T3 T4

clkCPU

Tempo total de execução

Registrar Busca de Operandos

Operação ALU Executar

Gravação do Resultado

14 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

6.7 Reinicializar e Interromper Manuseio


O AVR® fornece várias fontes de interrupção diferentes. Essas interrupções e o vetor de reset separado têm, cada um, um vetor de programa separado no espaço
de memória do programa. Todas as interrupções são atribuídas a bits de habilitação individuais que devem ser escritos lógicos um junto com o bit de habilitação
de interrupção global no registrador de status para habilitar a interrupção. Dependendo do valor do contador do programa, as interrupções podem ser desabilitadas
automaticamente quando os bits de bloqueio de inicialização BLB02 ou BLB12 são programados. Esse recurso melhora a segurança do software. Consulte a
Seção 27. “Programação de memória” na página 241 para obter detalhes.

Os endereços mais baixos no espaço de memória do programa são definidos por padrão como os vetores de reset e interrupção. A lista completa de vetores é
mostrada na Seção 11. “Interrupções” na página 49. A lista também determina os níveis de prioridade das diferentes interrupções. Quanto menor o endereço,
maior é o nível de prioridade. RESET tem a prioridade mais alta e o próximo é INT0 – a solicitação de interrupção externa 0. Os vetores de interrupção podem ser
movidos para o início da seção de flash de inicialização definindo o bit IVSEL no registro de controle MCU (MCUCR). Consulte a Seção 11. “Interrupções” na
página 49 para obter mais informações. O vetor de reinicialização também pode ser movido para o início da seção de flash de inicialização programando o fusível
BOOTRST, consulte a Seção 26. “Suporte ao carregador de inicialização – Autoprogramação de leitura-enquanto-gravação” na página 229.

Quando ocorre uma interrupção, o bit I de habilitação de interrupção global é apagado e todas as interrupções são desabilitadas. O software do usuário pode
escrever a lógica um no bit I para habilitar interrupções aninhadas. Todas as interrupções habilitadas podem interromper a rotina de interrupção atual.
O bit I é definido automaticamente quando uma instrução de retorno de interrupção – RETI – é executada.

Existem basicamente dois tipos de interrupções. O primeiro tipo é acionado por um evento que define o sinalizador de interrupção. Para essas interrupções,
o contador de programa é vetorizado para o vetor de interrupção real para executar a rotina de tratamento de interrupção e o hardware limpa o sinalizador de
interrupção correspondente. Os sinalizadores de interrupção também podem ser apagados escrevendo um lógico na(s) posição(ões) do bit de sinalizador a ser(em)
apagado(s). Se ocorrer uma condição de interrupção enquanto o bit de habilitação de interrupção correspondente estiver apagado, o sinalizador de interrupção
será definido e lembrado até que a interrupção seja habilitada ou o sinalizador seja apagado pelo software. Da mesma forma, se uma ou mais condições de
interrupção ocorrerem enquanto o bit de habilitação de interrupção global estiver desenergizado, o(s) sinalizador(es) de interrupção correspondente(s) será(ão)
definido(s) e lembrado(s) até que o bit de habilitação de interrupção global seja definido, e então será executado por ordem de prioridade.

O segundo tipo de interrupção será acionado enquanto a condição de interrupção estiver presente. Essas interrupções não têm necessariamente sinalizadores
de interrupção. Se a condição de interrupção desaparecer antes que a interrupção seja habilitada, a interrupção não será acionada.

Quando o AVR sai de uma interrupção, ele sempre retornará ao programa principal e executará mais uma instrução antes que qualquer interrupção pendente seja
atendida.

Observe que o registrador de status não é armazenado automaticamente ao entrar em uma rotina de interrupção, nem restaurado ao retornar de uma rotina de
interrupção. Isso deve ser tratado por software.

ATmega328P [FICHA DE DADOS] 15


7810D–AVR–01/15
Machine Translated by Google

Ao usar a instrução CLI para desabilitar interrupções, as interrupções serão desabilitadas imediatamente. Nenhuma interrupção será executada após a
instrução CLI, mesmo que ocorra simultaneamente com a instrução CLI. O exemplo a seguir mostra como isso pode ser usado para evitar interrupções
durante a sequência de gravação temporizada da EEPROM.

Exemplo de código de montagem

dentro r16, SREG ; armazenar valor SREG


cli ; desabilitar interrupções durante a sequência temporizada
sbi EECR, EEMPE ; iniciar gravação EEPROM
sbi EECR, EEPE
fora SREG, r16 ; restaurar o valor SREG (I-bit)

Exemplo de código C

char cSREG;
cSREG = SREG; /* / * armazena o valor SREG */
desabilita interrupções durante a seqüência temporizada */
_CLI();
EECR |= (1<<EEMPE); /* inicia a escrita na EEPROM */
EECR |= (1<<EEPE);
SREG = cSREG; /* restaura o valor SREG (I-bit) */

Ao usar a instrução SEI para habilitar interrupções, a instrução seguinte a SEI será executada antes de qualquer interrupção pendente, conforme
mostrado neste exemplo.

Exemplo de código de montagem

sei ; definir Ativação de interrupção global


dormir ; entrar no sono, aguardando interrupção
; nota: entrará em suspensão antes de qualquer interrupção pendente

Exemplo de código C

__enable_interrupt(); /* define a habilitação de interrupção global */


__dorme(); /* entra no sono, aguardando interrupção */
/* nota: entrará em suspensão antes de qualquer interrupção pendente */

6.7.1 Tempo de Resposta de Interrupção

A resposta de execução de interrupção para todas as interrupções AVR® habilitadas é de quatro ciclos de clock no mínimo. Após quatro ciclos de
clock, o endereço do vetor do programa para a rotina de tratamento de interrupção real é executado. Durante este período de quatro ciclos de clock,
o contador de programa é colocado na pilha. O vetor é normalmente um salto para a rotina de interrupção, e esse salto leva três ciclos de clock. Se
ocorrer uma interrupção durante a execução de uma instrução de vários ciclos, essa instrução será concluída antes que a interrupção seja atendida.
Se ocorrer uma interrupção quando o MCU estiver no modo de suspensão, o tempo de resposta da execução da interrupção será aumentado em
quatro ciclos de clock. Este aumento vem além do tempo de inicialização do modo de suspensão selecionado.

Um retorno de uma rotina de tratamento de interrupção leva quatro ciclos de clock. Durante esses quatro ciclos de clock, o contador de programa (dois
bytes) é retirado da pilha, o ponteiro da pilha é incrementado em dois e o bit I no SREG é definido.

16 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

7. Memórias AVR

7.1 Visão geral

Esta seção descreve as diferentes memórias do ATmega328P. A arquitetura AVR® possui dois espaços de memória principais, a memória de
dados e o espaço de memória do programa. Além disso, o ATmega328P possui uma memória EEPROM para armazenamento de dados. Todos
os três espaços de memória são lineares e regulares.

7.2 Memória de Programa Flash Reprogramável no Sistema


O ATmega328P contém 32 Kbytes de memória flash reprogramável no sistema no chip para armazenamento de programas. Como todas as
instruções do AVR têm largura de 16 ou 32 bits, o flash é organizado como 16K ÿ16. Para segurança do software, o espaço de memória do
programa flash é dividido em duas seções, a seção do carregador de inicialização e a seção do programa aplicativo no ATmega328P. Veja a
descrição SELFPRGEN na Seção 25.3.1 “SPMCSR – Armazenar Controle de Memória de Programa e Registro de Status” na página 228 e Seção
26.9.1 “SPMCSR – Armazenar Controle de Memória de Programa e Registro de Status” na página 239 para mais detalhes.

A memória flash tem uma duração de pelo menos 10.000 ciclos de gravação/apagamento. O contador de programa ATmega328P (PC) tem 14
bits de largura, endereçando assim os locais de memória de programa de 16K. A operação da seção do programa de inicialização e os bits de
bloqueio de inicialização associados para proteção do software são descritos em detalhes na Seção 25. “Autoprogramação do Flash, ATmega328P”
na página 223 e na Seção 26. Programação” na página 229. A seção 27. “Programação de memória” na página 241 contém uma descrição
detalhada sobre a programação flash no modo de programação SPI ou paralela.

Tabelas constantes podem ser alocadas dentro de todo o espaço de endereçamento da memória do programa (veja a descrição da instrução
LPM – load program memory).

Diagramas de tempo para busca e execução de instruções são apresentados na Seção 6.6 “Tempo de Execução de Instrução” na página 14.

Figura 7-1. Mapa de memória do programa ATmega328P

Memória do programa
0x0000

Seção Flash do Aplicativo

Seção Flash de Inicialização


0x3FFF

ATmega328P [FICHA DE DADOS] 17


7810D–AVR–01/15
Machine Translated by Google

7.3 Memória de Dados SRAM


A Figura 7-2 mostra como a memória SRAM ATmega328P está organizada.

O ATmega328P é um microcontrolador complexo com mais unidades periféricas que podem ser suportadas dentro dos 64 locais reservados no
opcode para as instruções IN e OUT. Para o espaço de E/S estendido de 0x60 - 0xFF na SRAM, somente as instruções ST/STS/STD e LD/LDS/LDD
podem ser usadas.

As 2303 localizações de memória de dados inferiores endereçam tanto o arquivo de registro, a memória de E/S, a memória de E/S estendida e a
SRAM de dados interna. As primeiras 32 localizações endereçam o arquivo de registradores, as próximas 64 localizam a memória de E/S padrão, então
160 localizações de memória de E/S estendida e as próximas 2048 localizações endereçam a SRAM de dados internos.

Os cinco modos de endereçamento diferentes para a memória de dados abrangem: Direto, indireto com deslocamento, indireto, indireto com pré-
decremento e indireto com pós-incremento. No arquivo de registradores, os registradores R26 a R31 apresentam os registradores de ponteiro de
endereçamento indireto.

O endereçamento direto atinge todo o espaço de dados.

O modo indireto com deslocamento atinge 63 locais de endereço a partir do endereço base fornecido pelo registrador Y ou Z.

Ao usar os modos de endereçamento indireto de registradores com pré-decremento e pós-incremento automáticos, os registradores de endereço X, Y e
Z são decrementados ou incrementados.

Os 32 registradores de trabalho de uso geral, 64 registradores de E/S, 160 registradores de E/S estendidos e os 2.048 bytes de SRAM de dados internos
no ATmega328P são todos acessíveis através de todos esses modos de endereçamento. O arquivo de registro é descrito em
Seção 6.4 “Arquivo de Registro de Uso Geral” na página 12.

Figura 7-2. Mapa de memória de dados

Memória de dados

32 Registros 0x0000 - 0x001F


64 Registros de E/S 0x0020 - 0x005F
160 Registros Ext I/O 0x0060 - 0x00FF
0x0100
SRAM interno
(1048 x 8)

0x08FF

7.3.1 Tempos de Acesso à Memória de Dados


Esta seção descreve os conceitos gerais de tempo de acesso para acesso à memória interna. O acesso aos dados internos da SRAM é realizado em
dois ciclos clkCPU conforme descrito na Figura 7-3.

Figura 7-3. Ciclos de acesso SRAM de dados no chip

T1 T2 T3

clkCPU

Endereço Endereço de computação Endereço válido

Dados

Escreva
WR

Dados

Ler
RD

Instrução de acesso à memória Próxima Instrução

18 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

7.4 Memória de Dados EEPROM


O Atmel® ATmega328P contém 1Kbyte de memória EEPROM de dados. Ele é organizado como um espaço de dados separado, no qual bytes únicos
podem ser lidos e gravados. A EEPROM tem uma resistência de pelo menos 100.000 ciclos de gravação/apagamento. O acesso entre a EEPROM e a
CPU é descrito a seguir, especificando os registradores de endereço EEPROM, o registrador de dados EEPROM e o registrador de controle EEPROM.

A Seção 27. “Programação de Memória” na página 241 contém uma descrição detalhada sobre a programação de EEPROM em SPI ou modo de
programação paralela.

7.4.1 Acesso de Leitura/Gravação EEPROM

Os registradores de acesso EEPROM são acessíveis no espaço de E/S.

O tempo de acesso de gravação para a EEPROM é fornecido na Tabela 7-2 na página 22. Uma função de temporização, no entanto, permite que o
software do usuário detecte quando o próximo byte pode ser gravado. Se o código do usuário contém instruções que gravam a EEPROM, alguns
cuidados devem ser tomados. Em fontes de alimentação altamente filtradas, o VCC provavelmente aumentará ou diminuirá lentamente ao ligar/
desligar. Isso faz com que o dispositivo por algum período de tempo funcione com uma tensão menor que a especificada como mínima para a frequência de clock usada
Consulte a Seção 7.4.2 “Evitando corrupção de EEPROM” na página 19 para obter detalhes sobre como evitar problemas nessas situações.

Para evitar gravações não intencionais na EEPROM, um procedimento de gravação específico deve ser seguido. Consulte a descrição do registro de
controle EEPROM para obter detalhes sobre isso.

Quando a EEPROM é lida, a CPU é parada por quatro ciclos de clock antes que a próxima instrução seja executada. Quando a EEPROM é escrita,
a CPU é parada por dois ciclos de clock antes que a próxima instrução seja executada.

7.4.2 Prevenindo Corrupção EEPROM

Durante períodos de baixo VCC, os dados da EEPROM podem ser corrompidos porque a tensão de alimentação é muito baixa para que a CPU e a
EEPROM funcionem corretamente. Esses problemas são os mesmos para sistemas de nível de placa usando EEPROM, e as mesmas soluções de projeto
devem ser aplicadas.

Uma corrupção de dados EEPROM pode ser causada por duas situações quando a tensão é muito baixa. Primeiro, uma sequência de gravação regular na
EEPROM requer uma tensão mínima para operar corretamente. Em segundo lugar, a própria CPU pode executar instruções incorretamente, se a tensão de
alimentação for muito baixa.

A corrupção de dados da EEPROM pode ser facilmente evitada seguindo esta recomendação de design:

Mantenha o AVR RESET ativo (baixo) durante os períodos de tensão de alimentação insuficiente. Isso pode ser feito ativando o detector interno de
brown-out (BOD). Se o nível de detecção do BOD interno não corresponder ao nível de detecção necessário, um circuito externo de proteção de reset de
VCC baixo pode ser usado. Se ocorrer uma reinicialização enquanto uma operação de gravação estiver em andamento, a operação de gravação será
concluída desde que a tensão da fonte de alimentação seja suficiente.

7,5 Memória de E/S


A definição do espaço de E/S do ATmega328P é mostrada na Seção “” na página 275.

Todas as E/Ss e periféricos do ATmega328P são colocados no espaço de E/S. Todas as localizações de E/S podem ser acessadas pelas instruções LD/
LDS/LDD e ST/STS/STD, transferindo dados entre os 32 registradores de trabalho de uso geral e o espaço de E/S. Os registradores de E/S dentro do
intervalo de endereços 0x00 - 0x1F são diretamente acessíveis por bit usando as instruções SBI e CBI. Nesses registradores, o valor de bits simples pode
ser verificado usando as instruções SBIS e SBIC. Consulte a seção do conjunto de instruções para obter mais detalhes. Ao utilizar os comandos
específicos de E/S IN e OUT, devem ser utilizados os endereços de E/S 0x00 - 0x3F.
Ao endereçar registradores de E/S como espaço de dados usando instruções LD e ST, 0x20 deve ser adicionado a esses endereços. O ATmega328P é
um microcontrolador complexo com mais unidades periféricas que podem ser suportadas dentro do local reservado em opcode para as instruções IN e OUT.
Para o espaço de E/S estendido de 0x60 - 0xFF na SRAM, somente as instruções ST/STS/STD e LD/LDS/LDD podem ser usadas.

Para compatibilidade com dispositivos futuros, os bits reservados devem ser gravados em zero se acessados. Os endereços de memória de E/S reservados
nunca devem ser gravados.

Alguns dos sinalizadores de status são apagados escrevendo-se um lógico neles. Observe que, diferentemente da maioria dos outros AVR®, as
instruções CBI e SBI só operarão no bit especificado e, portanto, podem ser usadas em registradores que contenham tais sinalizadores de status. As
instruções CBI e SBI funcionam apenas com os registradores 0x00 a 0x1F.

Os registros de controle de E/S e periféricos são explicados nas seções posteriores.

ATmega328P [FICHA DE DADOS] 19


7810D–AVR–01/15
Machine Translated by Google

7.5.1 Registros de E/S de Uso Geral

O Atmel® ATmega328P contém três registradores de E/S de uso geral. Esses registradores podem ser usados para armazenar qualquer
informação e são particularmente úteis para armazenar variáveis globais e sinalizadores de status. Os registradores de E/S de uso geral dentro do
intervalo de endereços 0x00 - 0x1F são diretamente acessíveis por bit usando as instruções SBI, CBI, SBIS e SBIC.

7.6 Descrição do Registro

7.6.1 EEARH e EEARL - O Registro de Endereço EEPROM

Pedaço 15 14 13 12 11 10 9 8

0x22 (0x42) – – – – – – – EEAR8 EEARH

0x21 (0x41) EEAR7 EEAR6 EEAR5 EEAR4 EEAR3 EEAR2 EEAR1 EEAR0 EEARL
76543210
Ler escrever R R R R R R R R/W
R/W R/W R/W R/W R/W R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 X
XXXXXXXX

• Bits 15..9 – Res: Bits Reservados

Esses bits são bits reservados no Atmel ATmega328P e sempre serão lidos como zero.

• Bits 8..0 – EEAR8..0: Endereço EEPROM

Os registradores de endereço EEPROM – EEARH e EEARL especificam o endereço EEPROM no espaço EEPROM de 256/512/512/1K
bytes. Os bytes de dados EEPROM são endereçados linearmente entre 0 e 255/511/511/1023. O valor inicial de EEAR é indefinido. Um valor
apropriado deve ser escrito antes que a EEPROM possa ser acessada.

EEAR8 é um bit não utilizado no ATmega328P e deve sempre ser escrito em zero.

7.6.2 EEDR - O Registro de Dados EEPROM

Pedaço 7 6 5 4 3 2 1 0

0x20 (0x40) MSB LSB EEDR


Ler escrever R/W R/W R/W R/W R/W R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

• Bits 7..0 – EEDR7.0: Dados EEPROM

Para a operação de escrita na EEPROM, o registrador EEDR contém os dados a serem gravados na EEPROM no endereço fornecido pelo registrador
EEAR. Para a operação de leitura da EEPROM, o EEDR contém os dados lidos da EEPROM no endereço fornecido pelo EEAR.

7.6.3 EECR - O Registro de Controle EEPROM

Pedaço 7 6 5 4 3 2 1 0

0x1F (0x3F) – – EEPM1 EEPM0 EERIE EEMPE EEPE EERE EECR


Ler escrever R R R/W R/W R/W R/W R/W R/W
Valor inicial 0 0 X X 0 0 X 0

• Bits 7..6 – Res: Bits Reservados

Esses bits são bits reservados no Atmel ATmega328P e sempre serão lidos como zero.

• Bits 5, 4 – EEPM1 e EEPM0: Bits do Modo de Programação EEPROM


A configuração de bit do modo de programação EEPROM define qual ação de programação será acionada ao escrever EEPE. É possível programar
dados em uma operação atômica (apagar o valor antigo e programar o novo valor) ou dividir as operações de apagar e escrever em duas operações
diferentes. Os tempos de programação para os diferentes modos são mostrados na Tabela 7-1. Enquanto o EEPE estiver definido, qualquer gravação
no EEPMn será ignorada. Durante o reset, os bits EEPMn serão redefinidos para 0b00, a menos que a EEPROM esteja ocupada na programação.

20 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

Tabela 7-1. Bits do modo EEPROM

EEPM1 Operação de Tempo de Programação EEPM0


0 0 3,4 ms Apagar e escrever em uma operação (operação atômica)
0 1 1,8 ms Apagar apenas

1 0 1,8 ms Escrever apenas

1 1 – Reservado para uso futuro

• Bit 3 – EERIE: Ativação de interrupção pronta para EEPROM

Escrever EERIE em um habilita a interrupção pronta para EEPROM se o bit I em SREG estiver definido. Escrever EERIE para zero desabilita a interrupção.
A interrupção pronta para EEPROM gera uma interrupção constante quando EEPE é desenergizado. A interrupção não será gerada durante a gravação de
EEPROM ou SPM.

• Bit 2 – EEMPE: Habilitar Gravação do Mestre EEPROM

O bit EEMPE determina se a configuração de EEPE para um faz com que a EEPROM seja gravada. Quando EEMPE é definido, definir EEPE dentro de
quatro ciclos de clock gravará dados na EEPROM no endereço selecionado. Se EEMPE for zero, a configuração de EEPE não terá efeito. Quando o EEMPE
é gravado em um por software, o hardware limpa o bit para zero após quatro ciclos de clock.
Consulte a descrição do bit EEPE para um procedimento de gravação EEPROM.

• Bit 1 – EEPE: Habilitar Gravação EEPROM

O sinal de habilitação de gravação da EEPROM EEPE é o estroboscópio de gravação na EEPROM. Quando o endereço e os dados estão configurados
corretamente, o bit EEPE deve ser gravado em um para gravar o valor na EEPROM. O bit EEMPE deve ser escrito em um antes que um bit lógico seja escrito
no EEPE, caso contrário não ocorre nenhuma escrita na EEPROM. O seguinte procedimento deve ser seguido ao escrever a EEPROM (a ordem das etapas
3 e 4 não é essencial):
1. Aguarde até que EEPE se torne zero.

2. Aguarde até que SELFPRGEN em SPMCSR se torne zero.

3. Escreva o novo endereço EEPROM no EEAR (opcional).

4. Grave novos dados EEPROM no EEDR (opcional).

5. Escreva um lógico no bit EEMPE enquanto escreve um zero no EEPE no EECR.

6. Dentro de quatro ciclos de clock após configurar o EEMPE, escreva um lógico no EEPE.

A EEPROM não pode ser programada durante uma escrita da CPU na memória flash. O software deve verificar se a programação do flash foi concluída
antes de iniciar uma nova gravação na EEPROM. O passo 2 só é relevante se o software contiver um carregador de inicialização permitindo que a CPU
programe o flash. Se o flash nunca estiver sendo atualizado pela CPU, a etapa 2 pode ser omitida. Consulte a Seção 26. “Suporte ao carregador de
inicialização – Autoprogramação de leitura-enquanto-gravação” na página 229 para obter detalhes sobre a programação de inicialização.

Atenção: Uma interrupção entre o passo 5 e o passo 6 fará com que o ciclo de escrita falhe, pois a habilitação de escrita do mestre EEPROM irá expirar. Se
uma rotina de interrupção acessando a EEPROM estiver interrompendo outro acesso à EEPROM, o registro EEAR ou EEDR será modificado,
fazendo com que o acesso interrompido à EEPROM falhe. Recomenda-se que o sinalizador de interrupção global seja limpo durante todas as
etapas para evitar esses problemas.

Quando o tempo de acesso de gravação tiver decorrido, o bit EEPE é limpo pelo hardware. O software do usuário pode pesquisar este bit e esperar por um
zero antes de escrever o próximo byte. Quando o EEPE é definido, a CPU é parada por dois ciclos antes que a próxima instrução seja executada.

• Bit 0 – EERE: Ativação de leitura de EEPROM

O sinal de habilitação de leitura da EEPROM EERE é o estroboscópio de leitura para a EEPROM. Quando o endereço correto é configurado no registrador
EEAR, o bit EERE deve ser escrito em um lógico para acionar a leitura da EEPROM. O acesso de leitura da EEPROM leva uma instrução e os dados solicitados
ficam disponíveis imediatamente. Quando a EEPROM é lida, a CPU é parada por quatro ciclos antes que a próxima instrução seja executada.

O usuário deve pesquisar o bit EEPE antes de iniciar a operação de leitura. Se uma operação de escrita estiver em andamento, não é possível ler a EEPROM,
nem alterar o registro EEAR.

ATmega328P [FICHA DE DADOS] 21


7810D–AVR–01/15
Machine Translated by Google

O oscilador calibrado é usado para cronometrar os acessos à EEPROM. A Tabela 7-2 lista o tempo de programação típico para acesso à EEPROM da
CPU.

Tabela 7-2. Tempo de programação EEPROM

Símbolo Número de ciclos do oscilador RC calibrados Tempo de Programação Típico

EEPROM escrever (de


26.368 3,3 ms
CPU)

Os exemplos de código a seguir mostram um assembly e uma função C para gravar na EEPROM. Os exemplos assumem que as interrupções são
controladas (por exemplo, desabilitando as interrupções globalmente) para que nenhuma interrupção ocorra durante a execução dessas funções. Os
exemplos também assumem que nenhum carregador de inicialização flash está presente no software. Se esse código estiver presente, a função de
gravação da EEPROM também deve aguardar a conclusão de qualquer comando SPM em andamento.

Exemplo de código de montagem

EEPROM_write:
; Aguarde a conclusão da gravação anterior
sbic EECR,EEPE
rjmp EEPROM_write
; Configure o endereço (r18:r17) no registro de endereço
Fora EEARH, r18
Fora EEARL, r17
; Gravar dados (r16) no Registro de Dados
Fora EEDR, r16
; Escreva um lógico para EEMPE
sbi EECR, EEMPE
; Inicie a gravação de eeprom configurando EEPE
sbi EECR,EEPE
ret

Exemplo de código C

void EEPROM_write(unsigned int uiAddress, unsigned char ucData)


{
/* Aguarda a conclusão da escrita anterior */
while(EECR & (1<<EEPE))
;
/* Configura o endereço e os registros de dados */
EEAR = uiAddress;
EEDR = ucDados;
/* Escreve um lógico no EEMPE */
EECR |= (1<<EEMPE);
/ * Inicia a gravação de eeprom configurando EEPE */
EECR |= (1<<EEPE);
}

22 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

Os próximos exemplos de código mostram as funções assembly e C para ler a EEPROM. Os exemplos assumem que as interrupções são controladas
para que nenhuma interrupção ocorra durante a execução dessas funções.

Exemplo de código de montagem

EEPROM_ler:
; Aguarde a conclusão da gravação anterior
sbic EECR,EEPE
rjmp EEPROM_read
; Configure o endereço (r18:r17) no registro de endereço
Fora EEARH, r18
Fora EEARL, r17
; Inicie a leitura da eeprom escrevendo EERE
sbi EECR,EERE
; Ler dados do Registro de Dados
dentro r16, EEDR
ret

Exemplo de código C

unsigned char EEPROM_read(unsigned int uiAddress)


{
/ * Aguarda a conclusão da escrita anterior */
while(EECR & (1<<EEPE))
;
/* Configura o cadastro de endereços */
EEAR = uiAddress;
/* Inicia a leitura da eeprom escrevendo EERE */
EECR |= (1<<EERE);
/ * Retorna dados do Data Register */
retornar EEDR;
}

7.6.4 GPIOR2 – Registro de E/S de Uso Geral 2

Pedaço 7 6 5 4 3 2 1 0

0x2B (0x4B) MSB LSB GPIOR2


Ler escrever R/W R/W R/W R/W R/W R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

7.6.5 GPIOR1 - Registro de E/S de Uso Geral 1

Pedaço 7 6 5 4 3 2 1 0

0x2A (0x4A) MSB LSB GPIOR1


Ler escrever R/W R/W R/W R/W R/W R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

7.6.6 GPIOR0 – Registro de E/S de Uso Geral 0

Pedaço 7 6 5 4 3 2 1 0

0x1E (0x3E) MSB LSB GPIOR0


Ler escrever R/W R/W R/W R/W R/W R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

ATmega328P [FICHA DE DADOS] 23


7810D–AVR–01/15
Machine Translated by Google

8. Relógio do Sistema e Opções de Relógio

8.1 Sistemas de Relógios e sua Distribuição


A Figura 8-1 apresenta os principais sistemas de clock do AVR® e sua distribuição. Todos os relógios não precisam estar ativos em um determinado
momento. Para reduzir o consumo de energia, os relógios dos módulos que não estão sendo usados podem ser interrompidos usando diferentes
modos de suspensão, conforme descrito na Seção 9. “Gerenciamento de energia e modos de suspensão” na página 34. Os sistemas de relógio são
detalhados abaixo.

Figura 8-1. Distribuição de relógio

Assíncrono E/S geral Flash e


ADC Núcleo da CPU BATER
Temporizador/Contador Módulos EEPROM

clkADC

clkI/O Relógio AVR clkCPU


Unidade de controle

clkASY clkFLASH

Relógio do sistema
Pré-escalador
Redefinir lógica Cronômetro de vigilância

Relógio de origem Relógio de cão de guarda

Relógio cão de guarda


Multiplexador Oscilador

Temporizador/Contador Cristal Baixa frequência RC calibrado


Relógio externo
Oscilador Oscilador Oscilador de cristal Oscilador

8.1.1 CPU Clock – clkCPU


O clock da CPU é roteado para partes do sistema relacionadas à operação do núcleo AVR. Exemplos de tais módulos são o arquivo de registrador de
uso geral, o registrador de status e a memória de dados que contém o ponteiro de pilha. Parar o clock da CPU inibe o núcleo de realizar operações e
cálculos gerais.

8.1.2 Relógio de E/S – clkI/O


O relógio de E/S é usado pela maioria dos módulos de E/S, como Timer/Counters, SPI e USART. O relógio de E/S também é usado pelo módulo de
interrupção externo, mas observe que algumas interrupções externas são detectadas pela lógica assíncrona, permitindo que tais interrupções sejam
detectadas mesmo se o relógio de E/S for interrompido. Observe também que a detecção de condição de início no módulo USI é realizada de forma
assíncrona quando clkI/O é interrompido, reconhecimento de endereço TWI em todos os modos de suspensão.

8.1.3 Relógio Flash – clkFLASH


O relógio flash controla a operação da interface flash. O flash clock geralmente está ativo simultaneamente com o clock da CPU.

24 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

8.1.4 Relógio Temporizador Assíncrono – clkASY

O relógio temporizador assíncrono permite que o temporizador/contador assíncrono seja sincronizado diretamente de um relógio externo ou de um cristal
de relógio externo de 32kHz. O domínio de relógio dedicado permite usar este Timer/Counter como um contador em tempo real mesmo quando o dispositivo
está em modo de suspensão.

8.1.5 Relógio ADC – clkADC

O ADC é fornecido com um domínio de relógio dedicado. Isso permite interromper os clocks da CPU e de E/S para reduzir o ruído gerado pelos circuitos
digitais. Isso fornece resultados de conversão ADC mais precisos.

8.2 Fontes de Relógio

O dispositivo tem as seguintes opções de fonte de relógio, selecionáveis por bits de fusível de flash, conforme mostrado abaixo. O relógio da fonte
selecionada é inserido no gerador de relógio AVR® e roteado para os módulos apropriados.

Tabela 8-1. Seleção de opções de relógio do dispositivo(1)

Opção de relógio do dispositivo CKSEL3..0

Oscilador de cristal de baixa potência 1111 - 1000

Oscilador de cristal full swing 0111 - 0110

Oscilador de cristal de baixa frequência 0101 - 0100

Oscilador RC interno de 128kHz 0011

Oscilador RC interno calibrado 0010

Relógio externo 0000

Reservado 0001

Nota: 1. Para todos os fusíveis “1” significa não programado enquanto “0” significa programado.

8.2.1 Fonte de Relógio Padrão

O dispositivo é fornecido com oscilador RC interno a 8,0MHz e com o fusível CKDIV8 programado, resultando em clock do sistema de 1,0MHz. O
tempo de inicialização é definido como máximo e o período de tempo limite ativado. (CKSEL = “0010”, SUT = “10”, CKDIV8 = “0”). A configuração
padrão garante que todos os usuários possam fazer a configuração de fonte de relógio desejada usando qualquer interface de programação disponível.

8.2.2 Sequência de inicialização do relógio

Qualquer fonte de clock precisa de um VCC suficiente para começar a oscilar e um número mínimo de ciclos de oscilação antes que possa ser
considerada estável.

Para garantir VCC suficiente , o dispositivo emite uma reinicialização interna com um atraso de tempo limite (tTOUT) após a reinicialização do dispositivo
ser liberada por todas as outras fontes de reinicialização. A Seção 10. “Controle e Reinicialização do Sistema” na página 40 descreve as condições de
partida para a reinicialização interna. O atraso (tTOUT) é cronometrado a partir do oscilador watchdog e o número de ciclos no atraso é definido pelos bits
de fusível SUTx e CKSELx. Os atrasos selecionáveis são mostrados na Tabela 8-2. A frequência do oscilador watchdog depende da tensão, conforme
mostrado na Seção 29. “Características típicas” na página 268.

Tabela 8-2. Número de ciclos do oscilador watchdog

Tipo de tempo limite (VCC = 5,0V) Tipo de tempo limite (VCC = 3,0V) Número de ciclos
0ms 0ms 0

4,1 ms 4,3 ms 512

65ms 69 ms 8K (8.192)

O principal objetivo do atraso é manter o AVR em reset até que seja fornecido com VCC mínimo. O atraso não monitorará a tensão real e será necessário
selecionar um atraso maior que o tempo de subida do VCC . Se isso não for possível, um circuito interno ou externo de detecção de brown-out deve ser
usado. Um circuito BOD garantirá VCC suficiente antes de liberar o reset, e o atraso de tempo limite pode ser desabilitado. Desativar o atraso de tempo
limite sem utilizar um circuito de detecção de brown-out não é recomendado.

ATmega328P [FICHA DE DADOS] 25


7810D–AVR–01/15
Machine Translated by Google

O oscilador deve oscilar por um número mínimo de ciclos antes que o relógio seja considerado estável. Um contador de ondulação interno monitora
o clock de saída do oscilador e mantém o reset interno ativo por um determinado número de ciclos de clock. A redefinição
é então liberado e o dispositivo começará a ser executado. O tempo de inicialização recomendado do oscilador depende do tipo de clock e varia
de 6 ciclos para um clock aplicado externamente a 32K ciclos para um cristal de baixa frequência.

A sequência de inicialização do relógio inclui o atraso de tempo limite e o tempo de inicialização quando o dispositivo é inicializado após a
reinicialização. Ao iniciar a partir do modo de economia de energia ou desligamento, o VCC é considerado em um nível suficiente e apenas o
tempo de inicialização é incluído.

8.3 Oscilador de Cristal de Baixa Potência


Os pinos XTAL1 e XTAL2 são entrada e saída, respectivamente, de um amplificador inversor que pode ser configurado para uso como oscilador
on-chip, conforme mostrado na Figura 8-2. Pode ser usado um cristal de quartzo ou um ressonador cerâmico.

Este oscilador de cristal é um oscilador de baixa potência, com oscilação de tensão reduzida na saída XTAL2. Ele oferece o menor consumo de
energia, mas não é capaz de acionar outras entradas de clock e pode ser mais suscetível a ruídos em ambientes ruidosos. Nesses casos, consulte
a Seção 8.4 “Oscilador de Cristal Full Swing” na página 27.

C1 e C2 devem sempre ser iguais para cristais e ressonadores. O valor ideal dos capacitores depende do cristal ou ressonador em uso, da
quantidade de capacitância parasita e do ruído eletromagnético do ambiente. Algumas diretrizes iniciais para a escolha de capacitores para uso com
cristais são fornecidas na Tabela 8-3. Para ressonadores cerâmicos, devem ser utilizados os valores dos capacitores fornecidos pelo fabricante.

Figura 8-2. Conexões do oscilador de cristal

C2

XTAL2 (TOSC2)

C1

XTAL1 (TOSC1)

GND

O oscilador de baixa potência pode operar em três modos diferentes, cada um otimizado para uma faixa de frequência específica. O modo de
operação é selecionado pelos fusíveis CKSEL3..1 conforme mostrado na Tabela 8-3.

Tabela 8-3. Modos de operação do oscilador de cristal de baixa potência (2)

Alcance de frequência Faixa recomendada para


(MHz) Capacitores C1 e C2 (pF) CKSEL3..1

0,4 a 0,9 – 100(1)


0,9 a 3,0 12 a 22 101

3,0 a 8,0 12 a 22 110

8,0 a 16,0 12 a 22 111

Observações: 1. .Esta opção não deve ser utilizada com cristais, somente com ressonadores cerâmicos.
2. Se a frequência de 8MHz exceder a especificação do dispositivo (depende do VCC), o fusível CKDIV8 pode ser
programado para dividir a frequência interna por 8. Deve-se garantir que o clock dividido resultante atenda à especificação de
frequência do dispositivo.

26 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

O fusível CKSEL0 junto com os fusíveis SUT1..0 selecionam os tempos de partida conforme mostrado na Tabela 8-4.

Tabela 8-4. Tempos de inicialização para a seleção do relógio do oscilador de cristal de baixa potência

Fonte / Potência do Oscilador Tempo de inicialização a partir do Atraso Adicional de


Condições desligamento e economia de energia Reinicialização (VCC = 5,0V) CKSEL0 SUT1..0

Ressonador cerâmico, subindo rapidamente


258CK 14CK + 4,1ms(1) 0 00
potência

Ressonador de cerâmica, subindo lentamente


258CK 14CK + 65ms(1) 0 01
potência

Ressonador cerâmico, BOD


1KCK 14CK(2) 0 10
habilitado

Ressonador cerâmico, subindo rapidamente


1KCK 14CK + 4,1ms(2) 0 11
potência

Ressonador de cerâmica, subindo lentamente


1KCK 14CK + 65ms(2) 1 00
potência

Oscilador de cristal, BOD habilitado 16KCK 14CK 1 01

Oscilador de cristal, subindo rapidamente


16KCK 14CK + 4,1ms 1 10
potência

Oscilador de cristal, subindo lentamente


16KCK 14CK + 65ms 1 11
potência

Observações: 1. Essas opções só devem ser utilizadas quando não estiverem operando próximo à frequência máxima do dispositivo, e
somente se a estabilidade de frequência na partida não for importante para a aplicação. Essas opções não são adequadas para cristais.

2. Essas opções destinam-se ao uso com ressonadores cerâmicos e garantirão a estabilidade da frequência na partida.
Eles também podem ser usados com cristais quando não estiverem operando perto da frequência máxima do dispositivo e se a estabilidade da
frequência na partida não for importante para a aplicação.

8.4 Oscilador de cristal de giro completo


Os pinos XTAL1 e XTAL2 são entrada e saída, respectivamente, de um amplificador inversor que pode ser configurado para uso como oscilador no chip, conforme
mostrado na Figura 8-2 na página 26. Pode ser usado um cristal de quartzo ou um ressonador cerâmico .

Este oscilador de cristal é um oscilador full swing, com swing rail-to-rail na saída XTAL2. Isso é útil para acionar outras entradas de clock e em ambientes ruidosos. O
consumo de corrente é maior do que o da Seção 8.3 “Oscilador de cristal de baixa potência” na página 26. Observe que o oscilador de cristal de giro total funcionará
apenas para VCC = 2,7 a 5,5V.

C1 e C2 devem sempre ser iguais para cristais e ressonadores. O valor ideal dos capacitores depende do cristal ou ressonador em uso, da quantidade de
capacitância parasita e do ruído eletromagnético do ambiente. Algumas diretrizes iniciais para a escolha de capacitores para uso com cristais são fornecidas na
Tabela 8-6 na página 28. Para ressonadores cerâmicos, os valores de capacitor fornecidos pelo fabricante devem ser usados.

O modo de operação é selecionado pelos fusíveis CKSEL3..1 conforme mostrado na Tabela 8-5.

Tabela 8-5. Modos de operação do oscilador de cristal de giro completo(2)

Faixa recomendada para


Faixa de Frequência(1) (MHz) Capacitores C1 e C2 (pF) CKSEL3..1

0,4 - 16 12 - 22 011

Notas: 1. As faixas de frequência são valores preliminares. Os valores reais são TBD.

2. Se a frequência de 8MHz exceder a especificação do dispositivo (depende do VCC), o fusível CKDIV8 pode ser
programado para dividir a frequência interna por 8. Deve-se garantir que o clock dividido resultante atenda à especificação de frequência do
dispositivo.

ATmega328P [FICHA DE DADOS] 27


7810D–AVR–01/15
Machine Translated by Google

Figura 8-3. Conexões do oscilador de cristal


C2

XTAL2 (TOSC2)

C1

XTAL1 (TOSC1)

GND

Tabela 8-6. Tempos de inicialização para a seleção do relógio do oscilador de cristal Full Swing

Fonte do oscilador / Tempo de inicialização a partir do Atraso Adicional de


Condições de energia desligamento e economia de energia Reinicialização (VCC = 5,0V) CKSEL0 SUT1..0

Ressonador cerâmico, potência em rápida


258CK 14CK + 4,1ms(1) 0 00
ascensão

Ressonador cerâmico, potência em


258CK 14CK + 65ms(1) 0 01
ascensão lenta

Ressonador cerâmico, BOD


1KCK 14CK(2) 0 10
habilitado

Ressonador cerâmico, potência em rápida


1KCK 14CK + 4,1ms(2) 0 11
ascensão

Ressonador cerâmico, potência em


1KCK 14CK + 65ms(2) 1 00
ascensão lenta

Oscilador de cristal, BOD habilitado 16KCK 14CK 1 01

Oscilador de cristal, potência em rápida


16KCK 14CK + 4,1ms 1 10
ascensão

Oscilador de cristal, potência subindo


16KCK 14CK + 65ms 1 11
lentamente

Observações: 1. Essas opções devem ser usadas somente quando não estiver operando próximo à frequência máxima do dispositivo e
somente se a estabilidade da frequência na partida não for importante para a aplicação. Essas opções não são adequadas
para cristais.
2. Essas opções destinam-se ao uso com ressonadores cerâmicos e garantirão a estabilidade da frequência na partida.
Eles também podem ser usados com cristais quando não estiverem operando perto da frequência máxima do dispositivo e se a
estabilidade da frequência na partida não for importante para a aplicação.

28 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

8.5 Oscilador de Cristal de Baixa Frequência


O oscilador de cristal de baixa frequência é otimizado para uso com um cristal de relógio de 32,768kHz. Ao selecionar cristais, capacitância de carga e
resistência em série equivalente do cristal, o ESR deve ser levado em consideração. Ambos os valores são especificados pelo fornecedor do cristal. O oscilador
ATmega328P é otimizado para consumo de energia muito baixo e, portanto, ao selecionar cristais, consulte a Tabela 8-7 para recomendações máximas de
ESR em cristais de 6,5pF, 9,0pF e 12,5pF

Tabela 8-7. Recomendação máxima de ESR para cristal de 32,768 kHz

Cristal CL (pF) Max ESR [kÿ] (1)


6,5 75

9,0 65

12,5 30

Nota: 1. ESR máximo é um valor típico baseado na caracterização

O oscilador de cristal de baixa frequência fornece uma capacitância de carga interna típica de 6pF em cada pino TOSC. A capacitância externa (C)
necessária em cada pino TOSC pode ser calculada usando:
C 2 =CL ÿ –
CS

onde CL é a capacitância de carga para um cristal de 32,768kHz especificado pelo fornecedor do cristal e CS é a capacitância parasita total para
um pino TOSC.

Cristais especificando capacitância de carga (CL) maior que 6pF, requerem capacitores externos aplicados conforme descrito em
Figura 8-2 na página 26.

O oscilador de cristal de baixa frequência deve ser selecionado ajustando os fusíveis CKSEL para “0110” ou “0111”, conforme mostrado na Tabela 8-9.
Os tempos de partida são determinados pelos fusíveis SUT conforme mostrado na Tabela 8-8.

Tabela 8-8. Tempos de inicialização para a seleção do relógio do oscilador de cristal de baixa frequência

SUT1..0 Atraso Adicional de Reinicialização (VCC = 5,0V) Uso recomendado


00 4CK Potência de aumento rápido ou BOD habilitado

01 4CK + 4,1ms Potência subindo lentamente

10 4CK + 65ms Frequência estável na inicialização


11 Reservado

Tabela 8-9. Tempos de inicialização para a seleção do relógio do oscilador de cristal de baixa frequência

Tempo de inicialização de
CKSEL3..0 Desligar e economizar energia Uso recomendado
0100(1) 1KCK

0101 32KCK Frequência estável na inicialização


Nota: 1. Esta opção só deve ser usada se a estabilidade de frequência na partida não for importante para a aplicação

8.6 Oscilador RC interno calibrado


Por padrão, o oscilador RC interno fornece um clock aproximado de 8,0 MHz. Embora dependente da tensão e da temperatura, este relógio pode ser calibrado
com muita precisão pelo usuário. Consulte a Tabela 28-1 na página 260 para obter mais detalhes. O dispositivo é fornecido com o fusível CKDIV8 programado.
Consulte a Seção 8.11 “Prescaler de relógio do sistema” na página 32 para obter mais detalhes.

Este relógio pode ser selecionado como relógio do sistema programando os fusíveis CKSEL conforme mostrado na Tabela 8-10 na página 30. Se selecionado,
ele funcionará sem componentes externos. Durante a reinicialização, o hardware carrega o valor de calibração pré-programado no registro OSCCAL e, assim,
calibra automaticamente o oscilador RC. A precisão desta calibração é mostrada como calibração de fábrica na Tabela 28-1 na página 260.

ATmega328P [FICHA DE DADOS] 29


7810D–AVR–01/15
Machine Translated by Google

Alterando o registro OSCCAL de SW, consulte a Seção 8.12.1 “OSCCAL – Registro de Calibração do Oscilador” na página 32, é possível obter uma precisão de
calibração maior do que usando a calibração de fábrica. A precisão desta calibração é mostrada como calibração do usuário na Tabela 28-1 na página 260.

Quando este oscilador é usado como chip clock, o oscilador watchdog ainda será usado para o watchdog timer e para o reset time-out. Para obter mais
informações sobre o valor de calibração pré-programado, consulte a Seção 27.4 “Byte de calibração” na página 244.

Tabela 8-10. Modos de operação do oscilador RC calibrado interno (1)(2)

Frequência Nominal (MHz) CKSEL3..0

8 0010

Notas: 1. O dispositivo é fornecido com esta opção selecionada.

2. Se a frequência de 8MHz exceder a especificação do dispositivo (depende do VCC), o fusível CKDIV8 pode ser
programado para dividir a frequência interna por 8.

Quando este oscilador é selecionado, os tempos de partida são determinados pelos fusíveis SUT conforme mostrado na Tabela 8-11.

Tabela 8-11. Tempos de inicialização para a seleção do relógio do oscilador RC calibrado interno

Tempo de inicialização desde o desligamento e Atraso Adicional de Reinicialização


Condições de energia Economia de energia (VCC = 5,0V) SUT1..0

BOD ativado 6CK 14CK(1) 00

Potência em ascensão rápida 6CK 14CK + 4,1ms 01

Potência subindo lentamente 6CK 14CK + 65ms(2) 10

Reservado 11

Notas: 1. Se o fusível RSTDISBL estiver programado, este tempo de inicialização será aumentado para 14CK + 4,1ms
para garantir que o modo de programação possa ser inserido.

2. O dispositivo é fornecido com esta opção selecionada.

Oscilador Interno de 8,7 128 kHz


O oscilador interno de 128kHz é um oscilador de baixa potência que fornece um clock de 128kHz. A frequência é nominal em 3V e 25°C. Este relógio pode ser
selecionado como o relógio do sistema programando os fusíveis CKSEL para “11” conforme mostrado na Tabela 8-12.
.
Tabela 8-12. Modos de operação do oscilador interno de 128kHz

Frequência Nominal CKSEL3..0

128kHz 0011

Quando esta fonte de relógio é selecionada, os tempos de inicialização são determinados pelos fusíveis SUT conforme mostrado na Tabela 8-13.

Tabela 8-13. Tempos de inicialização para o oscilador interno de 128 kHz

Tempo de inicialização desde o desligamento e


Condições de energia Economia de energia Atraso Adicional da Reinicialização SUT1..0

BOD ativado 6CK 14CK(1) 00

Potência em ascensão rápida 6CK 14CK + 4ms 01

Potência subindo lentamente 6CK 14CK + 64ms 10

Reservado 11

Nota: 1. Se o fusível RSTDISBL estiver programado, este tempo de inicialização será aumentado para 14CK + 4,1ms
para garantir que o modo de programação possa ser inserido.

30 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

8,8 Relógio externo

Para acionar o dispositivo a partir de uma fonte de clock externa, o XTAL1 deve ser acionado conforme mostrado na Figura 8-4. Para operar o dispositivo em um
relógio externo, os fusíveis CKSEL devem ser programados para “0000” (consulte a Tabela 8-14).

Tabela 8-14. Frequência do Relógio do Oscilador de Cristal

Frequência CKSEL3..0

0 a 16MHz 0000

Figura 8-4. Configuração do Drive de Relógio Externo

NC XTAL2

EXTERNO
RELÓGIO XTAL1
SINAL

GND

Quando esta fonte de relógio é selecionada, os tempos de inicialização são determinados pelos fusíveis SUT conforme mostrado na Tabela 8-15.

Tabela 8-15. Tempos de inicialização para a seleção do relógio externo

Tempo de inicialização desde o desligamento e Atraso Adicional de Reinicialização


Condições de energia Economia de energia (VCC = 5,0V) SUT1..0

BOD ativado 6CK 14CK 00

Potência em ascensão rápida 6CK 14CK + 4,1ms 01

Potência subindo lentamente 6CK 14CK + 65ms 10

Reservado 11

Ao aplicar um relógio externo, é necessário evitar mudanças repentinas na frequência do relógio aplicado para garantir uma operação estável do MCU. Uma
variação na frequência de mais de 2% de um ciclo de clock para o próximo pode levar a um comportamento imprevisível. Se forem necessárias alterações de mais
de 2%, certifique-se de que o MCU seja mantido em reinicialização durante as alterações.

Observe que o pré-escalador do relógio do sistema pode ser usado para implementar mudanças em tempo de execução da frequência do relógio interno enquanto
ainda garante uma operação estável. Consulte a Seção 8.11 “Prescaler de relógio do sistema” na página 32 para obter detalhes.

8.9 Buffer de saída do relógio


O dispositivo pode emitir o relógio do sistema no pino CLKO. Para habilitar a saída, o fusível CKOUT deve ser programado.
Este modo é adequado quando o clock do chip é usado para acionar outros circuitos no sistema. O relógio também será emitido durante a reinicialização, e a
operação normal do pino de E/S será anulada quando o fusível for programado. Qualquer fonte de relógio, incluindo o oscilador RC interno, pode ser selecionada
quando o relógio é emitido em CLKO. Se o pré-escalador do relógio do sistema for usado, é o relógio do sistema dividido que será emitido.

ATmega328P [FICHA DE DADOS] 31


7810D–AVR–01/15
Machine Translated by Google

8.10 Temporizador/Oscilador do Contador

Atmel® ATmega328P usa o mesmo oscilador de cristal para oscilador de baixa frequência e oscilador Timer/Counter. Consulte a Seção 8.5 “Oscilador de cristal
de baixa frequência” na página 29 para obter detalhes sobre os requisitos do oscilador e do cristal.

Atmel ATmega328P compartilha os pinos do oscilador Timer/Counter (TOSC1 e TOSC2) com XTAL1 e XTAL2. Ao usar o oscilador Timer/Counter, o relógio do
sistema precisa ser quatro vezes a frequência do oscilador. Devido a isso e ao compartilhamento de pinos, o oscilador Timer/Counter só pode ser usado quando
o oscilador RC interno calibrado for selecionado como fonte de relógio do sistema.

A aplicação de uma fonte de clock externa ao TOSC1 pode ser feita se EXTCLK no registrador ASSR for escrito no lógico um. Consulte a Seção 17.9 “Operação
Assíncrona do Temporizador/Contador2” na página 126 para obter mais descrições sobre como selecionar o relógio externo como entrada em vez de um cristal
de relógio de 32,768kHz.

8.11 Pré-escalador do Relógio do Sistema


O Atmel ATmega328P possui um pré-escalador do relógio do sistema e o relógio do sistema pode ser dividido configurando a Seção 8.12.2 “CLKPR – Registro
de pré-escala do relógio” na página 33. Este recurso pode ser usado para diminuir a frequência do relógio do sistema e o consumo de energia ao o requisito de
poder de processamento é baixo. Isso pode ser usado com todas as opções de fonte de clock e afetará a frequência de clock da CPU e todos os periféricos
síncronos. clkI/O, clkADC, clkCPU e clkFLASH são divididos por um fator conforme mostrado na Tabela 28-4 na página 261.

Ao alternar entre as configurações do prescaler, o prescaler do relógio do sistema garante que não ocorram falhas no sistema do relógio.
Também garante que nenhuma frequência intermediária seja maior que a frequência de clock correspondente à configuração anterior, nem a frequência de
clock correspondente à nova configuração. O contador de ondulação que implementa o prescaler é executado na frequência do clock indiviso, que pode ser mais
rápido que a frequência do clock da CPU. Portanto, não é possível determinar o estado do prescaler - mesmo que seja legível, e o tempo exato que leva para
alternar de uma divisão de clock para outra não pode ser previsto com exatidão. A partir do momento em que os valores de CLKPS são escritos, leva entre T1 +
T2 e T1 + 2 ÿ T2 antes que a nova frequência de clock seja ativada. Neste intervalo, são produzidas 2 bordas de clock ativas. Aqui, T1 é o período de relógio
anterior e T2 é o período correspondente à nova configuração do pré-escalador.

Para evitar mudanças não intencionais de freqüência de clock, um procedimento de escrita especial deve ser seguido para alterar os bits CLKPS:
1. Escreva o bit de habilitação de alteração do prescaler de clock (CLKPCE) para um e todos os outros bits em CLKPR para zero.

2. Dentro de quatro ciclos, escreva o valor desejado no CLKPS enquanto escreve um zero no CLKPCE.

As interrupções devem ser desativadas ao alterar a configuração do prescaler para garantir que o procedimento de gravação não seja interrompido.

8.12 Descrição do Registro

8.12.1 OSCCAL – Registro de Calibração do Oscilador

Pedaço 7 6 5 4 3 2 1 0

(0x66) CAL7 CAL6 CAL5 CAL4 CAL3 CAL2 CAL1 CAL0 OSCCAL
Ler escrever R/W R/W R/W R/W R/W R/W R/W R/W
Valor inicial Valor de calibração específico do dispositivo

• Bits 7..0 – CAL7..0: Valor de calibração do oscilador

O registro de calibração do oscilador é usado para ajustar o oscilador RC interno calibrado para remover as variações do processo do
frequência do oscilador. Um valor de calibração pré-programado é gravado automaticamente neste registro durante a reinicialização do chip, fornecendo a
frequência calibrada de fábrica conforme especificado na Tabela 28-1 na página 260. O software aplicativo pode gravar esse registro para alterar a frequência do
oscilador. O oscilador pode ser calibrado para frequências conforme especificado na Tabela 28-1 na página 260.
A calibração fora dessa faixa não é garantida.

Observe que esse oscilador é usado para cronometrar acessos de gravação à EEPROM e flash, e esses tempos de gravação serão afetados de acordo.
Se o EEPROM ou flash estiver gravado, não calibre para mais de 8,8 MHz. Caso contrário, a gravação de EEPROM ou flash pode falhar.

O bit CAL7 determina a faixa de operação do oscilador. Definir este bit como 0 fornece a faixa de frequência mais baixa, definir esse bit como 1 fornece a
faixa de frequência mais alta. As duas faixas de frequência se sobrepõem, ou seja, uma configuração de OSCCAL = 0x7F fornece uma frequência mais alta que
OSCCAL = 0x80.

Os bits CAL6..0 são usados para sintonizar a frequência dentro da faixa selecionada. Uma configuração de 0x00 fornece a frequência mais baixa nessa faixa e
uma configuração de 0x7F fornece a frequência mais alta da faixa.

32 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

8.12.2 CLKPR - Registro de Pré-escala do Relógio

Pedaço 7 6 5 4 3 2 1 0
CLKPCE – – – CLKPS3 CLKPS2 CLKPS1 CLKPS0 CLKPR
(0x61)
Ler escrever R/W R R R R/W R/W R/W R/W
Valor inicial 0 0 0 0 Veja a descrição do bit

• Bit 7 – CLKPCE: Ativar alteração do pré-escalador de relógio


O bit CLKPCE deve ser escrito na lógica um para permitir a mudança dos bits CLKPS. O bit CLKPCE só é atualizado quando os outros bits em
CLKPR são escritos simultaneamente em zero. O CLKPCE é apagado pelo hardware quatro ciclos após ser gravado ou quando os bits do
CLKPS são gravados. Reescrever o bit CLKPCE dentro desse período de tempo limite não estende o período de tempo limite nem limpa o bit
CLKPCE.

• Bits 3..0 – CLKPS3..0: Bits de seleção do pré-escalador de relógio 3 - 0

Esses bits definem o fator de divisão entre a fonte de clock selecionada e o clock interno do sistema. Esses bits podem ser escritos em
tempo de execução para variar a frequência do relógio para atender aos requisitos da aplicação. Como o divisor divide a entrada do relógio
mestre para o MCU, a velocidade de todos os periféricos síncronos é reduzida quando um fator de divisão é usado. Os fatores de divisão são
fornecidos na Tabela 8-16.
O fusível CKDIV8 determina o valor inicial dos bits CLKPS. Se o CKDIV8 não estiver programado, os bits CLKPS serão redefinidos para “0000”.
Se CKDIV8 estiver programado, os bits CLKPS são redefinidos para “0011”, dando um fator de divisão de 8 na inicialização. Este recurso deve
ser usado se a fonte de relógio selecionada tiver uma frequência mais alta que a frequência máxima do dispositivo nas atuais condições
de operação. Observe que qualquer valor pode ser gravado nos bits CLKPS, independentemente da configuração do fusível CKDIV8. O
software aplicativo deve garantir que um fator de divisão suficiente seja escolhido se a fonte de relógio selecionada tiver uma frequência
mais alta que a frequência máxima do dispositivo nas atuais condições de operação. O dispositivo é fornecido com o fusível CKDIV8
programado.

Tabela 8-16. Seleção do pré-escalador de relógio

CLKPS3 CLKPS2 CLKPS1 CLKPS0 Fator de divisão do relógio

0 0 0 0 1
0 0 0 1 2
0 0 1 0 4
0 0 1 1 8
0 1 0 0 16
0 1 0 1 32
0 1 1 0 64
0 1 1 1 128
1 0 0 0 256
1 0 0 1 Reservado
1 0 1 0 Reservado
1 0 1 1 Reservado
1 1 0 0 Reservado
1 1 0 1 Reservado
1 1 1 0 Reservado
1 1 1 1 Reservado

ATmega328P [FICHA DE DADOS] 33


7810D–AVR–01/15
Machine Translated by Google

9. Gerenciamento de energia e modos de suspensão


Os modos de suspensão permitem que o aplicativo desligue os módulos não utilizados no MCU, economizando energia. O AVR®
oferece vários modos de suspensão, permitindo ao usuário adequar o consumo de energia aos requisitos do aplicativo.
Quando ativado, o detector de brown-out (BOD) monitora ativamente a tensão da fonte de alimentação durante os períodos de inatividade. Para economizar
ainda mais energia, é possível desabilitar o BOD em alguns modos de suspensão. Consulte a Seção 9.2 “Desativar BOD” na página 35 para obter mais
detalhes.

9.1 Modos de suspensão

A Figura 8-1 na página 24 apresenta os diferentes sistemas de clock do Atmel® ATmega328P e sua distribuição. A figura é útil para
selecionar um modo de suspensão apropriado. A Tabela 9-1 mostra os diferentes modos de suspensão, suas fontes de ativação BOD
desabilitam a capacidade.

Tabela 9-1. Domínios de relógio ativos e fontes de despertar nos diferentes modos de suspensão.
Domínios de relógio ativos Osciladores Fontes de despertar

CPU

clique clkFLASH clkIO clkADC clkASY principal


Relógio ativada
Fonte temporizador
Oscilador
do Habilitado INT1,
INT0
e Alteração
pino
de Endereço
TWI Combine Temporizador2 EEPROM
SPM/ Preparar ADC WDT Outro/
O Programas Desativar
BOD

Modo dormir
Parado XXXX X(2) X X X XXXX
Ruído ADC X(2) X(3)
XXX X X(2) XXX
Redução

Desligar X(3) X X X
Economia de energia X X(2) X(3) X X X X
X X(3) X X X
Em espera(1)
Estendido X(2) X(3)
X(2) X X X X X
Notas
de espera: 1. Recomendado apenas com cristal externo ou ressonador selecionado como fonte de clock.
2. Se o Timer/Counter2 estiver sendo executado no modo assíncrono.
3. Para INT1 e INT0, apenas interrupção de nível.

Para entrar em qualquer um dos seis modos de sono, o bit SE no SMCR deve ser escrito na lógica um e uma instrução SLEEP deve
ser executada. Os bits SM2, SM1 e SM0 no registro SMCR selecionam qual modo de suspensão (inativo, redução de ruído ADC,
desligamento, economia de energia, espera ou espera estendida) será ativado pela instrução SLEEP. Consulte a Tabela 9-2 na página 38 para obter um
resumo.
Se ocorrer uma interrupção habilitada enquanto o MCU estiver em modo de suspensão, o MCU será ativado. O MCU é então parado
por quatro ciclos além do tempo de inicialização, executa a rotina de interrupção e retoma a execução da instrução seguinte a SLEEP.
O conteúdo do arquivo de registro e da SRAM permanece inalterado quando o dispositivo desperta do modo de suspensão. Se ocorrer uma reinicialização durante
o modo de suspensão, o MCU será ativado e executado a partir do vetor de reinicialização.

34 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

9.2 Desativar BOD


Quando o detector de brown-out (BOD) é ativado pelos fusíveis BODLEVEL, Tabela 27-7 na página 244, o BOD está monitorando ativamente
a tensão da fonte de alimentação durante um período de inatividade. Para economizar energia, é possível desabilitar o BOD por software para alguns dos
modos de hibernação, consulte a Tabela 9-1 na página 34. O consumo de energia do modo de hibernação estará então no mesmo nível de quando o
BOD é desabilitado globalmente por fusíveis. Se o BOD estiver desabilitado no software, a função BOD será desativada imediatamente após entrar no
modo de suspensão. Ao despertar da suspensão, o BOD é ativado automaticamente novamente. Isso garante uma operação segura caso o nível de VCC
tenha caído durante o período de suspensão.

Quando o BOD estiver desabilitado, o tempo de despertar do modo de suspensão será de aproximadamente 60µs para garantir que o BOD esteja
funcionando corretamente antes que o MCU continue executando o código.

A desabilitação do BOD é controlada pelo bit 6, BODS (BOD Sleep) no registro de controle MCUCR, consulte a Seção 9.11.2 “MCUCR – MCU Control
Register” na página 38 . um zero neste bit mantém o BOD ativo. A configuração padrão mantém o BOD ativo, ou seja, o BODS definido como zero.

A gravação no bit BODS é controlada por uma sequência temporizada e um bit de habilitação, consulte a Seção 9.11.2 “MCUCR – Registro de controle
MCU” na página 38.

9.3 Modo ocioso


Quando os bits SM2..0 são escritos em 000, a instrução SLEEP faz o MCU entrar em modo ocioso, parando a CPU, mas permitindo o SPI, USART,
comparador analógico, ADC, interface serial de 2 fios, Timer/Counters, watchdog e que o sistema de interrupção continue operando. Este modo de
suspensão basicamente interrompe o clkCPU e o clkFLASH, enquanto permite que os outros relógios sejam executados.

O modo ocioso permite que o MCU desperte de interrupções acionadas externas, bem como internas, como o estouro do temporizador e interrupções
completas de transmissão do USART. Se o despertar da interrupção do comparador analógico não for necessário, o comparador analógico pode ser
desligado definindo o bit ACD no controle do comparador analógico e no registrador de status – ACSR. Isso reduzirá o consumo de energia no modo
inativo. Se o ADC estiver ativado, uma conversão será iniciada automaticamente quando este modo for inserido.

9.4 Modo de Redução de Ruído ADC


Quando os bits SM2..0 são escritos em 001, a instrução SLEEP faz o MCU entrar no modo de redução de ruído ADC, parando a CPU mas permitindo o
ADC, as interrupções externas, o relógio do endereço da interface serial de 2 fios, Timer/Counter2(1 ), e o watchdog para continuar operando (se
habilitado). Esse modo de suspensão basicamente interrompe clkI/O, clkCPU e clkFLASH, enquanto permite que outros relógios sejam executados.

Isso melhora o ambiente de ruído para o ADC, permitindo medições de resolução mais alta. Se o ADC estiver ativado, uma conversão será iniciada
automaticamente quando este modo for inserido. Além da interrupção completa da conversão ADC, apenas um reset externo, um reset do sistema
watchdog, uma interrupção watchdog, um reset brown-out, uma correspondência de endereço de interface serial de 2 fios, uma interrupção Timer/
Counter2, uma interrupção pronta para SPM/EEPROM, uma interrupção de nível externo em INT0 ou INT1 ou uma interrupção de mudança de pino pode
acordar o MCU do modo de redução de ruído ADC.
Observação: 1. O Timer/Counter2 continuará funcionando apenas no modo assíncrono, consulte a Seção 17. “Timer/Counter2 de 8 bits com PWM
e operação assíncrona” na página 116 para obter detalhes.

9.5 Modo de desligamento


Quando os bits SM2..0 são escritos em 010, a instrução SLEEP faz o MCU entrar no modo de desligamento. Neste modo, o oscilador externo é parado,
enquanto as interrupções externas, o endereço da interface serial de 2 fios observam e o watchdog continua operando (se habilitado). Somente uma
reinicialização externa, uma reinicialização do sistema de watchdog, uma interrupção de watchdog, uma reinicialização de brown-out, uma correspondência
de endereço de interface serial de 2 fios, uma interrupção de nível externo em INT0 ou INT1 ou uma interrupção de mudança de pino pode acordar o
MCU. Este modo de suspensão basicamente interrompe todos os relógios gerados, permitindo a operação apenas de módulos assíncronos.

Observe que se uma interrupção acionada por nível for usada para despertar do modo de desligamento, o nível alterado deve ser mantido por algum
tempo para despertar o MCU. Consulte a Seção 12. “Interrupções externas” na página 53 para obter detalhes.

Ao acordar do modo de desligamento, ocorre um atraso da condição de ativação até que a ativação se torne efetiva. Isso permite que o relógio reinicie
e fique estável depois de ter sido parado. O período de despertar é definido pelos mesmos fusíveis CKSEL que definem o período de tempo limite de
reinicialização, conforme descrito na Seção 8.2 “Fontes de relógio” na página 25.

ATmega328P [FICHA DE DADOS] 35


7810D–AVR–01/15
Machine Translated by Google

9.6 Modo de economia de energia

Quando os bits SM2..0 são escritos em 011, a instrução SLEEP faz o MCU entrar no modo de economia de energia. Este modo é idêntico ao desligamento,
com uma exceção:

Se o Timer/Counter2 estiver habilitado, ele continuará funcionando durante o sono. O dispositivo pode acordar do estouro do temporizador ou do evento de
comparação de saída do Timer/Counter2 se os bits de habilitação de interrupção Timer/Counter2 correspondentes estiverem definidos no TIMSK2 e o bit de
habilitação de interrupção global no SREG estiver definido.

Se o Timer/Counter2 não estiver funcionando, o modo de desligamento é recomendado em vez do modo de economia de energia.

O Timer/Counter2 pode ser sincronizado de forma síncrona e assíncrona no modo de economia de energia. Se o Timer/Counter2 não estiver usando o relógio
assíncrono, o oscilador Timer/Counter será interrompido durante o sono. Se o Timer/Counter2 não estiver usando o relógio síncrono, a fonte do relógio será
interrompida durante o sono. Observe que, mesmo que o relógio síncrono esteja funcionando em economia de energia, esse relógio está disponível apenas para
Timer/Counter2.

9.7 Modo de espera


Quando os bits SM2..0 são 110 e uma opção de clock de cristal/ressonator externo é selecionada, a instrução SLEEP faz o MCU entrar no modo standby. Este
modo é idêntico ao desligamento, com a exceção de que o oscilador é mantido em funcionamento. do modo de espera, o dispositivo acorda em seis ciclos de
relógio.

9.8 Modo de espera estendido


Quando os bits SM2..0 são 111 e uma opção de clock de cristal/ressonator externo é selecionada, a instrução SLEEP faz o MCU entrar no modo standby
estendido. Este modo é idêntico ao de economia de energia com a exceção de que o oscilador é mantido funcionando. A partir do modo de espera estendida, o
dispositivo é ativado em seis ciclos de clock.

9.9 Registro de Redução de Energia


O registro de redução de energia (PRR), consulte a Seção 9.11.3 “PRR – Registro de redução de energia” na página 38, fornece um método para parar o relógio
de periféricos individuais para reduzir o consumo de energia. O estado atual do periférico está congelado e os registradores de E/S não podem ser lidos ou
escritos. Os recursos usados pelo periférico ao parar o relógio permanecerão ocupados, portanto o periférico deve na maioria dos casos ser desabilitado antes de
parar o relógio. Ativar um módulo, que é feito limpando o bit no PRR, coloca o módulo no mesmo estado de antes do desligamento.

O desligamento do módulo pode ser usado no modo Inativo e no modo ativo para reduzir significativamente o consumo geral de energia. Em todos os outros
modos de suspensão, o relógio já está parado.

9.10 Minimizando o Consumo de Energia


Existem várias possibilidades a serem consideradas ao tentar minimizar o consumo de energia em um sistema controlado por AVR®. Em geral, os modos de
suspensão devem ser usados o máximo possível e o modo de suspensão deve ser selecionado de modo que o menor número possível de funções do dispositivo
esteja operando. Todas as funções não necessárias devem ser desativadas. Em particular, os módulos a seguir podem precisar de consideração especial ao
tentar atingir o menor consumo de energia possível.

9.10.1 Conversor Analógico para Digital

Se ativado, o ADC será ativado em todos os modos de suspensão. Para economizar energia, o ADC deve ser desativado antes de entrar em qualquer modo
de suspensão. Quando o ADC é desligado e ligado novamente, a próxima conversão será uma conversão estendida. Consulte a Seção 23. “Conversor Analógico-
Digital” na página 205 para obter detalhes sobre a operação do ADC.

9.10.2 Comparador Analógico

Ao entrar no modo Idle, o comparador analógico deve ser desabilitado se não for usado. Ao entrar no modo de redução de ruído ADC, o comparador analógico
deve ser desabilitado. Em outros modos de suspensão, o comparador analógico é desativado automaticamente. No entanto, se o comparador analógico estiver
configurado para usar a referência de tensão interna como entrada, o comparador analógico deverá ser desabilitado em todos os modos de suspensão. Caso
contrário, a referência de tensão interna será habilitada, independente do modo sleep. Consulte a Seção 22.
“Comparador analógico” na página 202 para obter detalhes sobre como configurar o comparador analógico.

36 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

9.10.3 Detector de escurecimento

Se o detector de brown-out não for necessário para o aplicativo, este módulo deve ser desligado. Se o detector de brown-out for ativado pelos fusíveis
BODLEVEL, ele será ativado em todos os modos de suspensão e, portanto, sempre consumirá energia. Nos modos de suspensão mais profundos, isso
contribuirá significativamente para o consumo total de corrente. Consulte a Seção 10.5 “Detecção de escurecimento” na página 42 para obter detalhes sobre
como configurar o detector de escurecimento.

9.10.4 Referência de Tensão Interna

A referência de tensão interna será habilitada quando necessário pela detecção de brown-out, pelo comparador analógico ou pelo ADC.
Se estes módulos forem desabilitados conforme descrito nas seções acima, a referência de tensão interna será desabilitada e não consumirá energia. Quando
ligado novamente, o usuário deve permitir que a referência inicie antes que a saída seja utilizada. Se a referência for mantida no modo de suspensão, a saída
pode ser usada imediatamente. Consulte a Seção 10.7 “Referência de tensão interna” na página 43 para obter detalhes sobre o tempo de inicialização.

9.10.5 Temporizador de vigilância

Se o temporizador watchdog não for necessário na aplicação, o módulo deve ser desligado. Se o temporizador do watchdog estiver ativado, ele será ativado em
todos os modos de suspensão e, portanto, sempre consumirá energia. Nos modos de suspensão mais profundos, isso contribuirá significativamente para o
consumo total de corrente. Consulte a Seção 10.8 “Watchdog Timer” na página 43 para obter detalhes sobre como configurar o watchdog timer.

9.10.6 Pinos de Porta

Ao entrar no modo de suspensão, todos os pinos da porta devem ser configurados para usar o mínimo de energia. O mais importante é garantir que nenhum pino
conduza cargas resistivas. Nos modos de suspensão em que o relógio de E/S (clkI/O) e o relógio ADC (clkADC) estão parados, os buffers de entrada do dispositivo
serão desabilitados. Isso garante que nenhuma energia seja consumida pela lógica de entrada quando não for necessária.
Em alguns casos, a lógica de entrada é necessária para detectar as condições de ativação e, então, será habilitada. Consulte a Seção 13.2.5 “Ativação de
entrada digital e modos de suspensão” na página 62 para obter detalhes sobre quais pinos são ativados. Se o buffer de entrada estiver habilitado e o sinal de
entrada for deixado flutuante ou tiver um nível de sinal analógico próximo a VCC/2, o buffer de entrada usará energia excessiva.

Para pinos de entrada analógica, o buffer de entrada digital deve estar sempre desabilitado. Um nível de sinal analógico próximo a VCC/2 em um pino de entrada
pode causar uma corrente significativa mesmo no modo ativo. Os buffers de entrada digital podem ser desabilitados escrevendo nos registradores de desabilitação
de entrada digital (DIDR1 e DIDR0). Consulte a Seção 22.3.3 “DIDR1 – Registro de desativação de entrada digital 1” na página 204 e a Seção 23.9.5 “DIDR0 –
Registro de desativação de entrada digital 0” na página 220 para obter detalhes.

9.10.7 Sistema de depuração no chip

Se o sistema de depuração no chip for habilitado pelo fusível DWEN e o chip entrar no modo de suspensão, a fonte de clock principal será habilitada e, portanto,
sempre consumirá energia. Nos modos de suspensão mais profundos, isso contribuirá significativamente para o consumo total de corrente.

9.11 Descrição do Registro

9.11.1 SMCR - Registro de Controle do Modo de Repouso

O registro de controle do modo de suspensão contém bits de controle para gerenciamento de energia.

Pedaço 7 6 5 4 3 2 1 0

0x33 (0x53) – – – – SM2 SM1 SM0 SE SMCR


Ler escrever R R R R R/W R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

• Bits 7..4 Res: Bits Reservados

Esses bits são bits não utilizados no Atmel® ATmega328P e sempre serão lidos como zero.

ATmega328P [FICHA DE DADOS] 37


7810D–AVR–01/15
Machine Translated by Google

• Bits 3..1 – SM2..0: Seleção do modo de espera Bits 2, 1 e 0

Esses bits selecionam entre os cinco modos de suspensão disponíveis, conforme mostrado na Tabela 9-2 na página 38.

Tabela 9-2. Seleção do modo de suspensão

SM2 SM1 SM0 Modo dormir


0 0 0 Parado

0 0 1 Redução de ruído ADC

0 1 0 Desligar

0 1 1 Economia de energia

1 0 0 Reservado

1 0 1 Reservado

1 1 0 Em espera(1)
1 1 1 Espera externa(1)
Nota: 1. O modo de espera só é recomendado para uso com cristais ou ressonadores externos.

• Bit 0 - SE: Ativar suspensão

O bit SE deve ser escrito no lógico um para fazer o MCU entrar no modo sleep quando a instrução SLEEP for executada. Para evitar que o MCU entre no modo
de suspensão, a menos que seja o propósito do programador, recomenda-se escrever o bit de ativação do sono (SE) em um imediatamente antes da execução
da instrução SLEEP e limpá-lo imediatamente após acordar.

9.11.2 MCUCR - Registro de Controle MCU

Pedaço 7 6 5 4 3 2 1 0

0x35 (0x55) – CORPO CORPO PUD – – IVSEL IVCE MCUCR


Ler escrever R R R R/W R R R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

• Bit 6 – BODS: BOD Sleep

O bit BODS deve ser escrito no lógico um para desligar o BOD durante o sono, veja a Tabela 9-1 na página 34. A escrita no bit BODS é controlada por uma
sequência temporizada e um bit de habilitação, BODSE em MCUCR. Para desabilitar o BOD nos modos de suspensão relevantes, o BODS e o BODSE devem
primeiro ser definidos como um. Então, para definir o bit BODS, BODS deve ser definido como um e BODSE deve ser definido como zero dentro de quatro
ciclos de clock.

O bit BODS está ativo três ciclos de clock após ser definido. Uma instrução de suspensão deve ser executada enquanto o BODS estiver ativo para desligar o
BOD para o modo de suspensão real. O bit BODS é automaticamente apagado após três ciclos de clock.

• Bit 5 – BODSE: Ativar suspensão do BOD

BODSE habilita a configuração do bit de controle BODS, conforme explicado na descrição do bit BODS. A desativação do BOD é controlada por um tempo
seqüência.

9.11.3 PRR - Registro de Redução de Energia

Pedaço 7 6 5 4 3 2 1 0

(0x64) PRTWI PRTIM2 PRTIM0 – PRTIM1 PRSPI PRUSART0 PRADC PRR


Ler/Gravar R/W R/W R/W R R/W R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

• Bit 7 - PRTWI: Redução de Potência TWI

Escrever um lógico um para este bit desliga o TWI parando o relógio do módulo. Ao ativar o TWI novamente, o TWI deve ser reiniciado para garantir a operação
adequada.

38 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

• Bit 6 - PRTIM2: Temporizador/Contador de Redução de Potência2

Escrever um lógico neste bit desliga o módulo Timer/Counter2 no modo síncrono (AS2 é 0). Quando o Timer/Counter2 estiver habilitado, a
operação continuará como antes do desligamento.

• Bit 5 - PRTIM0: Temporizador/Contador de Redução de Potência0

Escrever um lógico neste bit desliga o módulo Timer/Counter0. Quando o Timer/Counter0 estiver habilitado, a operação continuará como antes do
desligamento.

• Bit 4 - Res: bit reservado

Este bit é reservado no Atmel® ATmega328P e sempre será lido como zero.

• Bit 3 - PRTIM1: Temporizador/Contador de Redução de Potência1

Escrever um lógico neste bit desliga o módulo Timer/Counter1. Quando o Timer/Counter1 estiver habilitado, a operação continuará como antes do
desligamento.

• Bit 2 - PRSPI: Interface Periférica Serial de Redução de Potência

Se estiver usando o sistema de depuração no chip debugWIRE, esse bit não deve ser gravado em um.

Escrever um lógico neste bit desliga a interface serial periférica parando o relógio do módulo. Ao acordar o SPI novamente, o SPI deve ser reiniciado para
garantir o funcionamento adequado.

• Bit 1 - PRUSART0: Redução de Potência USART0

Escrever um lógico neste bit desliga o USART parando o relógio do módulo. Ao ativar o USART novamente, o USART deve ser reiniciado para garantir
a operação adequada.

• Bit 0 - PRADC: Redução de Potência ADC

Escrever um lógico neste bit desliga o ADC. O ADC deve ser desabilitado antes de ser desligado. O comparador analógico não pode usar o MUX de entrada
ADC quando o ADC está desligado.

ATmega328P [FICHA DE DADOS] 39


7810D–AVR–01/15
Machine Translated by Google

10. Controle e Reinicialização do Sistema

10.1 Redefinindo o AVR


Durante o reset, todos os registradores de E/S são ajustados para seus valores iniciais, e o programa inicia a execução a partir do vetor de reset. Para o Atmel®
ATmega328P, a instrução colocada no vetor de reset deve ser uma instrução RJMP – salto relativo – para a rotina de manipulação de reset. Se o programa nunca
habilita uma fonte de interrupção, os vetores de interrupção não são usados e o código de programa regular pode ser colocado nesses locais. Este também é o
caso se o vetor de reset estiver na seção de aplicação enquanto os vetores de interrupção estiverem na seção de inicialização. O diagrama de circuito na Figura
10-1 mostra a lógica de reset. A Tabela 28-4 na página 261 define os parâmetros elétricos do circuito de reset. As portas de E/S do AVR® são imediatamente
redefinidas para seu estado inicial quando uma fonte de redefinição fica ativa. Isso não requer que nenhuma fonte de relógio esteja em execução. Após todas as
fontes de reset ficarem inativas, um contador de atraso é invocado, estendendo o reset interno. Isso permite que a potência atinja um nível estável antes do início
da operação normal.
O tempo limite do contador de atraso é definido pelo usuário através dos fusíveis SUT e CKSEL. As diferentes seleções para o período de atraso são apresentadas
na Seção 8.2 “Fontes de Relógio” na página 25.

10.2 Redefinir Fontes


O Atmel ATmega328P possui quatro fontes de reinicialização:

• Reinicialização ao ligar. O MCU é reinicializado quando a tensão de alimentação está abaixo do limite de reinicialização na inicialização (VPOT).

• Reinicialização externa. O MCU é reiniciado quando um nível baixo está presente no pino RESET por mais tempo que o pulso mínimo
comprimento.

• Reinicialização do sistema Watchdog. O MCU é reinicializado quando o período do temporizador do watchdog expira e o sistema do watchdog é reinicializado
modo está habilitado.

• Reinicialização de brown-out. O MCU é reinicializado quando a tensão de alimentação VCC está abaixo do limite de reinicialização de brown-out (VBOT) e o
detector de brown-out está habilitado.

Figura 10-1. Redefinir lógica


BARRAMENTO DE DADOS

Status do MCU

Registo (MCUSR)

PORF BORF
WDRF
EXTRF

Reinicialização ao ligar
VCC
O circuito

Apagão
NÍVEL DE CORPO [2..0] Reinicializar Circuito

Resistor de tração
Q
Reinicializar Circuito S

R REINICIALIZAÇÃO
INTERNA

ESPIGÃO cão de guarda


REDEFINIR
FILTRO Cronômetro

REINICIALIZAÇÃO
CONTADOR
DO

RSTDISBL

cão de guarda
Oscilador

CK
Contadores de atraso
Relógio
TEMPO ESGOTADO
Gerador

CKSEL[3:0]

SUT[1:0]

40 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

10.3 Reinicialização ao ligar

Um pulso de reinicialização na inicialização (POR) é gerado por um circuito de detecção no chip. O nível de detecção é definido na Seção 28.6
“Características do sistema e redefinição” na página 261. O POR é ativado sempre que o VCC estiver abaixo do nível de detecção. O circuito POR pode
ser usado para acionar o reset de inicialização, bem como para detectar uma falha na tensão de alimentação.

Um circuito de reinicialização na inicialização (POR) garante que o dispositivo seja reinicializado após a inicialização. Alcançar a tensão limite de
reinicialização na inicialização invoca o contador de atraso, que determina por quanto tempo o dispositivo é mantido em RESET após o aumento do VCC .
O sinal RESET é ativado novamente, sem qualquer atraso, quando VCC diminui abaixo do nível de detecção.

Figura 10-2. MCU Start-up, RESET Ligado ao VCC

VCC VPOT

REDEFINIR VRST

tTOUT

Tempo esgotado

interno
Redefinir

Figura 10-3. . Inicialização do MCU, RESET estendido externamente

VCC VPOT

REDEFINIR VRST

tTOUT
Tempo esgotado

interno
Redefinir

Tabela 10-1. Especificações de reinicialização ao ligar

Símbolo Parâmetro Mín. Tipo Máx. Unidades

Tensão limite de reinicialização na inicialização (aumentando) 1,4 V


VPOT
Tensão limite de reinicialização ao ligar (queda)(1) 1,0 1.3 1,6 V

VCC máx. tensão de partida para garantir o sinal de reinicialização interno VCC
VPORMAX 0,4 V
Min. tensão de início para garantir a taxa de aumento VCC do sinal de

reinicialização na inicialização interna para garantir a reinicialização na inicialização


VPORMIN -0,1 V

VCCRR 0,01 V/ms

Nota: 1. Antes de subir, a alimentação deve estar entre VPORMIN e VPORMAX para garantir um reset

ATmega328P [FICHA DE DADOS] 41


7810D–AVR–01/15
Machine Translated by Google

10.4 Reinicialização Externa

Um reset externo é gerado por um nível baixo no pino RESET. Redefinir pulsos maiores que a largura mínima de pulso (consulte a Seção 28.6
“Características do sistema e redefinição” na página 261) gerará uma redefinição, mesmo se o relógio não estiver funcionando. Pulsos mais curtos
não são garantidos para gerar um reset. Quando o sinal aplicado atinge a tensão limite de reset – VRST – em sua borda positiva, o contador de
atraso inicia o MCU após o período de timeout – tTOUT – ter expirado. O reset externo pode ser desabilitado pelo fusível RSTDISBL, veja Tabela
27-7 na página 244.

Figura 10-4. Reinicialização Externa Durante a Operação

VCC

REDEFINIR VRST

tOUT

TEMPO ESGOTADO

INTERNO
REDEFINIR

10.5 Detecção de escurecimento

O Atmel® ATmega328P possui um circuito de detecção de brown-out (BOD) no chip para monitorar o nível de VCC durante a operação,
comparando-o com um nível de disparo fixo. O nível de disparo para o BOD pode ser selecionado pelos fusíveis BODLEVEL. O nível de disparo tem
uma histerese para garantir a detecção de escurecimento sem picos. A histerese no nível de detecção deve ser interpretada como VBOT+ = VBOT
+ VHYST/2 e VBOT– = VBOT – VHYST/2. Quando o BOD está habilitado e VCC diminui para um valor abaixo do nível de disparo (VBOT- na Figura
10- 5), o reset do brown-out é imediatamente ativado. Quando VCC aumenta acima do nível de disparo (VBOT+ na Figura 10-5), o contador de atraso
inicia o MCU após o período de tempo limite tTOUT ter expirado.

O circuito BOD só detectará uma queda no VCC se a tensão permanecer abaixo do nível de disparo por mais tempo do que tBOD fornecido na
Seção 28.6 “Características do sistema e reset” na página 261.

Figura 10-5. Reinicialização de brown-out durante a operação

VCC
VBOT+
VBOT

REDEFINIR

tTOUT
TEMPO ESGOTADO

INTERNO
REDEFINIR

42 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

10.6 Reinicialização do Sistema Watchdog


Quando o watchdog expirar, ele gerará um pulso de reinicialização curto de duração de um ciclo CK. Na borda descendente deste pulso, o temporizador de retardo inicia a
contagem do período de time-out tTOUT. Consulte a Seção 10.8 “Cronômetro de watchdog” na página 43 para obter detalhes sobre a operação do temporizador de watchdog.

Figura 10-6. Reinicialização do sistema watchdog durante a operação

VCC

REDEFINIR

1 Ciclo CK

WDT
TEMPO ESGOTADO

tTOUT
REDEFINIR
Tempo esgotado

INTERNO
REDEFINIR

10.7 Referência de tensão interna


O Atmel® ATmega328P possui uma referência de bandgap interna. Esta referência é usada para detecção de brown-out e pode ser usada como entrada para o comparador
analógico ou o ADC.

10.7.1 Sinais de habilitação de referência de tensão e tempo de inicialização


A referência de tensão possui um tempo de partida que pode influenciar na forma como deve ser utilizada. O tempo de inicialização é fornecido na Seção 28.6 “Características
do sistema e reset” na página 261. Para economizar energia, a referência nem sempre está ligada. A referência está ativada durante as seguintes situações:

1. Quando o BOD está habilitado (programando os Fusíveis BODLEVEL [2:0]).

2. Quando a referência de bandgap está conectada ao comparador analógico (ajustando o bit ACBG no ACSR).
3. Quando o ADC está habilitado.

Assim, quando o BOD não estiver habilitado, após configurar o bit ACBG ou habilitar o ADC, o usuário deve sempre permitir a inicialização da referência antes que
a saída do comparador analógico ou ADC seja utilizada. Para reduzir o consumo de energia no modo de desligamento, o usuário pode evitar as três condições
acima para garantir que a referência seja desligada antes de entrar no modo de desligamento.

10.8 Temporizador de vigilância

10.8.1 Recursos
• Cronometrado a partir de oscilador no chip separado

• 3 modos de operação

• Interromper

• Redefinição do sistema

• Interrupção e reinicialização do sistema

• Período de tempo limite selecionável de 16ms a 8s

• Possível watchdog de fusível de hardware sempre ligado (WDTON) para modo à prova de falhas

ATmega328P [FICHA DE DADOS] 43


7810D–AVR–01/15
Machine Translated by Google

10.8.2 Visão geral

Atmel® ATmega328P possui um temporizador de vigilância aprimorado (WDT). O WDT é um temporizador de contagem de ciclos de um oscilador de 128kHz
no chip separado. O WDT dá uma interrupção ou uma reinicialização do sistema quando o contador atinge um determinado valor de tempo limite. No modo de
operação normal, é necessário que o sistema utilize a instrução WDR - watchdog timer reset - para reiniciar o contador antes que o valor de tempo limite seja
atingido. Se o sistema não reiniciar o contador, uma interrupção ou reinicialização do sistema será emitida.

Figura 10-7. Cronômetro de vigilância

128kHz cão de guarda


Pré-escalador
Oscilador

OSC/
2K OSC/
4K OSC/
8K

OSC/
16K OSC/
32K OSC/
64K

OSC/
128K OSC/
256K OSC/
512K

1024K
OSC/

WDP0
WDP1
CÃO DE GUARDA
WDP2
REDEFINIR
WDP3

WDE
REINICIAR MCU

WDIF

INTERROMPER
WDIE

No modo de interrupção, o WDT dá uma interrupção quando o temporizador expira. Essa interrupção pode ser usada para despertar o dispositivo dos modos
de suspensão e também como um temporizador geral do sistema. Um exemplo é limitar o tempo máximo permitido para certas operações, dando uma interrupção
quando a operação for executada por mais tempo do que o esperado. No modo de reinicialização do sistema, o WDT reinicia quando o temporizador expira. Isso
geralmente é usado para evitar o desligamento do sistema em caso de código descontrolado. O terceiro modo, modo de interrupção e reinicialização do sistema,
combina os outros dois modos, primeiro dando uma interrupção e, em seguida, alternando para o modo de reinicialização do sistema. Este modo permitirá, por
exemplo, um desligamento seguro salvando parâmetros críticos antes de uma reinicialização do sistema.

O fusível do watchdog sempre ligado (WDTON), se programado, forçará o temporizador do watchdog ao modo de reinicialização do sistema. Com o fusível
programado, o bit do modo de reinicialização do sistema (WDE) e o bit do modo de interrupção (WDIE) são bloqueados em 1 e 0, respectivamente. Para garantir
ainda mais a segurança do programa, as alterações na configuração do watchdog devem seguir sequências temporizadas.

A sequência para limpar o WDE e alterar a configuração de tempo limite é a seguinte:


1. Na mesma operação, escreva um lógico no bit de habilitação de alteração do watchdog (WDCE) e WDE. Um lógico deve ser escrito em WDE
independentemente do valor anterior do bit WDE.

2. Dentro dos próximos quatro ciclos de clock, escreva os bits WDE e watchdog prescaler (WDP) conforme desejado, mas com o
Bit WDCE apagado. Isso deve ser feito em uma operação.

44 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

O exemplo de código a seguir mostra um assembly e uma função C para desativar o temporizador do watchdog. O exemplo assume que as interrupções
são controladas (por exemplo, desabilitando globalmente as interrupções) para que nenhuma interrupção ocorra durante a execução dessas funções.

Exemplo de código de montagem(1)

WDT_off:
; Desativar interrupção global cli

; Redefinir o temporizador do
watchdog wdr
; Limpar WDRF no MCUSR
dentro r16, MCUSR ei
r16 , (0xff & (0<<WDRF)) fora MCUSR, r16

; Escreva um lógico para WDCE e WDE


; Mantenha a configuração do pré-escalador antigo para evitar tempo limite não intencional lds r16, WDTCSR
ou r16, (1<<WDCE) | (1<<WDE) sts WDTCSR, r16

; Desligue o WDT
ldi r16, (0<<WDE) sts WDTCSR,
r16
; Ativar interrupção global sei

ret

Exemplo de código C(1)

void WDT_off(void) {

__disable_interrupt(); __watchdog_reset();

/* Limpar WDRF no MCUSR */


MCUSR &= ~(1<<WDRF);
/* Escreve um lógico para WDCE e WDE */
/* Mantém a configuração antiga do pré-escalador para evitar tempo limite não intencional
*/
WDTCSR |= (1<<WDCE) | (1<<WDE);
/* Desativa o WDT */
WDTCSR = 0x00;
__enable_interrupt();
}

Observação: 1. Consulte a Seção 5. “Sobre exemplos de código” na página 8.


2. Nota: Se o watchdog for ativado acidentalmente, por exemplo, por um ponteiro descontrolado ou condição de brownout, o
dispositivo será redefinido e o temporizador do watchdog permanecerá ativado. Se o código não estiver configurado para lidar com o
watchdog, isso pode levar a um loop eterno de redefinições de tempo limite. Para evitar essa situação, o software aplicativo deve
sempre limpar o sinalizador de reinicialização do sistema de watchdog (WDRF) e o bit de controle WDE na rotina de inicialização,
mesmo se o watchdog não estiver em uso.

ATmega328P [FICHA DE DADOS] 45


7810D–AVR–01/15
Machine Translated by Google

O exemplo de código a seguir mostra um assembly e uma função C para alterar o valor de tempo limite do cronômetro do watchdog.

Exemplo de código de montagem(1)

WDT_Prescaler_Change:
; Desativar interrupção global
cli
; Redefinir o temporizador do watchdog
wdr
; Iniciar sequência cronometrada
lds r16, WDTCSR
ori r16, (1<<WDCE) | (1<<WDE)
sts WDTCSR, r16
; -- Tem quatro ciclos para definir os novos valores daqui -
; Defina o novo valor do pré-escalador (tempo limite) = 64 mil ciclos (~0,5 s)
ldi r16, (1<<WDE) | (1<<WDP2) | (1<<WDP0)
sts WDTCSR, r16
; -- Terminado de definir novos valores, usado 2 ciclos -
; Ativar interrupção global
sei
ret

Exemplo de código C(1)

void WDT_Prescaler_Change(void)
{
__disable_interrupt();
__watchdog_reset();
/* Iniciar sequência cronometrada */
WDTCSR |= (1<<WDCE) | (1<<WDE);
/* Definir novo valor do prescaler (tempo limite) = 64K ciclos (~0,5 s) */
WDTCSR = (1<<WDE) | (1<<WDP2) | (1<<WDP0);
__enable_interrupt();
}

Observação: 1. Consulte a Seção 5. “Sobre exemplos de código” na página 8.


2. O temporizador do watchdog deve ser reiniciado antes de qualquer mudança nos bits WDP, pois uma mudança nos bits WDP pode
resultar em um tempo limite ao alternar para um período de tempo limite mais curto.

10.9 Descrição do Registro

10.9.1 MCUSR - Registro de Status MCU

O registro de status da MCU fornece informações sobre qual fonte de reinicialização causou uma reinicialização da MCU.
Pedaço 7 6 5 4 3 2 1 0

0x35 (0x55) – – – – WDRF BORF EXTRF PORF MCUSR


Ler escrever R R R R R/W R/W R/W R/W
Valor inicial 0 0 0 0 Veja a descrição do bit

• Bit 7..4: Res: Bits Reservados

Esses bits são bits não utilizados no Atmel® ATmega328P e sempre serão lidos como zero.

• Bit 3 – WDRF: Sinalizador de Redefinição do Sistema Watchdog

Este bit é definido se ocorrer uma reinicialização do sistema watchdog. O bit é reinicializado por uma reinicialização na inicialização ou escrevendo um zero lógico no sinalizador.

• Bit 2 – BORF: Sinalizador de Reset Brown-out


Este bit é definido se ocorrer uma reinicialização de brown-out. O bit é reinicializado por uma reinicialização na inicialização ou escrevendo um zero lógico no sinalizador.

46 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

• Bit 1 – EXTRF: Flag de Reset Externo

Este bit é definido se ocorrer um reset externo. O bit é reinicializado por uma reinicialização na inicialização ou escrevendo um zero lógico no sinalizador.

• Bit 0 – PORF: Sinalizador de reinicialização na inicialização

Este bit é definido se ocorrer uma reinicialização na inicialização. O bit é redefinido apenas escrevendo um zero lógico no sinalizador.

Para fazer uso dos sinalizadores de reinicialização para identificar uma condição de reinicialização, o usuário deve ler e reinicializar o MCUSR o mais cedo possível no
programa. Se o registro for apagado antes de ocorrer outro reset, a fonte do reset pode ser encontrada examinando os sinalizadores de reset.

10.9.2 WDTCSR - Registro de Controle do Temporizador Watchdog

Pedaço 7 6 5 4 3 2 1 0

(0x60) WDIF WDIE WDP3 WDCE WDE WDP2 WDP1 WDP0 WDTCSR
Ler escrever R/W R/W R/W R/W R/W R/W R/W R/W
Valor inicial 0 0 0 0 X 0 0 0

• Bit 7 - WDIF: Sinalizador de interrupção do watchdog

Este bit é definido quando ocorre um time-out no temporizador do watchdog e o temporizador do watchdog está configurado para interrupção. WDIF é limpo pelo
hardware ao executar o vetor de tratamento de interrupção correspondente. Alternativamente, o WDIF é limpo escrevendo um lógico no sinalizador. Quando o bit I em SREG
e WDIE são definidos, a interrupção de tempo limite do watchdog é executada.

• Bit 6 - WDIE: Ativação de interrupção do watchdog

Quando este bit é escrito em um e o bit I no registrador de status é definido, a interrupção do watchdog é habilitada. Se WDE for desenergizado em combinação com esta
configuração, o temporizador do watchdog está no modo de interrupção e a interrupção correspondente é executada se o tempo limite
no temporizador watchdog ocorre. Se WDE estiver definido, o temporizador do watchdog está no modo de interrupção e reinicialização do sistema. O primeiro tempo limite
no temporizador do watchdog definirá o WDIF.

A execução do vetor de interrupção correspondente limpará o WDIE e o WDIF automaticamente pelo hardware (o watchdog vai para o modo de reinicialização do
sistema). Isso é útil para manter a segurança do cronômetro do watchdog ao usar a interrupção. Para permanecer no modo de interrupção e reinicialização do sistema, o
WDIE deve ser definido após cada interrupção. No entanto, isso não deve ser feito dentro da própria rotina de serviço de interrupção, pois isso pode comprometer a função
de segurança do modo de reinicialização do sistema watchdog. Se a interrupção não for executada antes do próximo tempo limite, uma reinicialização do sistema será
aplicada.

Tabela 10-2. Configuração do temporizador do watchdog

WDTON(1) WDE WDIE Modo Ação no tempo limite

1 0 0 Parou Nenhum

1 0 1 Modo de interrupção Interromper

1 1 0 Modo de reinicialização do sistema Redefinir

Interrompa e vá para o modo de redefinição do


1 1 1 Modo de interrupção e reinicialização do sistema
sistema

0 x x Modo de reinicialização do sistema Redefinir

Nota: 1. Fusível WDTON ajustado em “0” significa programado e “1” significa não programado.

• Bit 4 - WDCE: Ativar alteração do watchdog

Este bit é usado em sequências temporizadas para alterar bits WDE e prescaler. Para limpar o bit WDE e/ou alterar os bits do prescaler, o WDCE deve ser definido.

Uma vez gravado em um, o hardware limpará o WDCE após quatro ciclos de clock.

ATmega328P [FICHA DE DADOS] 47


7810D–AVR–01/15
Machine Translated by Google

• Bit 3 - WDE: Ativar reinicialização do sistema Watchdog


WDE é substituído por WDRF em MCUSR. Isso significa que o WDE é sempre definido quando o WDRF é definido. Para limpar o WDE, o
WDRF deve ser limpo primeiro. Esse recurso garante várias reinicializações durante as condições que causam falha e uma inicialização segura
após a falha.

• Bit 5, 2..0 - WDP3..0: Watchdog Timer Prescaler 3, 2, 1 e 0


Os bits WDP3..0 determinam o pré-escalonamento do cronômetro do watchdog quando o cronômetro do watchdog está em execução. Os diferentes valores de
pré-escalonamento e seus correspondentes períodos de tempo limite são mostrados na Tabela 10-3.

Tabela 10-3. Seleção de pré-escala do temporizador watchdog

WDP3 WDP2 WDP1 WDP0 Número de ciclos do oscilador WDT Tempo limite típico em VCC = 5,0 V
0 0 0 0 2K (2048) ciclos 16ms

0 0 0 1 Ciclos de 4K (4096) 32ms

0 0 1 0 8K (8192) ciclos 64ms

0 0 1 1 16K (16384) ciclos 0,125s

0 1 0 0 32K (32768) ciclos 0,25s

0 1 0 1 64K (65536) ciclos 0,5s

0 1 1 0 128K (131072) ciclos 1,0 segundo

0 1 1 1 256K (262144) ciclos 2,0 segundos

1 0 0 0 512K (524288) ciclos 4,0 segundos

1 0 0 1 1024K (1048576) ciclos 8,0 segundos

1 0 1 0

1 0 1 1

1 1 0 0
Reservado
1 1 0 1

1 1 1 0

1 1 1 1

48 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

11. Interrupções
Esta seção descreve os detalhes do tratamento de interrupções realizado no Atmel® ATmega328P. Para uma explicação geral do tratamento de
interrupção do AVR®, consulte a Seção 6.7 “Reinicialização e Tratamento de Interrupção” na página 15.
• Cada vetor de interrupção ocupa duas palavras de instrução no Atmel ATmega328P.

• No Atmel ATmega328P, o vetor de reset é afetado pelo fusível BOOTRST e o endereço inicial do vetor de interrupção é
afetado pelo bit IVSEL em MCUCR.

11.1 Vetores de interrupção no ATmega328P

Tabela 11-1. Redefinir e interromper vetores no ATmega328P

Vetor No. Origem do Endereço do Programa Definição de interrupção

Pino externo, reinicialização ao ligar, reinicialização por brown-out e reinicialização do


1 0x0000 REDEFINIR
sistema watchdog

2 0x002 INT0 Solicitação de interrupção externa 0


3 0x0004 INT1 Solicitação de interrupção externa 1
4 0x0006 PCINT0 Solicitação de interrupção de alteração de pino 0

5 0x0008 PCINT1 Solicitação de interrupção de alteração de pino 1

6 0x000A PCINT2 Solicitação de interrupção de alteração de pino 2

7 0x000C WDT Interrupção de tempo limite do watchdog

8 0x000E TIMER2 COMPA Timer/Counter2 comparam a correspondência A


9 0x0010 TIMER2 COMPB Timer/Counter2 comparam a correspondência B
10 0x0012 TEMPORIZADOR 2 OVF Estouro do temporizador/contador2

11 0x0014 TIMER1 CAPT Evento de captura Timer/Counter1


12 0x0016 TIMER1 COMPA Timer/Counter1 comparam a correspondência A
13 0x0018 TIMER1 COMPB Timer/Counter1 comparam a correspondência B
14 0x001A TEMPORIZADOR1 OVF Estouro do temporizador/contador1

15 0x001C TIMER0 COMPA Timer/Counter0 compara a correspondência A


16 0x001E TIMER0 COMPB Timer/Counter0 compara a correspondência B
17 0x0020 TEMPORIZADOR0 OVF Estouro do temporizador/contador0

18 0x0022 SPI, STC Transferência serial SPI concluída


19 0x0024 USART, RX USART Rx completo
20 0x0026 USART, UDRE USART, registro de dados vazio
21 0x0028 USART, TX USART, Tx completo
22 0x002A ADC Conversão ADC concluída
23 0x002C EE PRONTO Pronto para EEPROM

24 0x002E ANALOG COMP Comparador analógico


25 0x0030 TWI Interface serial de 2 fios

26 0x0032 SPM PRONTO Armazenar a memória do programa pronta

ATmega328P [FICHA DE DADOS] 49


7810D–AVR–01/15
Machine Translated by Google

A Tabela 11-2 mostra o posicionamento dos vetores de reset e interrupção para as várias combinações de configurações BOOTRST e IVSEL. Se
o programa nunca habilita uma fonte de interrupção, os vetores de interrupção não são usados e o código de programa regular pode ser colocado
nesses locais. Este também é o caso se o vetor de reset estiver na seção de aplicação enquanto os vetores de interrupção estiverem na seção de
inicialização ou vice-versa.

Tabela 11-2. Redefinir e interromper o posicionamento de vetores no ATmega328P(1)

BOOTRST Endereço de redefinição de IVSEL Endereço inicial de vetores de interrupção


1 0 0x000 0x002

1 1 0x000 Endereço de reinicialização de inicialização + 0x0002

0 0 Endereço de reinicialização de inicialização 0x002

0 1 Endereço de reinicialização de inicialização Endereço de reinicialização de inicialização + 0x0002

Nota: 1. Para o fusível BOOTRST “1” significa não programado enquanto “0” significa programado.

A configuração de programa mais típica e geral para os endereços de vetor de reinicialização e interrupção no Atmel® ATmega328P é:
Endereço Código de etiquetas Comentários
0x0000 jmp REDEFINIR ; Redefinir manipulador
0x0002 jmp EXT_INT0 jmp ; Manipulador de IRQ0
0x0004 EXT_INT1 jmp ; Manipulador de IRQ1
0x0006 PCINT0 ; Manipulador PCINT0
0x0008 jmp jmp jmpPCINT1
jmp ; Manipulador PCINT1
0x000A TIM2_COMPA PCINT2
; ; Manipulador PCINT2
0x000C WDT um
Timer2 Comparar ; Manipulador de temporizador de cão de guarda
0x000E manipulador
0x0010 jmp TIM2_COMPB ; Timer2 Comparar B Manipulador
0x0012 jmp TIM2_OVF jmp ; Manipulador de estouro do Timer2
0x0014 TIM1_CAPT ; Manipulador de Captura Timer1
0x0016 jmp TIM1_COMPA ; Timer1 Comparar um manipulador
0x0018 jmp TIM1_COMPB ; Timer1 Comparar B Manipulador
0x001A jmp TIM1_OVF jmp ; Manipulador de estouro do Timer1
0x001C TIM0_COMPA ; Timer0 Comparar um manipulador
0x001E jmp TIM0_COMPB ; Timer0 Comparar B Manipulador
0x0020 jmp TIM0_OVF ; Manipulador de estouro do Timer0
0x0022 jmp SPI_STC ; Manipulador Completo de Transferência SPI
0x0024 jmp USART_RXC ; USART, Manipulador Completo RX
0x0026 jmp USART_UDRE ; USART, UDR Manipulador vazio
0x0028 jmp USART_TXC ; USART, Manipulador Completo TX
0x002A jmp ADC ; Manipulador Completo de Conversão ADC
0x002C jmp EE_RDY ; Manipulador pronto para EEPROM
0x002E jmp ANA_COMP ; Manipulador de Comparador Analógico
0x0030 TWI de interface serial de 2 fios
jmp; Manipulador
0x0032 jmp SPM_RDY ; Armazenar Manipulador Pronto para Memória de Programa
;
0x0033 REINICIAR: ldi r16, alto(RAMEND); Início do programa principal
0x0034 Fora SPH,r16 ; Defina o Stack Pointer para o topo da RAM
0x0035 ldi r16, baixo(RAMEND)
0x0036 Fora SPL, r16
0x0037 sei ; Ativar interrupções
0x0038 <instr> xxx
... ... ... ...

50 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

Quando o fusível BOOTRST não está programado, o tamanho da seção de inicialização é definido para 2 Kbytes e o bit IVSEL no registro MCUCR é
definido antes que qualquer interrupção seja habilitada, a configuração de programa mais típica e geral para os endereços de vetor de reinicialização
e interrupção no Atmel® ATmega328P é:
Endereço Código de etiquetas Comentários
0x0000 REINICIAR: ldi r16,alta(RAMEND); Início do programa principal
0x0001 Fora SPH,r16 ; Defina o Stack Pointer para o topo da RAM
0x0002 ldi r16,baixo(RAMEND)
0x0003 Fora SPL, r16
0x0004 sei ; Ativar interrupções
0x0005 <instr> xxx
;
.org 0x3C02
0x3C02 jmp EXT_INT0 jmp ; Manipulador de IRQ0
0x3C04 EXT_INT1 ; Manipulador de IRQ1
... ... ... ;
0x3C32 jmp SPM_RDY ; Armazenar Manipulador Pronto para Memória de Programa

Quando o fusível BOOTRST é programado e o tamanho da seção de inicialização é definido para 2 Kbytes, a configuração de programa mais típica
e geral para os endereços de vetor de reinicialização e interrupção no Atmel ATmega328P é:
Endereço Código de etiquetas Comentários
.org 0x0002
0x0002 jmp EXT_INT0 jmp ; Manipulador de IRQ0
0x0004 EXT_INT1 ; Manipulador de IRQ1
... ... ... ;
0x0032 jmp SPM_RDY ; Armazenar Manipulador Pronto para Memória de Programa
;
.org 0x3C00
0x3C00 REINICIAR: ldi r16,alta(RAMEND); Início do programa principal
0x3C01 Fora SPH,r16 ; Defina o Stack Pointer para o topo da RAM
0x3C02 ldi r16,baixo(RAMEND)
0x3C03 Fora SPL, r16
0x3C04 sei ; Ativar interrupções
0x3C05 <instr> xxx

Quando o fusível BOOTRST é programado, o tamanho da seção de inicialização é definido para 2 Kbytes e o bit IVSEL no registro MCUCR é
definido antes que qualquer interrupção seja habilitada, a configuração de programa mais típica e geral para os endereços de vetor de reinicialização
e interrupção no Atmel ATmega328P é:
Endereço Código de etiquetas Comentários
;
.org 0x3C00
0x3C00 jmp REDEFINIR ; Redefinir gerenciador
0x3C02 jmp EXT_INT0 jmp ; Manipulador de IRQ0
0x3C04 EXT_INT1 ; Manipulador de IRQ1
... ... ... ;
0x3C32 jmp SPM_RDY ; Armazenar Manipulador Pronto para Memória de Programa
;
0x3C33 REINICIAR: ldi r16,alta(RAMEND); Início do programa principal
0x3C34 Fora SPH,r16 ; Defina o Stack Pointer para o topo da RAM
0x3C35 ldi r16,baixo(RAMEND)
0x3C36 Fora SPL, r16
0x3C37 sei ; Ativar interrupções
0x3C38 <instr> xxx

ATmega328P [FICHA DE DADOS] 51


7810D–AVR–01/15
Machine Translated by Google

11.2 Descrição do Registro

11.2.1 Movendo interrupções entre o aplicativo e o espaço de inicialização

O registrador de controle MCU controla o posicionamento da tabela de vetores de interrupção.

11.2.2 MCUCR - Registro de Controle MCU

Pedaço 7 6 5 4 3 2 1 0

0x35 (0x55) – BODS BODS PUD – – IVSEL IVCE MCUCR


Ler escrever R R R R/W R R R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

• Bit 1 – IVSEL: Interromper Seleção Vetorial


Quando o bit IVSEL é zerado (zero), os vetores de interrupção são colocados no início da memória flash. Quando este bit é definido (um), os vetores
de interrupção são movidos para o início da seção do carregador de inicialização do flash. O endereço real do início da seção de flash de inicialização é
determinado pelos fusíveis BOOTSZ. Consulte a Seção 26. “Suporte ao carregador de inicialização – Autoprogramação de leitura e gravação” na página
229 para obter detalhes. Para evitar alterações não intencionais das tabelas de vetores de interrupção, um procedimento de gravação especial deve ser
seguido para alterar o bit IVSEL:
uma. Escreva o bit de habilitação de alteração do vetor de interrupção (IVCE) para um.

b. Dentro de quatro ciclos, escreva o valor desejado para IVSEL enquanto escreve um zero para IVCE.

As interrupções serão desativadas automaticamente enquanto esta sequência é executada. As interrupções são desabilitadas no ciclo em que o IVCE é
configurado, e permanecem desabilitadas até após a instrução seguinte à escrita em IVSEL. Se IVSEL não for escrito, as interrupções permanecem
desabilitadas por quatro ciclos. O bit I no registrador de status não é afetado pela desabilitação automática.
Observação: Se os vetores de interrupção forem colocados na seção do carregador de inicialização e o bit de bloqueio de inicialização BLB02 estiver programado, as
interrupções serão desabilitadas durante a execução da seção do aplicativo. Se os vetores de interrupção forem colocados na seção do aplicativo e o bit
de bloqueio de inicialização BLB12 estiver programado, as interrupções serão desabilitadas durante a execução da seção do carregador de inicialização.
Consulte a Seção 26. “Suporte ao carregador de inicialização – Autoprogramação de leitura-enquanto-gravação” na página 229 para obter detalhes sobre bits de
bloqueio de inicialização.

Este bit não está disponível no Atmel® ATmega328P.

• Bit 0 – IVCE: Ativar alteração de vetor de interrupção


O bit IVCE deve ser escrito na lógica um para permitir a mudança do bit IVSEL. O IVCE é limpo pelo hardware quatro ciclos após ser gravado ou quando
o IVSEL é gravado. Definir o bit IVCE desabilitará as interrupções, conforme explicado na descrição IVSEL acima.
Veja o exemplo de código abaixo.

Exemplo de código de montagem

Move_interrupts:
; Habilitar mudança de vetores de interrupção
ldi r16, (1<<IVCE)
Fora MCUCR, r16
; Mover interrupções para a seção Boot Flash
ldi r16, (1<<IVSEL)
Fora MCUCR, r16
ret

Exemplo de código C

void Move_interrupts(void)
{
/* Habilita a mudança de vetores de interrupção */
MCUCR = (1<<IVCE);
/* Move as interrupções para a seção Boot Flash */
MCUCR = (1<<IVSEL);
}

Este bit não está disponível no Atmel ATmega328P.

52 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

12. Interrupções Externas


As interrupções externas são acionadas pelos pinos INT0 e INT1 ou por qualquer um dos pinos PCINT23..0. Observe que, se habilitada, as interrupções serão acionadas
mesmo que os pinos INT0 e INT1 ou PCINT23..0 estejam configurados como saídas. Esse recurso fornece uma maneira de gerar uma interrupção de software. A
interrupção de mudança de pino PCI2 será acionada se algum pino PCINT23..16 ativado alternar. A interrupção de mudança de pino PCI1 será acionada se algum pino
PCINT14..8 ativado alternar. A interrupção de mudança de pino PCI0 será acionada se algum pino PCINT7..0 ativado for alternado. Os registradores PCMSK2, PCMSK1 e
PCMSK0 controlam quais pinos contribuem para as interrupções de troca de pinos. As interrupções de mudança de pino no PCINT23..0 são detectadas de forma
assíncrona. Isso implica que essas interrupções podem ser usadas para despertar a peça também dos modos de suspensão diferentes do modo Inativo.

As interrupções INT0 e INT1 podem ser acionadas por uma borda descendente ou ascendente ou um nível baixo. Isso é configurado conforme indicado na
especificação para o registro de controle de interrupção externo A – EICRA. Quando as interrupções INT0 ou INT1 são habilitadas e configuradas como acionadas por
nível, as interrupções serão acionadas enquanto o pino for mantido baixo. Observe que o reconhecimento de interrupções de borda descendente ou ascendente em INT0
ou INT1 requer a presença de um relógio de E/S, descrito na Seção 8.1 “Sistemas de clock e sua distribuição” na página 24. A interrupção de nível baixo em INT0 e INT1
é detectada de forma assíncrona. Isso implica que essa interrupção pode ser usada para despertar a peça também dos modos de suspensão diferentes do modo inativo.
O relógio de E/S é interrompido em todos os modos de suspensão, exceto no modo Inativo.

Observe que, se uma interrupção acionada por nível for usada para despertar do desligamento, o nível necessário deve ser mantido por tempo suficiente para que o MCU
conclua a ativação para acionar a interrupção de nível. Se o nível desaparecer antes do final do tempo de inicialização, o MCU ainda será ativado, mas nenhuma interrupção
será gerada. O tempo de inicialização é definido pelos fusíveis SUT e CKSEL conforme descrito na Seção 8. “Opções de relógio e relógio do sistema” na página 24.

12.1 Tempo de interrupção de mudança de pino


Um exemplo de temporização de uma interrupção de mudança de pino é mostrado na Figura 12-1.

Figura 12-1. Tempo de interrupção da mudança de pino

pin_lat pin_sync pcint_in_(0) 0 pcint_sync pcint_setflag


PCINT(0) DQ
PCIF
LE x
PCINT(0) em PCMSK(x)
clique

clique

clique

PCINT(0)

pin_lat

pin_sync

pcint_in_(0)

pcint_syn

pcint_setflag

PCIF

ATmega328P [FICHA DE DADOS] 53


7810D–AVR–01/15
Machine Translated by Google

12.2 Descrição do Registro

12.2.1 EICRA - Registro A de Controle de Interrupção Externa

O registrador de controle de interrupção externo A contém bits de controle para controle de detecção de interrupção.
Pedaço 7 6 5 4 3 2 1 0

(0x69) – – – – ISC11 ISC10 ISC01 ISC00 EICRA


Ler escrever R R R R R/W R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

• Bit 7..4 – Res: Bits Reservados

Esses bits são bits não utilizados no Atmel® ATmega328P e sempre serão lidos como zero.

• Bit 3, 2 - ISC11, ISC10: Controle de detecção de interrupção 1 Bit 1 e Bit 0


A interrupção externa 1 é ativada pelo pino externo INT1 se o sinalizador SREG I e a máscara de interrupção correspondente estiverem definidos.
O nível e as bordas do pino INT1 externo que ativam a interrupção são definidos na Tabela 12-1. O valor no pino INT1 é amostrado antes de
detectar bordas. Se a interrupção de borda ou alternância for selecionada, pulsos que duram mais de um período de clock gerarão uma interrupção.
Pulsos mais curtos não são garantidos para gerar uma interrupção. Se a interrupção de baixo nível for selecionada, o nível baixo deve ser mantido
até a conclusão da instrução atualmente em execução para gerar uma interrupção.

Tabela 12-1. Interromper 1 Sentido de Controle

ISC11 ISC10 Descrição


0 0 O nível baixo de INT1 gera um pedido de interrupção.
0 1 Qualquer mudança lógica em INT1 gera um pedido de interrupção.
1 0 A borda descendente de INT1 gera uma solicitação de interrupção.
1 1 A borda de subida de INT1 gera uma solicitação de interrupção.

• Bit 1, 0 - ISC01, ISC00: Controle de detecção de interrupção 0 Bit 1 e Bit 0


A interrupção externa 0 é ativada pelo pino externo INT0 se o sinalizador SREG I e a máscara de interrupção correspondente estiverem definidos.
O nível e as bordas do pino INT0 externo que ativam a interrupção são definidos na Tabela 12-2. O valor no pino INT0 é amostrado antes de
detectar bordas. Se a interrupção de borda ou alternância for selecionada, pulsos que duram mais de um período de clock gerarão uma interrupção.
Pulsos mais curtos não são garantidos para gerar uma interrupção. Se a interrupção de baixo nível for selecionada, o nível baixo deve ser mantido
até a conclusão da instrução atualmente em execução para gerar uma interrupção.

Tabela 12-2. Interromper 0 Sentido de Controle

ISC01 ISC00 Descrição


0 0 O nível baixo de INT0 gera um pedido de interrupção.
0 1 Qualquer alteração lógica em INT0 gera um pedido de interrupção.
1 0 A borda descendente de INT0 gera uma solicitação de interrupção.
1 1 A borda de subida de INT0 gera uma solicitação de interrupção.

54 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

12.2.2 EIMSK - Registro de Máscara de Interrupção Externa

Pedaço 7 6 5 4 3 2 1 0

0x1D (0x3D) – – – – – – INT1 INT0 EIMSK


Ler escrever R R R R R R R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

• Bit 7..2 – Res: Bits Reservados

Esses bits são bits não utilizados no Atmel® ATmega328P e sempre serão lidos como zero.

• Bit 1 – INT1: Solicitação de interrupção externa 1 habilitada


Quando o bit INT1 é definido (um) e o bit I no registrador de status (SREG) é definido (um), a interrupção do pino externo é habilitada.
Os bits 1/0 de controle de detecção de interrupção 1/0 (ISC11 e ISC10) no registrador de controle de interrupção externo A (EICRA) definem se a
interrupção externa é ativada na borda ascendente e/ou descendente do pino INT1 ou no nível detectado. A atividade no pino causará uma
solicitação de interrupção mesmo se INT1 estiver configurado como uma saída. A interrupção correspondente da solicitação de interrupção externa
1 é executada a partir do vetor de interrupção INT1.

• Bit 0 – INT0: Solicitação de interrupção externa 0 habilitada


Quando o bit INT0 é definido (um) e o bit I no registrador de status (SREG) é definido (um), a interrupção do pino externo é habilitada.
Os bits de controle de detecção de interrupção 1/0 (ISC01 e ISC00) no registrador de controle de interrupção externo A (EICRA) definem se a
interrupção externa é ativada na borda ascendente e/ou descendente do pino INT0 ou no nível detectado. A atividade no pino causará uma
solicitação de interrupção mesmo se INT0 estiver configurado como uma saída. A interrupção correspondente da solicitação de interrupção externa
0 é executada a partir do vetor de interrupção INT0.

12.2.3 EIFR - Registro de Sinalização de Interrupção Externa

Pedaço 7 6 5 4 3 2 1 0

0x1C (0x3C) – – – – – – INTF1 INTF0 EIFR


Ler escrever R R R R R R R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

• Bit 7..2 – Res: Bits Reservados

Esses bits são bits não utilizados no Atmel ATmega328P e sempre serão lidos como zero.

• Bit 1 – INTF1: Sinalizador de Interrupção Externa 1


Quando uma mudança de borda ou lógica no pino INT1 aciona uma solicitação de interrupção, INTF1 é definido (um). Se o bit I em SREG e o bit
INT1 em EIMSK estiverem definidos (um), o MCU saltará para o vetor de interrupção correspondente. O sinalizador é apagado quando a rotina de
interrupção é executada. Alternativamente, o sinalizador pode ser apagado escrevendo-se um lógico nele. Este sinalizador é sempre apagado
quando INT1 é configurado como uma interrupção de nível.

• Bit 0 – INTF0: Sinalizador de Interrupção Externa 0


Quando uma mudança de borda ou lógica no pino INT0 aciona uma solicitação de interrupção, INTF0 é definido (um). Se o bit I em SREG e o bit
INT0 em EIMSK estiverem definidos (um), o MCU saltará para o vetor de interrupção correspondente. O sinalizador é apagado quando a rotina de
interrupção é executada. Alternativamente, o sinalizador pode ser apagado escrevendo-se um lógico nele. Este sinalizador é sempre apagado
quando INT0 é configurado como uma interrupção de nível.

ATmega328P [FICHA DE DADOS] 55


7810D–AVR–01/15
Machine Translated by Google

12.2.4 PCICR – Registro de Controle de Interrupção de Mudança de Pino

Pedaço 7 6 5 4 3 2 1 0

(0x68) – – – – – PCIE2 PCIE1 PCIE0 PCICR


Ler escrever R R R R R R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

• Bit 7..3 - Res: Bits Reservados

Esses bits são bits não utilizados no Atmel® ATmega328P e sempre serão lidos como zero.

• Bit 2 - PCIE2: Ativação de interrupção de alteração de pino 2

Quando o bit PCIE2 é definido (um) e o bit I no registrador de status (SREG) é definido (um), a interrupção de mudança de pino 2 é habilitada. Qualquer alteração em
qualquer pino PCINT23..16 habilitado causará uma interrupção. A interrupção correspondente da solicitação de interrupção de mudança de pino é executada a partir do
vetor de interrupção PCI2. Os pinos PCINT23..16 são habilitados individualmente pelo registrador PCMSK2.

• Bit 1 - PCIE1: Ativação de interrupção de alteração de pino 1

Quando o bit PCIE1 é definido (um) e o bit I no registrador de status (SREG) é definido (um), a interrupção de mudança de pino 1 é habilitada. Qualquer alteração em
qualquer pino PCINT14..8 habilitado causará uma interrupção. A interrupção correspondente da solicitação de interrupção de mudança de pino é executada a partir do
vetor de interrupção PCI1. Os pinos PCINT14..8 são habilitados individualmente pelo registrador PCMSK1.

• Bit 0 - PCIE0: Ativação de interrupção de alteração de pino 0

Quando o bit PCIE0 é definido (um) e o bit I no registrador de status (SREG) é definido (um), a interrupção de mudança de pino 0 é habilitada. Qualquer alteração em
qualquer pino PCINT7..0 ativado causará uma interrupção. A interrupção correspondente da solicitação de interrupção de mudança de pino é executada a partir do vetor
de interrupção PCI0. Os pinos PCINT7..0 são habilitados individualmente pelo registrador PCMSK0.

12.2.5 PCIFR – Registro de Sinalizador de Interrupção de Mudança de Pino

Pedaço 7 6 5 4 3 2 1 0

0x1B (0x3B) – – – – – PCIF2 PCIF1 PCIF0 PCIFR


Ler escrever R R R R R R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

• Bit 7..3 - Res: Bits Reservados

Esses bits são bits não utilizados no Atmel ATmega328P e sempre serão lidos como zero.

• Bit 2 - PCIF2: Sinalizador 2 de Interrupção de Mudança de Pino

Quando uma mudança de lógica em qualquer pino PCINT23..16 aciona uma solicitação de interrupção, o PCIF2 é definido (um). Se o bit I no SREG e o bit PCIE2 no
PCICR estiverem definidos (um), o MCU saltará para o vetor de interrupção correspondente. O sinalizador é apagado quando a rotina de interrupção é executada.
Alternativamente, o sinalizador pode ser apagado escrevendo-se um lógico nele.

• Bit 1 - PCIF1: Sinalizador de interrupção de mudança de pino 1

Quando uma mudança de lógica em qualquer pino PCINT14..8 aciona uma solicitação de interrupção, o PCIF1 é definido (um). Se o bit I no SREG e o bit PCIE1 no PCICR
estiverem definidos (um), o MCU saltará para o vetor de interrupção correspondente. O sinalizador é apagado quando a rotina de interrupção é executada. Alternativamente,
o sinalizador pode ser apagado escrevendo-se um lógico nele.

• Bit 0 - PCIF0: Sinalizador de interrupção de mudança de pino 0

Quando uma mudança de lógica em qualquer pino PCINT7..0 aciona uma solicitação de interrupção, o PCIF0 é definido (um). Se o bit I no SREG e o bit PCIE0 no PCICR
estiverem definidos (um), o MCU saltará para o vetor de interrupção correspondente. O sinalizador é apagado quando a rotina de interrupção é executada. Alternativamente,
o sinalizador pode ser apagado escrevendo-se um lógico nele.

56 ATmega328P [FICHA DE DADOS]


7810D–AVR–01/15
Machine Translated by Google

12.2.6 PCMSK2 – Registro de Máscara de Mudança de Pino 2

Pedaço 7 6 5 4 3 2 1 0

(0x6D) PCINT23 PCINT22 PCINT21 PCINT20 PCINT19 PCINT18 PCINT17 PCINT16 PCMSK2
Ler/Gravar R/W R/W R/W R/W R/W R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

• Bit 7..0 – PCINT23..16: Máscara de habilitação de mudança de pino 23..16

Cada bit PCINT23..16 seleciona se a interrupção de mudança de pino está habilitada no pino de E/S correspondente. Se PCINT23..16 estiver definido e o
bit PCIE2 em PCICR estiver definido, a interrupção de mudança de pino é habilitada no pino de E/S correspondente. Se PCINT23..16 for desenergizado, a
interrupção de mudança de pino no pino de E/S correspondente é desabilitada.

12.2.7 PCMSK1 – Registro de Máscara de Mudança de Pino 1

Pedaço 7 6 5 4 3 2 1 0

(0x6C) – PCINT14 PCINT13 PCINT12 PCINT11 PCINT10 PCINT9 PCINT8 PCMSK1


Ler escrever R R/W R/W R/W R/W R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

• Bit 7 – Res: Bit Reservado

Este bit é um bit não utilizado no Atmel® ATmega328P e sempre será lido como zero.

• Bit 6..0 – PCINT14..8: Máscara de habilitação de mudança de pino 14..8

Cada bit PCINT14..8 seleciona se a interrupção de mudança de pino está habilitada no pino de E/S correspondente. Se PCINT14..8 estiver definido e o bit
PCIE1 em PCICR estiver definido, a interrupção de mudança de pino é habilitada no pino de E/S correspondente. Se PCI