Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
ATmega328P
FICHA DE DADOS
Características
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
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:
1. Configurações de pinos
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
VCC 6 19 ADC6
9 10 11 12 13 14 15 16
(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
VCC 6 19 ADC6
9 10 11 12 13 14 15 16
(PCINT2/
OC1B)
PB2
SS/
(PCINT21/
OC0B/
PD5
T1)
(PCINT0/
CLKO/
ICP1)
PB0
(PCINT3/
OC2A/
MOSI)
PB3
(PCINT22/
OC0A/
AIN0)
PD6
1.1.1 VCC
Tensão de alimentação digital.
1.1.2 GND
Chão.
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.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.
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.
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).
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.
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
REDEFINIR
XTAL[1..2]
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.
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.
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”.
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.
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
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.
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.
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.
Pedaço 7 6 5 4 3 2 1 0
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.
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.
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.
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.
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.
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.
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.
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.
A Figura 6-2 mostra a estrutura dos 32 registradores de trabalho de uso geral na CPU.
7 0 Endereço
R0 0x00
R1 0x01
R2 0x02
…
R13 0x0D
Em geral R14 0x0E
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.
15 XH XG 0
Registro X 7 0 7 0
15 YH YL 0
registro Y 7 0 7 0
15 ZH ZL 0
Registro Z 7 0 7 0
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).
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.
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.
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
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.
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.
clkCPU
Gravação do Resultado
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.
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 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 C
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.
7. Memórias AVR
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.
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.
Memória do programa
0x0000
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 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.
Memória de dados
0x08FF
T1 T2 T3
clkCPU
Dados
Escreva
WR
Dados
Ler
RD
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.
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.
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.
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.
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.
Pedaço 15 14 13 12 11 10 9 8
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
Esses bits são bits reservados no Atmel ATmega328P e sempre serão lidos como zero.
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.
Pedaço 7 6 5 4 3 2 1 0
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.
Pedaço 7 6 5 4 3 2 1 0
Esses bits são bits reservados no Atmel ATmega328P e sempre serão lidos como zero.
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.
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.
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.
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.
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.
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.
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.
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
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.
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
Pedaço 7 6 5 4 3 2 1 0
Pedaço 7 6 5 4 3 2 1 0
Pedaço 7 6 5 4 3 2 1 0
clkADC
clkASY clkFLASH
Relógio do sistema
Pré-escalador
Redefinir lógica Cronômetro de vigilância
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.
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.
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.
Reservado 0001
Nota: 1. Para todos os fusíveis “1” significa não programado enquanto “0” significa programado.
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.
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.
Tipo de tempo limite (VCC = 5,0V) Tipo de tempo limite (VCC = 3,0V) Número de ciclos
0ms 0ms 0
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.
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.
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.
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.
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.
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
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.
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.
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.
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
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.
9,0 65
12,5 30
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
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
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.
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.
8 0010
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
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.
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.
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.
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).
Frequência CKSEL3..0
0 a 16MHz 0000
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.
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.
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.
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.
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
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.
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
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.
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
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
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
Esses bits são bits não utilizados no Atmel® ATmega328P e sempre serão lidos como zero.
Esses bits selecionam entre os cinco modos de suspensão disponíveis, conforme mostrado na Tabela 9-2 na página 38.
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.
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.
Pedaço 7 6 5 4 3 2 1 0
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.
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.
Pedaço 7 6 5 4 3 2 1 0
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.
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.
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.
Este bit é reservado no Atmel® ATmega328P e sempre será lido como zero.
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.
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.
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.
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.
• 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.
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
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]
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.
VCC VPOT
REDEFINIR VRST
tTOUT
Tempo esgotado
interno
Redefinir
VCC VPOT
REDEFINIR VRST
tTOUT
Tempo esgotado
interno
Redefinir
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
Nota: 1. Antes de subir, a alimentação deve estar entre VPORMIN e VPORMAX para garantir um reset
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.
VCC
REDEFINIR VRST
tOUT
TEMPO ESGOTADO
INTERNO
REDEFINIR
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.
VCC
VBOT+
VBOT
REDEFINIR
tTOUT
TEMPO ESGOTADO
INTERNO
REDEFINIR
VCC
REDEFINIR
1 Ciclo CK
WDT
TEMPO ESGOTADO
tTOUT
REDEFINIR
Tempo esgotado
INTERNO
REDEFINIR
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.1 Recursos
• Cronometrado a partir de oscilador no chip separado
• 3 modos de operação
• Interromper
• Redefinição do sistema
• Possível watchdog de fusível de hardware sempre ligado (WDTON) para modo à prova de falhas
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.
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.
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.
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.
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
; Desligue o WDT
ldi r16, (0<<WDE) sts WDTCSR,
r16
; Ativar interrupção global sei
ret
void WDT_off(void) {
__disable_interrupt(); __watchdog_reset();
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.
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
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();
}
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
Esses bits são bits não utilizados no Atmel® ATmega328P e sempre serão lidos como zero.
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.
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.
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.
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
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.
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.
1 0 0 Parou Nenhum
Nota: 1. Fusível WDTON ajustado em “0” significa programado e “1” significa não programado.
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.
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
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
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.
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.
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
... ... ... ...
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
Pedaço 7 6 5 4 3 2 1 0
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.
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);
}
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.
clique
clique
PCINT(0)
pin_lat
pin_sync
pcint_in_(0)
pcint_syn
pcint_setflag
PCIF
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
Esses bits são bits não utilizados no Atmel® ATmega328P e sempre serão lidos como zero.
Pedaço 7 6 5 4 3 2 1 0
Esses bits são bits não utilizados no Atmel® ATmega328P e sempre serão lidos como zero.
Pedaço 7 6 5 4 3 2 1 0
Esses bits são bits não utilizados no Atmel ATmega328P e sempre serão lidos como zero.
Pedaço 7 6 5 4 3 2 1 0
Esses bits são bits não utilizados no Atmel® ATmega328P e sempre serão lidos como zero.
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.
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.
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.
Pedaço 7 6 5 4 3 2 1 0
Esses bits são bits não utilizados no Atmel ATmega328P e sempre serão lidos como zero.
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.
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.
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.
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
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.
Pedaço 7 6 5 4 3 2 1 0
Este bit é um bit não utilizado no Atmel® ATmega328P e sempre será lido como zero.
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