Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Conjunto de Instruções do PIC, Exercícios de Linguagem de Programação

Uma visão geral do conjunto de instruções do microcontrolador pic16f628a, incluindo os três tipos de instruções (orientadas a bit, orientadas a byte e de controle), a lógica de construção dos nomes das instruções, exemplos de uso e uma explicação sobre como realizar comparações utilizando as flags do registrador de status. O documento fornece informações detalhadas sobre o funcionamento interno do pic e como programá-lo, sendo útil para estudantes e profissionais que trabalham com microcontroladores pic.

Tipologia: Exercícios

2022

Compartilhado em 22/05/2024

mateus-henrique-8z5
mateus-henrique-8z5 🇧🇷

2 documentos

1 / 15

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
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.
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff

Pré-visualização parcial do texto

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+