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.

Nenhum comentário: