Você está na página 1de 14

CAPTULO 4 - Programao em Linguagem Assembly

Microcontroladores PIC
on-line GRTIS!

Pgina 1 de 14

Indice
Sistema de desenvolvimento
Contacte-nos

CAPTULO 4
Programao em Linguagem Assembly
Introduo
Exemplo de como se escreve um programa
Directivas de controle
4.1 define
4.2 include
4.3 constant
4.4 variable
4.5 set
4.6 equ
4.7 org
4.8 end
Instrues condicionais
4.9 if
4.10 else
4.11 endif
4.12 while
4.13 endw
4.14 ifdef
4.15 ifndef
Directivas de dados
4.16 cblock
4.17 endc
4.18 db
4.19 de
4.20 dt
Configurando uma directiva
4.21 _CONFIG
4.22 Processor
Operadores aritmticos de assembler
Ficheiros criados ao compilar um programa
Macros

Introduo
A capacidade de comunicar da maior importncia nesta rea. Contudo, isso s possvel se ambas as partes
usarem a mesma linguagem, ou seja, se seguirem as mesmas regras para comunicarem. Isto mesmo se aplica
comunicao entre os microcontroladores e o homem. A linguagem que o microcontrolador e o homem usam
para comunicar entre si designada por linguagem assembly. O prprio ttulo no tem um significado
profundo, trata-se de apenas um nome como por exemplo ingls ou francs. Mais precisamente, linguagem
assembly apenas uma soluo transitria. Os programas escritos em linguagem assembly devem ser
traduzidos para uma linguagem de zeros e uns de modo a que um microcontrolador a possa receber.
Linguagem assembly e assembler so coisas diferentes. A primeira, representa um conjunto de regras
usadas para escrever um programa para um microcontrolador e a outra, um programa que corre num
computador pessoal que traduz a linguagem assembly para uma linguagem de zeros e uns. Um programa
escrito em zeros e uns diz-se que est escrito em linguagem mquina.

12/8/2003

CAPTULO 4 - Programao em Linguagem Assembly

Pgina 2 de 14

O processo de comunicao entre o homem e o microcontrolador

Fisicamente, Programa representa um ficheiro num disco de computador (ou na memria se estivermos a ler
de um microcontrolador) e escrito de acordo com as regras do assembly ou qualquer outra linguagem de
programao de microcontroladores. O homem pode entender a linguagem assembly j que ela constituda
por smbolos alfabticos e palavras. Ao escrever um programa, certas regras devem ser seguidas para alcanar
o efeito desejado. Um Tradutor interpreta cada instruo escrita em linguagem assembly como uma srie de
zeros e uns com significado para a lgica interna do microcontrolador.
Consideremos, por exemplo, a instruo RETURN que um microcontrolador utiliza para regressar de um
subprograma.
Quando o assembler a traduz, ns obtemos uma srie de uns e zeros correspondentes a 14 bits que o
microcontrolador sabe como interpretar.
Exemplo: RETURN 00 0000 0000 1000

Analogamente ao exemplo anterior, cada instruo assembly interpretada na srie de zeros e uns
correspondente.
O resultado desta traduo da linguagem assembly, designado por um ficheiro de execuo. Muitas vezes
encontramos o nome de ficheiro HEX. Este nome provm de uma representao hexadecimal desse ficheiro,
bem como o sufixo hex" no ttulo, por exemplo correr.hex". Uma vez produzido, o ficheiro de execuo
inserido no microcontrolador atravs de um programador.

Um programa em Linguagem Assembly escrito por intermdio de um processador de texto (editor) e


capaz de produzir um ficheiro ASCII no disco de um computador ou em ambientes prprios como o MPLAB
que vai ser explicado no prximo captulo.

Linguagem Assembly
Os elementos bsicos da linguagem assembly so:

Labels (rtulos)
Instrues
Operandos
Directivas
Comentrios

Um Label (rtulo) uma designao textual (geralmente de fcil leitura) de uma linha num programa ou de
uma seco de um programa para onde um microcontrolador deve saltar ou, ainda, o incio de um conjunto de
linhas de um programa. Tambm pode ser usado para executar uma ramificao de um programa (tal como
Goto....), o programa pode ainda conter uma condio que deve ser satisfeita, para que uma instruo Goto
seja executada. importante que um rtulo (label) seja iniciado com uma letra do alfabeto ou com um trao
baixo _. O comprimento de um rtulo pode ir at 32 caracteres. tambm importante que o rtulo comece na
primeira coluna.

12/8/2003

CAPTULO 4 - Programao em Linguagem Assembly

