Você está na página 1de 6

Microcontrolador Atmel ATmega328

O microcontrolador ATmega328 da Atmel utilizado nos Arduinos mais recentes. um


microcontrolador de 8 bits, com arquitetura Harvard modificada. Veremos algumas de suas
caractersticas.
Um Pouco Sobre a Famlia AVR
O ATmega328 pertence famlia AVR da Atmel. Todos os modelos desta famlia
compartilham uma arquitetura e conjunto de instrues bsicas, particularmente os grupos tinyAVR
(microcontroladores ATtiny), megAVR (os ATmega) e XMEGA (os Atxmega).Os primeiros
modelos de Arduino usavam o ATmega8 (com 8K de memria Flash), que posteriormente foi
substitudo pelo ATMega168 (com 16K de Flash e maiores recursos de entrada e sada) e finalmente
pelo ATMega328 (com 32K de Flash). A verso DIP destes trs modelos compartilham a mesma
pinagem (porm o ATMega168 e ATMega328 permitem alguns usos diferentes dos pinos). O
Arduino Mega 2560 usa o ATMega2560 com 256K de Flash e uma capacidade muito maior de
entrada e sada.
O Diagrama de Blocos
A figura abaixo, extrada do datasheet, mostra os principais blocos do microcontrolador

Reparar as ligaes separadas entre a CPU e as memrias Flash e SRam. O uso de vias de
dados separadas para programa e dados uma caracterstica da arquitetura Harvard. Na famlia AVR
as duas vias tem largura de 8 bits e a memria Flash pode ser usada para armazenar dados constantes
(da ser uma arquitetura Harvard modificada).
Entretanto, somente instrues armazenadas na Flash podem ser executadas (no possvel
executar cdigo que esteja na SRam).
Como outros microcontroladores AVR, o ATMega328 possui ainda uma memria do tipo
EEProm, porm esta memria est ligada na via de conexo aos perifricos e portanto no acessada
pelas instrues normais de acesso a memria.
Alm da EEProm podem ser vistos as trs portas de E/S digital (PORTs B, C e D), os trs
timers (TCx, dois de 8 bits e um de 16 bits), o conversor A/D, o comparador analgico e as interfaces
seriais SPI, TWI (compatvel com I2C) e USART.
CPU
O corao (ou o crebro?) de um microcontrolador a sua CPU. No caso do ATmega328,
temos uma CPU AVR do tipo enhanced core. Vejamos algumas de suas caractersticas.
A Arquitetura Interna da CPU

Novamente notamos a separao das vias de acesso Flash e SRam, tpicas das arquiteturas
Harvard e derivadas.
No lado da Flash temos o Program Counter (que aponta para a prxima instruo). O AVR
possui um pipelinede um nvel, no qual enquanto uma instruo executada a seguinte carregada.
Isto possibilita executar as instrues mais simples em um nico ciclo de clock. Embora a Flash seja
endereada byte a byte, as instrues so compostas por uma ou duas palavras de 16 bits (ocupando
portando duas ou quatro posies da Flash).
A famlia AVR possui uma generosa coleo de 32 registradores de uso geral, todos de 8 bits.
Os seis ltimos registradores podem ser usados aos pares como trs registradores de 16 bits (X, Y e
Z) para endereamento indireto da memria.
A Unidade Lgica Aritmtica (ALU) trabalha com 8 bits; obtm os operandos dos
registradores e coloca o resultado no primeiro operando (exceto na multiplicao). Todas as
operaes lgicas e aritmticas so executadas em um ciclo, exceto pela multiplicao que demora
dois ciclos.

Memria Interna de Dados


A memria interna de dados composta pelos registradores de uso geral, os registradores de
entrada e sada (que controlam os perifricos internos) e a memria SRam propriamente dita.
No Atmega328 os registradores podem ser acessados nas primeiras 32 posies de memria e
os registradores de E/S nas 64 posies seguintes, com a SRam comeando no endereo 0x60.
Reparar que na figura no temos a pilha nem o seu ponteiro (SP). No AVR a pilha reside na
memria SRam e o seu ponteiro so dois registradores de E/S.

