Baixe Conjunto de Instruções do PIC e outras Exercícios em PDF para Linguagem de Programação, somente na Docsity!
4 - Conjunto de Instruções do PIC
O microcontrolador PIC16F628A apresenta em seu nível ISA 35 instruções, A
maioria das instruções são executadas em apenas um ciclo de máquina,
lembrando que o um ciclo de máquina, corresponde ao clock de entrada
divido por 4. O Datasheet do PIC16F628A, divide o conjunto de instruções do
PIC em três tipos:
Orientadas a bit (Bit-Oriented): Operam com bits de um determinado
registador;
Orientadas a byte (Byte-Oriented): Operam com registradores
completos (bytes);
Literal ou controle (Literal and control): Instruções que usam literais
(números ou endereços) como operando.
4.1 Formato do conjunto de instruções
Cada instrução do PIC16F628A tem o tamanho de 14 bits, onde alguns destes
bits são usados para especificar o OPCODE (nome dado ao "comando"
assembly), e de zero até dois operandos. Por conveniência, neste material a
ultima categoria foi dividida em literal e controle.
O formato das instruções pode variar de acordo com o tipo, abaixo o formato
da instrução do PIC para cada tipo. A figura abaixo mostra os formatos de
instrução do PIC16F628A.
Figura 15-1 do Datasheet
As tabelas seguintes apresentam todas as instruções do PIC16F628A, com os
seus respectivos operandos.
Orientadas a bit
Mnemônico ciclos Descrição OPCODE
BIT
REGISTRADOR
(00h - 127h) BCF f,b 1 Limpa (zera) o bit b do registrador f
0 1 0 0 B B B F F F F F F F
BSF f,b 1 Seta (iguala a 1) o bit b do registrador f
0 1 0 1 B B B F F F F F F F
BTFSC f,b 1(2) Testa o Bit b de f, pula se zero(clear)
0 1 1 0 B B B F F F F F F F
Mnemônico ciclos Descrição OPCODE K literal RETURN 2 Retorna de uma subrotina chamada por CALL
RETFIE 2
Retorna de uma interrupção
SLEEP 0
Põe o controlador em stand-by
Mnemônico ciclos Descrição OPCODE K posição de memória CALL k 2 Salva PC+1 na pilha e faz PC=k (salta a execução para o endereço k)
1 1 0 K K K K K K K K K K K
GOTO k 2 Pula para o endereço k (11 bits) usa 2 ciclos
1 0 1 K K K K K K K K K K K
Operações com literais
Mnemônico ciclos Descrição OPCODE K literal MOVLW k 1 Move literal to W (W = k) 1 1 0 0 X X K K K K K K K K RETLW K 1 faz W=k e retorna de uma subrotina
1 1 0 1 X X K K K K K K K K
IORLW k 1 W = k OR W 1 1 1 0 0 0 K K K K K K K K ANDLW k 1 W = k AND W 1 1 1 0 0 1 K K K K K K K K XORLW k 1 W = k AND W 1 1 1 0 1 0 K K K K K K K K SUBLW k 1 W = k - W 1 1 1 1 0 X K K K K K K K K ADDLW k 1 W = k + W 1 1 1 1 1 X K K K K K K K K Legenda: X = não importa o valor do bit k = o bit pertence a um literal f = O bit pertence a um endereço de registrador d = onde o resultado será armazenado W(d=0) ou F(d=1)
4.2 Mnemônicos
Uma instrução do PIC é normalmente da seguinte forma:
INST OP1,OP
Onde INST é o OPCODE da instrução e OP1 e OP2 são os operandos. Uma
instrução pode ter zero, um ou dois operandos. Um operando pode ser um
Literal (k), um registrador (f), bit (b onde 0≤b≤7) ou um destino (d), onde d=
work e d=1 file;
O nome das instruções do PIC são construídos de acordo com certa lógica.
Entender essa lógica pode facilitar muito o trabalho do programador, pois com
esse entendimento é mais fácil decorar o set de instruções do PIC e os seus
operandos, e diminuir eventuais consultas a documentação na hora de ler um
código. Os termos abaixo são usados na construção dos nomes de instrução:
(W)ork – Refere-se ao registrador temporário W. Observando o esquema
interno do PIC é possível perceber que esse registrador está localizado na
saída da ULA. Quase todas as operações sobre bytes, de alguma forma,
envolvem esse registrador. As instruções que manipulam esse registrador
diretamente tem o W na sua formação.
(L)iteral – Refere-se a um valor numérico. Pode ser escrito na forma binária,
decimal ou hexadecimal. As instruções que operam com literais apresentam o
L na sua formação.
(F)ile – Refere-se a uma posição de memória (File Register). As instruções
que operam diretamente com registrador apresentam um F na sua formação.
Ex.: Para fazer uma atribuição do tipo:
A=
É necessário carregar W com o valor do literal 25 e depois carregar o
conteúdo do registrador W na posição representada por A.
A equ H'007' ... MOVLW d'25' ; Move o (L)iteral (25 no caso) para (W)ork MOVWF A ; move (W)ork para (F)ile (A no caso)
Observe que as referencias a W, são implícitas, ou seja, não aparecem nos
operandos.
(B)it – Refere-se a um bit específico do registrador F, as instruções que
operam diretamente com bit tem um B na sua formação.
(S)et/(C)lear – Refere-se a ação de por em nível lógico um (set) ou zero
(clear) um determinado registrador (neste caso o pic só permite zerar um
registrador específico) ou bit específico do registrador. As instruções que
setam um determinado bit apresentam S na sua formação.
São exemplos:
BCF 0x5h,3 ; Bit Clear File – zera Bit 3 de 0x5h BSF 0x5h,3 ; Bit Set File- Faz o bit 3 de 0x5h igual a 1
(T)est – Refere-se ao ato de testar uma determinada condição que está
associada a um um bit específico do registrador F. As instruções que fazem
testes tem o T na sua formação.
ORG 0x00 ;Vetor de reset GOTO INICIO INICIO BSF 3H,5 ;Liga o Bit 5 (RP0) do registrador 3h (STATUS); Seleciona banco ;de memória 1. TRISA e TRISB estão no banco 1 MOVLW b'0000000' ;Move zero para o registrador W (o mesmo que CRLW) MOVWF 86H ; Move W para o registrador 86H (TRISB) ou Seja TRISB= ;Todos pinos do PORTB estão configurados com output BCF 3H,5 ;Desliga o Bit 5 (RP0) do registrador 3h (STATUS) seleciona o ;banco de memória 0 MAIN BSF 6h,2 ;Liga o pino 0 do PORTB (RB2) GOTO MAIN END
Listagem 1: Hello World
Laboratório: Para veficiar o funcionamento di código acima através de
simulação, favor execute o laboratório 1
A seguir um breve comentário sobre as principais instruções exibidas na
tabela acima
4.4 INSTRUÇÕES ORIENTADAS A BYTE
Movimentação de dados (MOVLW, MOVWF, MOVF)
O fluxo de movimentação dos dados pode ser mapeado conforme a figura
abaixo:
O movimento 1 é executado pela instrução MOVLW LITERAL. Essa
instrução preenche o registrador W com o valor informado em Literal requer
apenas um operando que é justamente o literal que será movimentado, se
observamos o formato da instrução MOVLW na tabela no inicio do capítulo
veremos que 8 bits estão disponíveis para representar esse literal, desta forma
o maior literal que pode ser armazenado em W é 255.
O movimento 2 é feito pela instrução MOVWF END , essa instrução copiará
no endereço informado em END o valor armazenado em W. Observando a
tabela no inicio do capítulo pode-se verificar que existe apenas 7 bits
disponíveis para informar endereço, o que torna a instrução capaz de
endereçar apenas 128 posições (0-127), entretando o intervalo de
endereçamento de dados do pic vai até o endereço 511, como foi mostrado no
capitulo anterior. Para resolver esse problema a memória do PIC foi dividida
em bancos que podem ser selecionados usando os bits 6 e 5 do
registrador status (endereço 3h)
O movimento 3 é feito pela instrução MOVF END,DST. Essa instrução recebe
2 operandos END e DST , onde END é o endereço do dado que será
movimentado e DST é o destino da movimentação. Se DST=0 a
movimentação será feita para registrador W. Se DST=1 a movimentação será
para o mesmo endereço apontado por END, ou seja copia o valor para ele
mesmo. A questão que pode surgir é para que serve fazer uma cópia para ele
mesmo? E a resposta é para verificar se um valor armazenado em uma posição
de memória é igual 0. Mais sobre isso na seção dicas de programação.
Resumindo é o seguinte: Todo valor literal para chegar a algum registrador
(posição de memória) tem que necessariamente passar pelo acumulador W.
Sendo assim para atribuir algum valor a algum registrador primeiro
precisamos movê-lo para o acumulador W e em seguida mover o conteúdo de
W para o registrador em questão. Ex:
MOVLW d'45' ; literal para W MOVWF 85h ; W para (F) memória
Já para mover o conteúdo de um registrador (EX: 05h->06h) para outro existe
a função MOVF:
MOVF 05h,0 ; F para W (indicado pelo 0 no segundo operando) MOVWF 06h Limpar registradores (CLRW, CLRF)
Uma questão que é sempre necessária em qualquer programa é a inicialização
de variáveis com o valor 0. Desta forma para se zerar um determinado
registador podemos usar as seguintes instruções:
MOVLW 0x MOVWF 05h
Irá fazer o conteúdo de 07H igual á 32 (em Hexa é 20H e em binário é
00100000). Por outro lado a instrução instrução RLF ( Rotate Left File )
rotacionará o registrador para esquerda. Aplicando essa instrução ao mesmo
registrador (com valor 16) do exemplo anterior:
RLF 07H,
Irá fazer o conteúdo de 07H igual á 8 (em Hexa é 8H e em binário é
SWAPF
A instrução SWAPF troca os nibbles(sequencia de 4 bits) alto e baixo de um
registrador. Por exemplo imagine que o conteúdo do registrador 08H seja FEh
(em decimal é 254 e em binário é 11111110):
SWAPF 08H,
Após a execução da instrução acima o conteúdo do registrador 08H será EFh
(em decimal é 239 e em binário é 11101111).
4.6 INSTRUÇÕES DE CONTROLE
O Modelo de execução de qualquer computador prevê que o fluxo de
execução das instruções é sequencial. Em alguns casos é necessário desviar o
fluxo normal de execução para algum outro ponto do programa. Existem três
tipos de situações que podem levar a um desvio de fluxo: Desvios
(condicional ou não), Chamada de Procedimento (CALL) e uma interrupção
de hardware. O conjunto de instruções do PIC oferece algumas alternativas
para programar esse desvio.
4.6.1 Desvios condicionais
Um desvio condicional muda o fluxo de execução do programa, se alguma
condição for verdadeira. As instruções de desvio condicional do PIC, não
permitem a especificação de um endereço especifico para o salto, o que
ocorrem é um salto da próxima instrução caso a condição seja verdadeira.
Instruções do PIC que se encaixam nesta categoria estão na tabela abaixo.
Mnemônico operandos Limites Descrição INCFSZ f,d 0 ≤ f ≤ 127 0 ≤ d ≤ 1 Incrementa o conteúdo de F, armazena o resultado em W (d=0) e em F se d=1, salta se o resultado da operação for ZERO. DECFSZ f,d 0 ≤ f ≤ 127 0 ≤ d ≤ 1 Decrementa o conteúdo de F, armazena o resultado em W (d=0) e em F se d=1, salta se o resultado da operação for ZERO.
BTFSC f,b 0 ≤ f ≤ 127 0 ≤ b ≤ 7 Salta se o bit b do registrador f estiver em nível lógico 1. BTFSS f,b 0 ≤ f ≤ 127 0 ≤ b ≤ 7 Salta a instrução se o bit b do registrador f estiver em nível lógico 1.
Essas instruções normalmente são usadas em conjunto com a instrução
GOTO. Vejamos alguns exemplos.
Comparação
A comparação é o principal recurso usado pelo programador para tomar
decisões sobre a execução de um determinado bloco de código. Qualquer
linguagem deve fornecer a possibilidade de realizar comparações. Abaixo um
exemplo de uma comparação:
SE A=B PORTA= ELSE PORTA=
Observe o conjunto de instruções do PÌC não fornece diretamente uma
instrução de comparação. Em geral as comparações são feitas usando
subtrações (SUB), nestes casos é feita a subtração entre dois operandos e
observado os bits Z e C do registrador STATUS. Por exemplo:
SUBLW D'15' ; W = 15-W
Se W=15 então Z (STATUS,2) = 1
Se W<15 então Z (STATUS,2) = 0 e C (STATUS,0)=
Se W>15 então Z (STATUS,2) = 0 e C (STATUS,0)=
Na implementação Abaixo estamos comparando o conteúdo dos registadores
0x07(A) e 0x08(B). Se o conteúdo destes registradores apresentarem valores
iguais, liga-se o Bit RA3, caso contrário liga RA3 e RA4. Observe que nos
exemplos , os conteúdos das posições A e B não foram definidos.
STATUS EQU H'003' PORTA EQU H'005' A EQU H'020' B EQU H'021' W EQU D'0' MOVF A,W ; Move o valor de A para W SUBWF B,W ; Subtrai B d W e armazena o resultado em W
RETLW k 0 ≤ k ≤ 255 Armazena k em W e faz PC=topo da pilha. Deve ser chamado em conjunto com CALL. RETFIE - - Instrução de Retorno de uma interrupção.
4.7 ANATOMIA DE UM PROGRAMA ASM(PIC)
Aqui falaremos de: ORG, END, INCLUDE e DEFINE
Bosco Junior© 2011
Dicas de programação
7.1 Comparação entre dois valores
Como fazer comparação com o PIC uma vez que ele não dispõe de instrução
de comparação?
A resposta é simples: usando uma instrução de subtração (SUBLW ou
SUBWF) e os bits Z e C/B do registrador STATUS. O fato é que quando se
executa uma instrução, isso pode afetar as Flags Z, DC e C do registrador e a
maneira como essas flags serão afetadas depende diretamente da relação entre
os números.
observe a instrução abaixo:
SUBLW X ;(w=X-w)
Três resultados são possíveis:
Se a flag Z(STATUS,Z)=1, Significa que o resultado da operação foi ZERO ,
então são iguais (X=w);
Se a flag C(STATUS,C)=0, Siginifica que houve um "pedir emprestado",
então X é menor que w (X<w);
Se as flags Z(STATUS,Z)=0 C(STATUS,C)=1, Siginifica que não houve um
"pedir emprestado", então X é maior que w (X>w).
7.1.1 Comparação com zero
No caso específico de uma comparação com zero a Instrução MOVF
simplifica bastante o código, haja vista que ela também manipula a Flag Z
(STATUS,Z). Ou seja se no conteúdo do endereço manipulado estiver o valor
0 então a Flag Z será setada. Observe o código abaixo:
SE I==0 ENTÃO I=I+ ELSE I=I-
Listagem 7.
MOVF 20H,1 ; Move de 20H para 20H BTFSC 03H,2 ; Checa se Z(STATUS,2)==0 Se sim I(20H)<> então pula GOTO INCR ; var para rotina de incremento DECF 20H,1 ; Pulou, ou seja I(20H)<>0 decrementa GOTO FIMIF ; Evita executar a rotina de incremento desnecessariamente INCR INCF 20H,1 ; incrementa FIMIF
Listagem 7.
7.1.2 Comparação com um valor qualquer
Observe o pseudo-código abaixo:
SE I==100 ENTÃO I=I+