Instrodução para o iniciante à Linguagem Assembly

Instrodução para o iniciante à Linguagem Assembly

(Parte 1 de 9)

Introdução para o iniciante à

Linguagem Assembly dos Microprocessadores ATMEL AVR por

Gerhard Schmidt

Dezembro de 2003

Versão corrigida em Julho de 2006

Correções adicionais e atualizações em Janeiro de 2008 Traduzido por Guilherme Groke – ggroke@gmail.com

Avr-Asm-Tutorial 1 http://www.avr-asm-tutorial.net

Porque aprender Assembler?1
Curta e fácil1
Veloz1
Assembler é de fácil aprendizado1
AVRs são ideais para se aprender assembler1
Teste!2
Hardware para programação em Assembler AVR3
A interface ISP da família de processadores AVR3
Programador para a porta paralela do PC3
Placas experimentais4
Placa experimental com ATtiny134
Placa experimental com um AT90S2313/ATmega23135
Placas de programação comerciais para a família AVR6
STK2006
STK5006
AVR Dragon7
Ferramentas para programação assembly AVR 8
De um arquivo texto a palavras de instrução para a memória flash8
O editor8
O assembler9
Programando os chips10
Simulação no studio1
Registrador13
O que é um registrador?13
Registradores diferentes14
Registradores ponteiros14
Recomendação para uso dos registradores15
Portas17
O que é uma Porta?17
Deatlhes de portas relevantes do AVR18
O registrador de status como a porta mais utilizada18
Detalhes das portas19
SRAM20
Usando SRAM em linguagem assembler AVR 20
O que é SRAM?20
Para que propósitos posso usar a SRAM?20
Como usar a SRAM?20
Use of SRAM as stack21
Definindo SRAM como pilha21
Uso da pilha2
Bugs com a operação de pilhas2
Saltos e Desvios24
Controlando a execução seqüencial de um programa24
O que acontece durante um reset?24
Execução linear do programa e desvios25
Temporização durante a execução do programa25
Macros e execução do programa26
Subrotinas26
Interrupções e a execução do programa28
Cálculos30
Sistemas numéricos em assembler30
Números positivos inteiros (bytes, palavras, etc.)30
Números com sinal (inteiros)30
Dígitos Codificados em Binário, BCD (Binary Coded Digits)30
BCDs compactados31
Números em formato ASCII31

Conteúdo Manipulação de bits.............................................................................................................................31

Desloca e rotaciona32
Somando, subtraindo e comparando3
Conversão de formatos numéricos35
Multiplicação35
Multiplicação decimal35
Multiplicação binária36
Programa em Assembler AVR36
Binary rotation37
Multiplicação no studio37
Divisão39
Divisão decimal39
Binary division39
Passos do programa durante a divisão40
Divisão no simulador40
Conversão numérica43
Frações decimais43
Conversões lineares43
Exempl0 1: Conversor AD 8­bit para saída decimal com ponto fixo4
Exemplo 2: Conversor AD de 10 bits com saída decimal fixa45
Anexo46
Instruções ordenadas por função46
Lista de Diretivas e Instruções em ordem alfabética48
Diretivas de Assembler em ordem alfabética48
Instruções em ordem alfabética48
Detalhes das Portas50
Registrador de Status, Flags do Acumulador50
Ponteiro de pilha51
SRAM e controle externo de interrupções51
Controle de Interrupção Externo52
Controle do Timer de Interrupção52
Timer/Contador 053
Timer/Contador 154
Watchdog­Timer5
EEPROM56
Interface de Periféricos Seriais (SPI)56
UART57
Analog Comparator58
Portas E/S59
Portas, ordem alfabética59

Avr-Asm-Tutorial 1 http://www.avr-asm-tutorial.net

Porque aprender Assembler?

Assembler ou outras linguagens, esta é a questão. Porque eu deveria aprender mais uma linguagem, se eu já conheço outras linguagens de programação? O melhor argumento: enquanto você viver na França, poderá sobreviver falando Inglês, mas você nunca se sentirá em casa, e a vida fica difícil. Você pode apenas continuar desta forma, mas isto não é apropriado. Se as coisas ficarem complicadas, você deverá usar a linguagem corrente do país

Muitas pessoas já experientes em programação de AVRs e que usam linguagens de alto nível em seu trabalho normal, recomendam que os iniciantes comecem aprendendo linguagem assembly. A razão para isto é que, algumas vezes, podem ocorrer certas situações, como: ●se bugs têm que ser analizados,

●se o programa faz coisas diferentes das que foram escritas e são esperadas,

