Você está na página 1de 52

UNIVASF

Microprocessadores e
Microcontroladores
Conjunto de Instrues do
PIC16F877A
Prof. Rodrigo Ramos
godoga@gmail.com

Tipos de Instrues

A famlia PIC16F87XA possui 35 instrues

So divididas basicamente em quatro tipos:

Instrues de transferncia de dados

Instrues de processamento de dados

Instrues de mudana de direo de execuo

Instrues de controle

Tipos de Instrues
Instrues de transferncia de dados: limitam-se a mover dados da memria

de programa para o espao de registradores e entre registradores, sempre


passando pela ULA.

Literal ou endereamento imediato: dados so parte da instruo.

Acesso

direto: usa endereo da instruo mais endereamento do


banco de memria.

Endereameto indexado: atravs dos registradores FSR e INDF.

Tipos de Instrues (cont.)


Instrues de processamento de dados: dado sai do
registrador, passa pela ULA junto com o contedo do
WREG e volta ao registrador ou WREG. Operaes
disponveis:

Adio e subtrao

Incremento e decremento

Limpar registrador (clearing)

Bit setting e bit clearing (resetting)

AND, OR, XOR e complemento bit-a-bit

Tipos de Instrues (cont.)


Instrues de mudana de direo de execuo:
causam desvio na execuo normal do programa

call e goto

Saltos condicionais

Tipos de Instrues (cont.)


Instrues de controle: usadas para funes internas
e controle da CPU. So trs:

NOP: Sem operao. O processador gasta um ciclo


sem executar nenhuma operao.

CLRWDT: Zera o contador watchdog.

SLEEP: aciona o modo de baixa potncia da CPU.

Conjunto de Instrues

Conjunto de Instrues
Nas descries a seguir, criar um projeto no MPLAB para
verificar o funcionamento de cada instruo.

Use o mesmo arquivo, e modifique-o para cada nova


instruo apresentada.

Verifique o estado dos bits do registrador STATUS para


cada instruo, usando o Watch do MPLAB.

Instrues de transferncia de dados

movlw k

Mtodo bsico para carregar w com valor constante:

Ex.: movlw 0x12

movwf f

Copia contedo de w para f.

Ex.: movlw 0x12

movwf 0x20

;carrega w com 0x12

;copia 0x12 para posicao 0x20

movf Variable, d ;Move o contedo de Variable


;pela ULA e seta o flag Zero
;dependendo do seu valor.
;Grava Variable de acordo com
;d = w or f

Instrues de transferncia de dados (cont.)


Copie o seguinte trecho do programa e verifique os
pontos em que o flag Z setado. Isto condiz com o
esperado?

movlw 0x47
movwf 0x20
movlw 0x00
movwf 0x21
movf 0x20, w
movf 0x21, f
goto $

O que acontece se a penltima linha for modificada para


movf 0x21, 0x22 ?

Instrues de transferncia de dados (cont.)

clrw

Limpa o contedo de WREG


clrf f

Limpa o contedo do registrador reg


swapf f,d

Troca o nibble mais significativo pelo menos


significativo do registrador f e guarda de volta em f ou
em WREG. No modifica nenhum flag.

til para carregar WREG sem alterar nenhum flag de


STATUS.

Instrues de transferncia de dados (cont.)


Copie o seguinte trecho do programa e verifique seu
funcionamento, em especial WREG e os flags do STATUS.

movlw 0xF5
movwf 0x20

; Carrega registrador 0x20 com valor


; 0xF5

movlw 0x1F
movwf STATUS

; Seta bits aritmticos de STATUS

swapf 0x20, f
swapf 0x20, w
goto $

O que fazem as duas linhas com o comando swapf?

Instrues de transferncia de dados (cont.)

bcf f,b

Limpa o bit b do registrador f


bsf

Seta o bit b do registrador f


Para verificao, execute o cdigo a seguir:

movlw b'01111111'
movwf 0x20
bsf
0x20, 7
bcf
0x20, 0
goto $

Instrues de transferncia de dados (cont.)


