quarta-feira, julho 06, 2011

Microcontrolador Atmel ATmega328 - Parte 2

O coração (ou o cérebro?) de um microcontrolador é a sua CPU. No caso do ATmega328, temos uma CPU AVR do tipo "enhanced core". Vejamos algumas de suas características.

A Arquitetura Interna da CPU


Novamente notamos a separação das vias de acesso à Flash e SRam, típicas das arquiteturas Harvard e derivadas.

No lado da Flash temos o Program Counter (que aponta para a próxima instrução). O AVR possui um pipeline de um nível, no qual enquanto uma instrução é executada a seguinte é carregada. Isto possibilita executar as instruções mais simples em um único ciclo de clock. Embora a Flash seja endereçada byte a byte, as instruções são compostas por uma ou duas palavras de 16 bits (ocupando portando duas ou quatro posições da Flash).

A família AVR possui uma generosa coleção de 32 registradores de uso geral, todos de 8 bits. Os seis últimos registradores podem ser usados aos pares como três registradores de 16 bits (X, Y e Z) para endereçamento indireto da memória.

A Unidade Lógica Aritmética (ALU) trabalha com 8 bits; obtêm os operandos dos registradores e coloca o resultado no primeiro operando (exceto na multiplicação). Todas as operações lógicas e aritméticas são executadas em um ciclo, exceto pela multiplicação que demora dois ciclos.

Memória Interna de Dados

A memória interna de dados é composta pelos registradores de uso geral, os registradores de entrada e saída (que controlam os periféricos internos) e a memória SRam propriamente dita.

No Atmega328 os registradores podem ser acessados nas primeiras 32 posições de memória e os registradores de E/S nas 64 posições seguintes, com a SRam começando no endereço 0x60.

Reparar que na figura não temos a pilha nem o seu ponteiro (SP). No AVR a pilha reside na memória SRam e o seu ponteiro são dois registradores de E/S.

Endereçamento

As instruções dispõem de um conjunto bastante variado de modos de endereçamento:
  • Endereçamento direto a registrador: usado nas operações lógicas e aritméticas; os números dos registradores usados estão na instrução.
  • Endereçamento direto a E/S: o endereço do registrador de E/S está na instrução.
  • Endereçamento direto a dados: um endereço de memória de 16 bits faz parte da instrução.
  • Endereçamento indireto: um dos registradores X, Y ou Z contém o endereço da memória. Existem variações deste endereço com pré-decremento ou pós-incremento do registrador.
  • Endereçamento indireto com deslocamento: o endereço da memória é a soma do conteúdo do registrador Y ou Z com um deslocamento de 0 a 63 contido na instrução.
  • Endereçamento indireto da memória de programa: usado nas operações de leitura da Flash, usam o endereço no registrador Z; uma variante deste modo realiza o pós-incremento do registrador.
  • Endereçamento direto da memória de programa (para desvio): usado nas instruções JMP e CALL, um endereço de 22 bits faz parte da instrução.
  • Endereçamento indireto da memória de programa (para desvio): usado nas instruções IJMP e ICALL, usa o registrador Z para obter um endereço de 16bits.
  • Endereçamento relativo da memória de programa (para desvio): a instrução contem um deslocamento de 11 bits (com sinal) que é somando ao contador de programa.
Instruções

Durante o projeto do AVR a Atmel consultou vários desenvolvedores de compiladores para garantir que seria possível implementar linguagens de alto nível de forma eficiente.

A família AVR segue a filosofia RISC, com instruções lógicas e aritméticas operando sobre registradores e uma grande flexibilidade na escolha destes registradores. Apesar do R de RISC ser reduced, o ATMega tem nada menos que 131 instruções. Um resumo pode ser visto na Wikipedia, o manual completo está no site da Atmel.

As instruções normais lógicas, aritméticas e de manipulação de bits estão presentes. O ATmega328 possui ainda da multiplicação com e sem sinal sobre dois operandos de 8 bits com um resultado de 16 bits.

No que diz respeito a desvios condicionais, existem instruções de desvio propriamente dito (BRxx) que fazem um desvio relativo conforme o status da CPU e instruções do tipo skip (SBxx) que pulam a instrução seguinte conforme um bit de um registrador de uso geral ou E/S.

As instruções LPM e SPM permitem, respectivamente ler e gravar na memória de programa (Flash). Enquanto que a instrução LPM é bastante simples, a instrução SPM é bastante complexa, visto que a escrita é feita página a página e requer três operações: apagamento da página, montagem do novo conteúdo em um buffer temporário e a gravação da página com o conteúdo do buffer temporário. No AtMega328 temos 256 páginas, cada uma com 128 bytes.

2 comentários:

Gabriel disse...

Muito bom cara, bem explicado e de acordo com o datasheet me ajudou muito no meu trabalho de organização de computadores. Valeu

Guilherme disse...

Muito Útil esse Post, me ajudou em um trabalho sobre organização de computadores, as explicações estão mais claras aqui do nos manuais da própria Atmel.