Pgina 3 de 14

Instrues
As instrues so especficas para cada microcontrolador, assim, se quisermos utilizar a linguagem assembly
temos que estudar as instrues desse microcontrolador. O modo como se escreve uma instruo designado
por "sintaxe". No exemplo que se segue, possvel reconhecer erros de escrita, dado que as instrues movlp e
gotto no existem no microcontrolador PIC16F84.

Operandos
Operandos so os elementos da instruo necessrios para que a instruo possa ser executada. Normalmente
so registos, variveis e constantes. As constantes so designadas por literais. A palavra literal significa
nmero.

Comentrios
Comentrio um texto que o programador escreve no programa afim de tornar este mais claro e legvel.
colocado logo a seguir a uma instruo e deve comear com uma semi-vrgula ";".

Directivas
Uma directiva parecida com uma instruo mas, ao contrrio desta, independente do tipo de
microcontrolador e uma caracterstica inerente prpria linguagem assembly. As directivas servem-se de
variveis ou registos para satisfazer determinados propsitos. Por exemplo, NIVEL, pode ser uma designao
para uma varivel localizada no endereo 0Dh da memria RAM. Deste modo, a varivel que reside nesse
endereo, pode ser acedida pela palavra NIVEL. muito mais fcil a um programador recordar a palavra NIVEL,
que lembrar-se que o endereo 0Dh contm informao sobre o nvel.

12/8/2003

CAPTULO 4 - Programao em Linguagem Assembly

Pgina 4 de 14

Exemplo de como se escreve um programa


O exemplo que se segue, mostra como um programa simples pode ser escrito em linguagem assembly,
respeitando regras bsicas.
Quado se escreve um programa, alm das regras fundamentais, existem princpios que, embora no
obrigatrios conveniente, serem seguidos. Um deles, escrever no seu incio, o nome do programa, aquilo
que o programa faz, a verso deste, a data em que foi escrito, tipo de microcontrolador para o qual foi escrito e
o nome do programador.

Uma vez que estes dados no interessam ao tradutor de assembly, so escritos na forma de comentrios.
Deve ter-se em ateno que um comentrio comea sempre com ponto e vrgula e pode ser colocado na linha
seguinte ou logo a seguir instruo.
Depois deste comentrio inicial ter sido escrito, devem incluir-se as directivas. Isto mostra-se no exemplo de
cima.
Para que o seu funcionamento seja correcto, preciso definir vrios parmetros para o microcontrolador, tais
como:
- tipo de oscilador
- quando o temporizador do watchdog est ligado e
- quando o circuito interno de reset est habilitado.
Tudo isto definido na directiva seguinte:
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
Logo que todos os elementos de que precisamos tenham sido definidos, podemos comear a escrever o
programa.
Primeiro, necessrio definir o endereo para que o microcontrolador deve ir quando se liga a alimentao.
esta a finalidade de (org 0x00).
O endereo para onde um programa salta se ocorrer uma interrupo (org 0x04).
Como este um programa simples, suficiente dirigir o microcontrolador para o incio de um programa com
uma instruo "goto Main" (Main = programa principal).
As instrues encontradas em Main, seleccionam o banco 1 (BANK1) de modo a poder aceder-se ao registo
TRISB, afim de que o porto B seja definido como uma sada (movlw 0x00, movwf TRISB).
O prximo passo seleccionar o banco de memria 0 e colocar os bits do porto B no estado lgico 1 e, assim,
o programa principal fica terminado.
preciso, no entanto, um outro ciclo (loop), onde o microcontrolador possa permanecer sem que ocorram
erros. Trata-se de um loop infinito que executado continuamente, enquanto a alimentao no for desligada.

12/8/2003

CAPTULO 4 - Programao em Linguagem Assembly

Pgina 5 de 14

Finalmente, necessrio colocar a palavra end" no fim de cada programa, de modo a informar o tradutor de
assembly de que o programa no contm mais instrues.

Directivas de controle
4.1 #DEFINE Troca de uma poro de texto por outra
Sintaxe:
#define<nome> [< texto atribudo a nome > ]
Descrio:
De cada vez que a palavra <nome> aparece no programa, vai ser substituda por <texto atribudo a nome>.
Exemplo:
#define ligado 1
#define desligado 0
Directivas similares: #UNDEFINE, IFDEF, IFNDEF

4.2 INCLUDE Incluir um ficheiro adicional num programa


Sintaxe:
include <<nome_do_ficheiro>>
include <nome_do_ficheiro>
Descrio:
A aplicao desta directiva faz com que um ficheiro completo seja copiado para o local em que a directiva
include se encontra. Se o nome do ficheiro estiver entre aspas, estamos a lidar com um ficheiro do sistema, se
no estiver entre aspas, mas sim entre os sinais < >, trata-se de um ficheiro do utilizador. A directiva include,
contribui para uma melhor apresentao do programa principal.
Exemplo:
include < regs.h >
include subprog.asm

4.3 CONSTANT Atribui um valor numrico constante a uma designao textual


Sintaxe:
constant < nome > = < valor >
Descrio:
Cada vez que < nome > aparece no programa, substitudo por < valor > .
Exemplo:
constant MAXIMO = 100
constant Comprimento = 30
Directivas similares: SET, VARIABLE
4.4 VARIABLE Atribui um valor numrico varivel designao textual
Sintaxe:
variable < nome > = < valor >
Descrio:
Ao utilizar esta directiva, a designao textual muda o seu valor.
Difere da directiva CONSTANT no facto de, depois de a directiva ser aplicada, o valor da designao textual
poder variar.
Exemplo:
variable nivel = 20
variable tempo = 13
Directivas similares: SET, CONSTANT

12/8/2003

CAPTULO 4 - Programao em Linguagem Assembly

Pgina 6 de 14

4.5 SET Definir uma varivel assembler


Sintaxe:
< nome_variavel > set <valor>
Descrio:
varivel < nome_variavel > atribuda a expresso <valor> . A directiva SET semelhante a EQU, mas com
a directiva SET possvel tornar a definir a varivel com outro valor.
Exemplo:
nivel set 0
comprimento set 12
nivel set 45
Directivas similares: EQU, VARIABLE
4.6 EQU Definindo uma constante em assembler
Sintaxe:
< nome_da_constante > equ < valor >
Descrio:
Ao nome de uma constante < nome_de_constante > atribudo um valor < valor >
Exemplo:
cinco equ 5
seis equ 6
sete equ 7
Instrues similares: SET
4.7 ORG Define o endereo a partir do qual o programa armazenado na memria do
microcontrolador
Sintaxe:
<rtulo> org <valor>
Descrio:
Esta a directiva mais frequentemente usada. Com esta directiva ns definimos em que stio na memria de
programa o programa vai comear.
Exemplo:
Inicio org 0x00
movlw 0xFF
movwf PORTB
Estas duas instrues a seguir directiva 'org', so guardadas a partir do endereo 00.
4.8 END Fim do programa
Sintaxe:
end
Descrio:
No fim do programa, necessrio colocar a directiva 'end', para que o tradutor do assembly (assembler), saiba
que no existem mais instrues no programa.
Exemplo:
.
.
movlw 0xFF
movwf PORTB
end

Instrues condicionais

12/8/2003

CAPTULO 4 - Programao em Linguagem Assembly

Pgina 7 de 14

4.9 IF Ramificao condicional do programa


Sintaxe:
if <termo_condicional>
Descrio:
Se a condio em <termo_condicional> estiver satisfeita, a parte do programa que se segue directiva IF,
dever ser executada. Se a condio no for satisfeita, ento executada a parte que se segue s directivas
ELSE ou ENDIF.
Exemplo:
if nivel = 100
goto ENCHER
else
goto DESPEJAR
endif
Directivas similares: ELSE, ENDIF
4.10 ELSE Assinala um bloco alternativo se a condio termo_condicional presente em 'IF' no se
verificar
Sintaxe:
Else
Descrio:
Usado com a directiva IF como alternativa no caso de termo_condicional ser falso.
Exemplo:
if tempo < 50
goto DEPRESSA
else goto DEVAGAR
endif
Instrues similares: ENDIF, IF
4.11 ENDIF Fim de uma seco condicional do programa
Sintaxe:
endif
Descrio:
Esta directiva escrita no fim de um bloco condicional, para informar o tradutor do assembly de que o bloco
condicional terminou.
Exemplo:
if nivel = 100
goto METER
else
goto TIRAR
endif
Directivas similares: ELSE, IF
4.12 WHILE A execuo da seco do programa prossegue, enquanto a condio se verificar
Sintaxe:
while <condio>
.
endw
Descrio:
As linhas do programa situadas entre WHILE e ENDW devem ser executadas, enquanto a condio for
verdadeira. Se a condio deixar de se verificar, o programa dever executar as instrues a partir da linha que
sucede a ENDW. O nmero de instrues compreendidas entre WHILE e ENDW pode ir at 100 e podem ser
executadas at 256 vezes.
Exemplo:
while i < 10
i=i+1

12/8/2003

CAPTULO 4 - Programao em Linguagem Assembly

Pgina 8 de 14

endw
4.13 ENDW Fim da parte condicional do programa
Sintaxe:
endw
Descrio:
Esta directiva escrita no fim do bloco condicional correspondente a WHILE, assim, o assembler fica a saber
que o bloco condicional chegou ao fim.
Exemplo:
while i < 10
i=i+1
.
endw
Directivas similares: WHILE

4.14 IFDEF Executar uma parte do programa se um smbolo estiver definido


Sintaxe:
ifdef < designao >
Descrio:
Se a designao <designao> tiver sido previamente definida (normalmente atravs da directiva #DEFINE), as
instrues que se lhe sucedem sero executadas at encontrarmos as directivas ELSE ou ENDIF.
Exemplo:
#define teste
.
ifdef teste ; como teste foi definido
...............; as instrues nestas linhas vo ser executadas
endif
Directivas similares: #DEFINE, ELSE, ENDIF, IFNDEF, #UNDEFINE
4.15 IFNDEF Execuo de uma parte do programa se o smbolo no tiver sido definido
Sintaxe:
ifndef <designao>
Descrio:
Se a designao <designao> no tiver sido previamente definida ou se esta definio tiver sido mandada
ignorar atravs da directiva #UNDEFINE, as instrues que se seguem devero ser executadas, at que as
directivas ELSE ou ENDIF, sejam alcanadas.
Exemplo:
#define teste
........
#undefine teste
.........
ifndef teste ; como teste no est definido
........ ; as instrues nestas linhas so executadas
endif
Directivas similares: #DEFINE, ELSE, ENDIF, IFDEF, #UNDEFINE

Directivas de Dados
4.16 CBLOCK Definir um bloco para as constantes nomeadas
Sintaxe:
Cblock [< termo >]
<rtulo> [:<incremente>], <rtulo> [:<incremente>]......
endc

12/8/2003

CAPTULO 4 - Programao em Linguagem Assembly

Pgina 9 de 14

Descrio:
Esta directiva usada para atribuir valores s constantes a seguir nomeadas. A cada termo seguinte, atribudo
um valor superior em uma unidade ao anterior. No caso de <incremente> estar preenchido, ento o valor de
<incremente> que adicionado constante anterior.
O valor do parmetro <termo>, o valor inicial. Se no for dado, ento, por defeito, considerado igual a zero.
Exemplo:
cblock 0x02
primeiro, segundo ; primeiro = 0x02, segundo = 0x03
terceiro ;terceiro = 0x04
endc
cblock 0x02
primeiro : 4, segundo : 2 ; primeiro = 0x06, segundo = 0x08
terceiro ; terceiro = 0x09
endc
Directivas similares: ENDC
4.17 ENDC Fim da definio de um bloco de constantes
Sintaxe:
endc
Descrio:
Esta directiva utilizada no fim da definio de um bloco de constantes, para que o tradutor de assembly saiba
que no h mais constantes.
Directivas similares: CBLOCK

4.18 DB Definir um byte de dados


Sintaxe:
[<termo>] db <termo> [, <termo>,......,<termo>]
Descrio:
Esta directiva reserva um byte na memria de programa. Quando h mais termos a quem preciso atribuir
bytes, eles sero atribudos um aps outro.
Exemplo:
db t, 0x0f, e, s', 0x12
Instrues similares: DE, DT
4.19 DE Definir byte na memria EEPROM
Sintaxe:
[<termo>] de <termo> [, <termo>,......,<termo>]
Descrio:
Esta directiva reserva um byte na memria EEPROM. Apesar de ser destinada em primeiro lugar para a memria
EEPROM, tambm pode ser usada em qualquer outro local de memria.
Exemplo:
org H2100
de Verso 1.0, 0
Directivas similares: DB, DT
4.20 DT Definindo uma tabela de dados
Sintaxe:
[<termo>] dt <termo> [, <termo>,......,<termo>]
Descrio:

12/8/2003

CAPTULO 4 - Programao em Linguagem Assembly

Pgina 10 de 14

Esta directiva vai gerar uma srie de instrues RETLW, uma instruo para cada termo.
dt Mensagem , 0
dt primeiro, segundo, terceiro
Directivas similares: DB, DE

Configurando uma directiva


4.21 __CONFIG Estabelecer os bits de configurao
Sintaxe:
__config<termo> ou __config <endereo>, <termo>
Descrio:
So definidos o tipo de oscilador, e a utilizao do watchdog e do circuito de reset interno. Antes de usar esta
directiva, tem que declarar-se o processador atravs da directiva PROCESSOR.
Exemplo:
__CONFIG _CP_OFF & _WDT_OFF & PWRTE_ON & _XT_OSC
Directivas similares: __IDLOCS, PROCESSOR
4.22 PROCESSOR Definindo o modelo de microcontrolador
Sintaxe:
processor <tipo_de_microcontrolador>
Descrio:
Esta directiva, estabelece o tipo de microcontrolador em que o programa vai correr.
Exemplo:
processor 16f84

Operadores aritmticos de assembler

12/8/2003

CAPTULO 4 - Programao em Linguagem Assembly

Pgina 11 de 14

Ficheiros criados ao compilar um programa


Os ficheiros resultantes da traduo de um programa escrito em linguagem assembly so os seguintes:
Ficheiro de execuo (nome_do_programa.hex)
Ficheiro de erros no programa (nome_do_programa.err)
Ficheiro de listagem (nome_do_programa.lst)
O primeiro ficheiro contm o programa traduzido e que vai ser introduzido no microcontrolador quando este
programado. O contedo deste ficheiro no d grande informao ao programador, por isso, no o iremos mais
abordar.
O segundo ficheiro contm erros possveis que foram cometidos no processo de escrita e que foram notificados
pelo assembler durante a traduo. Estes erros tambm so mencionados no ficheiro de listagem list. No
entanto prefervel utilizar este ficheiro de erros err, em casos em que o ficheiro lst muito grande e,
portanto, difcil de consultar.
O terceiro ficheiro o mais til para o programador. Contm muita informao tal como o posicionamento das
instrues e variveis na memria e a sinalizao dos erros.

12/8/2003

CAPTULO 4 - Programao em Linguagem Assembly

Pgina 12 de 14

A seguir, apresenta-se o ficheiro list do programa deste captulo. No incio de cada pgina, encontra-se
informao acerca do nome do ficheiro, data em que foi criado e nmero de pgina. A primeira coluna, contm
o endereo da memria de programa, onde a instruo mencionada nessa linha, colocada. A segunda coluna,
contm os valores de quaisquer smbolos definidos com as directivas: SET, EQU, VARIABLE, CONSTANT ou
CBLOCK. A terceira coluna, tem, o cdigo da instruo que o PIC ir executar. A quarta coluna contm
instrues assembler e comentrios do programador. Possveis erros so mencionados entre as linhas, a seguir
linha em que o erro ocorreu.

12/8/2003

CAPTULO 4 - Programao em Linguagem Assembly

Pgina 13 de 14

No fim do ficheiro de listagem, apresentada uma tabela dos smbolos usados no programa. Uma caracterstica
til do ficheiro list a apresentao de um mapa da memria utilizada. Mesmo no fim, existe uma estatstica

12/8/2003

CAPTULO 4 - Programao em Linguagem Assembly

Pgina 14 de 14

dos erros, bem como a indicao da memria de programa utilizada e da disponvel.

Macros
As macros so elementos muito teis em linguagem assembly. Uma macro pode ser descrita em poucas
palavras como um grupo de instrues definido pelo utilizador que acrescentado ao programa pelo
assembler, sempre que a macro for invocada. possvel escrever um programa sem usar macros. Mas, se as
utilizarmos, o programa torna-se muito mais legvel, especialmente se estiverem vrios programadores a
trabalhar no mesmo programa. As macros tm afinidades com as funes nas linguagens de alto nvel.
Como as escrever:
<rtulo> macro
[<argumento1>,<argumento2>,.....,<argumentoN>]
.........
.........
endm
Pelo modo como so escritas, vemos que as macros podem aceitar argumentos, o que tambm muito til em
programao.
Quando o argumento invocado no interior de uma macro, ele vai ser substitudo pelo valor <argumentoN>.
Exemplo:

O exemplo de cima, mostra uma macro cujo propsito enviar para o porto B, o argumento ARG1, definido
quando a macro foi invocada. Para a utilizarmos num programa, basta escrever uma nica linha: ON_PORTB
0xFF e, assim, colocamos o valor 0xFF no porto B. Para utilizar uma macro no programa, necessrio incluir o
ficheiro macro no programa principal, por intermdio da instruo #include nome_da_macro.inc. O contedo
da macro automaticamente copiado para o local em que esta macro est escrita. Isto pode ver-se melhor no
ficheiro lst visto atrs, onde a macro copiada por baixo da linha #include bank.inc.

Pgina anterior

Tabela de contedos

Pgina seguinte

Copyright 2003. i-magazine e mikroElektronika. All Rights Reserved. For any comments contact
. webmaster

12/8/2003

Você também pode gostar