Uso dos bits STATUS<RP1,RP0> para endereamento de
banco

movlw
movwf

0x5A
0x20

bsf
STATUS, RP0
movwf 0x20
goto $

; carrega reg. 0X20 com valor 0x5A

; seleciona banco 1

Usar a janela File Registers para verificar o


funcionamento do programa.

Instrues de transferncia de dados (cont.)


Uso dos bits STATUS<IRP> para endereamento
indexado (indireto)

Registrador FSR o ponteiro e INDF usado para acesso


movlw
movwf

0xAA
FSR

movlw 0x23
movwf INDF
goto $

; carrega FSR com endereo de reg.


; no banco 1 (reg 0xAA)
; carrega valor 0x23 no reg. do
; banco 1

Observe que possvel acessar o banco 1 sem modificar


o bit RP0.

Conjunto de instrues

Identifique o erro no programa a seguir e corrija-o.


clrf
movlw
movwf
goto

TRISC
b'00001111'
PORTC
$

Verificao do espelhamento: ex. PCLATH


movlw
movwf
bsf
movf
goto

0x05
PCLATH
STATUS, RP0
PCLATH
$

Exerccio
Escreva um programa para acionar um display de 7
segmentos atravs da porta B. O programa deve escrever
um nmero qualquer no display.

Dica: utilize a diretiva BANKSEL Reg, que usada pelo


montador para selecionar automaticamente o banco
referente ao registrador Reg.

Utilize o Proteus para verificar o funcionamento do


display, assim como verificar o programa.

Instrues de processamento de dados

addlw k

Adiciona constante k a WREG e guarda em WREG.

Operao: w w + k

Ex.: addlw 55

addwf f,d
Adiciona contedo do registrador f a WREG e guarda
ou em WREG ou no prprio f.

Operao: d w + f

Ex.: addwf 0x20,f

Instrues de processamento de dados (cont.)


Copie o seguinte trecho do programa e verifique os flags C e
DC sendo modificados.

movlw
movwf
addwf

10
0x20
0x20, w

movlw 160
movwf 0x20
addwf 0x20, w
goto $

; adiciona 0x0A a 0x0A


; e guarda em WREG/ Flag DC = 1

; adiciona 0xA0 a 0xA0


; e guarda em WREG/ Flag C = 1

Instrues de processamento de dados (cont.)

subwf f, d
Subtrai do contedo do registrador f o contedo de WREG
e guarda ou em WREG ou no prprio f.

Operao: d f + (-w)

Na verdade: d f + [ (w ^ 0xFF) + 1 ]

XOR

Ex.: Se quisssemos realizar a operao 1 2 no PIC,


faramos:

movlw
movwf
movlw
subwf

1
0x20
2
0x20, w

Carry: emprstimo negativo


Resultado negativo: C = 0
Resultado positivo: C = 1

Instrues de processamento de dados (cont.)

sublw k

Operao: w k + (-w)

Trabalha de modo similar a subwf.

Ex.: Se quisssemos realizar as operaes 1 2 e 2 1 no


PIC, faramos:

movlw 2
sublw 1
movlw 1
sublw 2

O que faz a operao abaixo?

sublw

O que fazer para subtrair um valor de WREG?

addlw

-45

Instrues de processamento de dados (cont.)

decf f, d

incf f, d

Operaes de incremento e decremento de f.

Resultado salvo em d (WREG ou f).

comf f, d
Complementa (inverte logicamente) o contedo do um
registrador f, com resultado salvo em d.

Complemento de 1.

Para complemento de 2, deve-se fazer:


comf f, d
incf f, d

Instrues de processamento de dados (cont.)


Verifique o programa abaixo e tente prever o resultado final
dos registradores 0x20 e WREG.

movlw 47
movwf 0x20
incf
incf
incf

0x20, f
0x20, f
0x20, f

decf
decf
decf

0x20, w
0x20, w
0x20, w

comf
incf

0x20, f
0x20, f

goto

Instrues de processamento de dados (cont.)

andlw k

AND entre k e o contedo de WREG.


andwf f, d

AND entre o contedo de f e o contedo de WREG.


iorlw k

(Inclusive) OR entre k e o contedo de WREG.


iorwf f, d

(Inclusive) OR entre o contedo de f e o contedo de


WREG.
xorlw k

XOR (ou exclusivo) entre k e o contedo de WREG.


xorwf f, d

XOR entre o contedo de f e o contedo de WREG.

Instrues de processamento de dados (cont.)

rlf f, d
Deslocamento esquerda do contedo de f, salvando
resultado em d (rotate left - rl).

Deslocamento com carry STATUS<C>

rrf f, d
Deslocamento esquerda do contedo de f, salvando
resultado em d (rotate right - rr).

Deslocamento com carry STATUS<C>

Instrues de processamento de dados (cont.)


Para que no se perca nenhum bit no processo de
rotao, pode-se usar o seguinte trecho de cdigo
(chamado snippet - fragmento)
rrf Reg, w
rrf Reg, f

Na primeira instruo, o carry carregado com o LSB de


Reg (Reg<0>) e o resultado salvo em WREG.
Na segunda instruo, o carry colocado no MSB de Reg
(Reg<7>).

Instrues de processamento de dados (cont.)


O cdigo a seguir mostra o uso do snippet anterior para
deslocar um bit do registrador 0x20 de 4 posies.

movlw b'00100000'
movwf 0x20
rrf 0x20, w
rrf 0x20, f
rrf 0x20, w
rrf 0x20, f
rrf 0x20, w
rrf 0x20, f
goto $

Exerccio 1
Escreva um programa que incremente o nmero binrio
mostrado em um conjunto de 8 leds conectados ao
PORTB.

O incremento deve ocorrer quando for ativado um boto


(push button) conectado ao pino RA0.

Implemente o dispositivo no protoboard e programe o


PIC16F877A com seu firmware, testando-o nos kits
didticos.

Exerccio 2
Escreva um programa que realize a multiplicao 9 x 5
(note que N x 5 = N x 4 + N x 1).

Lembrar que uma rotao esquerda com um zero em


LSB equivale a uma multiplicao por 2, uma segunda
rotao equivale a multiplicar por 4 e assim por diante.

No usar desvio condicional, apenas as operaes de


transferncia e de processamento de dados.

Exerccio 3
Escreva um programa para somar dois nmeros de 16
bits.

DICA: Utilize labels para especificar os registradores que


guardaro os valores a serem usados. Dica: use a diretiva
CBLOCK para definir blocos de constantes.

CBLOCK 0x20
Var1, Var2, Var3, ..., VarN
ENDC
No usar desvio condicional, apenas as operaes de
transferncia e de processamento de dados.

Instrues de desvio

goto k

Desvia programa para o ponto k (geralmente um label)

Desvio incondicional sem retorno.

Dois ciclos de mquina.

Lembrar que a instruo s consegue enderear 211 bytes =


2048 bytes (0x800). Para valores de labels acima disso, devese usar os bits PCLATH<4:3>.

Organizao da Memria (cont.)

Memria de programa

13 bits para endereamento

8k palavras x 14 bits

0x0800 = 0000 1000 0000 0000


0x1000 = 0001 0000 0000 0000
0x1800 = 0001 1000 0000 0000
HIGH

LOW

Instrues de desvio (cont.)


Como exemplo do uso do goto, considere o cdigo abaixo.
Habilite a opo View Program Memory do MPLAB.

goto
movf

FirstLabel
STATUS, w

; Instruo no executada

FirstLabel:
movlw HIGH SecondLabel ; HIGH retorna o byte mais signif.
movwf PCLATH
goto
SecondLabel
org 0x376
movlw 40
org 0x1B76
SecondLabel:
goto

; Endereco na pagina 3
; Execuo do goto $ abaixo

Instrues de desvio (cont.)

call k

Chamada de subrotina especificada por k.

Operao idntica goto, com exceo de que PC salvo


na pilha.

Dois ciclos de instruo.

Ao fim da sub-rotina, uma instruo return (ou equivalente)


faz com que o fluxo retorne ao ponto seguinte chamada.

Pilha (13-bits x 8)
Topo da
pilha

ULA

Instrues de desvio (cont.)

return

Retorno de sub-rotina.

retlw k
Retorno de sub-rotina, com valor k copiado em WREG, til para
criao de tabelas.

Equivalente a

movlw k
return

retfie

Retorno de interrupo. INTCON<GIE> = 1 (habilita interrupes)


Pilha (13-bits x 8)
Topo da pilha

ULA

Exerccio
Re-escreva o programa para somar dois nmeros de 16
bits, utilizando agora uma sub-rotina, de forma a que seja
possvel realizar a soma diversas vezes a partir da
chamadas sub-rotina.

Instrues de desvio (cont.)

Desvios condicionais s desviam fluxo se condio for verdadeira.

Instrues skip on bit condition - salta a prxima instruo dependendo


da condio do bit testado.

btfsc f, b (bit test file-reg, skip if clear)

btfss f, b (bit test file-reg, skip if set)

Testa o bit b do registrador f e salta prxima instruo se b = 0.


Testa o bit b do registrador f e salta prxima instruo se b = 1.

Tempo de execuo:

1 ciclo se condio for falsa (sem desvio)

2 ciclos se verdadeira (com desvio)

Ex.: Saltar para um endereo se flag Z for 1.


btfsc STATUS, Z
goto Label

; Testa se Z = 0 e salta se V
; Se Z = 1, desvia para Label

Exerccio
Escreva um programa em assembly que compare dois
valores vA e vB. Caso eles sejam iguais, escreva no
registrador 0x25 o valor 0x0E. Caso sejam diferentes,
escreva 0x0D.

Instrues de desvio (cont.)


Desvios condicionais de forma geral, desvios baseados na
comparao de dois valores tm uma forma definida.

Pseudo-cdigo: if (A condio B) then goto Label

Assembly:
movf
FirstValue, w
subwf SecondValue, w
btfs# STATUS, flag
goto Label

Onde FirstValue, SecondValue e # so definidos na tabela a seguir.

Caso sejam usadas constantes, movf e subwf devem ser substitudas


por movlw e sublw.

Instrues de desvio (cont.)

Instrues de desvio (cont.)

Desvios condicionais

incfsz f, d
Incrementa o registrador f, salva resultado em d e salta prxima
instruo se o resultado do incremento for zero.

decfsz f, d
Decrementa o registrador f, salva resultado em d e salta prxima
instruo se o resultado do decremento for zero.

Tempo de execuo:

1 ciclo se resultado no for zero (no salta prxima instruo)

2 ciclos se for zero (salta)

So geralmente utilizados para controle de loops.

Instrues de desvio (cont.)


O cdigo a seguir pode ser usado para repetio de um
trecho de programa 10 vezes.

movlw
movwf

10
0x20

; carrega contador

Loop:
; Instrues a serem executadas repetidamente
decfsz 0x20, f ; decrementa contador
goto Loop
; se no zero, repete
; caso contrrio, continua

Tabelas
Estruturas de dados para armazenamento de constantes e
apontadas por um ndice (banco de dados de uma coluna).

Ex.: Tabela de quadrados de nmeros.

So usadas para retornar valores de acordo com o parmetro


passado tabela.

A forma mais tradicional no PIC com o uso de uma subrotina


que adiciona uma constante ao PC, com o uso da instruo
addwf PCL, f.

No novo endereo, uma instruo retlw usada para salvar


em WREG o valor a ser retornado.

IMPORTANTE: PC incrementado antes da execuo da


instruo!!

Tabelas (cont.)
Exemplo: Programa para determinar quadrado de um nmero
entre 0 e 6.

Quadrado:
addwf
retlw
retlw
retlw
retlw
retlw
retlw
retlw
main
movlw
call
goto
END

PCL,f
0
d'1'
d'4'
d'9'
d'16'
d'25'
d'36'
0x05
Quadrado
$

; PCL incrementado antes da execuo.


; Assim, PCL = 5 + 2 = 7

