# Atmel AVR

AVR é um microcontrolador RISC de chip único com uma arquitetura Harvard modificada de 8-bits (µC), desenvolvido em 1996 pela Atmel, comprada pela Microchip Technology em 2016. Foi um dos primeiros da família de microcontroladores a utilizar uma memória flash com o intuito de armazenar a programação, diferentemente de seus concorrentes da época, que utilizavam memórias do tipo PROM, EPROM ou EEPROM.

## Breve História

Acreditava-se que sua arquitetura base foi conceituada por dois estudantes do Instituto Norueguês de Tecnologia (INT) Alf-Egil Bogen e Vegard Wollan. Entretanto, ela foi desenvolvida por eles na Atmel Noruega, em Trondheim, onde, sendo eles dois fundadores da subsidiária naquele país, venderam a tecnologia para a Atmel como μRISC (Micro RISC).
A empresa diz que o nome AVR não é um acrônimo e não tem nenhum significado em especial. Os criadores nunca deram uma resposta definitiva sobre o assunto.
A linha AT90S8515 está entre as primeiras fabricadas, na qual seu formato de pacote DIP de 40 pinos teve a mesma pinagem que o 8051, incluindo endereços externos multiplexados e dados de controlador. A polaridade do RESET era invertida, mas fora isso, o restante da pinagem era idêntica.

## Visão geral

A arquitetura Havard modificada do AVR tem o programa e os dados armazenados em sistemas de memória física separados, que aparecem em diferentes espaços de endereços, mas possui a habilidade de ler os itens da memória do programa usando instruções especiais.

### Famílias

Há, geralmente, quatro amplos grupos de classificação:
| tinyAVR Série ATtiny | megaAVR Série ATmega | XMEGA Série ATxmega | Atmel At94k Série FPSLIC (Circuito Integrado com Campo de Nível de Sistema Programável) |
| • Memória do programa de 0.5 a 8 kB  • 6 ou 32 pinos  • Conjunto limitado de periféricos | • Memória do programa de 4 a 256 kB  • 28 ou 100 pinos  • Conjunto de instruções estendidas (múltiplas instruções e instruções para gerenciamento de programas com grandes memórias)  • Conjunto extensivo de periféricos | • Memória do programa de 16 a 384 kB  • 44, 64 ou 100 pinos (A4, A3, A1)  • Maior desempenho, tal como DMA, "Evento de Sistema"  • Suporte a criptografia  • Conjunto extensivo de periféricos com DACs | • Núcleo baseado em FPGA  • Utiliza SRAM para o código do programa, diferente dos restantes AVRs  • Em parte, devido a diferença de velocidade relativa entre SRAM e Flash, este núcleo pode executar velocidades acima de 50 megahertz |
* Aplicação específica AVR
* megaAVRs com características especiais não são associadas a nenhuma outra família AVR, tal como os controladores LCD e USB, energia avançada e CAN

### Arquitetura

Flash, EEPROM e SRAM são todos integrados em um único chip, fora o necessário pelas memórias externas nas maiorias das aplicações. Algumas aplicações têm a opção de inserir um barramento paralelo externo para permitir memória para dados adicionais, código ou para mapeamento de dispositivos. Todos possuem interface seriais, que podem ser usadas para conectar EEPROMs seriais ou chips flash.

#### Memória de programa (Flash)

As instruções de programas são armazenados em memórias flash não voláteis. Apesar de serem de 8 bits, cada instrução consiste de palavras de 16 bits, além disso, não há suporte de utilizar os códigos de programas externamente, todas as instruções devem residir no núcleo do dispositivo.
O tamanho da memória do programa é normalmente indicado no nome do próprio dispositivo. Por exemplo, a linha ATmega64x tem 64 kbytes de flash, assim como a ATmega32x tem apenas 32kB.

#### Dados de memória interna

Os dados do espaço de endereçamento consistem de arquivos registradores, registradores de E/S e SRAM.

#### Registradores Internos

Os AVRs têm 32 registradores de byte-único e são classificados como dispositivos de 8-bits RISC.
Em algumas variantes, os registradores em funcionamento são mapeados nos primeiros 32 endereços de memória (0000$_{16}$-001F$_{16}$) seguidos por 64 registradores de E/S (0020$_{16}$-005F$_{16}$). Atualmente, a SRAM inicia depois destas seções de registradores (endereço 0060$_{16}$). O espaço registrador de E/S pode ser ampliado em alguns dispositivos extensivos, no caso dos registradores de memória mapeada em E/S, uma parte do espaço de endereçamento SRAM será ocupada.
Ainda que haja separados esquemas e códigos otimizados para o arquivo registrador e para os acessos de E/S, tudo poderá continuar endereçado e manipulado como se estivesse na SRAM. Com exceção da XMEGA, na qual o funcionamento do arquivo registrador não é mapeado para o espaço de endereçamento de dados. Em vez disso, eles são mapeados para o endereçamento de começando logo no início dele. Consequentemente, a parte dedicada ao endereçamento para os registradores de E/S foram acrescidos para 4096 bytes (0000$_{16}$-0FFF$_{16}$).
Como na geração anterior, no entanto, as instruções rápidas para manipular E/S apenas podem acessar as primeiras 64 posições dos registradores de E/S (sendo que as primeiras 32 posições são para instruções bitwise). E logo em seguida aos registradores de E/S, a séria XMEGA reserva uma faixa de 4096 bytes do espaço de endereçamento de dados que pode ser usado opcionalmente para mapear a EEPROM interna (1000$_{16}$-1FFF$_{16}$). A SRAM real é localizada após essas faixas, começando em 2000$_{16}$.

#### EEPROM

Quase todos os microcontroladores AVR possuem EEPROM interna para armazenamento de dados semi-permanente. Diferente da memória RAM, a EEPROM pode manter seu conteúdo quando a energia é desligada.
Na maioria das variantes da arquitetura AVR, esta memória EEPROM interna não é mapeada para o espaço de memória endereçável da MCU (do inglês Microcontroller Unit). Ela só pode ser acessada da mesma forma que um dispositivo periférico externo, usando registradores de ponteiros especiais e instruções de leitura/escrita, o que faz o acesso à EEPROM muito mais lento que outra RAM interna.
Entretanto, alguns dispositivos na família SecureAVR (AT90SC) usam um mapeamento de EEPROM especial para a memória de dados ou texto (programa) dependendo da configuração. A família XMEGA também permite que a EEPROM seja mapeada para o espaço de endereçamento de dados.
Como o número de escritas na EEPROM não é ilimitado — a Atmel especifica 100.000 ciclos de escrita nos seus datasheets — uma boa rotina de escrita na EEPROM deve comparar o conteúdo do endereço da EEPROM a ser escrito com o valor desejado a ser gravado e fazer a escrita apenas se o conteúdo precisar ser modificado.

## Clones open-source

Com a crescente popularidade dos FPGAs na comunidade open-source, começaram a desenvolver processadores open-source compatíveis com o conjunto de instruções AVR. O sítio OpenCores lista os maiores projetos clones do AVR a seguir:
* pAVR, escrito em VHDL, é focada a criar o mais rápido e mais completo processador AVR, implementando técnicas não encontradas no processador AVR original, como uma pipeline mais profunda.
* avr_core é um clone em VHDL que objetiva ser o mais próximo possível ao ATmega103.
* Navré é escrito em Verilog, implementa todo o núcleo clássico do conjunto de instruções AVR e é voltado para alta performance e baixo consumo. Não suporta interrupções.