Modelagem Numérica e Computacional com Similitude e Elementos Finitos: Desenvolvimento de Equação Preditiva para o Cálculo da Força de Retenção em Freios de Estampagem
Desenvolvendo Um Datalogger Em Vb E Armazenando No Arquivo Formato Csv Para Monitoramento De Gaussímetro Usando O Esp8266 (nodemcu) Programado No Arduino
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¶ endereo Z e incrementa o ponteiro por um EJ :$*ZT ou 7T ZT*:$ #Z Jecrementa o ponteiro em um e l2&escre"e de¶ 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$
Modelagem Numérica e Computacional com Similitude e Elementos Finitos: Desenvolvimento de Equação Preditiva para o Cálculo da Força de Retenção em Freios de Estampagem
Desenvolvendo Um Datalogger Em Vb E Armazenando No Arquivo Formato Csv Para Monitoramento De Gaussímetro Usando O Esp8266 (nodemcu) Programado No Arduino