Tabelas (cont.)
Deve-se ter o cuidado de no haver cruzamento de pgina na
tabela. Se houver, PCLATH deve ser modificado.

Quadrado:
movwf
movlw
movwf
movf
addlw
btfsc
incf
movwf
Quadrado2:
retlw
retlw
...

Temp
HIGH Quadrado2
PCLATH
Temp, w
LOW Quadrado2
STATUS, C
PCLATH, f
PCL
0
1

Exerccio
Escreva um programa em assembly para acionamento
de um display de 7 segmentos usando uma tabela. Os bits
de acionamento dos nmeros de 0 a 9 devem estar
disponveis em uma tabela.

Atrasos (Delays)

Unidade bsica de tempo o ciclo de instruo:

Ciclo de instruo = 4 / freqncia de clock

Ex.: Para um clock de 20 MHz:


Ciclo

de instruo = 4 / 20 MHz = 0,2 us.

Atrasos de tempo podem ser convertidos em ciclos de


instruo pela expresso:

Ciclos de instruo = Atraso de tempo * (Freq. Clock / 4)

Ex.: Para um atraso de 5 ms em um PIC rodando a


20MHz, temos:

Ciclos de instruo = 5 x 10-3 (20 x 106 / 4) = 25.000

Assim, so necessrios 25.000 ciclos de instrues para


obter um atraso de 5 ms.

Atrasos (cont.)
A maneira mais simples de criar atrasos 'gastando tempo' com
instrues.

Para isso, pode-se usar loops que decrementem um contador,


podendo-se contar 256 vezes (ciclos de instruo).

Com um contador duplo, conta-se aproximadamente o quadrado


disto. Ex. Contador de ~(200)2 = 400.000 ciclos = 0.008 s (clock de
20MHz)

delay:
movlw .200 ; w = 200 decimal
movwf j ; j = w
jloop:
movwf k ; k = w
kloop:
decfsz k,f ; k = k-1, pula se zero
goto kloop
decfsz j,f ; j = j-1, pula se zero
goto jloop
return

Atrasos (cont.)

Forma alternativa:

delay:
movlw
LOW Valor
movwf
DelayL
movlw
HIGH Valor
movwf
DelayH
loop:
decf
DelayL, f
btfsc
STATUS, Z
decfsz DelayH, f
goto loop
return

Valor = ((atraso * freqncia/4)/5) + 256


Ex.: 20 ms com clock 4 MHz
Valor = ( (20 x 10-3 x 1 x 106) / 5) + 256 = 4.256 = 0x10A0

Atrasos (cont.)
Para atrasos maiores, usa-se loop
externo.

Valor pode ir at 65.535 (0xFFFF).


Porm, por facilidade, faz-se Valor
mximo = 50.256 (0xC450), o que d
250.000 ciclos (0.05 s com 20MHz).

Para ~1 s, repete-se 20 vezes o


loop.

Exerccio: Testar cdigo ao lado


para que acenda e apague um led
conectado ao pino RB0.

delay:
movlw
movwf
loopExt:
movlw
movwf
movlw
movwf
loop:
decf
btfsc
decfsz
goto
decfsz
goto
return

4
ValorRep
LOW Valor
DelayL
HIGH Valor
DelayH
DelayL, f
STATUS, Z
DelayH, f
loop
ValorRep
loopExt

Exerccio
Escreva um programa em assembly que acenda 4 leds na
barra grfica, cada um sendo acionado durante ~100ms
com os demais apagados, enquanto um valor digital 1
esteja presente em um pino de entrada.
Se o pino estiver em nvel 0, desativar todos os leds.
Utilize uma rotina de atraso para gerar os 100ms.

Bibliografia

MPASM User's Guide, Microchip Technology Inc., 2005.

PIC16F87xA Data Sheet, Microchip Technology Inc., 2003.

M. Predko, Programming and Customizing the PIC


Microcontroller, 3rd. Ed., McGraw-Hill, 2008.

F. Pereira, Microcontroladores PIC: Tcnicas Avanadas


16F627 e 16F628, 5a. Ed., rica, 2008.