Linguagem Assembly Dos Microprocessadores ATMEL AVR

Você também pode gostar

Você está na página 1de 63

Introduo para o iniciante

Linguagem Assembly dos


Microprocessadores ATMEL-AVR
por
Gerhard Schmidt
http://www.avr-asm-tutorial.net
Dezembro de 2003
Verso corrigida em Julho de 2006
Correes adicionais e atualizaes em Janeiro de 2008
Traduzido por Guilherme Groke ggroke@gmail.com
!"r#!sm#Tutorial $ http%&&'''(a"r#asm#tutorial(net
Contedo
Porque aprender Assembler?......................................................................................................................1
Curta e fcil...........................................................................................................................................1
Veloz.....................................................................................................................................................1
Assembler de fcil aprendizado..........................................................................................................1
AVRs so ideais para se aprender assembler........................................................................................1
Teste!.....................................................................................................................................................2
Hardware para programao em Assembler AVR.....................................................................................3
A interface ISP da famlia de processadores AVR................................................................................3
Programador para a porta paralela do PC..............................................................................................3
Placas experimentais.............................................................................................................................4
Placa experimental com ATtiny13...................................................................................................4
Placa experimental com um AT90S2313/ATmega2313..................................................................5
Placas de programao comerciais para a famlia AVR........................................................................6
STK200.............................................................................................................................................6
STK500.............................................................................................................................................6
AVR Dragon.....................................................................................................................................7
Ferramentas para programao assembly AVR ........................................................................................8
De um arquivo texto a palavras de instruo para a memria flash......................................................8
O editor.............................................................................................................................................8
O assembler......................................................................................................................................9
Programando os chips.........................................................................................................................10
Simulao no studio............................................................................................................................11
Registrador...............................................................................................................................................13
O que um registrador?......................................................................................................................13
Registradores diferentes......................................................................................................................14
Registradores ponteiros.......................................................................................................................14
Recomendao para uso dos registradores..........................................................................................15
Portas........................................................................................................................................................17
O que uma Porta?..............................................................................................................................17
Deatlhes de portas relevantes do AVR................................................................................................18
O registrador de status como a porta mais utilizada............................................................................18
Detalhes das portas..............................................................................................................................19
SRAM......................................................................................................................................................20
Usando SRAM em linguagem assembler AVR .................................................................................20
O que SRAM?..................................................................................................................................20
Para que propsitos posso usar a SRAM?...........................................................................................20
Como usar a SRAM?...........................................................................................................................20
Use of SRAM as stack.........................................................................................................................21
Definindo SRAM como pilha.........................................................................................................21
Uso da pilha....................................................................................................................................22
Bugs com a operao de pilhas.......................................................................................................22
Saltos e Desvios.......................................................................................................................................24
Controlando a execuo seqencial de um programa.........................................................................24
O que acontece durante um reset?..................................................................................................24
Execuo linear do programa e desvios..............................................................................................25
Temporizao durante a execuo do programa.................................................................................25
Macros e execuo do programa.........................................................................................................26
Subrotinas............................................................................................................................................26
Interrupes e a execuo do programa..............................................................................................28
Clculos....................................................................................................................................................30
Sistemas numricos em assembler......................................................................................................30
Nmeros positivos inteiros (bytes, palavras, etc.)..........................................................................30
Nmeros com sinal (inteiros)..........................................................................................................30
Dgitos Codificados em Binrio, BCD (Binary Coded Digits)......................................................30
BCDs compactados.........................................................................................................................31
Nmeros em formato ASCII...........................................................................................................31
Manipulao de bits.............................................................................................................................31
!"r#!sm#Tutorial 2 http%&&'''(a"r#asm#tutorial(net
Desloca e rotaciona..............................................................................................................................32
Somando, subtraindo e comparando....................................................................................................33
Converso de formatos numricos......................................................................................................35
Multiplicao.......................................................................................................................................35
Multiplicao decimal....................................................................................................................35
Multiplicao binria......................................................................................................................36
Programa em Assembler AVR.......................................................................................................36
Binary rotation................................................................................................................................37
Multiplicao no studio..................................................................................................................37
Diviso.................................................................................................................................................39
Diviso decimal..............................................................................................................................39
Binary division...............................................................................................................................39
Passos do programa durante a diviso............................................................................................40
Diviso no simulador......................................................................................................................40
Converso numrica............................................................................................................................43
Fraes decimais.................................................................................................................................43
Converses lineares........................................................................................................................43
Exempl0 1: Conversor AD 8-bit para sada decimal com ponto fixo.............................................44
Exemplo 2: Conversor AD de 10 bits com sada decimal fixa.......................................................45
Anexo.......................................................................................................................................................46
Instrues ordenadas por funo.........................................................................................................46
Lista de Diretivas e Instrues em ordem alfabtica...........................................................................48
Diretivas de Assembler em ordem alfabtica.................................................................................48
Instrues em ordem alfabtica......................................................................................................48
Detalhes das Portas..............................................................................................................................50
Registrador de Status, Flags do Acumulador.................................................................................50
Ponteiro de pilha.............................................................................................................................51
SRAM e controle externo de interrupes......................................................................................51
Controle de Interrupo Externo.....................................................................................................52
Controle do Timer de Interrupo..................................................................................................52
Timer/Contador 0............................................................................................................................53
Timer/Contador 1............................................................................................................................54
Watchdog-Timer.............................................................................................................................55
EEPROM........................................................................................................................................56
Interface de Perifricos Seriais (SPI)..............................................................................................56
UART.............................................................................................................................................57
Analog Comparator........................................................................................................................58
Portas E/S.......................................................................................................................................59
Portas, ordem alfabtica......................................................................................................................59
Lista de abreviaes............................................................................................................................60
Avr-Asm-Tutorial 1 http://www.avr-asm-tutorial.net
Porque aprender Assembler?
!ssem)ler ou outras linguagens* esta + a ,uesto( -or,ue eu de"eria aprender mais uma linguagem* se
eu ./ conheo outras linguagens de programao0 1 melhor argumento% en,uanto "oc2 "i"er na 3rana*
poder/ so)re"i"er 4alando 5ngl2s* mas "oc2 nunca se sentir/ em casa* e a "ida 4ica di46cil( Voc2 pode
apenas continuar desta 4orma* mas isto no + apropriado( 7e as coisas 4icarem complicadas* "oc2 de"er/
usar a linguagem corrente do pa6s
8uitas pessoas ./ e9perientes em programao de !V:s e ,ue usam linguagens de alto n6"el em seu
tra)alho normal* recomendam ,ue os iniciantes comecem aprendendo linguagem assem)l;( ! razo para
isto + ,ue* algumas "ezes* podem ocorrer certas situaes* como%
se )ugs t2m ,ue ser analizados*
se o programa 4az coisas di4erentes das ,ue 4oram escritas e so esperadas*
se linguagens de alto n6"el no suportam o uso de certas caracter6sticas do hard'are*
se rotinas em ,ue a temporizao + cr6tica re,uerem pores de linguagem assem)l;*
+ necess/rio entender a linguagem assem)l;* e(g(* entender o ,ue os compiladores de linguagens de alto
n6"el produzem( 7em compreender a linguagem assem)l;* "oc2 no ter/ chance de ir adiante nestes
casos(
Curta e fcil
1s comandos assem)ler so traduzidos um a um para serem comandos e9ecutados pela m/,uina( 1
processador necessita apenas e9ecutar o ,ue "oc2 ,uer 4azer e o necess/rio para e9ecutar a tare4a(
<enhum loop e9tra ou caracter6sticas desnecess/rias poluem o c=digo( 7e o espao para o seu programa
+ curto e limitado e "oc2 ter/ ,ue otimizar seu programa para ca)er na mem=ria* assem)ler + a escolha
n>mero um( -rogramas mais curtos so mais 4/ceis de depurar ?@de)ugarAB* cada passo 4az sentido(
Veloz
Como apenas os passos necess/rios so e9ecutados* os programas em assem)l; so to r/pidos ,uanto
poss6"el( !plicaes onde o tempo + cr6tico* como medies de tempo ,ue de"am ter )oa per4ormance*
sem ,ue ha.a um hard'are de temporizao* de"em ser escritas em assem)ler( 7e "oc2 ti"er mais tempo
e no se importar ,ue seu chip permanea CCD em um estado de espera ?'ait stateB de operao* "oc2
pode escolher a linguagem ,ue dese.ar(
Assembler de fcil aprendizado
<o + "erdade ,ue a linguagem assem)l; + mais complicada ou no + to 4/cil de compreender ,uanto
outras linguagens( !prender linguagem assem)l; para ,ual,uer tipo de hard'are 4acilita a compreenso
de conceitos de ,ual,uer outro dialeto da linguagem assem)l;( !prender outros dialetos depois + mais
4/cil( !lgumas caracter6sticas so dependentes do hard'are* e isto re,uer alguma 4amiliaridade com os
conceitos de hard'are e seus dialetos( 1 ,ue 4az o assem)ler parecer complicado algumas "ezes + ,ue
ele re,uer uma compreenso das 4unes do controlador do hard'are( Einguagens de alto n6"el no
permitem a utilizao de caracter6sticas especiais do hard'are* e escondem estas 4unes(
1 primeiro c=digo assem)l; no parece muito interessante* mas depois de $00 linhas adicionais
programadas* parecer/ melhor( -rogramas per4eitos re,uerem apenas alguns milhares de linhas de
c=digo de e9erc6cio* e otimizao re,uer )astante tra)alho( 1s primeiros passos so di46ceis em ,ual,uer
linguagem( !p=s algumas semanas programando* "oc2 dar/ risada se analisar seu primeiro c=digo(
!lguns comandos em assem)ler re,uerem meses de e9peri2ncia(
AVRs so ideais para se aprender assembler
-rogramas em assem)ler so um pouco tolos% o chip e9ecuta tudo ,ue "oc2 disser a ele para 4azer* e no
pergunta se "oc2 tem certeza se ,uer so)rescre"er isso ou a,uilo( Todas as caracter6sticas de proteo
de"em ser programadas por "oc2* o chip 4az e9atamente a,uilo ,ue lhe + comandado* mesmo ,ue no
4aa sentido algum( <enhuma .anela o alertar/* a menos ,ue "oc2 a tenha programado anteriormente(
-ara corrigir erros de digitao + to 4/cil ou complicado como ,ual,uer outra linguagem( F9istem erros
)/sicos ou mais complicados( -or+m% testar os programas nos chips !T8FE + muito 4/cil( 7e o chip no
4az o ,ue "oc2 espera* "oc2 pode 4acilmente adicionar algumas linhas de diagn=stico ao c=digo*
reprogram/#lo e test/#lo( !deus* programadores de F-:18* lGmpadas HV usadas para apagar o
programa* pinos ,ue no se encai9am mais no so,uete ap=s t2#los remo"ido uma d>zia de "ezes(
!s mudanas agora so programadas rapidamente* compiladas imediatamente* ou mesmo simuladas no
studio ou checadas no pr=prio circuito( <enhum pino tem ,ue ser remo"ido* e nenhuma lGmpada de HV te
Avr-Asm-Tutorial 2 http://www.avr-asm-tutorial.net
dei9ar/ na mo .ustamente no momento em ,ue "oc2 te"e uma e9celente id+ia so)re a,uele )ug(
Teste!
7e.a paciente nos seus primeiros passosI 7e "oc2 tem 4amiliaridade com outra linguagem ?alto n6"elB%
es,uea#a por en,uanto( ! maioria das caracter6sticas especiais de outras linguagens de computao
no 4azem nenhum sentido em assem)ler(
!s primeiras cinco instrues no so 4/ceis de aprender* depois disso sua "elocidade de aprendizado
aumentar/ rapidamente( Jepois ,ue "oc2 escre"eu as primeiras linhas% pegue o con.unto de instrues e
leia#o deitado em sua )anheira* imaginando para ,ue ser"em todas as outras instrues(
!"iso s+rio% <o tente criar uma mega#m/,uina logo de in6cio( 5sto no 4az sentido algum em nenhuma
linguagem de programao* e apenas produz 4rustrao( Comece com pe,uenos e9emplos tipo @1l/
8undoA* e(g(* ligando e desligando EFJs por algum tempo* e s= ento comece a e9plorar as
caracter6sticas do hard'are mais pro4undamente(
:ecomendao% Comente suas su)rotinas e armazene#as em um diret=rio especial* se de)ugadas% "oc2
precisar/ delas em )re"e(
7ucessoI
Avr-Asm-Tutorial 3 http://www.avr-asm-tutorial.net
Hardare para pro!rama"o em Assembler
AVR
!prender assem)ler re,uer um e,uipamento simples para testar seus programas e "er se eles 4uncionam
na pr/tica(
Fst/ p/gina mostra dois es,uemas 4/ceis ,ue permitem a "oc2 construir em casa o hard'are necess/rio(
Fste hard'are + realmente 4/cil de construir( Jesconheo ,ual,uer es,uema mais 4/cil do ,ue este para
o seus primeiros passo em so4t'are( 7e "oc2 ,uiser 4azer mais e9perimentos* reser"e espao para
e9panses 4uturas em sua placa de e9perimentos(
7e "oc2 no gosta do cheiro de solda* "oc2 pode comprar uma placa pronta para uso( !s placas
dispon6"eis esto listadas na seo a)ai9o(
A interface #$P da fam%lia de processadores AVR
!ntes de entrarmos na pr/tica* temos ,ue aprender alguns conceitos essenciais no modo de
programao serial da 4am6lia !V:( <o* "oc2 no precisa tr2s di4erentes "oltagens para programar e ler
a mem=ria 4lash do !V:( <o* "oc2 no precisa de outro microprocessador para programar os !V:s(
<o "oc2 no precisa de $0 linhas de F&7 para dizer ao chip o ,ue "oc2 gostaria ,ue ele 4izesse( F "oc2
no tem se,uer ,ue remo"er o !V: da sua placa de e9perimentos* antes de program/#lo( K 4/cil assim(
Tudo isto + 4eito pela inter4ace em)utida em cada chip !V:* ,ue permite a "oc2 escre"er e ler o conte>do
da mem=ria 4lash e FF-:18 em)utidas( Fsta inter4ace tra)alha serialmente e precisa de tr2s linhas de
sinal%
7CL% Hm sinal de clock ,ue mo"e os )its a serem escritos na mem=ria para um shi4t register
interno* ,ue mo"e os )its para serem lidos por outro shi4t register(
8175% Hm sinal de dados ,ue en"ia os )its para serem escritos no !V:*
MISO: Um sinal de dados ue re!e"e os "its lidos do A#$.
Fstes tr2s pinos de sinal so internamente conectados ao sistema de programao apenas se "oc2 dei9ar
o sinal :F7FT ?algumas "ezes chamado de :7T ou restartB em n6"el zero( Caso contr/rio* durante a
operao normal do !V:* estes pinos so portas de F&7 program/"eis como todas as outras( 7e "oc2
,uiser usar estes pinos para outros prop=sitos durante a operao normal* e para programao 57-* "oc2
ter/ ,ue 4az2#lo de 4orma ,ue estes dois prop=sitos no con4litem( <ormalmente "oc2 de"e desacoplar os
sinais por um resistor ou utilizar um multiple9ador( 1 necess/rio para o seu caso* depende do seu uso
dos pinos no modo de operao normal( 7e "oc2 ti"er sorte* pode dei9ar estes
pinos e9clusi"amente paa a programao 57-( <o necess/rio* por+m
recomendado para a programao 57-* + ,ue "oc2 tenha uma tenso de
alimentao para o hard'are no pr=prio circuito de programao( 5sto torna a
programao mais 4/cil* e re,uer apenas duas linhas adicionais entre o
programador e a placa !V:( G<J + o terra comum* VTG ?target "oltageB + a
tenso de alimentao ?normalmente M(0 VoltsB( 5sto totaliza 6 linhas entre o
programador e a placa !V:( ! cone9o 57-6 +* con4orme de4inida pela !T8FE*
mostrada N es,uerda(

-adres sempre t2m padres alternati"os( Fsta + a )ase t+cnica ,ue constitui a
empresa de adaptadores( <o nosso caso* o padro alternati"o 4oi pro.etado
utilizando um 57-$0 e 4oi utilizado na placa 7TL200( K um padro )astante
disseminado* e mesmo o 7TLM00 est/ e,uipado com este padro( 1 padro
571$0 tem um sinal adicional ,ue aciona um EFJ "ermelho( Fste EFJ sinaliza
,ue o programador est/ 4azendo o seu tra)alho( Hma )oa id+ia( Conecte o EFJ a
um resistor e N 4onte de tenso(
Pro!ramador para a porta paralela do PC
!gora* a,uea o seu 4erro de soldar e construiremos seu programador( K um es,uema )astante 4/cil e
4unciona com peas 4acilmente encontr/"eis na sua cai9a de e9perimentos(
7im* + tudo ,ue "oc2 precisa para programar um !V:( 1 plugue de 2M pinos se liga N porta paralela do
seu -C* e o conector 57- de $0 pinos se conecta N placa de e9perimentos !V:( 7e "oc2 no ti"er um
O2E72PM* "oc2 pode utilizar tam)+m o OPQC2PM ?sem mudanas no circuitoB ou um OPE72PP&OPQC2PP
Avr-Asm-Tutorial % http://www.avr-asm-tutorial.net
?com pe,uenas mudanas no circuitoB( 7e "oc2 utilizar QC* no se es,uea de conectar os pinos no
utilizados ao terra ou N tenso de alimentao* caso contr/rio os )u44ers podem produzir ru6do capaciti"o
pelo cha"eamento(
Todo o algoritmo de programao necess/rio + 4eito pelo so4t'are 57-( Fste.a ciente ,ue esta inter4ace
paralela no + mais suportada pelo so4t'are !tmel 7tudio( -ortanto* se "oc2 dese.ar programar seu !V:
diretamente do studio* utilize programadores di4erentes( ! internet 4ornece di"ersas solues(
7e "oc2 ./ ti"er uma placa de programao* "oc2 no precisar/ construir este programador* por,ue "oc2
encontrar/ a inter4ace 57- em alguns pinos( Consulte o manual para localiz/#los(
Placas e&perimentais
Voc2 pro"a"elmente ,uer 4azer seus primeiros programas com uma placa !V: 4eita em casa( !,ui
apresentamos duas "erses%
Hma )em pe,uena com um !Ttin;$R* ou
uma mais complicada com um !TC072R$R ou !Tmega2R$R* incluindo uma inter4ace serial
:72R2(
Placa e&perimental com ATtin'()
Fsta + uma placa )em pe,uena ,ue permite e9perimentos com o hard'are interno do !ttin;$R( ! 4igura
mostra
! inter4ace de programao 57-$0 N es,uerda* com o EFJ de programao ligado a um resistor
de RC0 ohms*
o !Ttin;$R com um resistor pull#up de$0k no pino :F7FT ?pino $B*
$( a 4onte de alimentao com um reti4icador em ponte* ,ue aplica de C a $MV a partir de uma 4onte
!C ou JC* e um pe,ueno regulador de MV(
Avr-Asm-Tutorial & http://www.avr-asm-tutorial.net
1 !Ttin;$R no re,uer cristal
e9terno ou gerador de clock* pois
tra)alha com o seu gerador :C
interno de C*6 8cs&s e* por padro*
com um di"isor de clock em 8
?4re,S2ncia de clock de $*2 8cs&sB(
1 hard'are pode ser construido
em uma pe,uena placa como a
mostrada na 4igura( Todos os pinos
do tin;$R so acess6"eis* e
componentes e9ternos ao
hard'are* como o EFJ mostrado*
so 4acilmente conectados(
Fsta placa permite o uso dos
componentes de hard'are do
!ttin;$R* como portas F&7* timers*
con"ersores !J* etc(
Placa e&perimental com um AT*+$,)()-ATme!a,)()
-ara 4ins de teste* ou se mais pinos de F&7 ou comunicao serial 4orem necess/rios* podemos utilizar
um !TC072R$R ou !tmega2R$R em uma placa e9perimental( 1 es,uema mostra
uma pe,uena 4onte de alimenao para coneco a um trans4ormador !C e um regulador de
tenso MV&$!*
um gerador de clock a cristal ?a,ui com um cristal de $0 8Qz* ,ual,uer 4re,S2ncia a)ai9o do
m/9imo especi4icado para o !TC072R$R 4uncionaroB* os componentes necess/rios para um reset
seguro durante o momento da partida da alimentao*
a inter4ace de programao 57- ?com o conector 57-$0B(
K isto ,ue "oc2 precisa para iniciar( Conecte os outros peri4+ricos e adicionais aos numerosos pinos li"res
de F&7 ao 2R$R(
1 dispositi"o de sa6da mais 4/cil pode ser um EFJ* conectado a um resistor N tenso de alimentao(
Com isso* "oc2 pode escre"er o seu primeiro programa em assem)ler para acender e apagar o EFJ(
7e "oc2
no precisar da inter4ace de comunicao serial* simplesmente ignore o hard'are conectado aos
pinos 2&R e $P&$6*
Avr-Asm-Tutorial ' http://www.avr-asm-tutorial.net
no precisar dos sinais de handshaking* ignore os pinos $P&$6 e conecte :T7 ao conector de C
pinos "ia um resistor de 2*2k a TCV(
7e "oc2 usar um !Tmega2R$R no lugar do !TC072R$R* sero 4eitas as seguintes mundanas%
o cristal e9terno no + necess/rio* pois o !Tmega possui um gerador de clock :C interno* )asta
ignorar as cone9es aos pinos P e M*
se "oc2 ,uiser usar um cristal e9terno no lugar do circuito :C interno* "oc2 ter/ ,ue programar os
4us6"eis do !tmega de acordo(
Placas de pro!rama"o comerciais para a fam%lia AVR
7e "oc2 no gosta de hard'are 4eito em casa* e tem algum dinheiro e9tra e no sa)e o ,ue 4azer com
ele* "oc2 pode comprar uma placa de programao comercial pronta( Jependendo da ,uantidade de
dinheiro e9tra ,ue "oc2 gostaria de gastar* "oc2 pode escolher entre "erses mais )aratas ou mais caras(
-ara o amador* a crit+rio de seleo de"e ser )aseado em%
preo*
inter4ace com o -C ?de pre4er2ncia H7UV menos con"eniente ou dur/"el% :72R2V re,uer so4t'are
adicional para programao% porta paralela do -CB*
suporte a no"os dispositi"os ?atualizaes so necess/rias de tempos em tempos* caso contr/rio
"oc2 montar/ em um ca"alo mortoB*
caracter6sticas do hard'are ?depende de suas necessidades para os pr=9imos cinco anosB(
! seo a seguir descre"e tr2s placas padro da !T8FE* a 7TL200* a 7TLM00 e a Jragon( ! seleo +
)aseada em minhas pr=prias e9peri2ncias* e no + uma recomendao(
$T.,++
! 7TL200 da !T8FE + uma placa hist=rica( 7e "oc2 conseguir uma usada* "oc2 ter/
uma placa com alguns so,uetes ?para dispositi"os de 8* 20* 28 e P0 pinosB*
oito cha"es e EFJs* conectados permanentemente Ns portas J e U*
um ECJ com inter4ace padro de $P pinos*
uma opo para conectar uma 7:!8 de 28 pinos*
uma inter4ace :72R2 para comunicao*
um ca)o de inter4ace com a porta paralela do -C em um lado e um 57- de $0 pinos do outro(
-rogramao em QV ?alta "oltagemB no + suportada(
! placa no pode ser programada do 7tudio* o so4t'are de programao no + mais suportado* e "oc2
de"e usar programas e9ternos capazes de programar "ia porta paralela(
7e algu+m lhe o4erecer esta placa* pegue#a apenas de graa* e se "oc2 esti"er acostumado a utilizar os
so4t'ares necess/rios(
$T./++
K 4/cil o)ter a 7TLM00 ?e(g( direto da !T8FEB( Fsta placa tem o seguinte hard'are%
7o,uetes para programar a maioria dos tipos de !V: ?e(g( Jispositi"os de $P pinos ou
encapsulamentos TW3-* e9igindo algum hard'are adicionalB*
programao serial e paralela em modo normal ou alta "oltagem ?programao QV traz de "olta N
"ida dispositi"os mesmo se o pino :F7FT 4oi programado para ser uma porta de entradaB*
Cone9es 57-6 e 57-$0 para programao 57-*
oscilador com 4re,S2ncia e tenses de alimentao program/"eis*
cha"es e EFJs con4igur/"eis*
um conector :72R2C ?H!:TB*
uma FF-:18#3lash serial ?somente as placas mais antigasB*
acesso a todas as portas "ia conectores de $0 pinos(
! principal des"antagem desta placa + ,ue* ap=s programar um dispositi"o* "/rias cone9es t2m ,ue ser
4eitas manualmente com os ca)os ,ue a acompanham(
! placa + conectada ao -C usando uma porta serial ?C189B( 7e o seu laptop no possui uma inter4ace
serial* "oc2 pode utilizar um con"ersor H7U#7erial comum com dri"er( <este caso* o dri"er de"e ser
a.ustada para usar entre C18$ e C182 e uma "elocidade de $$Mk para ser detectada automaticamente
pelo so4t'are 7tudio(
Avr-Asm-Tutorial ( http://www.avr-asm-tutorial.net
! programao + realizada e controlada pelas "erses recentes do !V: studio* ,ue est/ dispon6"el
gratuitamente para do'nload pela p/gina da !T8FE ap=s o registro( !tualizaes na lista de dispositi"os
e algoritmos de programao so 4ornecidos com as "erses do 7tudio* ento o suporte para no"os
dispositi"os + mais pro"/"el do ,ue com outras placas e so4t'ares de programao(
1s e9perimentos podem comear com o !V: 4ornecido ?"erses antigas% !TC078M$M* no"as placas
incluem tipos di4erentesB( Fste kit co)re todas as necessidades ,ue o iniciante pode ter(
AVR 0ra!on
1 !V: Jragon + uma pe,uena placa( Fla possui uma inter4ace H7U* ,ue alimenta a placa e a inter4ace
57- de 6 pinos( ! inter4ace 57- de 6 pinos + acompanhada pela inter4ace de programao QV de 20
pinos( ! placa + preparada para rece)er alguns so,uetes* mas no possui so,uetes para dispositi"os
para gra"ao ou outro hard'are(
1 dragon + suportado pelo so4t'are 7tudio e + atualizado automaticamente(
7eu preo e design o torna um e9celente presente para o amador de !V:(
Avr-Asm-Tutorial ) http://www.avr-asm-tutorial.net
1erramentas para pro!rama"o assembl'
AVR
Wuatro 4erramentas )/sicas so necess/rios para programao em assem)l;( Fstas 4erramentas so%
o editor*
o compilador*
a inter4ace para programao do chip* e
o simulador(
-ara realizar estas tare4as* e9istem dois caminhos%
$( todos as 4erramentas em um s= programa*
2( cada tare4a + realizada por um programa espec64ico* e os resultados so armazenados em
ar,ui"os espec64icos(
<ormalmente a primeira opo + escolhida( -or+m* como isto + um tutorial* e "oc2 de"e compreencer o
mecanismo primeiro* comearemos descre"endo a segunda opo(
0e um arqui2o te&to a pala2ras de instru"o para a
mem3ria flas4
5 editor
1s programas assem)ler so escritos com um editor( 1 editor simplesmente tem ,ue criar e editar te9to
!7C55( Fnto* )asicamente* ,ual,uer editor simples ser"e(
!lgumas caracter6sticas do editor podem ter e4eitos positi"os%
Frros* ,ue o assem)ler detecta depois* so reportados .untamente com o n>mero da linha do
ar,ui"o te9to( <>meros de linha so tam)+m uma poderosa in"eno da era do computador com
respeito a discusses no seu c=digo com algu+m( Fnto o seu editor de"e ser capaz de mostrar o
n>mero da linha( 5n4elizmente* ,uase todos os editores ,ue uma poderosa empresa de so4t'are
4ornece como parte dos seus sistemas operacionais* no possuem esta caracter6stica(
-ro"a"elmente o Xindo's 20$C rein"ente esta caracter6stica* e "enda melhor entre os malucos
por assem)ler(
Frros de digitao so muito reduzidos* se estes erros 4orem marcados com cores( K uma =tima
caracteristica de um editor* destacar os componentes de uma linha em di4erentes cores(
:econhecimento inteligente dos erros 4acilita a escrita( 8as + uma caracter6stica ,ue eu no sinto
4alta(
7e seu editor permite a seleo de 4onte* escolha uma 4onte com espao 4i9o* como Courier( 1s
ca)ealhos 4icam melhor assim(
7eu editor de"e ser capaz de reconhecer 4im de linhas com ,ual,uer com)inao de caracteres
?carriage return* line 4eed* am)osB sem produzir telas inaceit/"eis( 1utro item na lista de dese.os
para o Xindo's 20$R(
7e "oc2 pre4ere matar moscas com canho* "oc2 pode usar um so4t'are processador de te9to poderodo
para escre"er os seus programas em assem)ler( -ode parecer mais )onito* com ca)ealhos em 4onte
grande e negritos* coment/rios em cinza* a"isos em "ermelho* mudanas destacadas* e lem)retes e to#
dos em campos e9tra destacados( !lgumas des"antagens* contudo% "oc2 ter/ ,ue con"erter o seu te9to
em te9to simples no 4inal* perdendo todo o seu tra)alho de design* e o seu ar,ui"o te9to resultante no
poder/ ter um >nico );te de controle 4altando( Caso contr/rio* este >nico );te gerar/ uma mensagem de
erro* ,uando "oc2 tentar processar o te9to( F lem)re#se% <>meros de linha estaro apenas corretos na
p/gina do seu c=digo#4onte(
Avr-Asm-Tutorial * http://www.avr-asm-tutorial.net
!ssim* ,ual,uer programa de te9to ,ue
"oc2 ,uiser* + escolha sua( 1s
e9emplos a seguir 4oram escritos no
'a"rasm* um editor 4ornecido pela
!T8FE h/ algum tempo(
<o campo do editor simples*
escre"emos as nossas direti"as e
comandos de assem)ler( K altamente
recomendado ,ue estas linhas se.am
acompanhadas por alguns comentados
?comeando por VB( Fntender o ,ue
"oc2 ha"ia plane.ado a,ui so
importantes na depurao posterior(
!gora armazene o ar,ui"o te9to*
chamado TF7T(!78* em um diret=rio
dedicado* usando o menu 3ile( 1
programa assem)l; est/ completo
agora
7e "oc2 gostaria de "er o ,ue desta,ue pela sinta9e signi4ica* colo,uei a captura de uma tela do !V:
editor a,ui(
1 editor reconhece os
comandos automaticamente e
usa di4erentes cores ?desta,ue
da sinta9eB para sinalizar ao
usu/rio constantes e erros de
digitao nestes comandos ?em
pretoB( 1 c=digo armazenado
no ar,ui"o (asm + )asicamente
o mesmo* pois as cores no so
armazenadas no ar,ui"o(
<o tente encontrar este editor
ou seu autorV o editor "irou
hist=ria e no + mais mantido(

5 assembler
!gora temos um ar,ui"o te9to* com caracteres !7C55 em )ranco( 1 pr=9imo passo + traduzir este c=digo
para 4orma orientada para m/,uina* ,ue ser/ compreendida pelo chip !V:( 5sto + chamado de
@assem)larA* compilar* ou se.a @montar as pala"ras de comando corretasA( Fste programa l2 o ar,ui"o#
te9to e produz um tipo de sa6da chamada !ssem)ler( 1 4ormato mais simples deste programa + em linha
de comando* e ,uando chamado com o endereo do ar,ui"o te9to e alguns parGmetros adicionais* inicia
a traduo dos comandos para um segundo ar,ui"o#te9to(
7e o seu editor permite a chamada de programas e9ternos* + uma tare4a 4/cil( 7e no ?outro item para a
lista de dese.os para o editor do Xindo's 20$0B* + mais con"eniente escre"er um ar,ui"o )atch ?usando
outro editorB( Fste ar,ui"o )atch de"e ter uma linha assim%
-ath do !ssem)lerY!ssem)ler(e9e #opes -ath do !r,ui"o#Te9toY!r,ui"ote9to(asm
!o clicar no )oto para e9ecutar
programa e9terno* ou no ar,ui"o )atch*
inicia#se o compilador( Fste so4t'are
reporta a traduo completa ?na .anela
menorB* neste caso sem erros(
7e erros ocorrerem* eles so noti4icados*
.untamente com o seu tipo e o n>mero da
linha onde ele ocorreu(
! compilao resultou em uma pala"ra
de c=digo ,ue resultou da instruo
:J8- ,ue utilizamos( Jurante o
processo de assem)ler* nosso ar,ui"o de
te9to produziu outros ,uatro ar,ui"os
?nem todos sero tratados a,uiB(
1 primeiro destes no"os ,uatro ar,ui"os*
TF7T(FF-* cont+m o ,ue e4eti"amente
de"er/ ser gra"ado na FF-:18 do !V:(
5sto no + muito interessante no nosso
Avr-Asm-Tutorial 1+ http://www.avr-asm-tutorial.net
caso* por,ue no programamos nada para a FF-:18( 1 compilador* conse,Sentemente deletou este
ar,ui"o ,uando terminou a montagem* pois era "azio(
1 segundo ar,ui"o* TF7T(QFZ* + mais
rele"ante pois ele guarda os comandos ,ue
sero posteriormente gra"ados no chip !V:(
Fste ar,ui"o se apresenta assim(
1s n>meros he9adecimais esto escritos em
um 4ormato !7C55 especial* .untamente com
as in4ormaes de endereo e checksum
para cada linha( Fste 4ormato + chamado
5ntel#he9* + muito antigo e remonta para os
prim=rdios da computao( Fste 4ormato +
)em compreendido pelo so4t'are de programao(
1 terceiro ar,ui"o* TF7T(1UJ* ser/
e9plicado depois* este ar,ui"o +
necess/rio para simular um !V:( 7eu
4ormato + he9adecimal e de4inido pela
!T8FE( Hsando um editor he9a* seu
conte>do + assim( !teno% Fste
4ormato de ar,ui"o no + compat6"el
com o so4t'are de programao* no
use este ar,ui"o para programar um !V: ?um erro muito comum no in6cioB( !r,ui"os 1UJ so produzidos
apenas por alguns assem)lers !T8FE* no os espere de outros assem)lers(
1 ,uarto ar,ui"o* TF7T(E7T* + um ar,ui"o te9to( !)ra#
o com um editor simples( 7er/ "isto uma tela como a
mostrada a,ui(
1 programa com todos os seus endereos* comandos
e mensagens de erro so mostrados em uma 4orma
leg6"el( Voc2 precisar/ deste ar,ui"o em alguns casos
para depurar erros(
!r,ui"os de lista so gerados apenas se a opo +
especi4icada na linha de comando e se a direti"a
(<1E57T no suprimir a listagem(
Pro!ramando os c4ips
-ara programar nosso c=digo he9a* como codi4icado no ar,ui"o (QFZ* no !V:* um so4t'are programador
+ necess/rio( Fste so4t'are l2 o ar,ui"o (QFZ e trans4ere o seu conte>do* se.a )it a )it ?programao
serialB* se.a );te a );te ?programao paralelaB para a mem=ria 4lash do !V:( 5niciamos o so4t'are de
programao e carregamos o ar,ui"os he9 ,ue aca)amos de gerar(
Fm nosso e9emplo* a tela
seria semelhante a esta(
<ote% a .anela apresentada
mostra a tela do 57-(e9e*
um programa hist=rico no
mais distri)u6do pela
!T8FE( 1utros so4t'ares
programadores so
semelhantes(
Fste so4t'are gra"ar/
nosso c=digo no local
designado no chip( Q/
algumas precondies
necess/rias para 4azer
isto* e "/rias razes
poss6"eis para uma 4alta(
Consulte a a.uda do
so4t'are programador* se
ocorrerem pro)lemas(
Qard'are de programao e alternati"as de so4t'are apropriadas para di4erentes sistemas operacionais
esto dispon6"eis na 5nternet( Como e9emplo de um programador pela porta paralela ou serial* menciono
o -on;-rog2000(
Avr-Asm-Tutorial 11 http://www.avr-asm-tutorial.net
$imula"o no studio
[s "ezes* o c=digo escrito em assem)l;* mesmo ,ue se.a compilado sem erros* no 4az e9atamente o
,ue de"eria depois de gra"ado no chip( Testar o so4t'are no chip pode ser complicado* especialmente se
"oc2 tem um hard'are m6nimo e no tem oportunidade de "isualizar resultados intermedi/rios ou sinais
de de)ug( <estes casos* o pacote de so4t'are 7tudio da !T8FE 4ornece oportunidades per4eitas para
depurao( Testar o so4t'are ou somente partes + poss6"el* e o c=digo do programa pode ser testado
passo a passo mostrando os resultados(
!s imagens mostradas a,ui so
tiradas da Verso R do 7tudio( !
Verso P atual + "isualmente
di4erente* mas 4az praticamente a
mesma coisa(
-rimeiramente a)riremos um ar,ui"o
?menu 35EF 1-F<B(
Jemonstraremos utilizando o ar,ui"o
tutorial test$(asm* pois nele h/ mais
alguns comandos e aes do ,ue em
nosso programa de um >nico
comando acima(
!)ra o ar,ui"o TF7T$(1UJ* ,ue resultou da compilao do TF7T$(asm( Ehe + perguntado ,ue opes
"oc2 gostaria de usar ?se no "oc2
pode alterar atra"+s do menu
758HE!T1: 1-T51<7B( 7elecione
as seguintes opes%
Jispositi"o + um !TC078M$M*
3re,S2ncia do clock + P 8Qz(
<a seo de seleo de dispositi"os*
selecionamos o tipo de chip dese.ado(
! 4re,u2ncia correta de"e ser
selecionada* se "oc2 dese.a simular
temporizao correta(
-ara podermos "er o conte>do de
alguns registradores e o ,ue o status
atual do processador* selecionamos
V5FX -:1CF771: e :FG57TF:7(
!gora a imagem de"e ser a seguinte(
! .anela do processador mostra "/rios
"alores* como onde o contador de
comando est/* os registradores de
4lag de status* e a in4ormao so)re
temporizao ?a,ui a um clock de $
8QzB( 1 cron\metro por ser usado
para 4azer uma medida e9ata do
tempo necess/rio para e9ecutar
rotinas etc(
!goa iniciaremos a e9ecuo do programa( Hsaremos o modo de passo a passo ?T:!CF 5<T1 ou 3$$B(
Hsando G1 resultaria em uma e9ecuo cont6nua e nada seria "isto de"ido N alta "elocidade da
simulao(
Avr-Asm-Tutorial 12 http://www.avr-asm-tutorial.net
!p=s o primeiro passo ser e9ecutado* a .anela do processador
4icaria como ao lado(
1 contador de programa ?-rogram CounterB* mostrado na .anela
do processador* est/ no passo $* o contador de ciclo em 2
?:J8- precisa de dois ciclos para e9ecutarB( Com clock de $
8Qz* dois microssegundos 4oram gastos* os 4lags e
registradores no 4oram alterados( ! .anela com a ar,ui"o te9to
4onte mostra um ponteiro no pr=9imo comando a ser e9ecutado(
-ressionar 3$$ no"amente e9ecuta o pr=9imo comando* o
registrador mp ?]:$6B ser/ setado para 0933( !gora a .anela de
registradores de"e destacar esta mudana(
1 no"o "alor do
registrador :$6 +
mostrado em cor
"ermelha( -odemos
alterar o "alor de um
registrador a ,ual,uer
momento para checar
o ,ue acontece(
!gora o passo R 4oi e9ecutado* a sa6da + direcionada ao registrador da porta U( -ara mostrar* a)rimos
uma no"a .anela de "isualizao de F&7 e selecionamos porta U( ! imagem de"e ser como a seguir(
1 registrador de direo
de dados na .anela de
"isualizao de F&7 na
porta U agora mostra o
no"o "alor( 1s "alores
podem ser alterados
manualmente* se
dese.ado* pino a pino(
1s pr=9imos dois passos
so simulados usando
3$$( Fles no sero
mostrados a,ui( 7etando
as portas de sa6da para
n6"el um com a instruo
EJ5 mp* 0933 e 1HT -1:TU* mp resulta na seguinte 4igura na "isualizao de F&7( !gora todos os )its
de sa6da da porta esto em n6"el um* a "isualizao de F&7 mostra isso(
Fste + o nosso
pe,ueno passeio
atra"+s do mundo
do so4t'are de
simulao( 1
simulador + capaz
de muito mais*
de"endo portanto
ser utilizado e9tensi"amente nos casos de erro de pro.eto( Visite os di4erentes itens de menu* h/ muito
mais do ,ue o mostrado a,ui(
Avr-Asm-Tutorial 13 http://www.avr-asm-tutorial.net
Re!istrador
5 que um re!istrador?
:egistradores so locais especiais de armazenagem com capacidade de 8 )its e so da seguinte 4orma%
Uit O Uit 6 Uit M Uit P Uit R Uit 2 Uit $ Uit 0
<ote a numerao destes )its% o )it menos signi4icati"o inicia com zero ?2
0
] $B(
Hm registrador pode tanto armazenar n>meros de 0 a 2MM ?somente n>meros positi"osB* ou n>meros de #
$28 a T$2O ?n>mero inteiro com o )it O indicando o sinalB* ou o "alor ,ue representa um caractere !7C55
?e(g( ^!^B* ou apenas oito )its ,ue no t2m nada a "er um com outro ?e(g(* para oita 4lags usados para
sinalizar oito decises sim&no di4erentesB(
! caracter6stica especial dos registradores* comparada a outros locais de armazenagem* + ,ue
eles podem ser usados diretamente por comandos assem)ler*
operaes com o seu conte>do re,uerem somente uma pala"ra de comando*
eles so conectados diretamente N unidade central de processamento chamada acumulador*
eles so origem e destino para c/lculos(
Q/ R2 registradores em um !V:( Fles so originalmente chamados :0 a :R$* mas "oc2 pode escolher
nome/#los com nomes ,ue 4aam sentido em uma direti"a assem)ler( Hm e9emplo%
.DEF MeuRegistradorPreferido = R16
!s direti"as de assem)ler sempre iniciam com um ponto na coluna $ do te9to( 5nstrues <H<C! iniciam
na coluna $* eles sempre sero precedidos por um caractere "azio ou de ta)ulaoI
<ote ,ue as direti"as de assem)ler como esta signi4icam alguma coisa apenas para o compilador
assem)ler mas no produzem nenhum c=digo e9ecut/"el no chip destino !V:( <o lugar de utilizar o
registrador com nome :$6* podemos utilizar nosso pr=prio nome 8eu:egistrador-re4erido* ,uando
,uisermos usar :$6 com algum comando( Fnto escre"emos um pouco mais cada "ez ,ue ,ueremos
utilizar este registrador* mas temos uma associao ao ,ue pode ser o conte>do deste registrador(
Hsando a linha de comando
LDI MeuRegistradorPreferido, 15
signi4ica% carregue o n>mero $M0 imediatamente para o registrador :$6* LoaD Immediate, carregar
imediato. 5sto carrega um "alor 4i9o ou uma constante neste registrador( 7e o)ser"armos a traduo deste
c=digo no programa escrito no !V:* "eremos o seguinte%
E!6
1 comando load* )em como o registrador destino ?:$6B* assim como o "alor da constante ?$M0B + parte
do "alor he9a FC06* mesmo ,ue "oc2 no os "e.a diretamente( <o tenha medo% "oc2 no tem ,ue
lem)rar esta codi4icao por,ue o compilador sa)e traduzir tudo isto para o es,uisito FC06(
Jentro de um >nico comando* dois di4erentes registradores podem desempenhar um papel( 1 comando
mis 4/cil teste tipo + o comando de c=pia 81V( Fle copia o conte>do de um registrador em outro( !ssim%
.DEF MeuRegistradorPreferido = R16
.DEF "utroRegistrador = R15
LDI MeuRegistradorPreferido, 15
M"# "utroRegistrador, MeuRegistradorPreferido
!s duas primeiras linhas deste programa monstruoso so direti"as ,ue de4inem os no"os nomes dos
registradores :$6 e :$M para o compilador assem)ler( <o"amente* estas linhas no produzem nenhum
c=digo para o !V:( !s linhas de comando com EJ5 e 81V produzem o c=digo%
E!6
1 $F1
1s comandos escre"em $M0 no registrador :$6 e copiam o seu conte>do para o registrador destino :$M(
<1T! 58-1:T!<TF%
5 primeiro re!istrador sempre o re!istrador destino onde o resultado ser escrito!
?5sto in4elizmente + di4erente da 4orma normalmente esperada ou de como 4alamos( K uma con"eno
simples ,ue 4oi de4inida certa "ez para con4undir os iniciantes aprendendo assem)ler( K por isso ,ue
assem)ler + to complicado(B
Avr-Asm-Tutorial 1% http://www.avr-asm-tutorial.net
Re!istradores diferentes
1 iniciante pode ,uerer escre"er os comandos acima assim%
.DEF "utroRegistrador = R15
LDI "utroRegistrador, 15
F% "oc2 4alha( !penas os registradores de :$6 a :R$ carregam uma constante imediamente com o
comando EJ5* :0 a :$M no 4azem isso( Fsta restrio no + muito interessante* mas no p\de ser
e"itada durante a construo do con.unto de comandos dos !V:s(
Q/ uma e9ceo a esta regra% escre"er _ero em um registrador( 1 comando
%LR MeuRegistradorPreferido
+ "/lido para todos os registradores(
!l+m do comando EJ5* "oc2 desco)rir/ ,ue esta restrio de classes de registradores ocorre tam)+m
com os seguintes comandos%
!<J5 :9*L V 1perao !nd dos )its do registrador :9 com os )its do "alor constante L*
CU: :9*8 V zera todos os )its no registrador :9 ,ue esto em um dentro do "alor de m/scara
constante 8(
C-5 :9*L V Compara o conte>do do registrador :9 com o "alor constante L*
7UC5 :9*L V 7u)trai a constante L e o "alor atual da 4lag de carr; ?transporteB do registrador :9 e
armazena o resultado no registrador :9*
7U: :9*8 V 7eta todos os )its no registrador :9 para um* ,ue so um na m/scara constante 8*
7F: :9 V 7eta todos os )its no registrador :9 para um ?igual a EJ5 :9*2MMB*
7HU5 :9*L V 7u)trai a constante L do conte>do do registrador :9 e armazena o resultado no
registrador :9(
Fm todos estes comandos o registrador de"e ser entre :$6 e :R$I 7e "oc2 plane.a utilizar estes
comandos* "oc2 de"e selecionar um destes registradores para a operao( K mais 4/cil de programar( Q/
uma razo adicional pela ,ual "oc2 de"e de4inir o nome dos registradores* + por,ue "oc2 pode 4acilmente
alterar a localizao dos registradores posteriormente(
Re!istradores ponteiros
Hm papel muito especial + desempenhado pelos pares de registradores :2O%:26* :2C%:28 e :R$%:R2(
Fste papel + to importante ,ue estes pares t2m nomes e9tra curtos em !V: assem)ler% Z* ` e _( Fstes
nomes curtos so compreendidos pelo compilador( Fstes pares so registradores ponteiros de $6 )its*
capazes de apontar endereos da 7:!8 com at+ $6 )its ?Z* ` ou _B ou localizaes na mem=ria do
programa ?_B(
1 );te menor do endereo de $6 )its est/ localizado no registrador in4erior* o );te superior na registrador
superior( !m)as partes t2m seu pr=prio nome* e(g(* o );te mais alto de _ + chamado de _Q ?]:R$B* e o
);te mais )ai9o + _E ?]:R0B( Fstes nomes so de4inidos no ar,ui"o de ca)ealho padro para os chips(
Ji"idir estes dois ponteiros de $6 )its em dois );tes di4erentes + 4eito da seguinte 4orma%
.E&' e(dereco = R)ME*D + R)ME*D , o e(dere-o de 16 .its mais alto da /R)M 0fim da mem1ria2
LDI 34,4I540e(dereco2 + /eta o M/6
LDI 3L,L"70e(dereco2 + /et t8e L/6
!cessos "ia ponteiros so 4eitos com comandos especialmente designados( ! leitura + 4eita pelo
comando chamado EJ ?LoaD* carregarB* e a escrita pelo comando chamado 7T ?/9ore* armazenarB* e(g(
Com o ponteiro Z%
Ponteiro Seqncia Exemplos
Z E2&Fscre"e do endereo Z* no altera o ponteiro EJ :$*Z ou 7T Z*:$
ZT E2&Fscre"e de&para endereo Z e incrementa o ponteiro por um EJ :$*ZT ou 7T ZT*:$
#Z Jecrementa o ponteiro em um e l2&escre"e de&para o no"o endereo EJ :$*#Z ou 7T #Z*:$
Je 4orma similar* "oc2 pode usar ` e _ para este prop=sito(
Q/ somente um comando para acesso N leitura dos dados do programa( Fle + de4inido pelo par de
ponteiros _ e + chamado E-8 ?Load from Program Memor:, carregar da mem=ria do programaB( 1
comando copia o );te no endereo _ da mem=ria do programa para o registrador :0( Como a mem=ria
do programa + organizada na 4orma de pala"ras ?um comando em um endereo consiste de $6 )its ou
dois );tes ou uma pala"raB* o )it menos signi4icati"o seleciona o );te in4erior ou superior ?0]in4erior*
$]superiorB( -or causa disto* o endereo original de"e ser multiplicado por 2 e o acesso + limitado a $M
)its ou R2k) da mem=ria do programa( Jesta 4orma%
Avr-Asm-Tutorial 1& http://www.avr-asm-tutorial.net
LDI ;4,4I540$<e(dereco2
LDI ;L,L"70$<e(dereco2
LPM
7eguindo este comando* o endereo de"e ser incrementado para apontar o pr=9imo );te na mem=ria do
programa( Como isto + usado 4re,Sentemente* um comando de incremento de pointeiro 4oi de4inido para
4azer isto%
)DI7 ;L,1
LPM
!J5X signi4ica )Dd Immediate 7ord, adicione pala"ra imediato* e um m/9imo de 6R pode ser adicionado
desta 4orma( <ote ,ue o compilador espera o mais )ai9o do par de registradores _E como primeiro
parGmetro( 5sto pode causar con4uso* pois a adio + realizada como uma operao de $6 )its(
1 comando complementar* su)trair um "alor constante entre 0 e 6R de um ponteiro de $6 )its + chamado
de 7U5X ?/u6tract Immediate 7ord* su)trair pala"ra imediatoB( !J5X e 7U5X so poss6"eis para os
pares de registradores Z* ` e _ e para o par de registradores :2M%:2P* ,ue no t2m um nome e9tra e no
permitem acesso N 7:!8 ou a localizaes da mem=ria do programa( :2M%:2P so ideais para
manipular "alores de $6 )its(
Como inserir uma ta)ela de "alores na mem=ria do programa0 5sto + 4eito atra"+s das direti"as do
assem)ler (JU e (JX( Com elas "oc2 pode inserir uma lista de );tes ou uma lista de pala"ras( Eistas de
);tes organizados 4icam assim%
.D6 1$=,>5,6?,@! + uma lista de Auatro .:tes, escritos em formato decimal
.D6 BIsto e um teCto. B + uma lista de caracteres .:te, escritos como teCto
Voc2 de"e sempre colocar um n>mero par de );tes em cada linha( Caso contr/rio o compilador
adicionar/ um );te zero ao 4inal* ,ue pode ser indese.ado(
Hma lista similar de "alores 4icaria assim%
.D7 1$=>5,6?@! + uma lista de duas DalaEras
<o lugar de constantes* "oc2 pode tam)+m colocar la)els ?destinos para saltoB nesta lista* como%
La.el1F
G ... aAui EHo algu(s coma(dos ... I
La.el$F
G ... aAui EHo mais algu(s coma(dos ... I
9a.elaF
.D7 La.el1,La.el$ + uma lista de la.els
Ea)els 7F8-:F iniciam na coluna $I <ote ,ue ler os la)els com E-8 primeiro traz o );te in4erior da
pala"ra(
Hma aplicao muito especial para os ponteiros + acessar os pr=prios registradores( 1s registradores
esto localizados nos primeiros R2 );tes do espao do chip ?do endereo 090000 a 0900$3B( Fste acesso
+ >til se "oc2 ti"er ,ue copiar o conte>do dos registradores para a 7:!8 ou FF-:18 ou ler estes
"alores destes locais de "olta para os registradores( 1 uso mais comum dos ponteiros + para acessar
ta)elas com "alores 4i9os na mem=ria do programa( !,ui est/ um e9emplo* uma ta)ela com $0 di4erentes
"alores de $6 )its* onde o ,uinto "alor da ta)ela + lido para :2M%:2P%
Mi(8a9a.elaF
.D7 C1$=>,C$=>5,C=>56,C>56@,C56?@ + "s Ealores da ta.ela
.D7 C6?@!,C?@!),C@!)6,C!)6%,C)6%D + orga(iJados em DalaEras
Read5F LDI ;4,4I540Mi(8a9a.ela<$2 + e(dere-o do Do(teiro ;
LDI ;L,L"70Mi(8a9a.ela<$2 + multiDlicado Dor $ Dara acesso K ta.ela
)DI7 ;L,1 + )Do(ta Dara o Aui(to Ealor da ta.ela
LPM + LL o .:te me(os sig(ificatiEo da mem1ria do Drograma
M"# R$>,R + %oDia o L/6 Dara o registrador de 16 .its
)DI7 ;L,1 + )Do(ta Dara o M/6 (a mem1ria do Drograma
LPM + LL o M/6 da ta.ela de Ealores
M"# R$5,R + %oDia M/6 Dara o registrador de 16 .its.
Fste + apenas um e9emplo* Voc2 pode calcular o endereo da ta)ela em _ a partir de algum "alor de
entrada* le"ando os respecti"os "alores na ta)ela( !s ta)elas podem ser organizadas por );te ou
caracteres tam)+m(
Recomenda"o para uso dos re!istradores
Je4ina nomes para os registradores com a direti"a (JF3* nunca os use diretamente com o seus
nomes diretos :9(
7e "oc2 precisar acesso aos ponteiros* reser"e :26 a :R$ para este prop=sito(
! melhor localizao para contadores de $6 )its + :2M%:2P(
7e precisar ler da mem=ria do programa* e(g( Ta)elas 4i9as* reser"e _ ?:R$V:R0B e :0 para isso(
7e "oc2 pretende acessar )its dentro de certos registradores ?4lagsB* use :$6 a :2R para isso(
Avr-Asm-Tutorial 1' http://www.avr-asm-tutorial.net
Portas
5 que uma Porta?
!s portas do !V: so caminhos entre a unidade central de processamento e os componentes e9ternos
de hard'are e so4t'are( ! C-H se comunica com estes componentes* lendo deles ou escre"endo neles*
e(g( timers ou portas paralelas( ! porta mais utilizada + o registrador de 4lag* onde os resultados das
operaes anteriores so escritos e de onde as /r"ores de condies ?decisesB so lidas(
Q/ 6P portas di4erenentes* ,ue no esto dispon6"eis em todos tipos de !V:( Jependendo do espao de
armazenamento e outros hard'ares internos* as portas podem estar dispon6"eis e acess6"eis ou no( !
lista de portas ,ue podem ser usadas est/ listada nos data sheets do processador(
!s portas t2m endereo 4i9o* pelo ,ual a C-H se comunica( 1 endereo + independente do tipo de !V:(
!ssim* por e9emplo* o endereo da porta U + sempre 09$8 ?09 indica notao he9adecimalB( Voc2 no
tem ,ue lem)rar destes endereos das portas* elas t2m apelidos con"enientes( Fstes nomes so
de4inidos nos ar,ui"os include ?ca)ealhosB para os di4erentes tipos de !V:* 4ornecidos pelo 4a)ricante(
1s ar,ui"os include t2m uma linha de4inindo o endereo da porta U como a seguir%
.E&' P"R96, C1@
Fnto temos ,ue lem)rar apenas o nome da porta U* no sua localizao no espao de F&7 do chip( 1
ar,ui"o de inclde 8M$Mde4(inc est/ en"ol"ido atra"+s da direti"a do assem)ler
.I*%L'DE B%FM/omeN8ereM@515def.i(cB
e todos os registradores de 8M$M estaro de4inidos e 4acilmente acess6"eis(
!s portas normalmente so organizadas como n>meros de 8 )its* mas podem manipular 8 )its indi"iduais
,ue no t2m a "er uns com os outros( 7e estes )its t2m um signi4icado* eles podem ter seu pr=prio nome
associado no ar,ui"o include* para permitir a manipulao deste )it( Graas N con"eno dos nomes*
"oc2 no tem ,ue lem)rar a posio destes )its( Fstes nomes so de4inidos nos data sheets e esto
inclu6dos nos ar,ui"os include* tam)+m( Fles so 4ornecidos a,ui nas ta)elas das portas(
Como e9emplo* o registrador de controle geral 8CH* chamado 8CHC:* consiste de um n>mero de )its
de controle indi"iduais ,ue controlam algumas caracter6sticas gerais do chip ?"e.a a descrio em
8CHC: para maiores detalhesB( K uma porta* com 8 )its de controle e seus pr=prios nomes ?57C00*
57C0$* (((B( Wuem ,uiser mandar o seu !V: para um sono mortal precisa sa)er pelo data sheet como
setar os )its respecti"os( !ssim%
.DEF MeuRegistradorPreferido = R16
LDI MeuRegistradorPreferido, .1
"'9 M%'%R, MeuRegistradorPreferido
/LEEP
1 comando 1ut en"ia o conte>do do meu registrador pre4erido* um )it 7leep#Fna)le chamado 7F* para a
porta 8CHC: e seta o !V: imediatamente para entrar em repouso* se hou"er uma instruo 7EFF-
sendo e9ecutada( Como todos os outros )its do 8CHC: 4oram setados pelas instrues acima* e o )it
78 ?7leep 8odeB 4icou zero* ocorrer/ um modo chamado meio#repouso% no ha"er/ e9ecuo de
nenhum outro comando* mas o chip ainda reage a timers e outras interrupes de hard'are( Fstes
e"entos e9ternos interrompero o sono da C-H se eles acharem ,ue de"em noti4ic/#la(
Eer o conte>do de uma porta + poss6"el na maioria dos casos utilizando o comando 5<( ! se,u2ncia
.DEF MeuRegistradorPreferido = R16
I* MeuRegistradorPreferido, M%'%R
l2 os dados da porta 8CHC: para o registrador( Como muitas portas so usadas parcialmente ou no
utilizadas* normalmente os dados lidos so zeros(
8ais 4re,Sentemente do ,ue ler todos os 8 )its de uma porta* de"e#se reagir a certos status de uma porta(
<este caso* no precisamos ler a porta toda e isolar o )it de interesse( Certos comandos permitem
e9ecutar comandos dependendo do estado de certo )it ?"e.a a seo JH8-B( 7etar ou zerar certos )its
tam)+m + poss6"el sem ter ,ue ler e escre"er os outros )its da porta( 1s dois comandos so 7U5 ?7et Uit
5&o* setar )it F&7B e CU5 ?Clear Uit 5&o* zerar )it F&7B( ! e9ecuo + assim%
.E&' 6it)tiEo= + " .it Aue serO mudado
/6I Port6, 6it)tiEo + " .it serO setado Dara um
%6I Port6, 6it)tiEo + " .it serO setado Dara Jero
Fstas duas instrues t2m uma limitao% somente portas com endereo in4erior a 0920 podem ser
manipuladas desta 4orma(
-ara programadores mais e9=ticos% as portas podem ser acessadas utilizando comandos de acesso N
7:!8* como 7T e EJ( !penas some 0920 ao endereo da porta ?os primeiros R2 endereos so os
registradoresB e acesse a porta desta 4orma( Vamos demonstrar a,ui%
.DEF MeuRegistradorPreferido = R16
LDI ;4,4I540P"R96P=$2
LDI ;L,L"70P"R96P=$2
Avr-Asm-Tutorial 1( http://www.avr-asm-tutorial.net
LD MeuRegistradorPreferido,;
5sto 4az sentido apenas em certos casos* mas + poss6"el( K por esta razo ,ue o primeiro endereo da
7:!8 + sempre 0960(
0eatl4es de portas rele2antes do AVR
! ta)ela a seguir mostra as portas mais usadas( <em todas portas esto listadas a,ui* algumas do 8FG!
e !TC07PPRP&8MRM 4oram omitidas( 7e hou"er d>"ida* "eri4i,ue as re4er2ncias originais(
Componente Nome da porta Registrador da Porta
!cumulador 7:FG :egistrador de 7tatus
-ilha ?stack2 7-E&7-Q 7tackpointer ?apontador de pilhaB
7:!8 F9terna&5nterrupo F9terna 8CHC: :egistrador de Controle Geral 8CH
5nterrupo F9terna G587L :egistrador de 5nterrupo 8ascarado
G53: :egistrador de 3lag de 5nterrupo
5nterrupo de Timer T587L :egistrador de 5nterrupo de Timer 8ascarada
T53: :egistrador de 5nterrupo de 3lag de Timer
Timer 0 TCC:0 :egistrador controle de de Timer&Contador 0
TC<T0 Timer&Contador 0
Timer $ TCC:$! :egistrador controle de de Timer&Contador $ !
TCC:$U :egistrador controle de de Timer&Contador $ U
TC<T$ Timer&Contador $
1C:$! :egistrador Comparador de 7a6da $ !
1C:$U :egistrador Comparador de 7a6da $ U
5C:$E&Q :egistrador de Captura de Fntrada
Timer Xatchdog XJTC: :egistrador de Controle do Timer Xatchdog
FF-:18 FF!: :egistrador de endereo da FF-:18
FFJ: :egistrador de dados da FF-:18
FFC: :egistrador de controle da FF-:18
7-5 7-C: :egistrador de controle de peri4+ricos 7eriais
7-7: :egistrador de status de peri4+ricos 7eriais
7-J: :egistrador de dados de peri4+ricos 7eriais
H!:T HJ: :egistrador de dados da H!:T
H7: :egistrador de status da H!:T
HC: :egistrador de controle da H!:T
HU:: :egistrador de "elocidade ?)aud rateB da H!:T
Comparador anal=gico !C7: :egistrador de status e controle do comparador
anal=gico
-ortas de F&7 -1:T9 :egistrador de porta de sa6da
JJ:9 :egistrador de direo da porta
-5<9 :egistrador de porta de entrada
5 re!istrador de status como a porta mais utilizada
Je longe* a porta mais 4re,Sentemente usada + o registrador de status com seus 8 )its( <ormalmente o
acesso a esta porta + 4eito somente por alterao dos )its pela C-H ou acumulador* alguns acessos so
por leitura ou alterao dos )its na porta* e em raros casos + poss6"el manipular estes )its diretamente
?utilizando os comandos assem)ler 7F9 ou CE9* onde 9 + a a)re"iao do )itB( ! maioria destes )its +
alterada por operaes de teste de )it* comparao ou c/lculos( ! seguinte lista tem todos os comandos
em assem)ler ,ue podem alterar os )its de status* dependendo do resultado da e9ecuo(
Avr-Asm-Tutorial 1) http://www.avr-asm-tutorial.net
Bit Clculo Lgico Comparao Bits Rolagem !utro
_ !JJ* !JC* !J5X* JFC*
5<C* 7HU* 7HU5* 7UC*
7UC5* 7U5X
!<J* !<J5* 1:*
1:5* F1:* C18*
<FG* 7U:* CU:
C-* C-C* C-5 UCE: _*
U7FT _*
CE_* 7F_*
T7T
!7:* E7E*
E7:* :1E*
:1:
CE:
C !JJ* !JC* !J5X* 7HU*
7HU5* 7UC* 7UC5* 7U5X
C18* <FG C-* C-C* C-5 UCE: C*
U7FT C*
CEC* 7FC
!7:* E7E*
E7:* :1E*
:1:
#
< !JJ* !JC* !J5X* JFC*
5<C* 7HU* 7HU5* 7UC*
7UC5* 7U5X
!<J* !<J5* 1:*
1:5* F1:* C18*
<FG* 7U:* CU:
C-* C-C* C-5 UCE: <*
U7FT <*
CE<* 7F<*
T7T
!7:* E7E*
E7:* :1E*
:1:
CE:
V !JJ* !JC* !J5X* JFC*
5<C* 7HU* 7HU5* 7UC*
7UC5* 7U5X
!<J* !<J5* 1:*
1:5* F1:* C18*
<FG* 7U:* CU:
C-* C-C* C-5 UCE: V*
U7FT V*
CEV* 7FV*
T7T
!7:* E7E*
E7:* :1E*
:1:
CE:
7 7U5X # # UCE: 7*
U7FT 7*
CE7* 7F7
# #
Q !JJ* !JC* 7HU* 7HU5*
7UC* 7UC5
<FG C-* C-C* C-5 UCE: Q*
U7FT Q*
CEQ* 7FQ
# #
T # # # UCE: T*
U7FT T*
U7T* CET*
7FT
# #
5 # # # UCE: 5*
U7FT 5*
CE5* 7F5
# :FT5
0etal4es das portas
Jetalhes das portas mais comuns so mostrados na ta)ela e9tra ?"e.a ane9oB(
Avr-Asm-Tutorial 1* http://www.avr-asm-tutorial.net
$RA6
7sando $RA6 em lin!ua!em assembler AVR
-raticamente todos os 8CHs !V: tipo !TC07 t2m :!8 est/tica ?7:!8* /tatic R)MB ?alguns noB(
7omente compiladores muito simples e"itam a utilizao deste espao da mem=ria* colocando tudo nos
registradores( 7e os seus registradores aca)arem* "oc2 de"er/ ser capaz de programar a 7:!8 para
o)ter mais espao(
5 que $RA6?
7:!8 so mem=rias ,ue no so diretamente acess6"eis da unidade de processamento central ?Hnidade
!ritm+tica e E=gica !EH
0)rit8metic a(d Logical '(itB*
algumas "ezes chamada de
acumuladorB* como os
registradores o so( -ara
acessar estas localidades de
mem=ria* "oc2 normalmente
usa um registrador como
armaz+m intermedi/rio( <o
e9emplo a seguir* um "alor na
7:!8 ser/ copiado para o
registrador :2 ?primeiro
comandoB* um c/lculo
utilizando o "alor de :R + 4eito
e o resultado + escrito em :R
?comando2B( Jepois disso* o
"alor + escrito de "olta na 7:!8 ?comando R* no mostrado a,uiB(
K e"idente ,ue operaes com "alores armazenados na 7:!8 so mais lentas do ,ue a,uelas utilizando
apenas os registradores( -or outro lado% o menor !V: tem $28 );tes de 7:!8 dispon6"el* muito mais do
,ue os R2 registradores podem guardar(
1s tipos mais recentes do ,ue !TC078M$M o4erecem a possi)ilidade de conectar :!8 e9terna*
e9pandindo a interna de M$2 );tes( Jo ponto de "ista do assem)ler* a 7:!8 e9terna + acessada da
mesma 4orma ,ue a interna( <o e9iste nenhum comando e9tra para 7:!8 e9terna(
Para que prop3sitos posso usar a $RA6?
!l+m de simples armazenagem de "alores* a 7:!8 o4erece outras possi)ilidades de uso( <o apenas o
acesso com endereos 4i9os + pss6"el* como tam)+m o uso de ponteiros* de 4orma ,ue o acesso 4lutuante
a localizaes su)se,uentes pode ser programado( Jesta 4orma "oc2 pode construir )u44ers em anel para
armazenagem tempor/ria de "alores ou ta)elas calculadas( 5sto no + 4eito 4re,uentemente com
registradores* pois eles so muito poucos e acesso 4i9o + pre4erido(
1utra 4orma de acesso + utilizando um o44set para um endereo de in6cio 4i9o em um dos ponteiros( <este
caso* o endereo 4i9o + armazenado no ponteiro* e um "alor constante + adicionado a este endereo e os
acesso de leitura e escrita so 4eitos a esse endereo com um o44set( Com este tipo de acesso* as ta)elas
so melhores utilizadas(
1 uso mais interessande para a 7:!8 + a chamada pilha ?stackB( Voc2 coloca ?@empurraA* Dus8B "alores
para a pilha* se.a um registrador* um endereo de retorno ap=s o 4im de uma su)#rotina* ou o endereo de
retorno ap=s uma interrupo disparada por hard'are(
Como usar a $RA6?
-ara copiar um "alor para uma localizao da mem=ria 7:!8* "oc2 tem ,ue de4inir o endereo( 1
endereamento da 7:!8 comea em 090060 ?notao he9aB at+ o 4im da 7:!8 46sica no chip ?no
!TC078M$M* o endereo mais alto da 7:!8 + 0902M3B( Com o comando
/9/ C6, R1
o conte>do do registrador :$ + copiadao para o primeiro endereo da 7:!8( Com
LD/ R1, C6
o conte>do da 7:!8 no endereo 090060 + copiado para o registrador( Fste + o acesso direto atra"+s do
endereo de4inido pelo programador(
<omes sim)=licos de"em ser e"itados para e"itar manipular endereos 4i9os* pois re,uerem muito
tra)alho se "oc2 depois ,uiser alterar a estrutura da 7:!8( Fstes nomes so mais 4/ceis de lem)rar do
,ue os n>meros he9a* ento "oc2 pode nomear um endereo da seguinte 4orma%
Avr-Asm-Tutorial 2+ http://www.avr-asm-tutorial.net
.E&' MeuE(derecoPreferido= C6
/9/ MeuE(derecoPreferido, R1
7im* 4ica mais longo* mas mais 4/cil de lem)rar( Hse o nome ,ue "oc2 achar con"eniente(
1utro tipo de acesso N 7:!8 + com o uso de ponteiros( Voc2 precisa de dois registradores para este
prop=sito* para acomodar o endereo em $6 )its( Como aprendemos na di"iso dos ponteiros* os
registradores ponteiros so os pares Z ?ZQ%ZE* :2O%:26B* ` ?`Q%`E* :2C%:28B e _ ?_Q%_E* :R$%:R0B(
Fles permite acesso N localizao ,ue apontam diretamente ?e(g(* com 7T Z* :$B* antes da
decrementao do endereo por um ?e(g(* 7T #Z* :$B ou antes do incremento deste endereo ?e(g(* 7T
ZT* :$B( Hm acesso completo a tr2s endereos em seguida 4icaria ento da seguinte 4orma%
.E&' MeuE(derecoPreferido= C6
.DEF MeuRegistradorPreferido = R1
.DEF "utroRegistrador= R$
.DEF Mais'mRegistrador = R=
LDI Q4, 4I540MeuE(derecoPreferido2
LDI QL, L"70MeuE(derecoPreferido2
LD MeuRegistradorPreferido, QP
LD "utroRegistrador, QP
LD Mais'mRegistrador, Q
3/ceis de operar* estes ponteiros( F to 4/cil ,uanto em outras linguagens di4erentes do assem)ler* ,ue
dizem ser 4/cil de aprender(
! terceira construo + um pouco mais e9=tica e somente utilizada por programadores e9perientes(
Vamos assumir ,ue precisamos acessar tr2s localizaes da 7:!8 com 4re,S2ncia( Vamos tam)+m
assumir ,ue temos um par de registradores ponteiros so)rando* ento podemos utiliz/#lo e9clusi"amente
para nosso prop=sito( 7e us/ssemos as instrues 7T&EJ* ter6amos ,ue alterar o ponteiro a cada "ez ,ue
precis/ssemos acessar outra localizao( <o muito con"eniente(
-ara e"itar isso* e con4undir o iniciante* o acesso com o44set 4oi in"entado( Jurante este acesso* o "alor do
registrador no + alterado( 1 endereo + calculado adicionando temporariamente um o44set 4i9o( <o
e9emplo acima* o acesso N localizao 090062 4icaria assim( -rimeiro* o ponteiro + setado para nossa
localizao central 090060%
.E&' MeuE(derecoPreferido = C6
.DEF MeuRegistradorPreferido = R1
LDI 34, 4I540MeuE(derecoPreferido2
LDI 3L, L"70MeuE(derecoPreferido2
Fm algum lugar depois no programa* para acessar o endereo 090062%
/9D 3P$, MeuRegistradorPreferido
<ote ,ue 2 no + realmente adicionado a `* apenas temporariamente( -ara con4undi#lo mais* isto pode
ser 4eito apenas com os pares de registradores ` e _* no com o ponteiro ZI
! instruo correspondente para ler a 7:!8 com um o44set
EJJ 8eu:egistrador-re4erido* `T2
tam)+m + poss6"el(
Fsta + a 7:!8* mas espere% o uso mais interessante como pilha ainda de"e ser aprendido(
5 uso da $RA6 como pil4a
1 uso mais comum da 7:!8 + como pilha( ! pilha + uma torre de )locos de madeira( Cada )loco
adicional "ai no topo da torre* e cada chamada remo"e o )loco superior da torre( Fsta estrutura +
chamada de East#5n#3irst#1ut ?o primeiro a entrar + o >ltimo a sair E531B* ou mais 4/cil% o >ltimo a ir no
topo* ser/ o primeiro a sair(
0efinindo $RA6 como pil4a
-ara usar a 7:!8 como pilha* de"emos a.ustar o ponteiro de pilha ?stack pointerB primeiro( 1 ponteiro de
pilha + um ponteiro de $6 )its* acess6"el como uma porta( 1 registrador duplo + chamado de 7-Q%7-E(
7-Q armazena o );te mais signi4icati"o* e o 7-E* o menos signi4icati"o( 5sto + "erdadeiro apenas se o
!V: ti"er mais de 2M6 );tes de 7:!8( Caso contr/rio* 7-Q + inde4inido* no pode e no de"e ser usado(
Vamos assumir ,ue temos mais de 2M6 );tes nos e9emplos a seguir(
-ara contruir a pilha* o ponteiro de pilha + carregado com o endereo mais alto da 7:!8( ?<o nosso
caso* a torre cresce para )ai9o* em direo aos endereos menoresIB
.DEF MeuRegistradorPreferido = R16
LDI MeuRegistradorPreferido, 4I540R)ME*D2 + 6:te /uDerior
"'9 /P4,MeuRegistradorPreferido + Dara o Do(teiro de Dil8a
LDI MeuRegistradorPreferido, L"70R)ME*D2 + 6:te i(ferior
"'9 /PL,MeuRegistradorPreferido + Dara o Do(teiro de Dil8a
1 "alor :!8F<J ?,ue indica o endereo 4inal da mem=riaB +* o)"iamente* espec64ico para o tipo de
Avr-Asm-Tutorial 21 http://www.avr-asm-tutorial.net
progrssador( Fle + de4inido no ar,ui"o 5<CEHJF para o tipo de processador(1 ar,ui"o 8M$Mde4(inc tem a
linha%
.eAu R)ME*D =R$5F + Last "(S%8iD /R)M Locatio( 0(.t.F Tltima localiJa-Ho da /R)M (o c8iD2
1 ar,ui"o 8M$Mde4(inc + inclu6do atra"+s da direti"a de assem)ler
(5<CEHJF aC%YalgumlugarY8M$Mde4(inca
no in6cio do nosso c=digo 4onte em assem)ler(
Fnto de4inimos a pilha agora* e no temos mais ,ue nos preocupar so)re o ponteiro da pilha* por,ue as
manipulaes do ponteiro so autom/ticas(
7so da pil4a
Hsar a pilha + 4/cil( 1 conte>do dos registradores so empurrados na pilha assim%
P'/4 MeuRegistradorPreferido + %oloca aAuele Ealor (o toDo da Dil8a
-ara onde o "alor "ai* no nos interessa( 1 ponteiro de pilha 4oi decrementado ap=s colocarmos este
"alor* e no temos ,ue nos preocupar( 7e precisarmos deste conte>do de "olta* simplesmente usamos a
seguinte instruo%
P"P MeuRegistradorPreferido + LL o Ealor de Eolta
Com -1- simplesmente pegamos o >ltimo "alor colocado no topo da pilha( Fmpurrar e pegar
registradores 4az sentido* se
o conte>do ser/ necess/rio no"amente algumas linhas de c=digo depois*
todos os registradores esto em uso* e se
no h/ como armazenar a,uele "alor em nenhum outro lugar(
7e nenhuma destas condies se "eri4icarem* o uso da pilha para guardar registradores + in>til e apenas
desperdia tempo do processador(
3az mais sentido usar a pilha em su)rotinas* onde "oc2 tem ,ue retornar N localizao do programa ,ue
chamou a rotina( <este caso* o c=digo ,ue chama a su)rotina de"e guardar o endereo de retorno ?o
"alor atual do contador de programa* -C* Drogram cou(terB na pilha e salta para a su)rotina( !p=s a sua
e9ecuo* a su)rotina pega o endereo de retorno da pilha e carrega no contador de programa( !
e9ecuo do programa ento continua e9atamente uma instruo ap=s a instruo de chamada%
R%)LL )lgumLugar + /alta Dara o la.el U)lgumLugarFV
G...I aAui co(ti(uamos o Drograma
!,ui a e9ecuo para para o la)el !lgumEugar em algum lugar do c=digo*
!lgumEugar% V este + o endereo de salto
G...I )Aui faJemos alguma coisa
G...I e aAui termi(amos o Aue AuerWamos faJer e saltamos de Eolta Dara o local o(de essa roti(a foi c8amadaF
RE9
Jurante a e9ecuo da instruo :C!EE* o contador de programa ?-CB ./ incrementado* com $6 )its* +
colocado na pilha usando dois pushes( Wuando a instruo :FT + e9ecutada* o conte>do anterior do
contador de programa + recarregado usando dois pops e a e9ecuo continua(
Voc2 no precisa se preocupar so)re o endereo da pilha* ou onde o contador est/ gra"ado( 1 endereo
+ gerado automaticamente( 8esmo se "oc2 chamar uma su)rotina dentro de uma su)rotina* a 4uno da
pilha + per4eita( 1s dois endereos so colocados no topo da pilha* a su)rotina dentro da primeira remo"e
o primeiro endereo* e a su)rotina de chamada remo"e o segundo( Fn,uanto ha.a 7:!8 su4iciente* tudo
4unciona(
! utilizao de interrupes de hard'are no + poss6"el sem a pilha( ! interrupo p/ra a e9ecuo
normal do programa* onde ,uer ,ue ele este.a( !p=s a e9ecuo do ser"io como reao N,uela
interrupo* a e9ecuo de"e retornar N localizao anterior* antes da interrupo( 5sto no seria poss6"el
se a pilha no 4osse capaz de armazenar o endereo de retorno(
!s enormes "antagens de se ter uma pilha para interrupes so as razes de mesmo o menor dos !V:s
,ue no tenham 7:!8* tenham ao menos uma pe,uena pilha de hard'are(
8u!s com a opera"o de pil4as
-ara o iniciante* h/ uma grande possi)ilidade de )ugs* ap=s aprender a usar a pilha(
8uito inteligente + o uso da pilha sem setar primeiro o ponteiro da pilha( Como o "alor deste ponteiro +
zero no in6cio do programa* o ponteiro aponta para o registrador :0( Colocar algo na pilha resulta em
escre"er neste registrador* so)rescre"endo ,ual,uer conte>do ,ue ali esti"esse( Hm outro push na pilha*
e a pilha "ai gra"ar em 093333* uma posio inde4inida ?se "oc2 no ti"er 7:!8 e9ternaB( :C!EE e :FT
retornaro um endereo estranho na mem=ria( F tenha certeza% no ha"er/ nenhum a"iso* nenhuma
.anela indicando @!cesso ilegal N mem=ria localizao 9999A(
Avr-Asm-Tutorial 22 http://www.avr-asm-tutorial.net
1utra possi)ilidade de ter )ug + es,uecer de 4azer o pop em um "alor armazenado anteriormente* ou
4azer pop sem 4azer push antes(
Fm alguns poucos causos* a pilha estoura para a)ai9o do primeiro endereo da 7:!8( 5sto ocorre no
caso de uma chamada recursi"a in4inita( !p=s alcanar o endereo mais )ai9o da 7:!8* os pr=9imos
pushes escre"em nas portas ?0900M3 at+ 090020B* e ento os registradores ?0900$3 a 090000B( Coisas
engraadas e impre"is6"eis podem ocorrer com o chip* se isto ocorrer( F"ite este )ug* ele pode destruir o
seu hard'areI
Avr-Asm-Tutorial 23 http://www.avr-asm-tutorial.net
$altos e 0es2ios
!gora discutiremos todos os comandos ,ue controlam a e9ecuo se,Sencial de um programa* iniciando
com a se,S2ncia inicial de partida do processador* continuando com saltos* interrupes* etc(
Controlando a e&ecu"o seq9encial de um pro!rama
5 que acontece durante um reset?
Wuando a tenso de tra)alho de um !V: so)e e o processador inicia o seu tra)alho* o hard'are dispara
uma se,S2ncia de reset( 1 contador de passos do programa + zerado( <este endereo* a e9ecuo
sempre inicia( !,ui temos ,ue ter nossa primeira pala"ra de c=digo( 8as este endereo pode ser ati"ado
tam)+m de outras 4ormas%
Jurante um reset e9terno "ia pino de reset* o processador + reiniciado(
7e o contador Xatchdog alcana a sua contagem m/9ima* um reset + iniciado( 1 timer 'itchdog +
um temporizador interno ,ue de"e ser resetado de tempos em tempos pelo programa* caso
contr/rio ele reinicia o processador(
Voc2 pode chamar o reset 4azendo um salto direto a este endereo ?"e.a a seo de saltos a)ai9oB(
1 terceiro caso no + um reset real* pois o rein6cio de registradores e "alores de porta a "alores
conhecidos* no + e9ecutado( -ortanto* es,uea#o por en,uanto(
! segunda opo* o reset 'atchdog* de"e ser ha)ilitado pelo programa( 7e esti"er desa)ilitado por
padro* a ha)ilitao re,uer escre"er comandos na porta do 'atchdog( _erar o contador 'atchdog re,uer
a e9ecuo do comando
7DR
para e"itar o reset(
!p=s a e9ecuo de um reset* e resta)elecimento dos registradores e portas para seus "alores padro* o
c=digo no endereo 0000 + lido pela parte de e9ecuo do processador* e e9ecutado( Jurante esta
e9ecuo o contador de programa ?-C* Drogram cou(terB ./ + incrementado em um e a pr=9ima pala"ra
do c=digo ./ + lida para o )u44er de )usca de c=digo ?Uusca durante F9ecuoB( 7e o comando e9ecutado
no re,uer um salto para outra localidade no programa* o pr=9imo comando + e9ecutado imediatamente(
K por isso ,ue os !V:s e9ecutam e9tremamente r/pido* cada ciclo de clock e9ecuta um comando ?se
no ocorrerem saltosB(
1 primeiro comando de um e9ecut/"el est/ sempre localizado no endereo 0000( -ara dizer ao
compilador ,ue nosso c=digo 4onte inicia a,ui e agora* uma direti"a especial pode ser colocada no in6cio*
antes do primeiro c=digo%
.%/E5
."R5
! primeira direti"a diz ao compilador ,ue a sa6da de"e ser para a seo de c=digos( Tudo ,ue se segue
ser/ traduzido como c=digo* e ser/ escrito N mem=ria de programa do processador( Tam)+m + poss6"el
direcionar a sa6da para a seo FF-:18 do chip* onde "oc2 pode escre"er );tes e pala"ras(
.E/E5
1 terceiro segmento + a poro 7:!8 do chip(
.D/E5
Ji4erente do conte>do para FF-:18* ,ue realmente + gra"ado no FF-:18 durante a programao* o
segmento J7FG no + programado no chip( K utilizado somente para c/lculo dos la)els durante o
processo de compilao(
! direti"a 1:G indica a origem e manipula os endereos dentro do segmento de c=digo* onde as pala"ras
montadas so gra"adas( Como nosso programa sempre inicia a 090000* as direti"as C7FG&1:G so
tri"iais* "oc2 poder/ ignor/#las sem o)ter um erro( -oder6amos comear* por e9emplo* a 090$00* mas no
4az sentido* "isto ,ue o processador inicia a e9ecuo em 0000( 7e "oc2 ,uiser colocar uma ta)ela
e9atamente em uma certa localizao no segmento de c=digo* "oc2 pode usar 1:G( 7e "oc2 ,uiser
demarcar onde realmente comea o seu programa* ap=s de4inir outras coisas com direti"as (JF3 e (FWH*
use a se,S2ncia C7FG&1:G para sua orientao* mesmo sa)endo ,ue no + necess/rio utiliz/#las(
Como a primeira pala"ra de c=digo sempre inicia no endereo zero* esta localizao + tam)+m chamada
de "etor de reset( -rocedendo os pr=9imos endereos* 09000$* 090002 etc(* temos os "etores de
interrupo( Fstas so as posies para onde a e9ecuo salta se uma interrupo e9terna ou interna 4oi
ha)ilitada e ocorre( Fstas posies chamadas "etores so espec64icas para cada tipo de processador* e
dependem do hard'are interno dispon6"el ?"e.a a)ai9oB( 1s comandos para reagir Ns interrupes de"em
ser colocadas nas localizaes de "etor apropriados( 7e "oc2 usar interrupes* o primeiro c=digo* no
"etor de reset* de"e ser um comando de salto ?.umpB* para saltar por cima dos outros "etores( Cada "etor
de interrupo de"e possuir um comando de salto para a respecti"a rotina para tratar a interrupo( !
t6pica se,S2ncia do programa no in6cio + como se segue%
Avr-Asm-Tutorial 2% http://www.avr-asm-tutorial.net
.%/E5
."R5
RXMP I(icio
RXMP 9rataI(terruDcao1
G...I aAui colocamos os outros coma(dos (o Eetor de i(terruD-Ho
G...I e aAui , um .om lugar Dara colocar as Dr1Drias roti(as de tratame(to da i(terruD-Ho
I(icioF + Y aAui Aue o Drograma i(icia
G...I )Aui colocamos o Drograma Dri(ciDal
1 comando :J8- resulta em um salto para o la)el @5nicio%A* localizado algumas linhas a)ai9o( Eem)re#se*
la)els sempre iniciam na coluna $ do c=digo 4onte e terminam com um @%A( Ea)els ,ue no atendam esta
condies no so interpretadas corretamente pelo compilador( Ea)els 4altantes resultam em uma
mensagem de erro ?@Ea)el inde4inidoA* '(defi(ed La.elB* e a compilao + interrompida(
:&ecu"o linear do pro!rama e des2ios
! e9ecuo de um programa + sempre linear* se nada mudar a e9ecuo se,uencial( Fstas mudanas
so a e9ecuo de uma interrupo* ou instrues de des"io(
1s des"ios normalmente so dependentes de alguma condio* chamados portanto des"ios condicionais(
Como e9emplo* "amos imaginar ,ue constru6mos um contador de R2 )its utilizando os registradores :$ a
:P( 1 );te menos signi4icati"o :$ + incrementado( 7e o registrador estoura ?oEerfloNB durante esta
operao ?2MM T $ ] 0B* temos ,ue incrementar :2 similarmente( 7e :2 estoura* incrementamos :R* e
assim por diante(
1 incremento por um + 4eito pela instruo 5<C( 7e um estouro ?o"er4lo'B ocorre durante esta e9ecuo
de 5<C :$* o )it zero do registrador de status + setado para um ?o resultado da operao + zeroB( 1 carr;
do registrador de status* usualmente setado em o"er4lo's* no + alterado durante um 5<C( 5sto no + para
con4undir o iniciante* mas o carr; + usado para outros prop=sitos( ! 4lag de _ero ou )it de zero neste caso
+ su4iciente para detectar um estouro( 7e no ocorrer nenhum estouro* mantemos a se,S2ncia de
contagem(
7e o )it#_ero 4or setado* de"emos e9ecutar um incremento adicional nos outros registradores( -ara
con4undir o iniciante* o comando de des"io ,ue temos ,ue usar no + chamado U:<_ mas U:<F
?6ra(c8 if *ot EAual* Jes"iar se no 4or igualB( Hma ,uesto de gosto(((
! se,S2ncia de contagem inteira do contador de R2 )its ento de"e 4icar assim%
I*% R1
6R*E %o(ti(ue=$
I*% R$
6R*E %o(ti(ue=$
I*% R=
6R*E %o(ti(ue=$
I*% R>
%o(ti(ue=$F
K s= isso( ! condio oposta a U:<F + U:FW ou 6ra(c8 E&ual* des"iar se 4or igual(
-ara sa)er ,uais os )its de status* tam)+m chamados de 4lags do processador so alterados durante a
e9ecuo de um comando* olhe a Eista de 5nstrues( Ja mesma 4orma ,ue o )it _ero* "oc2 pode usar
outros )its como%
6R%% la.elZ6R%/ la.el+ %arr:Sflag 06R%%2 ou 1 06R%/2
6R/4 la.el+ Igual ou maior
6RL" la.el+ Me(or
6RMI la.el+ Me(os
6RPL la.el+ Mais
6R5E la.el+ Maior ou igual 0com .it de si(al2
6RL9 la.el+ /maller 0Nit8 sig( .it2
6R4% la.elZ6R4/ la.el+ Flag de meioSoEerfloN ou 1
6R9% la.elZ6R9/ la.el+ 9S6it ou 1
6R#% la.elZ6R#/ la.el+ Flag de comDleme(to de dois ou 1
6RIE la.elZ6RID la.el+ I(terruD-[es 8a.ilitadas ou desa.ilitadas
para reagir a di4erentes condies( Jes"ios sempre ocorrem ,uando as condies so cumpridas( <o
tenha medo* a maioria destes comandos + raramente usada( -ara o iniciante* apenas _ero e Carr; so
importantes(
Temporiza"o durante a e&ecu"o do pro!rama
Como mencionado anteriormente* o tempo necess/rio para e9ecutar uma instruo + igual ao tempo de
ciclo do clock do processador( 7e o processador roda a P 8Qz( Fnto uma instruo re,uer $&P bs ou
2M0 ns* e a $0 8Qz* apenas $00 ns( 1 c/lculo do tempo + to preciso ,uanto o cristal do clock( 7e "oc2
precisa temporizao e9ata* um !V: + a melhor soluo( <ote ,ue h/ poucos comandos ,ue necessitam
de dois ou mais ciclos* e(g( !s instrues de des"io ?se este ocorreB ou se,S2ncias de leitura&escrita na
Avr-Asm-Tutorial 2& http://www.avr-asm-tutorial.net
7:!8( Ve.a a ta)ela de instrues para detalhes(
-ara de4inir o tempo e9ato* de"e ha"er uma oportunidade para no 4azer nada e retardar a e9ecuo do
programa( Voc2 pode utilizar outras instrues para 4azer nada* mas mais inteligente + a utilizao do
comando <1- ?*" oPeratio(, sem operaoB( Fsta + a instruo mais in>til%
*"P
Fsta instruo no 4az nada al+m de desperdiar tempo do processador( ! P 8Qz* precisamos de P
instrues desta para desperdiar $ bs( <o h/ outros signi4icados ocultos na instruo <1-( -ara um
gerador de sinal de $ kQz no precisamos adicionar P000 instrues destas em nosso c=digo 4onte* mas
utilizamos um contador por so4t'are e algumas instrues de des"io( Com isso* constru6mos um elo ,ue +
e9ecutado por um certo n>mero de "ezes* pro"ocando retardo( Hm contador por ser um registrador de 8
)its ,ue + decrementado pela instruo JFC* e(g( Jesta 4orma%
%LR R1
%o(taF
DE% R1
6R*E %o(ta
Contagem em $6 )it tam)+m pode ser usada para um retardo e9ato* assim%
LDI ;4,4I540655=52
LDI ;L,L"70655=52
%o(taF
/6I7 ;L,1
6R*E %o(ta
7e "oc2 usar mais registradores para construir contadores compostos* "oc2 pode conseguir ,ual,uer
retardo( F este + a)solutamente e9ato* mesmo sem um hard'are de temporizao(
6acros e e&ecu"o do pro!rama
3re,Sentemente "oc2 tem ,ue escre"er se,S2ncias de c=digo id2nticas ou similares em di4erentes
ocasies no seu c=digo 4onte( 7e "oc2 no ,uiser escre"2#la uma "ez e saltar para ela "ia chamada de
su)rotina* "oc2 pode usar um macro para e"itar escre"er a mesma se,S2ncia di"ersas "ezes( 8acros so
se,u2ncias de codigos* escritas e testadas uma "ez* e inseridas no c=digo por seu nome macro( Como
e9emplo* "amos imaginar ,ue precisamos retardar a e9ecuo do programa "/rias "ezes de $ b7 com
clock de P 8Qz( Fnto de4inimos uma macro em algum lugar do c=digo%
.M)%R" Retardo1
*"P
*"P
*"P
*"P
.E*DM)%R"
! de4inio da macro no produz ainda nenhum c=digo* + silenciosa( 1 c=digo + produzido ,uando "oc2
chama a macro pelo seu nome%
G...I em algum lugar (o c1digo fo(te
Retardo1
G...I o c1digo Eai aAui
5sto resulta em ,uatro instrues <1- inseridas no c=digo nesta localizao( Hm :etardo$ adicional
insere mais P instrues <1-(
!o chamar um macro por seu nome "oc2 pode adicionar alguns parGmetros para manipular o c=digo
produzido( 8ais isto + mais ,ue um iniciante precisa sa)er so)re macros(
7e seu macro tem longas se,u2ncias de c=digo* ou se "oc2 est/ com pouco espao de armazenamento*
de"e e"itar o uso de macros e usar su)rotinas no lugar(
$ubrotinas
!o contr/rio das macros* uma su)rotina economiza espao de armazenamento( ! se,S2ncia respecti"a +
apenas armazenada uma "ez no c=digo e + chamada de ,ual,uer parte( -ara assegurar a e9ecuo
continuada da se,uencia* "oc2 de"e retornar ao c=digo ,ue chamou a su)rotina( -ara um retardo de $0
ciclos "oc2 precisa escre"er esta su)rotina%
Retardo1F
*"P
*"P
*"P
RE9
7u)rotinas sempre iniciam com um la)el* caso contr/rio "oc2 no seria capaz de saltar para elas* no
nosso caso* @:etardo$0%A( Tr2s <1-s seguem a instruo :FT( 7e "oc2 contar os ciclos necess/rios*
"oc2 desco)rir/ ,ue so O ?R para os <1-s* P para o :FTB( 1s R ,ue 4altam esto contidos nesta rotina%
G...I algum lugar do c1digo fo(teF
R%)LL Retardo1
Avr-Asm-Tutorial 2' http://www.avr-asm-tutorial.net
G...I co(ti(ua(do com o c1digo fo(te
:C!EE + uma chamada relati"a( ! chamada + codi4icada como um salto relati"o* a distGncia relati"a da
rotina de chamada para a su)rotina + calculada pelo compilador( ! instruo :FT "olta N rotina de
chamada( <ote ,ue antes de "oc2 usar chamadas de su)rotina* "oc2 de"e setar o ponteiro de pilha ?"e.a
-ilhaB* por,ue o endereo para retorno de"e ser colocado na pilha pela instruo :C!EE(
7e "oc2 ,uiser saltar diretamente a algum outro lugar no c=digo* "oc2 tem ,ue usar a instruo .ump%
G...I em algum lugar do c1digo fo(te
RXMP Retardo1
Retor(oF
G...I co(ti(ua(do com o c1digo fo(te
! rotina para onde "oc2 pulou no pode usar o comando :FT neste caso( -ara "oltar N localizao de
onde "oc2 chamou* re,uer outro la)el e ,ue a rotina ,ue "oc2 chamou* salte de "olta para este la)el( Fste
tipo de salto no + chamado de su)rotina* por,ue "oc2 no pode cham/#la de di4erentes localidades do
c=digo(
:C!EE e :J8- so des"ios incondicionais( -ara pular para uma localidade* dependendo de alguma
condio* "oc2 ter/ ,ue com)inar com instrues de des"io( ! chamada condicional de uma su)rotina
pode ser 4eita com os seguintes comandos( 7e "oc2 ,uiser chamar uma su)rotina dependendo de um
certo )it em um registrador* use a se,u2ncia seguinte%
/6R% R1,? + Pule a Dr1Cima i(stru-Ho se o .it ? for
R%)LL "utroLa.el + %8ame a su.roti(a
7U:C ,uer dizer @-ule a pr=9ima instruo se o Uit O no :egistrador :$ 4or zero* skiD (eCt i(structio( if 6it
? i( Register R1 is %learB( ! instruo :C!EE para o 1utroEa)el% somente ser/ e9ecutada se o )it O no
registrador :$ 4or $* pois a pr=9ima instruo ser/ pulada se 4or 0( 7e "oc2 dese.ar chamar a su)rotina
caso o )it se.a 0* "oc2 pode utilizar a instruo correspondente 7U:7( ! instruo ,ue se segue a 7U:7&
7U:C pode ser de um ou dois );tes* o processador sa)e ,uanto ele tem ,ue pular( <ote ,ue os tempos
de e9ecuo so di4erentes neste caso( -ara pular so)re mais de uma instruo* estes comandos no
podem ser usados(
7e "oc2 ti"er ,ue pular uma instruo se dois registradores ti"erem o mesmo "alor* "oc2 pode usar a
instruo e9=tica
%P/E R1,R$ + %omDara R1 e R$, Dula se forem iguais
R%)LL )lguma/u.roti(a + %8ama alguma su.roti(a
K um comando raramente utilizado* es,uea#o no comeo( 7e "oc2 ,uiser pular a instruo seguinte
dependendo de um certo )it em uma porta* use as instrues 7U5C e 7U57( Flas ,uerem dizer @-ule se o
Uit no espao F&7 esti"er zero ?ou 7etadoB* /kiD if t8e 6it i( IZo sDace is %lear 0ou /et2V* assim%
/6I% PI*6, + Pule se o 6it (a Dorta 6 for
RXMP Desti(o) + Pule Dara o la.el Desti(o)
! instruo :J8- ser/ e9ecutada apenas se o )it 0 na porta U 4or $( K de alguma 4orma con4uso para o
iniciante( 1 acesso aos )its da porta + limitado N metade in4erior* as R2 portas superiores no podem ser
usadas a,ui(
!gora* outra aplicao e9=tica para o e9pert( -ule esta parte se "oc2 4or iniciante( 5magine ,ue temos P
cha"es* uma para cada )it* conectados N porta U( Jependendo do estado destes P "its* gostar6amos de
pular para $6 di4erentes localizaes no c=digo( !gora podemos ler a porta e usar di"ersas instrues de
des"io para desco)rir para onde teremos ,ue pular ho.e( Como alternati"a* "oc2 pode escre"er uma
ta)ela contendo os $6 endereos* assim%
Mi(8a9a.elaF
RXMP Routi(e1
RXMP Routi(e$
G...I
RXMP Routi(e16
Fm nosso c=digo* copiamos o endereo da ta)ela para o ponteiro _%
LDI ;4,4I540Mi(8a9a.ela2
LDI ;L,L"70Mi(8a9a.ela2
e adicionar o estado atual da porta U ?em :$6B a este endereo(
)DD ;L,R16
6R%% /emEstouro
I*% ;4
/emEstouroF
!gora podemos saltar Ns localidades na ta)ela* da mesma 4orma ,ue chamamos uma su)rotina%
I%)LL
ou pular* sem possi)ilidade de retorno%
IXMP
Avr-Asm-Tutorial 2( http://www.avr-asm-tutorial.net
1 processador carrega o conte>do do par de registradores _ no contador de programa e continua a
operao a partir da6( 8ais inteligente ,ue 4azer des"ios e mais des"ios0
#nterrup";es e a e&ecu"o do pro!rama
3re,uentemente temos ,ue reagir a condies do hard'are e outos e"entos( Hma e9emplo* + uma
alterao em um pino de entrada( Voc2 pode programar uma reao como um loop* sempre "eri4icando
se hou"e alterao em um pino( Fste m+todo + chamado de )usca* como uma a)elha "oando em c6rculos
procurando por no"as 4lores( 7e "oc2 tem ,ue detectar pulsos curtos com durao in4erior a
microssegundos* este m+todo + in>til( <este caso* "oc2 ter/ ,ue programar uma interrupo(
Hma interrupo + disparada por alguma condio de hard'are( Fsta condio tem ,ue ser ha)ilitada
primeiro* todas as interrupes de hard'are so disa)ilitadas por padro* no momento do reset( 1s )its
respecti"os da porta ,ue ha)ilitam a resposta N interrupo de"em ser ha)ilitados primeiro( 1
processador tem um )it no seu registrador de status ,ue o ha)ilita a responder N interrupo de ,ual,uer
componente* a 4lag de ha)ilitao de interrupo ?I(terruDt E(a.le FlagB( Qa)ilitar a resposta Ns
interrupes re,uer o seguinte comando%
/EI + /eta .it de 8a.ilita-Ho de I(terruD-Ho
7e a condio de interrupo ocorre* e(g( uma mudana no )it da porta* o processador coloca o contador
de programa atual na pilha ?,ue de"e ser ha)ilitada primeiroI Ve.a a inicializao do ponteiro de pilha na
seo -ilha da descrio da 7:!8B( 7em isso* o processador no seria capaz de retornar ao ponto onde
esta"a ,uando ocorreu a interrupo ?o ,ue pode ocorrer a ,ual,uer momento em ,ual,uer lugar da
e9ecuo do programaB( Jepois* o processamento salta para a localizao prede4inida* o "etor de
interrupo* e a6 e9ecuta as instrues(
<ormalmente a instruo + um JH8- para a rotina de tratamento da interrupo* localizado em algum
lugar do c=digo( ! localizao do "etor de interrupo + espec64ico do processador* e dependente dos
componentes de hard'are e da condio ,ue le"ou N interrupo( Wuanto mais componentes de
hard'are e mais condies* mais "etores( 1s di4erentes "etores para alguns tipos de !V: esto listados
na ta)ela a seguir ?o primeiro "etor no + uma interrupo* mas sim o "etor de reset* ,ue no 4az
operao com a pilhaIB
Nome Endereo do "etor de
interrupo
#$%$ #$#$ &'%'
(isparado por
:F7FT 0000 0000 0000 Qard'are :eset* -o'er#1n#:eset* Xatchdog :eset
5<T0 000$ 000$ 000$ 8udana de n6"el no pino e9terno 5<T0
5<T$ 0002 # 0002 8udana de n6"el no pino e9terno 5<T$
T58F:$C!-T 000R # 000R F"ento de captura no Timer&Contador $
T58F:$C18-! # # 000P Timer&Contador $ ] Valor de comparao !
T58F:$ C18-U # # 000M Timer&Contador $ ] Valor de comparao U
T58F:$ C18-$ 000P # # Timer&Contador $ ] Valor de comparao $
T58F:$ 1V3 000M # 0006 Fstouro ?o"er4lo'B de Timer&Contador $
T58F:0 1V3 0006 0002 000O Fstouro ?o"er4lo'B de Timer&Contador 0
7-5 7TC # # 0008 Transmisso 7erial Completa
H!:T TZ 000O # 000C Caractere H!:T dispon6"el no )u44er de recepo
H!:T HJ:F 0008 # 000! Transmisso H!:T esgotada
H!:T TZ 000C # 000U H!:T totalmente en"iada
!<!cC18- # # 000C Comparador !nal=gico
<ote ,ue a capacidade de reagir a e"entos + muito di4erente para os di4erentes tipos( 1s endereos so
se,uenciais* mas no id2nticos para di4erentes tipo( Consulte o datasheet para cada tipo de !V:(
Wuanto mais alto um "etor na lista* maior + sua prioridade( 7e dois ou mais componentes t2m uma
condio de interrupo ao mesmo tempo* o "etor com o menor endereo "ence( ! interrupo in4erior
tem ,ue esperar at+ ,ue a primeira tenha sido tratada( -ara e"itar ,ue as interrupes in4eriores
interrompam a e9ecuo do tratamento de uma interrupo superior* a primeira interrupo desa)ilita a
4lag 5 ?interrupoB do processador( ! rotina de"e rea)ilitar esta 4lag ap=s o t+rmino do tra)alho(
-ara rea)ilitar o )it de status 5 h/ duas 4ormas( 1 tratamento da interrupo para terminar com o comando
RE9I
Fste comando retorna o )it 5 depois do contador de programa ter sido resta)elecido com o "alor do
endereo de retorno(
Avr-Asm-Tutorial 2) http://www.avr-asm-tutorial.net
! segunda 4orma + ha)ilitar o )it 5 pela instruo
/EI + 4a.ilita .it de I(terruD-Ho
RE9 + Retor(a
5sto no 4az a mesma coisa do :FT5* pois interrupes su)se,uentes estaro ha)ilitadas antes do
contador de programa ser recarregado com o endereo de retorno( 7e outra interrupo esti"er pendente*
sua e9ecuao ./ inicia antes ,ue o endereo de retorno se.a remo"ido da pilha( Jois ou mais endereos
de retorno permanecem na pilha( 5sto no causa )ug imediato* mas + um risco desnecess/rio( -ortanto*
use a instruo :FT5 para e"itar 4lu9o desnecess/rio na pilha(
Hm "etor de interrupo tem capacidade para apenas uma instruo de salto para a rotina de ser"io( 7e
certa interrupo no + usada ou inde4inida* colocamos simplesmente uma instruo :FT5 ali* no caso de
uma 4alsa interrupo ocorrer( K o caso da e9ecuo do ser"io respecti"o no resetar automaticamente a
condio de interrupo do peri4+rico( <este caso* um simples :FT5 causaria um loop cont6nuo de resets(
Fste + o caso com algumas interrupes da H!:T(
Wuando uma interrupo est/ em tratamento* a e9ecuo de outras interrupes de menor prioridade +
)lo,ueada( -or este moti"o* todas as rotinas de tratamento de interrupo de"em ser to curtas ,uanto
poss6"el( 7e "oc2 precisar de uma longa rotina de tratamento da interrupo* use um dos seguintes
m+todos( 1 primeiro + permitir interrupes com 7F5 dentro da rotina de tratamento* en,uanto "oc2
e9ecuta as tare4as mais urgentes( <o + muito inteligente( 8ais con"eniente seria e9ecutar as tare4as
urgentes* setar uma 4lag em algum lugar em um registrador para as reaes mais lentas* e retornar da
interrupo imediatamente(
Hma regra muito importante para o tratamento de interrupes +% ! primeira instruo sempre tem ,ue
guardar o registrador de status na pilha* antes de "oc2 utilizar instrues ,ue possam alterar as 4lags do
registrador de status( 1 programa principal* ,ue 4oi interrompido* pode precisar utilizar uma 4lag ,ue
esta"a setada* para tomar alguma deciso* e a interrupo alterou .ustamente esta 4lag( Coisas
engraadas podem acontecer de tempos em tempos( ! >ltima instruo antes de :FT5 de"er/ ser
recuperar o conte>do do registrador de status da pilha e restaurar seu conte>do original(
-ela mesma razo* todos os registradores usados no tratamento da interrupo de"em ser reser"ados
e9clusi"amente para a,uele prop=sito* ou sal"os na pilha e restaurados ao 4im da rotina( <unca altere o
conte>do de um registrador dentro de uma tratamento de interrupo ,ue 4or usado em outras partes do
programa* sem restaur/#lo antes(
Je"ido a todas estas necessidades* um e9emplo mais so4isticado de tratamento de interrupo* +
mostrado a,ui(
.%/E5 + /egme(to de c1digo come-a aAui
."R5 + E(dere-o , Jero
RXMP I(icia+ " Eetor de reset (o e(dere-o
RXMP /erEicoI(t + 1F Primeiro Eetor de i(terruD-Ho, tratame(to de I*9
G...I aAui outros Eetores

I(iciaF + )Aui o Drograma Dri(ciDal i(icia
G...I aAui 8O esDa-o suficie(te Dara defi(ir Dil8a e outras coisas

/erEicoI(tF + )Aui i(iciamos a roti(a de tratame(to da i(terruD-Ho
P'/4 R16 + salEamos um registrador (a Dil8a
I* R16,/RE5 + lemos o registrador de status 0(.t. e colocamos em R162
P'/4 R16 + e o colocamos (a Dil8a
G...I )Aui a roti(a de tratame(to da i(terruD-Ho faJ alguma coisa e usa R16
P"P R16 + o.temos o registrador de flags de Eolta da Dil8a 0(.t. Para R162
"'9 /RE5,R16 + e o restauramos (a flag de status
P"P R16 + o.temos o co(teTdo a(terior de R16 (a Dil8a
RE9I + e retor(amos da i(terruD-Ho
-arece um pouco complicado* mas + um pr+#re,uisito para usar interrupes sem produzir s+rios )ugs(
5gnore -H7Q :$6 e -1- :$6 se "oc2 pode reser"ar este registrador e9clusi"amente para uso no
tratamento das interrupes( Como o tratamento da interrupo no pode ser interrompido ?a no ser ,ue
"oc2 permita* no c=digoB* todas as rotinas de tratamento de interrupo podem usar o mesmo registrador(
K isso para o iniciante( Q/ mais algumas coisas com interrupes* mas + o su4iciente para comear e no
o con4undir(
Avr-Asm-Tutorial 2* http://www.avr-asm-tutorial.net
Clculos
!gora discutiremos os comandos necess/rios para calcular em linguagem assem)ler !V:( 5sto inclui
sistemas num+ricos* setar e zerar )its* deslocar e rotacionar* e adicionar&su)trair&comparar e con"erso
de 4ormatos num+ricos(
$istemas numricos em assembler
1s seguintes 4ormatos num+ricos so comuns em assem)ler%
<>meros positi"os inteiros ?U;tes* -ala"ras* etc(B*
<>meros com sinal ?inteirosB*
J6gitos codi4icados em )in/rio ?UCJ* 6i(ar: %oded DigitsB
UCJs compactados*
<>meros 4ormatados em !7C55(
<=meros positi2os inteiros >b'tes? pala2ras? etc@A
1 menor n>mero inteiro a ser manipulado em assem)ler + um );te com oito )its( Fle codi4ica n>meros
entre 0 e 2MM( Tais )its encai9am per4eitamente em um registrador da 8CH( Todos os n>meros maiores
de"em ser )aseados neste 4ormato )/sico* usando mais do ,ue um registrador( Jois );tes 4ormam uma
pala"ra* Nord* ?,ue "ai de 0 a 6M(MRMB* tr2s );tes 4ormam uma pala"ra maior ?"ai de 0 a $6(OOO(2$MB e
,uatro );tes 4ormam uma pala"ra dupla* dou.le Nord ?de 0 a P(2CP(C6O(2CMB(
1s );tes de uma pala"ra ou pala"ra dupla podem ser armazenados no registrador ,ue "oc2 ,uiser(
1peraes com estes );tes so programados );te por );te* ento "oc2 no tem ,ue se preocupar em
coloc/#los em ordem( -ara 4ormar um con.unto de uma pala"ra dupla* podemos armazenar assim%
.DEF r16 = dN
.DEF r1? = dN1
.DEF r1@ = dN$
.DEF r1! = dN=
d'0 a d'R esto em ordem nos registradores( 7e ,uisermos iniciar esta pala"ra dupla no in6cio de uma
aplicao* de"emos 4azer da seguinte 4orma%
.E&' dNi = > + defi(imos a co(sta(te
LDI dN,L"70dNi2 + "s @ .its mais .aiCos em R16
LDI dN1,639E$0dNi2 + .its @ .. 15 em R1?
LDI dN$,639E=0dNi2 + .its 16 .. $= em R1@
LDI dN=,639E>0dNi2 + .its $> .. =1 em R1!
Fnto* con"ertemos este n>mero decimal* chamado d'i* em suas pores )in/rias e as ,ue)ramos em
,uatro pacotes de );tes( !gora "oc2 pode 4azer c/lculos com esta pala"ra dupla(
<=meros com sinal >inteirosA
!lgumas "ezes* mas em raros casos* "oc2 precisa calcular com n>meros negati"os( Hm n>mero negati"o
+ de4inido interpretando o )it mais signi4icati"o de um );te como um )it de sinal( 7e 4or 0* o n>mero +
positi"o( 7e 4or $* o n>mero + negati"o( 7e 4or negati"o* usualmente no armazenamos o n>mero em sua
4orma normal* mas usamos seu "alor in"ertido( 5n"ertido signi4ica ,ue #$ como um );te inteiro no +
escrito $000(000$ mas $$$$($$$$( 5sto signi4ica% su)traia $ de 0 e es,uea o estouro ?o"er4lo'B( 1
primeiro )it + o )it de sinal* sinalizando ,ue este + um n>mero negati"o( 1 por,u2 deste 4ormato di4erente
?su)trair o n>mero negati"o de 0B ser usado + 4/cil de entender( 7omar #$ ?$$$$($$$$B e T$ ?0000(000$B
d/ e9atamente zero* se "oc2 es,uecer o estouro ,ue ocorre durante esta operao ?o nono )itB(
Fm um );te* o maior n>mero inteiro + T$2O ?)in/rio 0*$$$$$$B* o menor + #$28 ?)in/rio $*0000000B( Fm
outras linguagens de computador* este 4ormato num+rico + chamado de inteiro curto 0s8ort i(teger2. 7e
"oc2 precisar de uma 4ai9a de "alores maior* "oc2 pode adicionar outro );te para 4ormar um n>mero
inteiro* indo de TR2(O6O at+ #R2(O68* en,uanto ,ue ,uatro );tes 4ornecem uma 4ai9a de T2($PO(P8R(6PO
at+ #2($PO(P8R(6P8* usualmente chamado de 5nteiro longo ?Eong5ntB ou 5nteiro Juplo ?Jou)le5ntB(
0%!itos Codificados em 8inrio? 8C0 )Binar* Coded (igits+
<>meros inteiros positi"os ou com sinal nos 4ormatos assima utilizam o espao dispon6"el da 4orma mais
e4iciente( 1utra 4ormato num+rico* menos denso* mas 4/cil de tra)alhar* + armazenar os n>meros
decimais em um );te para cada d6gito( 1 d6gito decimal + armazenado em sua 4orma )in/rio em um );te(
Cada d6gito de 0 a C precisa de ,uatro )its ?0000 a $00$B* os ,uatro )its superiores so zeros*
desperdiando muito espao em cada );teB( -or e9emplo* para mostrarmos o n>mero 2M0* precisamos de
no m6nimo tr2s );tes%
Avr-Asm-Tutorial 3+ http://www.avr-asm-tutorial.net
,alor do -it %#& ./ $# %. & / # %
:$6* J6gito $ ]2 0 0 0 0 0 0 $ 0
:$O* J6gito 2 ] M 0 0 0 0 0 $ 0 $
:$8* J6gito R ] 0 0 0 0 0 0 0 0 0
+I(stru-[es Dara codificarF
LDI R16,$
LDI R1?,5
LDI R1@,

Voc2 pode calcular com estes n>meros* mas + um pouco mais complicado em assem)ler do ,ue calcular
com "alores )in/rios( ! "antagem dste 4ormato + ,ue "oc2 pode manipular n>meros to grandes ,uanto
"oc2 ,uiser* desde ,ue ha.a espao su4iciente( 1s c/lculos so to precisos ,uanto "oc2 ,uiser ?se "oc2
programa !V:s para aplicaes de )ancoB* e "oc2 pode con"ert2#los 4acilmente para cordes ?stri(gsB de
caracteres(
8C0s compactados
7e "oc2 comprimir dois d6gitos decimais dentro de um );te* "oc2 no perder/ tanto espao de
armazenagem( Fste m+todo + chamado de d6gitos codi4icados em )in/rio compactados ?Dacked .i(ar:
coded digitsB( !s duas partes de um );te so chamados de ni))le superior e in4erior( 1 ni))le superior
normalmente guardo o d6gito mais signi4icati"o* o ,ue tem "antagens no c/lculo ?instrues especiais na
linguagem assem)ler do !V:B( 1 n>mero decimal 2M0 ento 4icaria assim 4ormatado em UCJ
compactado%
B*te (0gitos ,alor & / # % & / # %
2 P d R 02 0 0 0 0 0 0 $ 0
$ 2 d $ M0 0 $ 0 $ 0 0 0 0
+ I(stru-[es Dara codificar
LDI R1?,C$ + 6:te suDerior
LDI R16,C5 + 6:te i(ferior
-ara 4azer isto corretamente* "oc2 pode usar a notao )in/ria ?0)(((B ou a notao he9adecimal ?09(((B
para colocar os )its na posio correta dentro dos ni))les(
1 c/lculo com UCJs compactados + um pouco mais complicado comparado com a 4orma )in/ria( -ara
con"erter em cordes de caracteres* + to 4/cil ,uanto com UCJs( 1 comprimento dos n>meros e a
preciso dos c/lculos + limitado somente pelo espao de armazenagem(
<=meros em formato A$C##
8uito similar ao 4ormato UCJ + a armazenagem de n>meros em 4ormato !7C55( 1s d6gitos 0 a C so
armazenados utilizando sua representao !7C55 ?!7C55 ] )merica( /ta(dard %ode for I(formatio(
I(terc8a(ge* -adro de C=digos !mericanos para 5ntercGm)io de 5n4ormaoB( 1 !7C55 + um 4ormato
muito antigo* desen"ol"ido e otimizado para escritores de teletipo* desnecessariamente complicado para
utilizao em computadores ?"oc2 sa)e o ,ue um caractere chamado E(d "f 9ra(smissio( ?4im da
transmissoB F1T signi4ica"a ,uando 4oi in"entado0B* muito limitado para outras l6nguas ,ue no o ingl2s
?somente O )its por caractereB* ainda usado em comunicaes ho.e de"ido aos es4oros limitados de
programadores de sistemas operacionais no sentido de mudar para sistemas de caracteres mais e4eti"os(
Fste sistema antigo s= + ultrapassado pelo con.unto de caracteres de M )it Furopeu chamado con.unto
Uaudot ou o c=digo 8orse* ainda em uso por algumas pessoas com dedos r/pidos(
Jentro do sistema de codi4icao !7C55* o d6gito decimal 0 + representado pelo n>mero P8 ?he9a 09R0*
)in/rio 0)00$$(0000B* d6gito C + MO ?he9a 09RC* )in/rio 0)00$$($00$B( 1 !7C55 no 4oi pro.etado para ter
estes n>meros no in6cio do con.unto de c=digo* pois ./ h/ alguns caracteres de comando como o F1T
mencionado para teletipo( Fnto temos ,ue adicionar P8 a um UCJ ?ou setar os )it P e M para $B para
con"erter UCJ para !7C55( 1s n>meros 4ormatados em !7C55 precisam do mesmo espao de
armazenagem ,ue o UCJ( Carregar 2M0 para um con.unto de registradores representando este n>mero
4icaria desta 4orma%
LDI R1@,\$\
LDI R1?,\5\
LDI R16,\\
! representao !7C55 destes caracteres so escrito nos registradores(
6anipula"o de bits
-ara con"erter um d6gito codi4icado em UCJ para sua representao em !7C55* temos ,ue setar os )its P
e M para um( Fm outras pala"ras* precisamos 4azer uma operao 1: no UCJ com um "alor he9a de
09R0( Fm assem)ler isto + 4eito da seguinte 4orma%
Avr-Asm-Tutorial 31 http://www.avr-asm-tutorial.net
"RI R16,C=
7e temos um registrador ,ue ./ tem o "alor he9a 09R0* podemos 4azer 1: com este registrador para
con"ert2#lo para UCJ%
"R R1,R$
Con"erter um !7C55 de "olta para UCJ + 4/cil( ! instruo
)*DI R16,CF
isola os ,uatro )its mais )ai9os ?] o ni))le in4eriorB( <ote ,ue 1:5 e !<J5 so poss6"eis apenas com
registradores acima de :$M( 7e precisar utiliz/#los* use um dos registradores entre :$6 e :R$I
7e o "alor he9a 0903 ./ esti"er no registrador :2* "oc2 pode 4azer !<J o caractere !7C55 com este
registrador%
)*D R1,R$
!s outras instrues para manipular )its em um registrador so tam)em limitados para os registradores
acima de :$M( Fles podem ser 4ormulados assim%
/6R R16,.11 + /eta .its > e 5 Dara um
%6R R16,.11 + Jera .its > e 5 Dara Jero
7e um ou mais )its de um );te t2m ,ue ser in"ertidos* "oc2 pode usar a seguinte instruo ?,ue no +
poss6"el usar com uma constanteB%
LDI R16,.1111 + I(Eerte todos os .its Dares
E"R R1,R16 + do registrador R1 e armaJe(a o resultado em R1
5n"erter todos os )its de um );te + chamado de Complemento de Hm(
%"M R1
in"erte o conte>do do registrador :$ e su)stitui zeros por uns e "ice "ersa( 5sto + di4erente do
Complemento de Jois* ,ue con"erte um n>mero com sinal positi"o pelo seu complemento negati"o
?su)traindo de zeroB( 5sto + 4eito com a instruo
*E5 R1
Fnto T$ ?decimal% $B "ira #$ ?)in/rio $($$$$$$$B* T2 "ira #2 ?)in/rio $($$$$$$0B* e assim por diante(
!l+m da manipulao de )its em um registrador* a c=pia de apenas um )it + poss6"el usando a )it T do
registrador de status( Com
6LD R1,
1 )it T + carregado com uma c=pia do )it 0 do registrador :$( 1 )it T pode ser setado ou zerado* e seu
conte>do pode ser copiado para ,ual,uer )it em ,ual,uer registrador%
%L9 + Jera .it 9, ou
/E9 + seta .it 9, ou
6/9 R$,$ + coDia .it 9 Dara o .it $ do registrador R$
0esloca e rotaciona
Jeslocamento e rotao de n>meros )in/rios signi4ica multiplicao ou di"iso por 2( 1 deslocamento
tem "/rias su)#instrues(
! multiplicao por 2 + 4acilmente 4eita deslocando todos os )its de um );te um d6gito )in/rio N es,uerda
e escre"endo um zero no )it menos signi4icati"o( 5sto + chamado des"io N es,uerda l=gico ?Logic /8ift
LeftB( 1 antigo )it O do );te ser/ deslocado para o carr; no registrador de status(
L/L R1
1 in"erso* di"iso por 2 + a instruo chamada des"io N direita l=gico ?Logic /8ift Rig8tB
E7: :$
1 antigo )it O* agora deslocado para o )it 6* + preenchido com 0* en,uanto o antigo )it 0 + deslocado para
o carr; do registrador de status( Fste carr; poderia ser usado para arredondar para cima e para )ai9o ?se
esti"er setado* adicionar um ao resultadoB( F9emplo* di"iso por ,uatro com arredondamento%
L/R R1 + diEisHo Dor $
6R%% DiE$ + Pula se (Ho arredo(dar
I*% R1 + arredo(da Dara cima
DiE$F
L/R R1 + Mais uma diEisHo Dor $
6R%% DiEE + Pula se (Ho arredo(dar
I*% R1 + )rredo(da
DiEEF
Avr-Asm-Tutorial 32 http://www.avr-asm-tutorial.net
!ssim* di"idir + 4/cil com )in/rios* contanto ,ue "oc2 di"ida por m>ltiplos de 2(
7e inteiros com sinal 4orem usados* o des"io N direito so)rescre"eria o )it de sinal O( ! instruo des"io N
direita aritm+tico ?arit8metic s8ift rig8tB !7: dei9a o )it O intocado e desloca os O )its in4eriores* inserindo
um )it zero na localizao 6(
)/R R1
Ja mesma 4orma ,ue o des"io l=gico* o antigo )it 0 "ai para o carr; no registrador de status(
Wue tal multiplicarmos uma pala"ra de $6 )its por 20 1 )it mais signi4icati"o do );te in4erior tem ,ue ser
deslocado para se tornar o )it in4erior do );te superior( <este passo* um des"io setaria o )it mais )ai9o
para zero* mas precisamos deslocar o carr; do deslocamento anterior do );te mais )ai9o para o )it 0( 5sto
+ chamado rotao( Jurante a rotao* o carr; no registrador de status + alterado para )it 0* e o antigo )it
O + deslocado para o carr; durante a rotao(
L/L R1 + DesEio K EsAuerda L1gico do .:te mais .aiCo
R"L R$ + Rotacio(a Dara esAuerda 0R"tate Left2 do .:te suDerior
1 des"io N es,uerda l=gico da primeira instruo desloca o )it O para o carr;* a instruo :1E rola o carr;
para o )it 0 do );te superior( !p=s a segunda instruo* o carr; tem o antigo )it O( 1 carr; pode ser usado
tanto para indicar um estouro ?se 4or 4eito um c/lculo de $6 )itsB ou para ser rolado para );tes superiores
?se est/ sendo 4eito c/lculo com mais de $6 )itsB(
! rolagem para a direita + tam)+m poss6"el* di"idindo por 2 e deslocando o carr; para o )it O do
resultado%
L/R R$ + DesEio l1gico K direita, .it Eai Dara o carr:
R"R R1 + Rotacio(a Dara direita 0R"tate Rig8t2 e desEia o carr: Dara o .it ?
K 4/cil di"idir n>meros grandes( Voc2 "2 ,ue aprender assem)ler no + Te1 complicado(
! >ltima instruo ,ue desloca ,uatro )its em um >nico passo + normalmente usado em UCJs
compactados( Fsta instruo desloca um ni))le inteiro da posio superior para a in4erior e "ice#"ersa(
Fm nosso e9emplo* precisamos deslocar o ni))le superior para o ni))le in4erior( <o lugar de usarmos
R"R R1
R"R R1
R"R R1
R"R R1
podemos 4azer isso com um simples
/7)P R1
Fsta instruo troca os ni))les superior e o in4erior entre si( <ote ,ue o conte>do do ni))le superior ser/
di4erente ap=s aplicar estes dois m+todos(
$omando? subtraindo e comparando
!s seguintes operaes de c/lculo so complicadas demais para os iniciantes e demonstram ,ue
assem)ler + apenas para e9perts e9tremos( Eeia por seu pr=prio riscoI
-ara comear a complicar* somaremos dois n>meros de $6 )its* em :$%:2 e :R%:P( ?<esta notao*
,ueremos dizer ,ue o primeiro registrador + o );te mais signi4icati"o* o segundo o menos signi4icati"oB(
)DD R$,R> + Drimeiro soma os dois .:tes i(feriores
)D% R1,R= + deDois os dois .:tes suDeriores
<o lugar do segundo !JJ* usamos !JC na segunda instruo( 5sso signi4ica somar com o carr; ?)dd
Nit8 %arr:B* ,ue + setado ou zerado durante a primeira instruo* dependendo do resultado( J/ est/
apa"orado o su4iciente por essa matem/tica complicada0 7e no% tome issoI
7u)trairemos :R%:P de :$%:2(
/'6 R$,R> + Drimeiro o .:te i(ferior
/6% R1,R= + deDois o .:te suDerior
<o"amente o mesmo tru,ue% durante a segunda instruo su)tra6mos outro $ do resultado caso o
resultado da primeira instruo te"e um estoruo( !inda respirando0 7e sim* siga adianteI
!gora comparemos uma pala"ra de $6 )its em :$%:2 com outro em :2%:P para a"aliar se + maior do ,ue
o segundo( <o lugar de 7HU* usamos uma instruo de comparao C-* e no lugar de 7UC usamos
C-C%
%P R$,R> + comDara .:tes i(feriores
%P% R1,R= + comDara .:tes suDeriores
7e a 4lag de carr; esti"er setada agora* :$%:2 + maior ,ue :R%:P
!gora adicionamos coisas mais complicadas( Comparemos o conte>do de :$6 com a constante
0)$0$0$0$0(
Avr-Asm-Tutorial 33 http://www.avr-asm-tutorial.net
%PI R16,C))
7e o )it de _ero do registrador de status 4or $ depois disso* sa)emos ,ue :$6 + 09!!( 7e o carr; 4or $*
sa)emos ,ue + menor( 7e nem o carr; nem o _ero 4orem $* sa)emos ,ue + maior(
F agora o teste mais complicado( !"aliamos se :$ + zero ou negati"o%
9/9 R1
7e o )it _ esti"er setado* o registrador :$ + zero e podemos utilizar uma das seguintes instrues% U:FW*
U:<F* U:85* U:-E* U:E1* U:7Q* U:GF* U:ET* U:VC or U:V7 para des"iarmos um pouco(
!inda conosco0 7e sim* h/ alguns c/lculos para UCJ compactados( 7omar dois UCJs compactados
pode resultar em dois estouros di4erentes( 1 carr; usual mostra um o"er4lo'* se o ni))le superior resultar
em mais do ,ue $M decimal( 1utro estouro ocorre do ni))le in4erior para o superior* se a soma dos dois
ni))les der mais do ,ue $M decimal(
-ara ser"ir de e9emplo* "amos somar os UCJs compactados PC ?]he9a PCB e CC ?]he9a CCB para chegar
a $P8 ?]he9a 090$P8B( 7om/#los usando matem/tica )in/ria resultaria em um );te com o he9a 09F2* e
no ocorreria estouro( 1 mais )ai9o dos ni))les de"eria ter dado um o"er4lo'* pois CTC]$8 ?mais ,ue CB e
o ni))le in4erior pode somente manipular n>meros at+ $M( 1 estouro 4oi somado ao )it P* o )it menos
signi4icati"o do ni))le superior( 1 ,ue est/ corretoI 8as o ni))le in4erior de"eria ser 8 e + somente 2 ?$8 ]
0)000$(00$0B( Je"er6amos adicionar 6 a este ni))le para chegarmos ao resultado correto( 1 ,ue + l=gico*
por,ue sempre ,ue o ni))le in4erior passar de C* temos ,ue adicionar 6 para corrigi#lo(
1 ni))le superior est/ totalmente incorreto* por,ue est/ 09F e de"eria ser R ?com um $ estourando para o
pr=9imo d6gito do UCJ compactadoB( 7e adicionarmos 6 a este 09F* conseguiremos 09P e o carr; +
setado ?]09$PB( Fnto o tru,ue + primeiro somarmos estes dois n>meros e depois adicionarmos 0966
para corrigir os dois d6gitos do UCJ compactado( 8as espere% e se a soma do primeiro e do segundo
d6gitos no resultarem em estouro para o pr=9imo ni))le e no resultar em um n>mero maior do ,ue C no
ni))le in4erior0 7omar 0966 ento resultaria em um resultado totalmente incorreto( 1 6 in4erior de"e ser
adicionado se o ni))le in4erior estoura para o ni))le superior* ou resulta em um d6gito maior ,ue C( 1
mesmo com o ni))le superior(
Como sa)emos* se ocorre um estouro do ni))le in4erior para o superior0 ! 8CH seta o )it Q no
registrador de status* o )it meio#carr; ?8alfScarr:B( ! seguir mostramos o algoritmo para di4erentes casos
,ue so poss6"eis ap=s somar dois ni))les e somar o he9a 096 a eles(
$( 7ome os ni))les( 7e ocorrer estouro ?C para os ni))les superiores* ou Q para os in4erioresB*
adicione 6 para corrigir( 7e no* passe para o passo 2(
2( 7ome 6 ao ni))le( 7e ocorrer estouro ?C ou QB* est/ terminado( 7e no* su)traia 6(
-ara programar um e9emplo* "amos assimir ,ue dois UCJs compactados esto em :2 e :R* :$ 4icar/
com o estouro* e :$6 e :$O esto dispon6"eis para c/lculos( :$6 + o registrador de soma para adicionar
0966 ?o registrador :2 no pode rece)er um "alor constanteB* :$O + usado para corrigir o resultado
dependendo das di4erentes 4lags( 7omar :2 com :R 4ica assim%
LDI R16,C66 + Dara somar C66 ao resultado
LDI R1?,C66 + Dara deDois su.traiSlo do resultado
)DD R$,R= + soma os dois 6%Ds de dois dWgitos
6R%% *o%:1 + Dula se (Ho ocorrer estouro
I*% R1 + i(creme(ta o Dr1Cimo .:te suDerior
)*DI R1?,CF + (Ho su.traia 6 do (i..le i(ferior
*o%:1F
6R4% *o4c1 + Dula se (Ho ocorrer meioScarr:
)*DI R1?,CF + (Ho su.traia 6 do (i..le i(ferior
*o4c1F
)DD R$,R16 + some C66 ao resultado
6R%% *o%:$ + Dule se (Ho ocorreu carr:
I*% R1 + i(creme(te o Dr1Cimo .:te suDerior
)*DI R1?,CF + (Ho su.traia 6 do (i..le suDerior
*o%:$F
6R4% *o4c$ + Dule se (Ho ocorreu meioScarr:
)*DI R1?,CF + (Ho su.traia 6 do (i..le i(ferior
*o4c$F
/'6 R$,R1? + corre-Ho da su.tra-Ho
Hm pouco mais curto%
LDI R16,C66
)DD R$,R16
)DD R$,R=
6R%% *o%:
I*% R1
)*DI R16,CF
*o%:F
6R4% *o4c
)*DI R16,CF
*o4cF
/'6 R$,R16
-ergunta para pensar% por,ue am)os esto corretos* e a segunda "erso ocupa metade do tamanho e
Avr-Asm-Tutorial 3% http://www.avr-asm-tutorial.net
menos complicado* onde est/ o tru,ue0
Con2erso de formatos numricos
Todos os 4ormatos num+ricos podem ser con"ertidos( ! con"erso entre UCJ e !7C55 e "ice#"ersa ./ 4oi
mostrada acima ?8anipulao de )itsB(
! con"erso para UCJs compactados no + muito complicada tam)+m( -rimeiro temos ,ue copiar o
n>mero para outro registrador( Com o "alor copiado* trocamos os ni))les usando a instruo 7X!-
?trocarB para trocar o superior com o in4erior( ! parte superior + zerada* e(g( 3azendo !<J com 0903(
!gora temos o UCJ do ni))le superior e podemos us/#lo como UCJ ou setar )it P e M para con"ert2#lo
em um caractere !7C55( Jepois disso* copiamos no"amente o );te e tratamos o ni))le in4erior sem 4azer
7X!- para o)ter o UCJ in4erior(
Hm pouco mais complicada + a con"erso de d6gitos UCJ para )in/rio( Jependendo dos n>meros a
serem manipulados* primeiramente li)eramos os );tes necess/rios ,ue rece)ero o resultado da
con"erso( Fnto iniciamos com o d6gito UCJ mais alto( !ntes de adicionar este resultado* multiplicamos
o resultado por $0( ?<ote ,ue no primeiro passo isto no + necess/rio* pois o resultado + zeroB(
-ara 4azermos esta multiplicao por $0* copiamos o resultado para algum lugar( Jepois multiplicamos o
resultado por P ?duas rolagens N es,uerdaB( !dicionar o n>mero anteriormente copiado resulta na
multiplicao por M( !gora uma multiplicao por 2 ?uma rolagem N es,uerdaB chega ao resultado
decaduplicado( 3inalmente adicionamos o UCJ e repetimos este algoritmo at+ todos os d6gitos estarem
con"ertidos( 7e* em uma destas operaes* ocorrer um carr; ?transporteB do resultado* o UCJ + grande
demais para ser con"ertido( Fste algoritmo 4unciona com n>meros de ,ual,uer comprimento* desde ,ue
ha.a registradores su4icientes(
! con"erso de )in/rios para UCJ + um pouco mais complicada( 7e con"ertermos um )in/rio de $6 )its
podemos su)trair $0(000 ?092O$0B at+ ,ue ocorra um estouro* o)tendo o primeiro d6gito( Fnto repetimos
com $000 para o)termos os segundo d6gito( F assim por diante com $00 ?09006PB e $0 ?09000!B* e ento
o ,ue remanescente + o >ltimo d6gito( !s constantes $0(000* $(000* $00 e $0 podem ser colocados na
mem=ria do programa em uma ta)ela de pala"ras* organizada da seguinte 4orma%
DeJ9a.F
.D7 1, 1, 1, 1
e podem ser lidas as pala"ras com uma instruo E-8 da ta)ela(
Hma alternati"a + uma ta)ela ,ue cont+m o "alor decimal de cada )it do )in/rio de $6 )its* e(g(*
.D6 ,=,$,?,6,@
.D6 ,1,6,=,@,>
.D6 ,,@,1,!,$
.D6 ,,>,,!,6
.D6 ,,$,,>,@ + e assim Dor dia(te at,
.D6 ,,,,,1
F ento "oc2 desloca os )its do )in/rio para ,ue este deslo,ue dos registradores para o carr;( 7e 4or um*
"oc2 adiciona o n>mero na ta)ela ao resultado* lendo on n>meros da ta)ela usando E-8( 5sto + mais
complicado para programar e um pouco mais lento do ,ue o m+todo acima(
1 terceiro m+todo + calcular o "alor da ta)ela* iniciando com 00000$* adicionando#o ao UCJ* cada "ez
,ue "oc2 desloca um )it do seu )in/rio para a direita e adiciona ao UCJ(
8uitos m+todos* muito a ser otimizado(
6ultiplica"o
! multiplicao de n>meros )in/rios ser/ e9plicada a,ui(
6ultiplica"o decimal
-ara multiplicarmos dois n>meros )in/rios de 8 )its* "amos lem)rar como 4azemos com os n>meros
decimais%
$2RP f M6O ] 0
########################
$2RP f O ] 86R8
T $2RP f 60 ] OP0P0
T $2RP f M00 ] 6$O000
########################
$2RP f M6O ] 6CC6O8
]]]]]]]]]]]]]]]]]]]]]]]]
-asso a passo* em decimal%
Avr-Asm-Tutorial 3& http://www.avr-asm-tutorial.net
8ultiplicamos o primeiro n>mero com o d6gito menos signi4icati"o do segundo n>mero e
adicionamos ao resultado(
8ultiplicamos o primeiro n>mero por $0 e pelo pr=9imo d6gito do segundo n>mero e adicionamos ao
resultado(
8ultiplicamos o primeiro n>mero por $00* e ao terceiro d6gito* e adicionamos ao resultado(
6ultiplica"o binria
!gora em )in/rio( ! multiplicao com d6gitos simples no + nececss/ria* pois h/ somente os d6gitos $
?some o n>meroB e 0 ?no some o n>meroB( ! multiplicao por $0 em decimal e,ui"ale N multiplicao
por 2 em modo )in/rio( 8ultiplicao em 2 + 4eita 4acilmente* adicionando o n>mero a si mesmo* ou
deslocando todos os )its uma posio para a es,uerda e escre"endo um 0 para a posio "azia N direita(
Ve.a ,ue matem/tia )in/ria + muito mais 4/cil ,ue decimal( -or,ue a humanidade no a usou desde o
comeo0
Pro!rama em Assembler AVR
1 c=digo 4onte a seguir demonstra a realizao de multiplicao em assem)ler(
+ Mult@.asm multiDlica dois (Tmeros de @ .it Dara c8egar a um resultado de 16 .its.
+
.*"LI/9
.I*%L'DE B%FMaErtoolsMaDD(otesM@515def.i(cB
.LI/9
+
+ FluCo da multiDlica-Ho
+
+ 1. " .i(Orio a ser multiDlicado , deslocado (o se(tido do carr:. /e for um, o (Tmero , adicio(ado ao resultado, se (Ho for
um, o (Tmero (Ho , adicio(ado.
+ $. " (Tmero .i(Orio , multiDlicado Dor $, rotacio(a(do uma Dosi-Ho K esAuerda, e Dree(c8e(do a Dosi-Ho EaJia com .
+ =. /e o .i(Orio com Aue serO multiDlicado (Ho for Jero, o ciclo de multiDlica-Ho , reDetido. /e for Jero, a multiDlica-Ho estO
termi(ada.
+
+ Registradores usados
+
.DEF rm1 = R + *Tmero .i(Orio a ser multiDlicado 0@ 6it2
.DEF rm8 = R1 + )rmaJ,m i(termediOrio
.DEF rm$ = R$ + *Tmero .i(Orio com Aue o Drimeiro serO multiDlicado 0@ 6it2
.DEF rel = R= + Resultado, L/6 016 6it2
.DEF re8 = R> + Resultado, M/6
.DEF rmD = R16 + Registrador multi DroD1sitos Dara carregame(to
+
.%/E5
."R5
+
r]mD /9)R9
+
/9)R9F
ldi rmD,C)) + eCemDlo .i(Orio 11.11
moE rm1,rmD + Dara o Drimeiro registrador
ldi rmD,C55 + eCamDlo .i(Orio 11.11
moE rm$,rmD + Dara o segu(do registrador
+
+ )Aui i(iciamos a multiDlica-Ho de um dos .i(Orios em rm1 e rm$, o resultado Eai Dara re8Frel 016 .its2
+
M'L9@F
+
+ ;era Ealores de i(Wcio
clr rm8 + Jera armaJ,m i(termediOrio
clr rel + Jera registradores de resultado
clr re8
+
+ )Aui i(iciamos o ciclo de multiDlica-Ho
+
M'L9@aF
+
+ Passo 1F Rotacio(a o .it mais .aiCo do (Tmero $ Dara a flag de carr: 0diEide Dor $, rotacio(a um Jero (o .it ?2
+
clc + Jera carr:
ror rm$ + .it Eai Dara o carr:, .it 1 a ? EHo uma Dosi-Ho Dara direita, carr: Eai Dara o .it ?
+
+ Passo $F DecisHo deDe(de(do se foi ou 1 Aue foi rotacio(ado Dara o carr:
+
.rcc M'L9@. + Dula Dor cima da adi-Ho, se o carr: for
+
+ Passo =F /oma 16 .its em rm8Frml ao resultado, com estouro do L/6 Dara o M/6
+
add rel,rm1 + soma o L/6 de rm1 ao resultado
adc re8,rm8 + soma carr: e M/6 de rm1
+
M'L9@.F
+
Avr-Asm-Tutorial 3' http://www.avr-asm-tutorial.net
+ Passo >F MultiDlicar rm8Frm 1 Dor $ 016 .its, desEio K esAuerda2
+
clc + Jera carr: 0clear carr: .it2
rol rm1 + rotacio(a o L/6 K esAuerda 0multiDlica Dor $2
rol rm8 + rotacio(a o carr: Dara o M/6 e o M/6 uma casa K esAuerda
+
+ Passo 5F %8eca se 8O ai(da (Tmeros 1 (o .i(Orio $, se sim, co(ti(ua multiDlica(do
+
tst rm$ + todos os .its Jero^
.r(e M'L9@a + se (Ho, EO Dara o looD
+
+ Fim da multiDlica-Ho, resultado em re8Frel
+
+ LooD sem fim
+
L""PF
r]mD looD
Rota"o binria
-ara entender a operao de multiplicao* +
necess/rio entender os comandos de rotao
)in/ria :1E e :1:( Fstas instrues
deslocam todos os )its de um registrador uma
posio N es,uerda ?:1EB ou N direita ?:1:B(
! posio "azia no registrador rece)e o
conte>do do carr; do registrador de status* e o
)it ,ue rola para 4ora do registrador "ai para o
carr;( Fsta operao + demonstrada usando
09!! como e9emplo de :1E e 09MM como
e9emplo de :1:(
6ultiplica"o no studio
! tela a)ai9o mostra o programa de multiplicao no simulador(
1 c=digo#o).eto 4oi a)erto* e o
cursor + colocado na primeira
instruo e9ecut/"el( 3$$
e9ecuta um passo(

Avr-Asm-Tutorial 3( http://www.avr-asm-tutorial.net
1s registradores :0 e :2 so
setados para 09!! e 09MM*
nossos )in/rios de teste* para
serem multiplicados(
:2 + rotacionado N
direita* para rolar o
)it menos
signi4icati"o para o
carr;* 09MM
?0$0$(0$0$B "ira
092! ?00$0($0$0B(

Com o carr; era $* o
conte>do dos
registradores :2%:$
+ somado ao par de
registradores :P%:R
?"azioB* resultando
em 0900!! nestes(

Avr-Asm-Tutorial 3) http://www.avr-asm-tutorial.net
!gora o par de
registradores :$%:0
+ rotacionado uma
posio N es,uerda
para multiplicar este
)in/rio por 2( ! partir
de 0900!!* a
multiplicao por 2
resulta 090$MP(
1 ciclo de
multiplicao +
repetido en,uanto
ha.a ao menos um
)in/rio $ no
registrador :2( 1s
passos seguintes
no so mostrados
a,ui(

Hsando a tecla 3M
no studio podemos
pular estes loops
at+ um ponto de
parada no 4im da
rotina de
multiplicao( 1
resultado no par de
registradores
:P%:R mostra o
resultado da
multiplicao de
09!! por 09MM%
09R8O2(

<o 4oi to complicado* )asta lem)rar na similaridade com as operaes decimais( ! multiplicao em
)in/rio + muito mais 4/cil do ,ue decimal(
0i2iso
0i2iso decimal
<o"amente comeamos com di"iso decimal* para compreender melhor a di"iso )in/ria( Vamos assumir
uma di"iso de M6O8 por $2( 5sto + 4eito assim%
M6O8 % $2 ] 0
##########################
# P f $200 ] P800
####
8O8
# O f $20 ] 8P0
###
R8
# R f $2 ] R6
##
2
:esultado% M6O8 % $2 ] POR :esto 2
Avr-Asm-Tutorial 3* http://www.avr-asm-tutorial.net
]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
0i2iso binria
Fm )in/rio* a multiplicao do segundo n>mero ?P f $200* etcB no + necess/ria* de"ido ao 4ato ,ue
temos apenas 0 e $ como d6gitos( 5n4elizmente* n>meros )in/rios t2m muito mais d6gitos do ,ue seu
e,ui"alente decimal* ento trans4erir a di"iso decimal em )in/ria + um pouco incon"eniente( !ssim* o
programa tra)alha de 4orma um pouco di4erente(
! di"iso de um n>mero )in/rio de $6 )its por um n>mero de 8 )its em assem)ler !V: est/ listado na
seo seguinte(
+ DiE@ diEide um (Tmero de 16 .its Dor um (Tmero de @ .its 09esteeF (Tmero de 16 .itsF C)))), (Tmero de @ .itsF C552
.*"LI/9
.I*%L'DE B%FMaErtoolsMaDD(otesM@515def.i(cB
.LI/9
+ Registradores
.DEF rd1l = R + L/6 do (Tmero de 16 .its a ser diEidido 0diEide(do2
.DEF rd18 = R1 + M/6 do (Tmero de 16 .its a ser diEidido 0diEide(do2
.DEF rd1u = R$ + registrador i(termediOrio
.DEF rd$ = R= + (Tmero de @ .its diEisor
.DEF rel = R> + L/6 do resultado
.DEF re8 = R5 + M/6 do resultado
.DEF rmD = R16+ registrador multiSDroD1sito Dara carregame(to
+
.%/E5
."R5
r]mD start
startF
+ %arregamos os (Tmeros do teste Dara os registradores aDroDriados
ldi rmD,C)) + C)))) , o diEide(do
moE rd18,rmD
moE rd1l,rmD
ldi rmD,C55 + C55 , o diEisor
moE rd$,rmD
+ DiEide rd18Frd1l Dor rd$
diE@F
clr rd1u + Jera registrador i(termediOrio
clr re8 + Jera resultado 0os registradores de resultado2
clr rel + tam.,m usados Dara co(tar at, 16 Dara
i(c rel + os Dassos da diEisHo, , setado em 1 (o i(Wcio2
+ )Aui o looD de diEisHo i(icia
diE@aF
clc + Jera carr:
rol rd1l + rotacio(a o Dr1Cimo .it suDerior do (Tmero
rol rd18 + Dara o registrador i(termediOrio 0multiDlica Dor $2
rol rd1u
.rcs diE@. + um foi rolado Dara a esAuerda, Dorta(to su.traia
cD rd1u,rd$ + Resultado da diEisHo 1 ou ^
.rcs diE@c + Dule so.re a su.tra-Ho, se for me(or
diE@.F
su. rd1u,rd$+ su.traia os (Tmeros Dara diEidir
sec + set carr:, o resultado , 1
r]mD diE@d + Dule Dara o desEio do .it de resultado
diE@cF
clc + Jere o carr:, o .it resultado ,
diE@dF
rol rel + rotacio(e o carr: Dara de(tro dos registradores de resultado
rol re8
.rcc diE@a + e(Aua(to Jero rotacio(ar Dara fora dos registradores de resultadoF EO Dara o looD de diEisHo
+ Fim da diEisHo
stoDF
r]mD stoD + looD sem fim
Passos do pro!rama durante a di2iso
Jurante a e9ecuo do programa os seguintes passos so seguidos
Je4inio e pr+#a.uste dos registradores com os )in/rios de teste*
pr+#a.uste do registrador intermedi/rio e o par de registradores de resultado ?os registradores de
resultado so pr+#a.ustados para 09000$I !p=s $6 rotaes* a rolagem do $ para 4ora interrompe as
di"ises(B*
o )in/rio de $6 )its em rd$h%rd$l + rotacionado para o registrador intermedi/rio rd$u ?multiplicao
por 2B* se um $ 4or rotacionado para 4ora de rd$u* o programa des"ia para o passo de su)trao no
passo P imediatamente(
1 conte>do do registrador intermedi/rio + comparado com o )in/rio de 8 )its em rd2( 7e rd2 4or
menor* ele + su)tra6do do registrador intermedi/rio e o carr; + setado $* se rd2 4or maior* a
su)trao + pulada e um zero + setado na 4lag de carr;(
1 conte>do da 4lag de carr; + rotacionada no registrador de resultado reh%rel da direita(
Avr-Asm-Tutorial %+ http://www.avr-asm-tutorial.net
7e um zero 4oi rotacionado para 4ora do registrador de resulltado* temos ,ue repetir o loop de
di"iso( 7e 4oi um $* a di"iso est/ completa(
7e "oc2 no entende rotao ainda* "oc2 encontrar/ esta operao discutida na seo de multiplicao(
0i2iso no simulador
! tela a seguir demonstra os passos do
programa no studio( -ara 4azer isto* "oc2
tem ,ue compilar o c=digo 4onte e a)rir o
ar,ui"o o).eto resultante no studio(
1 c=digo o).eto 4oi iniciado* o cursor est/
na primeira instruo e9ecut/"el( 3$$
e9ecuta passo a passo(
1 teste* )in/rios 0Z!!!! e
09MM* sero di"ididos* e so
escritos nos registradores
:$%:0 e :R(

1 registrador intermedi/rio :2
e o par de registradores do
resultado so setados para
seus "alores prede4inidos(
Avr-Asm-Tutorial %1 http://www.avr-asm-tutorial.net
:$%:0 4oi rotacionado N
es,uerda para :2* a partir
do "alor 09!!!! chegamos
ao "alor do)rado 090$MMMP(
<o hou"e estouro da
rotao para o carr; e 090$
em :2 era menor ,ue 09MM
em :R* ento a su)trao 4oi
pulada( Hm zero no carr; 4oi
rotacionado para o
registrador de resultado
:M%:P( 1 conte>do anterior
destes registradores* um )it
na posio 0 4oi rotacionado
para a posio $ ?conte>do
agora% 090002B( Como um
zero 4oi rotacionado para
4ora do registrador de
resultados* o pr=9imo passo
a ser e9ecutado + um des"io
para o in6cio do loop de
di"iso e o loop + repetido(
!p=s e9ecutar o loop $6
"ezes* chegamos ao
ponto de parada no 4inal
da rotina de di"iso( 1
registrador de resultado
:M%:P tem 090202* o
resultado da di"iso( 1s
registradores :2%:$%:0
esto "azios* portanto
no temos resto( 7e
hou"esse resto*
poder6amos us/#lo para
decidir um incremento
do resultado*
arredondando#o para
cima( Fste passo no 4oi
codi4icado a,ui(

Avr-Asm-Tutorial %2 http://www.avr-asm-tutorial.net
Toda a di"iso precisou de 60
microssegundos do tempo do processador
?a)ra o processor "ie' do menu studioB(
Hm tempo )astante grande para uma
di"iso(


Con2erso numrica
:otinas de con"erso num+ricas no so inclu6das a,ui( -or 4a"or "isite o 'e)site* se precisar do c=digo
4onte ou uma melhor compreenso(
1ra";es decimais
-rimeiro% <o use pontos 4lutuantes* a menos ,ue "oc2 realmente precise deles( -ontos 4lutuantes so
"orazes consumidores de recursos em um !V:* e precisam de muito tempo de e9ecuo( Voc2 estar/
neste dilema* se "oc2 pensa ,ue assem)ler + muito complicado* e pre4erir Uasic ou outras linguagens
como C e -ascal(
8as no* se "oc2 usa assem)ler( Ehe ser/ demonstrado a,ui* como "oc2 pode realizar uma multiplicao
de um n>mero real em menos de 60 microssegundos* em casos especiais at+ com $8 microssegundos*
usando uma 4re,S2ncia de clock de P 8Qz( 7em ,uais,uer e9tenses para ponto 4lutuante ou outros
tru,ues caros para pessoas preguiosas demais para usar o seu c+re)ro(
Como 4azer isto0 Je "olta N ra6zes de matem/ticaI ! maioria das tare4as com reais usando ponto
4lutuante pode ser 4eita usando n>meros inteiros( 5nteiros so 4/ceis de programar em assem)ler* e so
"elozes( 1 ponto decimal est/ somente no c+re)ro do programador* e + adicionado depois no 4lu9o digital(
<ingu+m se d/ conta disso* este + o tru,ue(
Con2ers;es lineares
Como um e9emplo* a tare4a seguinte% um con"ersor !J de 8 )its mede a entrada de um sinal de entrada
"ariando de 0*00 a 2*MM Volts* e retorna como resultado um )in/rio entre g00 e g33( 1 resultado + uma
"oltagem* para ser mostrada em um displa; ECJ( F9emplo to simples ,uanto 4/cil% 1 )in/rio +
con"ertido em uma string !7C55 decimal entre 000 e 2MM* e logo depois do primeiro d6gito* o ponto
decimal tem ,ue ser inserido( -rontoI
1 mundo eletr\nico + mais complicado( F( g(* o con"ersor !J retorna um he9a de 8 )its para tenses de
entrada entre 0*00 e M*00 Volt( !gora complicou e no sa)emos como 4azer( -ara mostrar o "alor correto
no ECJ* ter6amos ,ue multiplicar o )in/rio por M00&2MM* ,ue + $*C608( Fste + um n>mero complicado* pois
+ ,uase 2* mas apenas ,uase( F no ,ueremos este tipo de impreciso de 2D* ./ ,ue temos um
con"ersor !J com cerca de 0*2MD de preciso(
-ara resol"er isso* multiplicamos a entrada por 200&2MMf2M6 ou M0$*C6 e di"idimos o resultado por 2M6(
-or,ue primeiro multiplicar por 2M6 e depois di"idir por 2M60 K apenas para maior preciso( 7e
multiplicarmos a entrada por M02 ao in"+s de M0$*C6* o erro + da ordem de 0*008D( 5sto est/ )om para
nosso con"ersor !J* podemos con"i"er com isso( F di"idir por 2M6 + uma tare4a 4/cil* pois + uma pot2ncia
de 2 )em conhecida( Ji"idir n>meros ,ue so pot2ncia de 2* o !V: se sente muito con4ort/"el e realiza
de 4orma muito r/pida( -ara di"idir por 2M6* o !V: + ainda mais r/pido* pois )asta pularmos o >ltimo );te
do n>mero )in/rio( <o precisamos nem mesmo deslocar e rotacionarI
<a multiplicao de um )in/rio de 8 )its com o )in/rio de C )its M02 ?he9 $63B* podemos o)ter um "alor
maior do ,ue $6 )its( -ortanto temos ,ue reser"ar 2P )its ou R registradores para o resultado( Jurante a
multiplicao* a constante M02 tem ,ue ser deslocada N es,uerda ?multiplicao por 2B para somar estes
n>meros ao resultado cada "ez ,ue um $ rola para 4ora do n>mero de entrada( Como podem ser
necess/rios 8 des"ios N es,uerda* precisamos de mais tr2s );tes para esta constante( Fnto escolhemos
a seguinte com)inao dos registradores para multiplicao%
N1mero ,alor )exemplo+ Registrador
Valor de entrada 2MM :$
8ultiplicador M02 :P % :R % :2
:esultado $28*0$0 :O % :6 % :M
Avr-Asm-Tutorial %3 http://www.avr-asm-tutorial.net
!p=s colocar o "alor M02 ?00(0$(36B em :P%:R%:2 e zerar os registradores de resultado :O%:6%:M* a
multiplicao segue da seguinte 4orma%
$( Testar* se o n>mero da entrada ./ + zero( 7e 4or* terminamos(
2( 7e no* um )it do n>mero de entrada + deslocado para 4ora do registrador para a direita* no carr;*
en,uanto um )it zero + colocado no )it O( Fsta instruo + chamada des"io N direta l=gico ou E7:
?Logical /8ift Rig8tB
R( 7e o )it no carr; 4or um* somamos o multiplicador ?durante o passo $ o "alor M02* no passo 2 +
$00P e assim por dianteB ao resultado( Jurante a adio* tomamos o cuidado com ,ual,uer carr;
?somando :2 a :M por !JJ* somando :R a :6 e :P a :O com instruo !JCIB( 7e o )it no carr;
era zero* no adicionamos o multiplicador ao resultado e pulamos para o pr=9imo passo(
P( !gora o multiplicador 4oi multiplicado por 2* pois o pr=9imo )it deslocado para 4ora do n>mero de
entrada "ale o do)ro( Fnto deslocamos :2 para a es,uerda ?inserindo um zero no )it 0B usando
E7E( 1 )it O + deslocado para o carr;( Fnto rotacionamos este carr; para :R* rotacionando seu
conte>do um )it N es,uerda* e o )it O para o carr;( 1 mesmo com :P(
M( !gora terminamos com um d6gito do n>mero de entrada* e prosseguimos no passo $ no"amente(

1 resultado da multiplicao por M02 agora est/ nos registradores de resultado :O%:6%:M( 7e
simplesmente ignorarmos o registrador :M ?di"iso por 2M6B* temos o nosso resultado dese.ado( -ara
aumentar a preciso* podemos usar o )it O em :M para arredondar o resultado( !gora temos ,ue
con"erter o resultado de sua 4orma )in/ria para o !7C55 decimal ?"e.a a ta)ela de con"erso para
decimal#!7C55 no 'e)siteB( 7e colocarmos um ponto decimal no local correto na string !7C55* nossa string
de tenso est/ pronta para ser mostrada(
1 programa todo* desde o n>mero de entrada at+ a !7C55 resultado* re,uer entre OC e 228 ciclos de
rel=gio* dependendo do n>mero de entrada( !,ueles ,ue ,uiserem "encer com rotinas de ponto 4lutuante
de uma linguagem de programao mais so4isticada ,ue assem)ler* sinta#se N "ontade para me escre"er
o seu tempo de con"erso ?e a utilizao de mem=ria 4lash e de programaB(
:&emplo (B Con2ersor A0 CDbit para sa%da decimal com ponto fi&o
+ Demo(tra co(EersHo de Do(to flutua(te em )ssem.ler, _ $= NNN.aErSasmStutorial.(et
+
+ ) tarefaF #ocL lL um resultado de @ .its de um co(Eersor a(al1gicoSdigital, o (Tmero estO (a faiCa de 8eC a FF.
+ #ocL Drecisa co(EertLSlo em um (Tmero com Do(to flutua(te (a faiCa de , a 5, #olts.
+ " esAuema do DrogramaF
+ 1. MultiDlica-Ho Dor 5$ 08eC 1F62. Este Dasso multiDllica Dor 5, $56 e diEide Dor $55 em um Dasso`
+ $. )rredo(dar e cortar o Tltmo .:te do resultado. Este Dasso diEide Dor $56 ao ig(orar o Tltimo .:te do resultado.
+ )(tes de faJer isso, o .it ? , usado Dara arredo(dar o resultado.
+ =. %o(Eerter a DalaEra resulta(te Dara )/%II e setar o si(al decimal correto. ) DalaEra resulta(te Aue Earia de a 5
+ , mostrada em caracteres )/%II como . a 5..
+ "s registradores usadosF
+ )s roti(as usam os registradores R@..R1 sem salEOSlos a(tes. 9am.,m , (ecessOrio um registrador multiDroD1sito rmD,
+ localiJado (a metade suDerior dos registradores. )ssegureSse Aue estes registradores (Ho co(flitem com registradores
+ em uso (o resta(te do Drograma.
+ " (Tmero de @ .its , esDerado (o registrador R1. ) multiDlica-Ho usa R>FR=FR$ Dara guardar o multiDlicador 5$
+ 0, deslocado K esAuerda at, oito EeJes dura(te a multiDlica-Ho2. " resultado da multiDlica-Ho , calculado (os
+ registradores R?FR6FR5. " resultado da diEisHo Dor $56 , feita ig(ora(do R5 (o resultado, usa(do some(te R?FR6.
+ R?FR6 , arredo(dado, deDe(e(do do .it mais alto de R5, e o resultado , coDiado Dara R$FR1.
+ ) co(EersHo Dara )/%IISstri(g usa a e(trada em R$FR1, o Dar de registradores R>FR= como diEisor Dara co(EesHo, e
+ coloca o resultado )/%II em R5FR6FR?FR@ 0R6 , o caractere decimal2.
+ "utras co(Ee(-[esF
+ ) co(EersHo usa su.toti(as e a Dil8a. ) Dil8a deEe estar fu(cio(a(do Dara uso de trLs (WEeis 0seis .:tes de /R)M2.
+ 9emos de co(EersHoF
+ ) roti(a i(teira reAuer $$@ ciclos de rel1gico (o mOCimo 0co(Eerte(do RFF2, e ?! (o mW(imo 0co(Eerte(do R2.
+ ) > M8J os temDos sHo 56,?5 microssegu(dos e 1?,?5 microssegu(dos, resDectiEame(te.
+ Defi(i-[esF
+ Registradores
.DEF rmD = R16 + usado como registrador multiDroD1sito
+ tiDo de )#RF 9estado em )9!/@515, (ecessOrio Dara Dil8a, as roti(as deEem fu(cio(ar com outros tiDos )9!/S.
.*"LI/9
.I*%L'DE B@515def.i(cB
.LI/9
+ I(Wcio do Drograma de teste
+ EscreEe um (Tmero em R1 e i(icia a co(EersHo da roti(a, Dara DroD1sitos de teste some(te
.%/E5
."R5 R
r]mD mai(
mai(F
ldi rmD,4I540R)ME*D2 + I(icia a Dil8a
out /P4,rmD
ldi rmD,L"70R)ME*D2
out /PL,rmD
ldi rmD,RFF + %o(Eerte RFF
moE R1,rmD
rcall fDco(E@ + c8ama a roti(a de co(EersHo
(oae(dF + looD i(fi(ito, Aua(do termi(ar
r]mD (oae(d
+ Roti(a de co(EersHo, c8ama difere(tes Dassos da co(EersHo
Avr-Asm-Tutorial %% http://www.avr-asm-tutorial.net
fDco(E@F
rcall fDco(E@m + multiDlica Dot 5$
rcall fDco(E@r + arredo(da e diEide Dor $56
rcall fDco(E@a + co(Eerte Dara stri(g )/%II
ldi rmD,\.\ + seta caractere decimal
moE R6,rmD
ret + tudo Dro(to
+ /u.roti(a de multiDlica-Ho Dor 5$
fDco(E@mF
clr R> + seta o multiDlicador como 5$
ldi rmD,R1
moE R=,rmD
ldi rmD,RF6
moE R$,rmD
clr R? + Jera o resultado
clr R6
clr R5
fDco(E@m1F
or R1,R1 + c8eca se o (Tmero , Jero
.r(e fDco(E@m$ + ai(da tem um, co(ti(uamos com a EersHo
ret + Dro(to, retor(e
fDco(E@m$F
lsr R1 + desloca (Tmero K direita 0diEide Dor $2
.rcc fDco(E@m= + se o (Tmero mais .aiCo era , Dula adi-Ho
add R5,R$ + some o (Tmero em R6FR5FR>FR= ao resultado
adc R6,R=
adc R?,R>
fDco(E@m=F
lsl R$ + multiDlica R>FR=FR$ Dor $
rol R=
rol R>
r]mD fDco(E@m1 + reDete Dara o Dr1Cimo .it
+ )rredo(da o Ealor em R?FR6 com o Ealor do .it ? de R5
fDco(E@rF
clr rmD + coloca Jero em rmD
lsl R5 + rotacio(a .it ? Dara o carr:
adc R6,rmD + soma L/6 com carr:
adc R?,rmD + soma M/6 com carr:
moE R$,R? + coDia o Ealor Dara R$FR1 0diEide Dor $562
moE R1,R6
ret
+ %o(Eerte a DalaEra em R$FR1 Dara uma stri(g )/%II em R5FR6FR?FR@
fDco(E@aF
clr R> + /eta o Ealor do diEisor decimal Dara 1
ldi rmD,1
moE R=,rmD
rcall fDco(E@d + o.t,m o dWgito )/%II Dor su.tra-[es reDetidas
moE R5,rmD + seta caractere como se(do da ce(te(a
ldi rmD,1 + /eta o Ealor do diEisor decimal Dara 1
moE R=,rmD
rcall fDco(E@d + o.t,m o Dr1Cimo dWgito )/%II
moE R?,rmD + seta caractere como se(do da deJe(a
ldi rmD,\\ + co(Eerte o resto Dara dWgito )/%II
add rmD,R1
moE R@,rmD + seta caractere como se(do da u(idade
ret
+ %o(Eerte DalaEra .i(Oria em R$FR1 Dara dWgito decimal su.trai(do o Ealor do diEisor decimal em R>FR= 01,12
fDco(E@dF
ldi rmD,\\ + i(icia com o Ealor decimal \\
fDco(E@d1F
cD R1,R= + %omDara Dala.ra com o Ealor do diEisor decimal
cDc R$,R>
.rcc fDco(E@d$ + Jera carr:, su.trai Ealor do diEisor
ret + su.tra-Ho feita
fDco(E@d$F
su. R1,R= + su.trai Ealor do diEisor
s.c R$,R>
i(c rmD + soma um
r]mD fDco(E@d1 + de (oEo
+ Fim da roti(a de co(EersHo

:&emplo ,B Con2ersor A0 de (+ bits com sa%da decimal fi&a
Fste e9emplo + um pouco mais complicado( Ve.a o 'e)site se precisar dele(
Avr-Asm-Tutorial %& http://www.avr-asm-tutorial.net
Ane&o
#nstru";es ordenadas por fun"o
-ara as a)re"iaes usadas* "e.a a lista de a)re"iaes(
2uno Su- 3uno Comando 2lags Cl4
:egistrador
0 CE: r$ _ < V $
2MM 7F: rh $
Constante EJ5 rh*c2MM $
C=pia
:egistrador ]h :egistrador 81V r$*r2 $
7:!8 ]h :egistrador* direto EJ7 r$*c6MMRM 2
7:!8 ]h :egistrador EJ r$*rp 2
7:!8 ]h :egistrador e 5<C EJ r$*rpT 2
JFC* 7:!8 ]h :egistrador EJ r$*#rp 2
7:!8* deslocado ]h :egistrador EJJ r$*r;Tk6R 2
-orta ]h :egistrador 5< r$*p$ $
-ilha ]h :egistrador -1- r$ 2
-rogram storage _ ]h :0 E-8 R
:egistrador ]h 7:!8* direto 7T7 c6MMRM*r$ 2
:egistrador ]h 7:!8 7T rp*r$ 2
:egistrador ]h 7:!8 e 5<C 7T rpT*r$ 2
JFC* :egistrador ]h 7:!8 7T #rp*r$ 2
:egistrador ]h 7:!8* deslocado 7TJ r;Tk6R*r$ 2
:egistrador ]h -orta 1HT p$*r$ $
:egistrador ]h -ilha -H7Q r$ 2
7oma
8 Uit* T$ 5<C r$ _ < V $
8 Uit !JJ r$*r2 _ C < V Q $
8 Uit T carr; !JC r$*r2 _ C < V Q $
$6 Uit* constante !J5X rd*k6R _ C < V 7 2
7u)trao
8 Uit* #$ JFC r$ _ < V $
8 Uit 7HU r$*r2 _ C < V Q $
8 Uit* constante 7HU5 rh*c2MM _ C < V Q $
8 Uit # carr; 7UC r$*r2 _ C < V Q $
8 Uit # carr;* constante 7UC5 rh*c2MM _ C < V Q $
$6 Uit 7U5X rd*k6R _ C < V 7 2
Jes"io
E=gico* es,uerda E7E r$ _ C < V $
E=gico* direita E7: r$ _ C < V $
:otao* es,uerda so)re carr; :1E r$ _ C < V $
:otao* direita so)re carr; :1: r$ _ C < V $
!ritm+tica* direita !7: r$ _ C < V $
Troca de ni))les 7X!- r$ $
Uin/rios
F ?!ndB !<J r$*r2 _ < V $
F* constante !<J5 rh*c2MM _ < V $
1u ?1rB 1: r$*r2 _ < V $
1u* constante 1:5 rh*c2MM _ < V $
1u#F9clusi"o ?Z1:B F1: r$*r2 _ < V $
Complemento de Hm C18 r$ _ C < V $
Complemento de Jois <FG r$ _ C < V Q $
Avr-Asm-Tutorial %' http://www.avr-asm-tutorial.net
2uno Su- 3uno Comando 2lags Cl4
Troca de
Uits
:egistrador* seta 7U: rh*c2MM _ < V $
:egistrador* zera CU: rh*2MM _ < V $
:egistrador* copia para 3lag T U7T r$*)O T $
:egistrador* copia da 3lag T UEJ r$*)O $
-orta* seta 7U5 pl*)O 2
-orta* zera CU5 pl*)O 2
7eta )it de
7tatus
3lag de _ero 7F_ _ $
3lag de carr; 7FC C $
3lag de <egati"o 7F< < $
3lag de carr; de Complemento de
Jois
7FV V $
3lag de meio carr; 7FQ Q $
3lag de 7inal 7F7 7 $
3lag de Trans4er2ncia 7FT T $
3lag de Qa)ilitao de 5nterrupo 7F5 5 $
zera )it de
status
3lag de _ero CE_ _ $
3lag de carr; CEC C $
3lag de <egati"o CE< < $
3lag de carr; de Complemento de
Jois
CEV V $
3lag de meio carr; CEQ Q $
3lag de 7inal CE7 7 $
3lag de Trans4er2ncia CET T $
3lag de Jesa)ilitao de 5nterrupo CE5 5 $
Compara
:egistrador* :egistrador C- r$*r2 _ C < V Q $
:egistrador* :egistrador T carr; C-C r$*r2 _ C < V Q $
:egistrador* constante C-5 rh*c2MM _ C < V Q $
:egistrador* i0 T7T r$ _ < V $
7alto
5mediato
:elati"o :J8- cP0C6 2
5ndireto* Fndereo em _ 5J8- 2
7u)rotina* relati"o :C!EE cP0C6 R
7u)rotina* Fndereo em _ 5C!EE R
:etorna da 7u)rotina :FT P
:etorna da 5nterrupo :FT5 5 P
Avr-Asm-Tutorial %( http://www.avr-asm-tutorial.net
2uno Su- 3uno Comando 2lags Cl4
7alto
Condicional
Uit de status setado U:U7 )O*c$2O $&2
Uit de status zera U:UC )O*c$2O $&2
7alta se igual U:FW c$2O $&2
7alta se di4erente U:<F c$2O $&2
7alta se carr; setado U:C7 c$2O $&2
7alta se carr; zero U:CC c$2O $&2
7alta se igual ou maior U:7Q c$2O $&2
7alta se menor U:E1 c$2O $&2
7alta se negati"o U:85 c$2O $&2
7alta se positi"o U:-E c$2O $&2
7alta se igual ou maior ?com sinalB U:GF c$2O $&2
7alta se menor ,ue zero ?com sinalB U:ET c$2O $&2
7alta se meio carr; setado U:Q7 c$2O $&2
7alta se meio carr; zero U:QC c$2O $&2
7alta se 3lag T setada U:T7 c$2O $&2
7alta se 3lag T zera U:TC c$2O $&2
7alta se 4lag de complemento de 2
setado
U:V7 c$2O $&2
7alta se 4lag de complemento de 2
zero
U:VC c$2O $&2
7alta se interrupo ha)ilitada U:5F c$2O $&2
7alta se interrupo desa)ilitada U:5J c$2O $&2
7alto
condcionado
Uit do registrador]0 7U:C r$*)O $&2&R
Uit do registrador]$ 7U:7 r$*)O $&2&R
Uit da porta]0 7U5C pl*)O $&2&R
Uit da porta]$ 7U57 pl*)O $&2&R
Compara* salta se 4or igual C-7F r$*r2 $&2&R
1utros
7em 1perao <1- $
:epouso 7EFF- $
Xatchdog :eset XJ: $
Eista de 0ireti2as e #nstru";es em ordem alfabtica
0ireti2as de Assembler em ordem alfabtica
(ireti"a 555 signi3ica 555
.%/E5 %omDilar Dara o segme(to de c1digo
.D6 I(serir .:tes de dados
.DEF Defi(ir o (ome de um registrador
.D7 I(sirir DalaEras de dados
.E*DM)%R" ) macro estO comDleta, Darar a graEa-Ho
.E/E5 %omDilar Dara o segme(to da EEPR"M
.E&' Defi(ir uma co(sta(te Dor (ome e setar o seu Ealor
.I*%L'DE I(serir o co(teTdo de um arAuiEo (este local como se fosse Darte deste arAuiEo
.M)%R" I(iciar a graEa-Ho das segui(tes i(stru-[es como defi(i-[es de macro
."R5 /etar o e(dere-o de saWda do assem.ler Dara o segui(te (Tmero
#nstru";es em ordem alfabtica
6nstruo 555 3a7 555
)D% r1,r$ /oma r$ com carr: com r1, e armaJe(a o resultado em r1
)DD r1,r$ /oma r$ com r1 e armaJe(a o resultado em r1
)DI7 rd,k6= /oma a DalaEra co(sta(te imediata k6= ao registrador duDlo rdP1Frd 0rd = R$>, R$6, R$@, R=2
Avr-Asm-Tutorial %) http://www.avr-asm-tutorial.net
)*D r1,r$ FaJ oDera-Ho a(d de r1 com o Ealor em r$ e armaJe(a o resultado em r1
)*DI r8,c$55 FaJ oDera-Ho a(d com o registrador suDerior r8 com a co(sta(te c$55 e armaJe(a o resultado em r8
)/R r1 DesEio K direita aritm,tico do registrador r1
6LD r1,.? %oDia a flag 9 do registrador de status Dara o .it .? do registrador r1
6R%% c1$? DesEia ou Eolta Dara i(stru-[es c1$? se a flag de carr: for
6R%/ c1$? DesEia ou Eolta Dara i(stru-[es c1$? se a flag de carr: for 1
6RE& c1$? DesEia ou Eolta Dara i(stru-[es c1$? se a flag de Jero for 1
6R5E c1$? DesEia ou Eolta Dara i(stru-[es c1$? se a flag de carr: for
6R4% c1$? DesEia ou Eolta Dara i(stru-[es c1$? se a flag de meioScarr: for
6R4/ c1$? DesEia ou Eolta Dara i(stru-[es c1$? se a flag de meioScarr: for 1
6RID c1$? DesEia ou Eolta Dara i(stru-[es c1$? se a flag de i(terruD-Ho for
6RIE c1$? DesEia ou Eolta Dara i(stru-[es c1$? se a flag de i(terruD-Ho for 1
6RL" c1$? DesEia ou Eolta Dara i(stru-[es c1$? se a flag de carr: for 1
6RL9 c1$? DesEia ou Eolta Dara i(stru-[es c1$? se as flags de (egatiEo e estouro forem 1
6RMI c1$? DesEia ou Eolta Dara i(stru-[es c1$? se a flag de (egatiEo for 1
6R*E c1$? DesEia ou Eolta Dara i(stru-[es c1$? se a flag de Jero for 1
6RPL c1$? DesEia ou Eolta Dara i(stru-[es c1$? se a flag de (egatiEo for
6R/4 c1$? DesEia ou Eolta Dara i(stru-[es c1$? se a flag de carr: for
6R9% c1$? DesEia ou Eolta Dara i(stru-[es c1$? se a flag de tra(sferL(cia for
6R9/ c1$? DesEia ou Eolta Dara i(stru-[es c1$? se a flag de tra(sferL(cia for 1
6R#% c1$? DesEia ou Eolta Dara i(stru-[es c1$? se a flag de estouro for
6R#/ c1$? DesEia ou Eolta Dara i(stru-[es c1$? se a flag de estouro for 1
6/9 r1,.? %oDia o .it ? (o registrador r1 Dara a flag de tra(sferL(cia (o registrador de status
%6I Dl,.? ;era .it .? (a Dorta mais .aiCa Dl
%6R r8,k$55 ;era todos os .its (o registrador suDerior r8, Aue estHo setados (a co(sta(te k$55 0mOscara2
%L% ;era o .it de carr:
%L4 ;era o .it de meioScarr:
%LI ;era o .it de i(terruD-Ho, desa.ilita a eCecu-Ho de i(terruD-[es
%L* ;era o .it de (egatiEo (o registrador de status
%LR r1 ;era o registrador r1
%L/ ;era a flag de si(al (o registrador de status
%L9 ;era a flag de tra(sferL(cia (o registrador de status
%L# ;era a flag de oEerfloN do registrador de status
%L; ;era a flag de Jero do registrador de status
%"M r1 %omDleme(ta registrador r1 0comDleme(to de um2
%P r1,r$ %omDara registrador r1 com registrador r$
%P% r1,r$ %omDara registrador r1 com registrador r$ e flag de carr:
%PI r8,c$55 %omDara o registrador suDerior r8 com a co(sta(te imediata c$55
%P/E r1,r$ %omDara r1 com r$ e Dula so.re a Dr1Cima i(stru-Ho se for igual
DE% r1 Decreme(ta o registrador r1 Dor 1
E"R r1,r$ "uSeCclusiEe dos .its do registrador r1 com registrador r$ e armaJe(a resultado em r1
I%)LL %8ama a su.roti(a (o e(dere-o (o Dar de registradores ; 0;4F;L, R=1FR=2
IXMP I* r1,D1 /alta Dara o e(dere-o (o Dar de registradores ; 0;4F;L, R=1FR=2
I*% r1 I(creme(ta o registrador r1 Dor 1
LD r1,0rD,rDP,SrD2 %arrega o registrador r1 com o co(teTdo localiJado (o e(dere-o aDo(tado Delo Dar de registradores rD
0Q, 3 ou ;2 0rDP i(creme(ta o Dar de registradores deDois da carga, SrD decreme(ta o Dar a(tes da
carga2
LDD r1,r:Pk6= %arrega o registrador r1 com o co(teTdo localiJado (o e(dere-o aDo(tado Delo Dar de registradores r:
03 ou ;2, deslocado Dela co(sta(te k6=
LDI r8,c$55 %arrega o registrador suDerior r8 com a co(sta(te c$55
LD/ r1,c655=5 %arrega o registrador r1 com o co(teTdo do e(dere-o c655=5
LPM
LPM r1
LPM r1,;P
LPM r1,S;
%arrega o registrador R com o co(teTdo da memor: flas8 localiJado (o e(dere-o aDo(tado Delo Dar
de registradores ; 0;4F;L, R=1FR=2, diEidido Dor $, .it em ; aDo(ta Dara o .:te i(ferior 02 ou
suDerior 012 (o flas8 0%arrega registrador r1, ;P i(creme(ta ; deDois da carga, S; decreme(ta ; a(tes
da carga2.
L/L r1 DesEio K esAuerda l1gico do registrador r1
L/R r1 DesEio K direita l1gico do registrador r1
Avr-Asm-Tutorial %* http://www.avr-asm-tutorial.net
M"# r1,r$ MoEe registrador r$ Dara o registrador r1
*E5 r1 /u.trai registrador r1 de ;ero
*"P /em oDera-Ho
"R r1,r$ FaJ oDera-Ho "R do registrador r1 com r$ e armaJe(a o resultado em r1
"RI r8,c$55 FaJ oDera-Ho "R do registrador suDerior r1 com a co(sta(te c$55
"'9 D1,r1 %oDia registrador r1 Dara Dorta de EZ/ D1
P"P r1 I(creme(ta o Do(teiro de Dil8a e retira o Tltimo .:te da Dil8a e o coloca (o registrador r1
P'/4 r1 %oloca o co(teTdo do registrador r1 (a Dil8a e decreme(ta o Do(teiro de Dil8a
R%)LL c>!6 %oloca o co(tador de Drograma (a Dil8a e adicio(a a co(sta(te com si(al c>!6 ao co(tador de
Drograma 0c8amada relatiEa2
RE9 RecuDera o co(tador de Drograma da Dil8a 0retor(a ao e(dere-o de c8amada2
RE9I 4a.ilita i(terruD-[es e recuDera o co(tador de Drograma da Dil8a 0retor(a de i(terruD-Ho2
RXMP c>!6 /alto relatiEo, soma co(sta(te com si(al c>!6 ao e(dere-o do Drograma
R"L r1 Rotacio(a registrador r1 K esAuerda, coDia a flag de carr: Dara o .it
R"R r1 Rotacio(a o registrador r1 K direita, coDia a flag de carr: Dara o .it ?
/6% r1,r$ /u.trai r$ e a flag de carr: do registrador r1 e armaJe(a o resultado em r1
/6%I r8,c$55 /u.trai co(sta(te c$55 e carr: do registrador suDerior r8 e armaJe(a o resultado em r8
/6I Dl,.? /eta o .it .? (a Dorta .aiCa Dl
/6I% Dl,.? /e o .it .? (a Dorta .aiCa Dl for Jero, Dula a Dr1Cima i(stru-Ho
/6I/ Dl,.? /e o .it .? (a Dorta .aiCa Dl for um, Dula a Dr1Cima i(stru-Ho
/6I7 rd,k6= /u.trai a co(sta(te k6= do Dar de registradores rd 0rdP1Frd, rd = R$>, R$6, R$@, R=2
/6R r8,c$55 /eta os .its (o registrador suDerior r8, Aue sHo 1 da co(sta(te c$55
/6R% r1,.? /e o .it .? do registrador r1 for Jero, Dula a Dr1Cima i(stru-Ho
/6R/ r1,.? /e o .it .? (o registrador r1 for um, Dula a Dr1Cima i(stru-Ho
/E% /eta flag de carr: (o registrador de status
/E4 /eta flag de meio carr: (o registrador de status
/EI /eta flag de i(terruD-Ho (o registrador de status, 8a.ilita a eCecu-Ho de i(terruD-Ho
/E* /eta flag de (egatiEo (o registrador de status
/ER r8 /eta todos os .its (o registrador suDerior r8
/E/ /eta flag de si(al (o registrador de status
/E9 /eta flag de tra(sferL(cia (o registrador de status
/E# /eta flag de estouro 0oEerfloN2 (o registrador de status
/E; /eta flag de Jero (o registrador de status
/LEEP %oloca o co(trolador (o modo de reDouso selecio(ado
/9 0rDZrDPZSrD2,r1 )rmaJe(a o co(teTdo do registrador r1 (a localiJa-Ho da mem1ria i(dicada Delo Dar de registradores
rD 0rD = Q, 3, ;+ rDPF i(creme(ta o Dar de registradores deDois do armaJe(ame(to+ SrDF decreme(ta o
Dar de registradores a(tes do armaJe(ame(to2
/9D r:Pk6=,r1 )rmaJe(a o co(teTdo do registrador r1 (a localiJa-Ho aDo(tada Delo Dar de registradores r: 03 ou J2,
deslocado Dela co(sta(te k6=.
/9/ c655=5,r1 )rmaJe(a o co(teTdo do registrador r1 (a localiJa-Ho c655=5
/'6 r1,r$ /u.trai o registrador r$ do registrador r1 e escreEe o resultado em r1
/'6I r8,c$55 /u.trai a co(sta(te c$55 do registrador suDerior r8
/7)P r1 9roca os (i..les suDerior com o i(ferior (o registrador r1
9/9 r1 %omDara o registrador r1 com ;ero
7DR 7atc8dog reset
0etal4es das Portas
Fsta ta)ela cont+m as portas importantes nos !V: tipo !TC072R$R* 2R2R e 8M$M( -ortas ou pares de
registradores acess6"eis no so mostradas em detalhes( <o h/ garantias da e9atido destes dados*
con4ira os data sheets originaisI
Avr-Asm-Tutorial &+ http://www.avr-asm-tutorial.net
Re!istrador de $tatus? 1la!s do Acumulador
Porta 2uno
Endereo da
porta
Endereo da
R89
7:FG
!cumulador do registrador
de status
09R3 09M3
: . ' / $ # % ;
5 T Q 7 V < _ C
Bit Nome Signi3icado 6ndica Comando
O 5
3lag de 5nterrupo
Glo)al
0% 5nterrupes desa)ilitadas CE5
$% 5nterrupes ha)ilitadas 7F5
6 T !rmaz+m de )its
0% 1 )it armazenado + 0 CET
$% 1 )it armazenado + $ 7FT
M Q 3lag de 8eio#Carr;
0% <o ocorreu meio#carr; CEQ
$% 1correu meio#carr; 7FQ
P 7 3lag de 7inal
0% 7inal positi"o CE7
$% 7inal negati"o 7F7
R V
3lag de complemento de
dois
0% <o ocorreu transporte ?carr;B CEV
$% 1correu transporte ?carr;B 7FV
2 < 3lag de <egati"o
0% 1 resultado no era negati"o&menor CE<
$% 1 resultado era negati"o&menor 7F<
$ _ 3lag de _ero
0% :esultado no era zero&di4erente CE_
$% :esultado era zero&igual 7F_
0 C 3lag de Carr;
0% <o ocorreu transporte ?carr;B CEC
$% 1correu transporte ?carr;B 7FC
Ponteiro de pil4a
Porta 2uno
Endereo da
porta
Endereo da
R89
7-E&7-Q
-onteiro de
pilha
00RJ&09RF 09MJ&09MF
Nome Signi3icado (isponi-ilidade
7-E
U;te )ai9o do
ponteiro de pilha
Jo !TC072R$R para 4rente* no em $200
7-Q
U;te alto do
ponteiro de pilha
Jo !TC078M$M para 4rente* apenas para dispositi"os com mais de 2M6
);tes de 7:!8 interna(
$RA6 e controle e&terno de interrup";es
Porta 2uno
Endereo da
porta
Endereo da
R89
8CHC:
:egistrador de Controle Geral
8CH
09RM 09MM
: . ' / $ # % ;
7:F 7:X 7F 78 57C$$ 57C$0 57C0$ 57C00
Bit Nome Signi3icado 6ndica
O 7:F Qa)ilita 7:!8 F9terna
0]<o h/ 7:!8 e9terna conectada
$]Q/ 7:!8 e9terna conectada
Avr-Asm-Tutorial &1 http://www.avr-asm-tutorial.net
Bit Nome Signi3icado 6ndica
6 7:X
Fstados de espera ?'ait
statesB da 7:!8 F9t(
0]7em 'ait state e9tra na 7:!8 e9terna
$]Xait state adicional na 7:!8 e9terna
M 7F Qa)ilita repouso ?sleepB
0]5gnora comando 7EFF-
$]!ceita comando 7EFF-
P 78 8odo de respouso
0]5nati"idade ?8eio#repousoB
$]Jesligamento ?:epouso totalB
R 57C$$
2 57C$0
-ino de controle de
interrupo 5<T$
?conectado a G587LB
00% <6"el )ai9o inicia interrupo
0$% 5nde4inido
$0% Uorda de descida dispara interrupo
$$% Uorda de su)ida dispara interrupo
$ 57C0$
0 57C00
-ino de controle de
interrupo 5<T0
?conectado a G587LB
00% <6"el )ai9o inicia interrupo
0$% 5nde4inido
$0% Uorda de descida dispara interrupo
$$% Uorda de su)ida dispara interrupo
Controle de #nterrup"o :&terna
Porta 2uno
Endereo da
Porta
Endereo da
R89
G587L
:egistrador mascarado de
5nterrupo Geral
09RU 09MU
: . ' / $ # % ;
5<T$ 5<T0 # # # # # #
Bit Nome Signi3icado 6ndica
O 5<T$
5nterrupo por pino e9terno
5<T$ ?conectado a 8CHC:B
0% 5<T$ F9terna desa)ilitada
$% 5<T$ F9terna ha)ilitada
6 5<T0
5nterrupo por pino e9terno
5<T0 ?conectado a 8CHC:B
0% 5<T0 F9terna desa)ilitada
$% 5<T0 F9terna ha)ilitada
0(((M ?<o usadosB
Porta 2uno
Endereo
da Porta
Endereo da
R89
G53: :egistrador geral de 5nterrupes 09R! 09M!
: . ' / $ # % ;
5<T3$ 5<T30 # # # # # #
Bit Name Signi3icado 6ndica
O 5<T3$ 1correu interrupo e9terna pelo pino 5<T$
6 5<T30 1correu interrupo e9terna pelo pino 5<T0
_era o )it pela e9ecuo da rotina de
tratamento ou por comando
0(((M ?<o usadosB
Avr-Asm-Tutorial &2 http://www.avr-asm-tutorial.net
Controle do Timer de #nterrup"o
Port 2uno
Endereo da
Porta
Endereo da
R89
T587L
:egistrador mascarado do
timer de interrupo
09RC 09MC
: . ' / $ # % ;
T15F$ 1C5F$! 1C5F$U # T5C5F$ # T15F0 #
Avr-Asm-Tutorial &3 http://www.avr-asm-tutorial.net
Bit Nome Signi3icado 6ndica
O T15F$ Fstouro de Timer&Contador $#5nterrupo
0% 7em int no
estouro
$% 5nt no estouro
6 1C5F$! 5nterrup( do Timer&Contador $ Comparador !
0% 7em int igual a !
$% 5nt igual a !
M 1C5F$U 5nterrup( do Timer&Contador $ Comparador U
0% 7em int em U
$% 5nt em U
P ?<o usadoB
R T5C5F$ Captura do Timer&Contador $ 5nterrupo
0% 7em int na
captura
$% 5nt na captura
2 ?<o usadoB
$ T15F0 Fstouro de Timer&Contador 0#5nterrupo
0% 7em int no
estouro
$% 5nt no estouro
0 ?<o usadoB
Port 2uno
Endereo
da Porta
Endereo da
R89
T53:
:egistrador de timer de
interrupo
09R8 09M8
: . ' / $ # % ;
T1V$ 1C3$! 1C3$U # 5C3$ # T1V0 #
Bit Nome Signi3icado 6ndica
O T1V$ Timer&Contador $ estourou
6 1C3$! Timer&Contador $ chegou a Compara !
M 1C3$U Timer&Contador $ chegou a Compara U
P ?<o usadoB
R 5C3$ F"ento de captura de Timer&Contador $
2 ?<o usadoB
$ T1V0 Timer&Contador 0 estourou
0 ?<o usadoB
8odo#5nterrupo%
_ero pela e9ecuo
da rotina da
interrupo
1H
_ero por comando
Avr-Asm-Tutorial &% http://www.avr-asm-tutorial.net
Timer-Contador +
Port 2uno
Endereo da
Porta
Endereo da
R89
TCC:0
:egistrador de controle de Timer&
Contador 0
09RR 09MR
: . ' / $ # % ;
# # # # # C702 C70$ C700
Bit Nome Signi3icado 6ndica
2((0 C702((C700 Timer Clock
000% -/ra timer
00$% Clock ] clock do chip
0$0% Clock ] clock do chip & 8
0$$% Clock ] clock do chip & 6P
$00% Clock ] clock do chip & 2M6
$0$% Clock ] clock do chip & $02P
$$0% Clock ] )orda de descida do pino T0
$$$% Clock ] )orda de su)ida do pino T0
R((O ?<o usadoB
Port 2uno
Endereo da
Porta
Endereo da
R89
TC<T0
:egistrador de Controle de
Timer&Contador 0
09R2 09M2
Timer-Contador (
Port 2uno
Endereo da
Porta
Endereo da
R89
TCC:$!
:egistrador de Controle ! de Timer&
Contador $
0923 09P3
: . ' / $ # % ;
C18$!$ C18$!0 C18$U$ C18$U0 # # -X8$$ -X8$0
Bit Nome Signi3icado 6ndica
O C18$!$
6 C18$!0
7a6da Comparadora !
M C18$U$
P C18$U0
7a6da Comparadora U
00% 1C$!&U no conectado
0$% 1C$!&U troca polaridade
$0% 1C$!&U para zero
$$% 1C$!&U para um
R
2
?<o usadoB
$((0
-X8$$
-X8$0
8odulador por largura
de pulso ?-X8B
00% -X8 desligado
0$% 8#Uit -X8
$0% C#Uit -X8
$$% $0#Uit -X8
Avr-Asm-Tutorial && http://www.avr-asm-tutorial.net
Port 2uno
Endereo da
Porta
Endereo da
R89
TCC:$U
:egistrador de Controle U de Timer&
Contador $
092F 09PF
: . ' / $ # % ;
5C<C$ 5CF7$ # # CTC$ C7$2 C7$$ C7$0
Bit Nome Signi3icado 6ndica
O 5C<C$
Cancelador de
ru6do no pino 5C-
0% desa)ilitado* primeira )orda inicia a
amostragem
$% ha)ilitado* pelo menos ,uatro ciclos
6 5CF7$
7eleo de )ordo
na captura
0% )orda de descida dispara captura
$% )orda de su)ida dispara captura
M((P ?<o usadoB
R CTC$
Eimpa ,uando a
comparao 4or
igual a !
$% Contador zera se 4or igual
2((0 C7$2((C7$0 7eleo do clock
000% Contador parado
00$% Clock
0$0% Clock & 8
0$$% Clock & 6P
$00% Clock & 2M6
$0$% Clock & $02P
$$0% )orda de descida em pino T$
$$$% )orda de su)ida em pino T$
Port 2uno
Endereo da
Porta
Endereo da
R89
TC<T$E&Q :egistrador Timer&Contador $ 092C&092J 09PC&09PJ
Port 2uno
Endereo da
Porta
Endereo da
R89
1C:$!E&Q Timer&Contador $ 1utput Compare register ! 092!&092U 09P!&09PU he9
Port 2uno
Endereo da
Porta
Endereo da
R89
1C:$UE&Q
:egistrador de 7a6da do Comparador U
Timer&Contador $
0928&092C 09P8&09PC
Port 2uno
Endereo da
Porta
Endereo da
R89
5C:$E&Q
:egistrador de Fntrada de Captura do
Timer&Contador $
092P&092M 09PP&09PM
Avr-Asm-Tutorial &' http://www.avr-asm-tutorial.net
Fatc4do!DTimer
Port 2uno
Endereo da
Porta
Endereo da
R89
XJTC:
:egistrador de Controle do
Xatchdog Timer
092$ 09P$
: . ' / $ # % ;
# # # XJT1F XJF XJ-2 XJ-$ XJ-0
Bit Nome Signi3icado Ciclo<=(> a '?; ,olts
O((M ?<o usadoB
P XJT1F Qa)ilita ciclo de Xatchdog
:e,uerido setar antes de
desa)ilitar o XJF
R XJF Qa)ilita Xatchdog $% Xatchdog ati"o
2((0 XJ-2((XJ-0 Tempo do Xatchdog
000% $M ms
00$% R0 ms
0$0% 60 ms
0$$% $20 ms
$00% 2P0 ms
$0$% PC0 ms
$$0% CO0 ms
$$$% $*C s
::PR56
Port 2uno
Endereo da
Porta
Endereo da
R89
FF!:E&Q
:egistrador de Fndereo da
FF-:18
09$F&09$3 09RF&09R3
FF!:Q apenas nos tipo com FF-:18 com mais de 2M6 U;tes ?do !TC078M$M para 4renteB
Port 2uno
Endereo da
Porta
Endereo da
R89
FFJ:
:egistrador de Jados da
FF-:18
09$J 09RJ
Port 2uno
Endereo da
Porta
Endereo da
R89
FFC:
:egistrador de Controle da
FF-:18
09$C 09RC
: . ' / $ # % ;
# # # # # FF8XF FFXF FF:F
Bit Nome Signi3icado 2uno
O((
R
?<o usadoB
2 FF8XF
Qa)ilita Fscrita 8aster
FF-:18
Qa)ilita ciclo de leitura
$ FFXF Qa)ilita Fscrita FF-:18 7etar para iniciar gra"ao
0 FF:F Qa)ilita Eeitura FF-:18 7etar para iniciar leitura
Avr-Asm-Tutorial &( http://www.avr-asm-tutorial.net
#nterface de Perifricos $eriais >$P#A
Port 2uno
Endereo da
Porta
Endereo da
R89
7-C:
:egistrador de
Controle 7-5
090J 092J
: . ' / $ # % ;
7-5F 7-F J1:J 87T: C-1E C-Q! 7-:$ 7-:0
Bit Nome Signi3icado 2uno
O 7-5F 5nterrupes 7-5
0% 5nterrupes desa)ilitadas
$% 5nterrupes ha)ilitadas
6 7-F Qa)ilita 7-5
0% 7-5 desa)ilitado
$% 7-5 ha)ilitado
M J1:J 1rdem de Jados
0% 87U primeiro
$% E7U primeiro
P 87T: 7eleo 8aster&7la"e
0% 7la"e
$% 8aster
R C-1E -olaridade do Clock
0% 3ase positi"a do Clock
$% 3ase negati"a do Clock
2 C-Q! 3ase do Clock
0% !mostragem no in6cio da 4ase do clock
$% !mostragem no 4im da 4ase do clock
$ 7-:$
0 7-:0
3re,S2ncia do clock
7CL
00% Clock & P
0$% Clock & $6
$0% Clock & 6P
$$% Clock & $28
Port 2uno
Endereo da
Porta
Endereo da
R89
7-7:
:egistrador de
7tatus 7-5
090F 092F
: . ' / $ # % ;
7-53 XC1E # # # # # #
Bit Nome Signi3icado 6ndica
O 7-53
3lag de 5nterrupo
7-5
:e,uisita 5nterrupo
6 XC1E
3lag de Coliso de
Fscrita
1correu coliso na
escrita
M((0 ?<o usadoB
Port 2uno
Endereo da
Porta
Endereo da
R89
7-J:
:egistrador de
Jados da 7-5
0903 0923
Avr-Asm-Tutorial &) http://www.avr-asm-tutorial.net
7ART
Port 2uno
Endereo da
Porta
Endereo da
R89
HJ:
:egistrador de Jados da
F&7 H!:T
090C 092C
Port 2uno
Endereo da
Porta
Endereo da
R89
H7:
:egistrador de 7tatus
da H!:T
090U 092U
: . ' / $ # % ;
:ZC TZC HJ:F 3F 1: # # #
Bit Nome Signi3icado 2uno
O :ZC :ecepo H!:T Completa $% Caractere rece)ido
6 TZC
Transmisso H!:T
Completa
$% 7hi4t register "azio
M HJ:F
:egistrador de Jados da
H!:T Vazio
$% :egistrador de
transmisso dispon6"el
P 3F
Frro de en,uadramento
?4ramingB
$% Uit de -arada 5legal
R 1: -erda ?1"errunB $% Caractere perdido
2((0 ?<o usadoB
Port 2uno
Endereo da
Porta
Endereo da
R89
HC:
:egistrador de Controle
da H!:T
090! 092!
: . ' / $ # % ;
:ZC5F TZC5F HJ:5F :ZF< TZF< CQ:C :ZU8 TZU8
Bit Nome Signi3icado 2uno
O :ZC5F
Qa)ilita 5nterrupo ,uando :Z
terminada
$% 5nterrupo ,uando rece)e
caractere
6 TZC5F
Qa)ilita 5nterrupo ,uando TZ
completo
$% 5nterrupo ,uando transmisso
completada
M HJ:5F
Qa)ilita 5nterrupo ,uando
:egistrador de Jados "azio
$% 5nterrupo ,uando )u44er de
dados "azio
P :ZF< :ecepo Qa)ilitada $% :eceptor ha)ilitado
R TZF< Transmisso Qa)ilitada $% Transmissor ha)ilitado
2 CQ:C Caracteres de C )its $% Tamanho do caractere C )its
$ :ZU8 :ece)e Uit de Jado 8 ?segura nono )it na recepoB
0 TZU8 Transmite Uit de Jado 8 ?escre"e nono )it para transmissoB
Port 2uno
Endereo da
Porta
Endereo da
R89
HU::
:egistrador de "elocidade
da H!:T ?Uaud :ateB
090C 092C
Avr-Asm-Tutorial &* http://www.avr-asm-tutorial.net
Analo! Comparator
Port 2uno
Endereo da
Porta
Endereo da
R89
!C7:
:egistrador de 7tatus e de Controle do
Comparador !nal=gico
0908 0928
: . ' / $ # % ;
!CJ # !C1 !C5 !C5F !C5C !C57$ !C570
Bit Nome Signi3icado 2uno
O !CJ Jesa)ilita Jesa)ilita Comparadores
6 ?<o usadoB
M !C1 7a6da do Comparador 7a6da dos Comparadores
P !C5 3lag de 5nterrupo $% 5nterrupo re,uisitada
R !C5F Qa)ilita 5nterrupo $% 5nterrupo ha)ilitada
2 !C5C
Qa)ilita Captura de
entrada
$% Conecta a Captura do Timer$
$ !C57$
0 !C570
Qa)ilita Captura de
Fntrada
00% 5nterrupo na mudana de
n6"el
0$% ?<o usadoB
$0% 5nterrupo em )orda de
descida
$$% 5nterrupo em )orda de
su)ida
Portas :-$
Port Register 2uno
Endereo da
Porta
Endereo da
R89
!
-1:T! :egistrador de Jados 09$U 09RU
JJ:!
:egistrador da Jireo
dos Jados
09$! 09R!
-5<!
Fndereo dos -inos de
Fntrada
09$C 09RC
U
-1:TU :egistrador de Jados 09$8 09R8
JJ:U
:egistrador da Jireo
dos Jados
09$O 09RO
-5<U
Fndereo dos -inos de
Fntrada
09$6 09R6
C
-1:TC :egistrador de Jados 09$M 09RM
JJ:C
:egistrador da Jireo
dos Jados
09$P 09RP
-5<C
Fndereo dos -inos de
Fntrada
09$R 09RR
J
-1:TJ :egistrador de Jados 09$2 09R2
JJ:J
:egistrador da Jireo
dos Jados
09$$ 09R$
-5<J
Fndereo dos -inos de
Fntrada
09$0 09R0
Avr-Asm-Tutorial '+ http://www.avr-asm-tutorial.net
Portas? ordem alfabtica
)%/R, Registrador de /tatus e %o(trole do %omDarador )(al1gico
DDRC, Registrador da Dire-Ho dos Dados da Porta C
EE)R, Registrador de e(dere-o da EEPR"M
EE%R, Registrador de co(trole da EEPR"M
EEDR, Registrador de Dados da EEPR"M
5IFR, Registrador da Flag de I(terruD-Ho 5eral
5IM/b, Registrador de I(terruD-Ho Mascarada 5eral
I%R1LZ4, Registrador de %aDtura de E(trada 1
M%'%R, Registrador de %o(trole 5eral da M%'
"%R1), Registrador de /aWda do %omDarador 1 )
"%R16, Registrador de /aWda do %omDarador 1 6
PI*C, )cesso K Porta de E(trada
P"R9C, Port C "utDut Register
/PLZ/P4, Po(teiro de Pil8a
/P%R, Registrador de %o(trole de Perif,ricos /eriais
/PDR, Registrador de Dados de Perif,ricos /eriais
/P/R, Registrador de /tatus de Perif,ricos /eriais
/RE5, Registrador de /tatus
9%%R, Registrador de %o(trole do 9imerZ%o(tador 9imer
9%%R1), Registrador de %o(trole do 9imerZ%o(tador 1 )
9%%R16, Registrador de %o(trole do 9imerZ%o(tador 1 6
9%*9, Registrador do 9imerZ%o(tador, %o(tador
9%*91, Registrador do 9imerZ%o(tador, %o(tador 1
9IFR, Flag de I(terruD-Ho do 9imer
9IM/b, Registrador Mascarado de I(terruD-Ho do 9imer
'6RR, Registrador de Eelocidade da ')R9 06aud Rate2
'%R, Registrador de %o(trole da ')R9
'DR, Registrador de Dados da ')R9
7D9%R, Registrador de %o(trole do 9imer 7atc8dog
Eista de abre2ia";es
!s a)re"iaes usadas 4oram escolhidas para inclu6rem a 4ai9a de "alores( -ares de registradores so
nomeadas pelo menor dos dois registradores( Constantes em comandos de salto so automaticamente
calculadas das respecti"as la)els durante a compilao(
Categ5 8-re"5 Signi3ica 555 2aixa de ,alores
:egister
r$
:egistradores origem e destino
comuns
r2 :egistrador 4onte comum
:0((:R$
rh :egistrador de p/gina superior :$6((:R$
rd :egistrador g2meo :2P?:2MB* :26?:2OB* :28?:2CB* :R0?:R$B
rp :egistrador de ponteiro Z]:26?:2OB* `]:28?:2CB* _]:R0?:R$B
r;
:egistrador de ponteiro com
deslocamento
`]:28?:2CB* _]:R0?:R$B
Constant
k6R Constante ponteiro 0((6R
c$2O JistGncia de salto condicional #6P((T6R
c2MM Constante de 8 )its 0((2MM
cP0C6 JistGncia de salto relati"o #20P8((T20PO
c6MMRM Fndereo de $6 )its 0((6MMRM
Uit )O -osio do )it 0((O
-ort
p$ -orta comum 0((6R
pl -orta de p/gina in4erior 0((R$

Você também pode gostar