●se linguagens de alto nível não suportam o uso de certas características do hardware,

●se rotinas em que a temporização é crítica requerem porções de linguagem assembly, é necessário entender a linguagem assembly, e.g., entender o que os compiladores de linguagens de alto nível produzem. Sem compreender a linguagem assembly, você não terá chance de ir adiante nestes casos.

Curta e fácil

Os comandos assembler são traduzidos um a um para serem comandos executados pela máquina. O processador necessita apenas executar o que você quer fazer e o necessário para executar a tarefa. Nenhum loop extra ou características desnecessárias poluem o código. Se o espaço para o seu programa é curto e limitado e você terá que otimizar seu programa para caber na memória, assembler é a escolha número um. Programas mais curtos são mais fáceis de depurar (“debugar”), cada passo faz sentido.

Veloz

Como apenas os passos necessários são executados, os programas em assembly são tão rápidos quanto possível. Aplicações onde o tempo é crítico, como medições de tempo que devam ter boa performance, sem que haja um hardware de temporização, devem ser escritas em assembler. Se você tiver mais tempo e não se importar que seu chip permaneça 9% em um estado de espera (wait state) de operação, você pode escolher a linguagem que desejar.

Assembler é de fácil aprendizado

Não é verdade que a linguagem assembly é mais complicada ou não é tão fácil de compreender quanto outras linguagens. Aprender linguagem assembly para qualquer tipo de hardware facilita a compreensão de conceitos de qualquer outro dialeto da linguagem assembly. Aprender outros dialetos depois é mais fácil. Algumas características são dependentes do hardware, e isto requer alguma familiaridade com os conceitos de hardware e seus dialetos. O que faz o assembler parecer complicado algumas vezes é que ele requer uma compreensão das funções do controlador do hardware. Linguagens de alto nível não permitem a utilização de características especiais do hardware, e escondem estas funções.

O primeiro código assembly não parece muito interessante, mas depois de 100 linhas adicionais programadas, parecerá melhor. Programas perfeitos requerem apenas alguns milhares de linhas de código de exercício, e otimização requer bastante trabalho. Os primeiros passos são difíceis em qualquer linguagem. Após algumas semanas programando, você dará risada se analisar seu primeiro código. Alguns comandos em assembler requerem meses de experiência.

AVRs são ideais para se aprender assembler

Programas em assembler são um pouco tolos: o chip executa tudo que você disser a ele para fazer, e não pergunta se você tem certeza se quer sobrescrever isso ou aquilo. Todas as características de proteção devem ser programadas por você, o chip faz exatamente aquilo que lhe é comandado, mesmo que não faça sentido algum. Nenhuma janela o alertará, a menos que você a tenha programado anteriormente.

Para corrigir erros de digitação é tão fácil ou complicado como qualquer outra linguagem. Existem erros básicos ou mais complicados. Porém: testar os programas nos chips ATMEL é muito fácil. Se o chip não faz o que você espera, você pode facilmente adicionar algumas linhas de diagnóstico ao código, reprogramá-lo e testá-lo. Adeus, programadores de EPROM, lâmpadas UV usadas para apagar o programa, pinos que não se encaixam mais no soquete após tê-los removido uma dúzia de vezes.

As mudanças agora são programadas rapidamente, compiladas imediatamente, ou mesmo simuladas no studio ou checadas no próprio circuito. Nenhum pino tem que ser removido, e nenhuma lâmpada de UV te

Avr-Asm-Tutorial 2 http://www.avr-asm-tutorial.net deixará na mão justamente no momento em que você teve uma excelente idéia sobre aquele bug.

Seja paciente nos seus primeiros passos! Se você tem familiaridade com outra linguagem (alto nível): esqueça-a por enquanto. A maioria das características especiais de outras linguagens de computação não fazem nenhum sentido em assembler.

As primeiras cinco instruções não são fáceis de aprender, depois disso sua velocidade de aprendizado aumentará rapidamente. Depois que você escreveu as primeiras linhas: pegue o conjunto de instruções e leia-o deitado em sua banheira, imaginando para que servem todas as outras instruções.

Aviso sério: Não tente criar uma mega-máquina logo de início. Isto não faz sentido algum em nenhuma linguagem de programação, e apenas produz frustração. Comece com pequenos exemplos tipo “Olá Mundo”, e.g., ligando e desligando LEDs por algum tempo, e só então comece a explorar as características do hardware mais profundamente.

Recomendação: Comente suas subrotinas e armazene-as em um diretório especial, se debugadas: você precisará delas em breve.

Sucesso!

Avr-Asm-Tutorial 3 http://www.avr-asm-tutorial.net

Hardware para programação em Assembler

Aprender assembler requer um equipamento simples para testar seus programas e ver se eles funcionam na prática.

Está página mostra dois esquemas fáceis que permitem a você construir em casa o hardware necessário. Este hardware é realmente fácil de construir. Desconheço qualquer esquema mais fácil do que este para o seus primeiros passo em software. Se você quiser fazer mais experimentos, reserve espaço para expansões futuras em sua placa de experimentos.

Se você não gosta do cheiro de solda, você pode comprar uma placa pronta para uso. As placas disponíveis estão listadas na seção abaixo.

A interface ISP da família de processadores AVR

Antes de entrarmos na prática, temos que aprender alguns conceitos essenciais no modo de programação serial da família AVR. Não, você não precisa três diferentes voltagens para programar e ler a memória flash do AVR. Não, você não precisa de outro microprocessador para programar os AVRs. Não você não precisa de 10 linhas de E/S para dizer ao chip o que você gostaria que ele fizesse. E você não tem sequer que remover o AVR da sua placa de experimentos, antes de programá-lo. É fácil assim.

Tudo isto é feito pela interface embutida em cada chip AVR, que permite a você escrever e ler o conteúdo da memória flash e EEPROM embutidas. Esta interface trabalha serialmente e precisa de três linhas de sinal:

•SCK: Um sinal de clock que move os bits a serem escritos na memória para um shift register interno, que move os bits para serem lidos por outro shift register. •MOSI: Um sinal de dados que envia os bits para serem escritos no AVR,

•MISO: Um sinal de dados que recebe os bits lidos do AVR.

Estes três pinos de sinal são internamente conectados ao sistema de programação apenas se você deixar o sinal RESET (algumas vezes chamado de RST ou restart) em nível zero. Caso contrário, durante a operação normal do AVR, estes pinos são portas de E/S programáveis como todas as outras. Se você quiser usar estes pinos para outros propósitos durante a operação normal, e para programação ISP, você terá que fazê-lo de forma que estes dois propósitos não conflitem. Normalmente você deve desacoplar os sinais por um resistor ou utilizar um multiplexador. O necessário para o seu caso, depende do seu uso dos pinos no modo de operação normal. Se você tiver sorte, pode deixar estes pinos exclusivamente paa a programação ISP. Não necessário, porém recomendado para a programação ISP, é que você tenha uma tensão de alimentação para o hardware no próprio circuito de programação. Isto torna a programação mais fácil, e requer apenas duas linhas adicionais entre o programador e a placa AVR. GND é o terra comum, VTG (target voltage) é a tensão de alimentação (normalmente 5.0 Volts). Isto totaliza 6 linhas entre o programador e a placa AVR. A conexão ISP6 é, conforme definida pela ATMEL, mostrada à esquerda.

Padrões sempre têm padrões alternativos. Esta é a base técnica que constitui a empresa de adaptadores. No nosso caso, o padrão alternativo foi projetado utilizando um ISP10 e foi utilizado na placa STK200. É um padrão bastante disseminado, e mesmo o STK500 está equipado com este padrão. O padrão ISO10 tem um sinal adicional que aciona um LED vermelho. Este LED sinaliza que o programador está fazendo o seu trabalho. Uma boa idéia. Conecte o LED a um resistor e à fonte de tensão.

Programador para a porta paralela do PC

Agora, aqueça o seu ferro de soldar e construiremos seu programador. É um esquema bastante fácil e funciona com peças facilmente encontráveis na sua caixa de experimentos.

Sim, é tudo que você precisa para programar um AVR. O plugue de 25 pinos se liga à porta paralela do seu PC, e o conector ISP de 10 pinos se conecta à placa de experimentos AVR. Se você não tiver um 72LS245, você pode utilizar também o 74HC245 (sem mudanças no circuito) ou um 74LS244/74HC244

Avr-Asm-Tutorial 4 http://www.avr-asm-tutorial.net

(com pequenas mudanças no circuito). Se você utilizar HC, não se esqueça de conectar os pinos não utilizados ao terra ou à tensão de alimentação, caso contrário os buffers podem produzir ruído capacitivo pelo chaveamento.

Todo o algoritmo de programação necessário é feito pelo software ISP. Esteja ciente que esta interface paralela não é mais suportada pelo software Atmel Studio. Portanto, se você desejar programar seu AVR diretamente do studio, utilize programadores diferentes. A internet fornece diversas soluções.

Se você já tiver uma placa de programação, você não precisará construir este programador, porque você encontrará a interface ISP em alguns pinos. Consulte o manual para localizá-los.

Placas experimentais

Você provavelmente quer fazer seus primeiros programas com uma placa AVR feita em casa. Aqui apresentamos duas versões:

●Uma bem pequena com um ATtiny13, ou

●uma mais complicada com um AT90S2313 ou ATmega2313, incluindo uma interface serial RS232.

Placa experimental com ATtiny13

Esta é uma placa bem pequena que permite experimentos com o hardware interno do Attiny13. A figura mostra

●A interface de programação ISP10 à esquerda, com o LED de programação ligado a um resistor de 390 ohms,

●o ATtiny13 com um resistor pull-up de10k no pino RESET (pino 1),

1.a fonte de alimentação com um retificador em ponte, que aplica de 9 a 15V a partir de uma fonte AC ou DC, e um pequeno regulador de 5V.

Avr-Asm-Tutorial 5 http://www.avr-asm-tutorial.net

O ATtiny13 não requer cristal externo ou gerador de clock, pois trabalha com o seu gerador RC interno de 9,6 Mcs/s e, por padrão, com um divisor de clock em 8 (freqüência de clock de 1,2 Mcs/s).

O hardware pode ser construido em uma pequena placa como a mostrada na figura. Todos os pinos do tiny13 são acessíveis, e componentes externos ao hardware, como o LED mostrado, são facilmente conectados.

Esta placa permite o uso dos componentes de hardware do Attiny13, como portas E/S, timers, conversores AD, etc.

Placa experimental com um AT90S2313/ATmega2313

Para fins de teste, ou se mais pinos de E/S ou comunicação serial forem necessários, podemos utilizar um AT90S2313 ou Atmega2313 em uma placa experimental. O esquema mostra

•uma pequena fonte de alimenação para conecção a um transformador AC e um regulador de tensão 5V/1A,

•um gerador de clock a cristal (aqui com um cristal de 10 MHz, qualquer freqüência abaixo do máximo especificado para o AT90S2313 funcionarão), os componentes necessários para um reset seguro durante o momento da partida da alimentação,

•a interface de programação ISP (com o conector ISP10).

É isto que você precisa para iniciar. Conecte os outros periféricos e adicionais aos numerosos pinos livres de E/S ao 2313.

O dispositivo de saída mais fácil pode ser um LED, conectado a um resistor à tensão de alimentação. Com isso, você pode escrever o seu primeiro programa em assembler para acender e apagar o LED.

Se você

●não precisar da interface de comunicação serial, simplesmente ignore o hardware conectado aos pinos 2/3 e 14/16,

Avr-Asm-Tutorial 6 http://www.avr-asm-tutorial.net

●não precisar dos sinais de handshaking, ignore os pinos 14/16 e conecte RTS ao conector de 9 pinos via um resistor de 2,2k a +9V.

Se você usar um ATmega2313 no lugar do AT90S2313, serão feitas as seguintes mundanças:

●o cristal externo não é necessário, pois o ATmega possui um gerador de clock RC interno, basta ignorar as conexões aos pinos 4 e 5,

●se você quiser usar um cristal externo no lugar do circuito RC interno, você terá que programar os fusíveis do Atmega de acordo.

Placas de programação comerciais para a família AVR

Se você não gosta de hardware feito em casa, e tem algum dinheiro extra e não sabe o que fazer com ele, você pode comprar uma placa de programação comercial pronta. Dependendo da quantidade de dinheiro extra que você gostaria de gastar, você pode escolher entre versões mais baratas ou mais caras. Para o amador, a critério de seleção deve ser baseado em:

●interface com o PC (de preferência USB; menos conveniente ou durável: RS232; requer software adicional para programação: porta paralela do PC),

●suporte a novos dispositivos (atualizações são necessárias de tempos em tempos, caso contrário você montará em um cavalo morto),

●características do hardware (depende de suas necessidades para os próximos cinco anos).

A seção a seguir descreve três placas padrão da ATMEL, a STK200, a STK500 e a Dragon. A seleção é baseada em minhas próprias experiências, e não é uma recomendação.

A STK200 da ATMEL é uma placa histórica. Se você conseguir uma usada, você terá ●uma placa com alguns soquetes (para dispositivos de 8, 20, 28 e 40 pinos),

●oito chaves e LEDs, conectados permanentemente às portas D e B,

●um LCD com interface padrão de 14 pinos,

●uma opção para conectar uma SRAM de 28 pinos,

●uma interface RS232 para comunicação,

●um cabo de interface com a porta paralela do PC em um lado e um ISP de 10 pinos do outro.

(Parte 1 de 9)

Comentários