Como todo microcontrolador que se preze, o ATmega328 possui uma boa coleo de perifricos
internos. A plataforma Arduino se aproveita disto e disponibiliza quase todos os pinos do ATmega
para os shields, como mostram as figuras abaixo:

Entradas e Sadas Digitais


Dos 28 pinos do ATmega328, 23 podem ser usados como entrada ou sada digital (inclusive
os que esto marcados como entradas analgicas na placa do Arduino). Todos os pinos possuem
funes alternativas, por exemplo no Arduino utiliza funes como Reset, XTAL1 e XTAL2,
limitando o uso destes pinos para E/S digital.
Os pinos de E/S digital esto organizados em trs portas (PB, PC e PD), mas cada pino pode
ser configurado independentemente como entrada e sada. Todos os pinos possuem um resistor
de pull-up (tambm controlado independentemente) e diodos de proteo. Quando operando como
sada, os pinos podem tanto gerar como receber uma corrente suficiente para acender um LED (at
40mA por pino).
Os 23 pinos de E/S digital podem tambm ser gerar uma interrupo quando ocorre mudana
de sinal. possvel controlar a gerao de interrupo pino a pino e ela independe do pino ter sido
configurado como entrada ou sada.
Conversor Analgico Digital
O conversor analgico digital (ADC) possui 10 bits de resoluo e possui 8 opes de entrada
(6 no encapsulamento DIP normalmente usado no Arduino). Existem trs opes de referncia: a
tenso de alimentao (fornecida em um pino separado, AVcc), uma referncia interna de 1,1V ou
um tenso externa (fornecida no pino ARef).
Comparador Analgico
Para aplicaes que precisam testar um sinal analgico mas no precisam de toda a
sofisticao da converso analgico digital, o ATmega328 possui um mdulo comparador analgico
que pode gerar uma interrupo ou iniciar/parar um timer quando a voltagem na sua entrada positiva
fica maior que a voltagem na sua entrada negativa.

Timers
O ATmega328 possui trs timers: o Timer0, de 8 bits, o Timer1, de 16 bits, e o Timer2 de 8
bits. Os trs timers podem ser usados para gerao de sinais PWM, Timer1 e Timer2 possuem duas
unidades de comparao e sada independentes, o Timer3 apenas uma.
Todo cdigo a ser executado pelo ATmega328 precisa residir na memria Flash. Embora o
usurio casual do Arduino no perceba, esta memria possui diversas excentricidades.
As Memrias Flash
De uma forma geral, as memrias do tipo Flash se caracterizam por no necessitarem de
alimentao para manter seu contedo (so no volteis) e permitirem a sua alterao ocasional.
A leitura da memria Flash no costuma envolver cuidados especiais (porm ela mais lenta
que a memria Ram). A operao de escrita um pouco mais complexa e permite apenas mudar bits
do estado '1' para o estado '0'. Para retornar os bits em '0' para '1' necessria uma operao de
apagamento, que lenta e tipicamente afeta muitas posies de memria.
O nmero de escritas/apagamentos limitado; a Atmel garante um mnimo de 10000
operaes no ATmega328.
Usando Dados na Flash do ATmega328
Como dito no incio, o ATMega328 s capaz de executar instrues que estejam na Flash
(consequncia da sua arquitetura Harvard). Nada impede, claro, de colocar bytes arbitrrios na
Flash. Entretanto, usar estes dados requer um procedimento especial. Afinal, na arquitetura Harvard,
as vias de endereos e dados so separadas para Ram e Flash. No primeiros microcontroladores PIC,
por exemplo, era impossvel acessar diretamente o contedo da Flash; constante tinham que ser
geradas executando cdigo.
Felizmente o ATmega328 (e outros microcontroladores da famlia AVR) possuem a instruo
LPM (Load Program Memory). Esta instruo copia o byte da Flash apontado pelo registrador Z para
um registrador de uso geral (de onde pode ser escrito na Ram se necessrio) e, opcionalmente,
incrementa Z para apontar para a posio seguinte.
Gravando a Flash
Como colocar um programa inicialmente na Flash do ATmega328? Existem trs maneiras
bsicas:

