Académique Documents
Professionnel Documents
Culture Documents
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.
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:
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.
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