Programador paralelo externo: esta opo requer colocar +12V no pino de reset e fazer um
"sapateado" complexo em vrios outros pinos. , portanto, mais adequado para a programao fora
do circuito.

Programador serial (SPI) externo: esta opo no requer tenses especiais e utiliza apenas trs
pinos (alm do reset), sendo vivel de ser usada sem retirar o ATmega328 do circuito.

Programao por software: atravs de instrues especiais possvel o firmware regravar a


Flash.
Em todos os casos muitos cuidados especiais precisam ser tomados.
Arduino: O Bootloader
O arduino necessita ter um software chamado bootloader gravado no microcontrolador e o
cdigo executvel (programa) gravado na flash.. Vamos agora juntar estas duas informaes e ver em
mais detalhes o que e como funciona o Bootloader.

Uma vez que todo software a ser executado no AVR precisa estar na Flash, o programa feito
na IDE do Arduino (sketch) precisa ser gravado l. Para dispensar o uso de um gravador externo, a
gravao da Flash feita por um software que reside nela prpria, o Bootloader. O Bootloader o
primeiro software executado pelo microcontrolador aps um Reset (Boot) e carrega na Flash um
software que recebe pela serial (loader).
O ATmega328 possui alguns recursos que facilitam (ou complicam?) isto:

A memria Flash pode ser dividida em duas sees, um bootloader (no final da memria, com
512, 1024, 2048 ou 4096 bytes) e uma aplicao (com o restante). Na seo do bootloader pode ser
usada a instruo SPM, capaz de reprogramar toda a Flash.

Independente disto, existe uma outra diviso em duas sees de tamanho fixo, a RWW (Read
While Write, os primeiros 28K) e a NRWW (No Read While Write, os ltimos 4K). Enquanto est
sendo feito um apagamento ou escrita na regio RWW, cdigo pode estar executando na regio
NRWW. No caso contrrio, regio NRWW sendo atualizada, o processador fica parado durante a
operao.

Para fins de apagamento e gravao a Flash dividida em pginas de 128 bytes. As operaes
afetam sempre uma pgina inteira.
Obs.: Os outros microcontroladores usados no Arduino tem recursos semelhantes, porm os nmeros
acima podem ser diferentes.
Em termos prticos, um software na seo bootloader pode executar sem parada enquanto a
seo de aplicao atualizada. A seo de bootloader pode se auto-atualizar, porm o processador
ficar parado enquanto a operao de completa (e voc no vai querer atualizar a pgina onde est
sendo executada a instruo SPM).
No que diz respeito ao protocolo para receber o programa pela serial, o Bootloader utiliza um
subconjunto do protocolo usado por um programador externo, o STK-500. Isto permite usar
softwares padro de programao no PC, a IDE do Arduino usa o Avrdude.
Ao longo dos anos o bootloader do Arduino passou por alteraes, a verso atual o chamado
Optiboot (bootloader "otimizado"). A otimizao consistiu em reduzir o tamanho para caber em 512
bytes, aumentar a velocidade na serial para 19200 e receber os dados de uma pgina enquanto a
apaga.
Existe ainda um ltimo ponto importante no bootloader: o seu disparo e o disparo da
aplicao. Nas primeiras verses, o bootloader comeava a sua execuo quando era feito um reset e
esperava por um certo tempo uma comunicao antes de iniciar a aplicao. Isto trazia dois
inconvenientes: era preciso apertar o boto de reset antes de enviar um sketch e aguardar alguns
segundos ao final da carga para ele comear a ser executado.
A primeira limitao foi contornada por hardware: ao detectar uma conexo na serial o
microcontrolador ressetado no Duemilinove e no Uno. Para o segundo inconveniente, o bootloader
passou a distinguir a iniciao pelo sinal de reset da reiniciao ao final da carga de um sketch. No
segundo caso o bottoloader passa diretamente para a aplicao, no tentando estabelecer
comunicao.
Com estas alteraes podem ocorrer problemas quando a aplicao do Arduino utiliza
comunicao serial. De um lado pode ocorrer uma reiniciao devido a uma conexo (retirando o
controle da aplicao e passando ao bootloader) e por outro o bootloader pode ficar tentando tratar
uma comunicao destinada aplicao e nunca passar o controle para ela