Trabalho de Microcontroladores Familia 16fXXX

38
1 FACULDADE POLITECNICA DE UBERLANDIA - FPU Ângelo Henrique Dias – EEN8A Edson dos Anjos Teixeira – EMN8A Murilo Barbosa Lopes – EEN8A Rodrigo Lucio de Melo – EMN8A MICROCONTROLADORES PIC – Familia 16FXXX

description

microcontroladores

Transcript of Trabalho de Microcontroladores Familia 16fXXX

Page 1: Trabalho de Microcontroladores Familia 16fXXX

1

FACULDADE POLITECNICA DE UBERLANDIA - FPU

Ângelo Henrique Dias – EEN8AEdson dos Anjos Teixeira – EMN8A

Murilo Barbosa Lopes – EEN8ARodrigo Lucio de Melo – EMN8A

MICROCONTROLADORESPIC – Familia 16FXXX

Uberlândia2015

Page 2: Trabalho de Microcontroladores Familia 16fXXX

2

Ângelo Henrique Dias – EEN8AEdson dos Anjos Teixeira – EMN8A

Murilo Barbosa Lopes – EEN8ARodrigo Lucio de Melo – EMN8A

MicrocontroladoresPIC – Familia 16FXXX

Trabalho apresentado para obtenção da nota parcial da disciplina Microcontroladores 8º período do curso de Engenharia de Controle e Automação e Engenharia Elétrica da Faculdade Politécnica , realizado no 1º Semestre de 2015, tutorado pelo Prof. Jean Claude Richard.

Uberlândia2015

Page 3: Trabalho de Microcontroladores Familia 16fXXX

3

MICROCONTROLADORES DA FAMILIA PIC 16FXXX

SUMARIO

1. INTRODUÇÃO 5

2. SUA ARQUITETURA 5

2.1- ARQUITETURA INTERNA DO PIC 16F84 6

3. ORGANIZAÇÃO DO SISTEMA DE MEMORIA 7

3.1- MEMORIA DO PROGRAMA 7

3.2- MAPA DE MEMORIA DO PROGRAMA 7

3.3- MAPA DE MEMORIA DE DADOS E REGISTROS DE

CONTROLE

8

3.4- MEMORIA DE USO GERAL 9

3.5- ARQUITETURA DE REGISTROS ESPECIAIS - SFR 9

4. REGISTRADORES 10

4.1 – REGISTRADOR DE STATUS 10

4.2- REGISTRADOR OPTION_REG 11

4.3- REGISTRADOR INTCOM 13

4.4- REGISTRADOR PCL 14

4.5- REGISTRADOR STACK 15

4.6- REGISTRADOR INDF E FSR 15

4.7- REGISTRADOR PORTA E PORTB 15

4.8- REGISTRADOR TRISA E TRISB 15

5. CONJUNTO DE INSTRUÇÕES DO PIC 16

5.1- FORMATO DO CONJUNTO DE INSTRUÇÕES 16

5.1.1- ORIENTADAS A BITE 17

5.1.2- ORIENTADAS A BYTE 17

5.1.3- DE CONTROLE (QUANDO EFETUAM DESVIO

GASTAM 2 CICLOS)

18

5.1.4- OPERAÇÕES COM LITERAIS 19

5.2- MNEMONICOS 20

5.3- INSTRUÇÕES ORIENTADAS A BYTE 23

5.4- INSTRUÇÕES ORIENTADAS A BITE 26

Page 4: Trabalho de Microcontroladores Familia 16fXXX

4

5.5- INSTRUÇÕES DE CONTROLE 27

5.5.1- DESVIOS CONDICIONAIS 27

5.5.2- COMPARAÇÃO 28

5.5.3- LAÇO 30

5.5.4- DESVIOS INCONDICIONAIS 30

6. BIBLIOGRAFIA 32

Page 5: Trabalho de Microcontroladores Familia 16fXXX

5

1- INTRODUÇÃO

Microcontrolador é um circuito integrado que possui em um único chip um

microprocessador, memórias Flash, EEPROM e RAM, dispositivos de entrada e

saída e periféricos como comparadores de tensão, conversores de A/D

(analógico para digital), UART e outros.

Na sua historia de criação podemos encontrar duas datas, uma de 1969 onde

uma empresa Japonesa Busicon encaminhou seus engenheiros com um projeto

para os Estados Unidos para que fosse possível sua fabricação e utilização em

suas calculadoras. Esse projeto acabou senso o percusor do primeiro

microprocessador 4004 da Intel, a segunda data marca 1971, conforme dados do

Institute Smithsonian dos Estados Unidos dois engenheiros da Texas

Instruments, Gary Boone e Michael Cochram criaram o TMS 1000, que era um

microcontrolador de 4 bits com ROM e RAM.

O microcontrolador PIC da família 16FXXX é fabricado pela Microchip uma

empresa americana e representada no Brasil pela Artimar.

2- SUA ARQUITETURA

Após varias pesquisas que diferem de alguns escritores e pesquisadores a

arquitetura do microcontrolador da família PIC é a Havard, conforme figura

abaixo.

Fig.01- Arquitetura Havard

Page 6: Trabalho de Microcontroladores Familia 16fXXX

6

A arquitetura Harvard utiliza um barramento para memória de dados e um

barramento para memória do programa se diferenciando da aquitetura Von-

Newmann que utilizava somente um barramento para as memórias de dados e

programas.

A arquitetura Havard utiliza a tecnologia de estrutura RISC (Reduced

Instruction Set Computer), ou seja Computador com Conjuto de Instruções

Reduzidas.

Hoje existem microcontroladores que suportam instruções e 8 bits ate 32 bits.

2.1- ARQUITETURA INTERNA DO PIC 16F84

Fig.02- Arquitetura Interna PIC 16F84

Page 7: Trabalho de Microcontroladores Familia 16fXXX

7

Os membros da família PIC 16FXXX podem acessar tanto direta com

indiretamente qualquer posição de memória RAM ou registros internos, pois

estão mapeados no mesmo bloco de memória.

3- ORGANIZAÇÃO DO SISTEMA DE MEMORIA

A organização do sistema de memória da família do microcontroladores PIC

16FXXX e dividade em:

Memória de programa;

Memoria de dados e registros de controle;

Memoria de uso geral

Arquivos de registros especiais (SFR- Special File Register)

3.1- MEMORIA DE PROGRAMA

A memória de programa varia em tamanho e organização. Nos membros da

família PIC 16FXXX, a memória de programas é dividida em paginas, isso se

deve a limitação de endereçamento direto dado pelo controlador de programa

(PC) que tem 13.

O PIC 16F84 possui apenas 1K implementado (de 00 a 3FF). Qualquer

referencia a outras posições de memórias serão deslocados para esse bloco de

1K.

3.2- MAPA DE MEMÓRIA DE PROGRAMA

O Stack (pilha) que tem um espaço reservado que não fazem parte da memória

utilizável pelo usuário.

O espaço utilizável que vai de 000h ate 3FFh (1024 posições de 14 bits)

Page 8: Trabalho de Microcontroladores Familia 16fXXX

8

O Reset de Vetor 000h é a primeira posição que o PC aponta quando o PIC é

resetado.

Quando recebe um pedido de interrupção externa o PC aponta para o Vetor

de Interrupção com endereço 00C4h

Fig.03- Mapa de Memoria de Programa

3.3- MAPA DE MEMORIA DE DADOS E REGISTRO DE CONTROLES

A memória de dados e de registro de controles nada mais são que um grupo

de memória RAM, organizada em dois bancos de regustradores, bancos 0 e 1.

Os registros especiais e as memórias de dados estão organizados conforme

figura abaixo. Temos o banco 0 e o banco 1, que serão selecionados através de

dois flags, 2 bits , RP0 e RP1 , podendo selecionar ate 4 bancos. Como o 16F84

so possui dois bancos o RP1 ficará sempre 0.

Page 9: Trabalho de Microcontroladores Familia 16fXXX

9

Fig.04- Mapa de Memoria de Dados e Registro de Controle

Lembrando que a memória RAM quando do sistema desligado o sistema os

dados nela gravado serão apagados.

3.4- MEMORIA DE USO GERAL

A memória de uso geral se estende do endereço 0Ch ate 4Fh (no banco 0),

totalizando 68 bits disponível ao usuário. No banco 1 de 8Ch ate CFh que esta

mapeado no banco 0, ou seja, qualquer endereço no banco 0 sera espelhado no

banco 1, o que na verdade significa que se acessar o endereço 0Ch é o mesmo

que acessar o endereço 8Ch.

Esta memória e usada para alocar variáveis, bem como, salvar informações

uteis quando houver chamada de sub-rotina ou pedido de interrupções.

Page 10: Trabalho de Microcontroladores Familia 16fXXX

10

3.5- ARQUIVOS DE REGISTROS ESPECIAIS (SFR – SPECIAL FILE

REGISTER)

Os SFR ou melhor dizendo os registros de controle ocupam posições de

memória RAM que vai do enderço 00h ate 0Bh no banco 0 e de 80h ate 8Bh no

banco 1, onde cada posição com o seu respectivo endereço recebe um nome.

Alguns registros se repetem no banco 0 e no banco 1, podendo ser programado

tanto no banco 0 como no 1. Tanto registro como memória de dados de uso geral

são 8 bits.

A maioria destes registros podemos programar bit a bit, pois são através

deles que teremos o controle do PIC.

INDF Endereçamento Indireto

TMR0 Registro de contagem do timer 0

PCL Parte baixa do contador de progama

STATUS Registro de Status para controle da CPU

FSR Ponteiro para o endereçamento indireto

PORTA Registro dos pinos da porta A

PORTB Registro dos pinos da porta B

Em branco Não implementado

EEDATA Dado ligado/gravado na EEPROM

EEADR Endereço para ler/gravar na EEPROM

PCLATH Parte alto contador de programa

INTCON Registro INTCON para controle da CPU

OPTION Registro Option para controle da CPU

TRISA Direção dos pinos da porta A

TRISB Direção dos pinos da porta B

EECON1 Controle da EEPROM

EECON2 Controle da EEPROM

Fig.05- Tabela do que significa cada bloco de memória

4- REGISTRADORES

Page 11: Trabalho de Microcontroladores Familia 16fXXX

11

Os registradores do PIC16F84 estão divididos em duas partes. A primeira é

conhecida como SFR (Registros de Função Especial) e GPR (Registros de Propósito

Geral). Estes registros dividem-se em dois bancos. 

4.1- REGISTRADOR STATUS

Este registrador possui o estado atual da Unidade Lógica Aritmética,

do Reset e do banco de registros selecionado.

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

Leitura Leitura Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

IRP RP1 RP0 TO PD Z DC C

bit 7 bit 0

Fig.06- Tabela de estado ULA

bit 7 - IRP – Este registro não é utilizado pela PIC16F84, sempre lido sempre como

“0”

bit 6, 5 - RP1, RP0 – Registros de seleção do banco de registros

00 = Banco 0 (00H – 7FH)

01 = Bano 1 (80H – FFH)

bit 4 - TO – Time-out

1 = Após power-up (ligar), instrução CLRWDT (limpar Cão de Guarda) ou

instrução SLEEP (dormir)

0 = Um time-out do WDT ocorreu

bit 3 - PD – Power-down

1 = Após power-up (ligar) ou instrução CLRWDT (limpar Cão de Guarda)

0 = execução da instrução SLEEP (dormir)

bit 2 - Z – Zero

Page 12: Trabalho de Microcontroladores Familia 16fXXX

12

1 = O resultado da operação aritmética ou lógica é igual a zero.

0 = O resultado da operação aritmética ou lógica não é zero.

bit 1 - DC – Digito Carry/borrow

1 = Ocorreu um transbordamento do 4º bit menos significativo

0 = Não ocorreu o transbordamento do 4º bit menos significativo

bit 0 - C – Carry

1 = Ocorreu um transbordamento do 7º bit mais significativo

0 = Não ocorreu um transbordamento do 7º bit mais significativo

4.2- REGISTRADOR OPTION_REG

Com este registrador podemos configurar a interrupção externa através de

RB0, a interrupção do timer, o divisor para o timer e os resistores de pull-up da parte

mais significativa do PORTB.

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0

bit 7 bit 0

Fig.07- Tabela da Interrupção do Timer

bit 7 - RBPU – Habilita/desabilita pull-up’s do PORTB

1 = pull-up desabilitados

0 = pull-up habilitado

bit 6 - INTEDG – Seleção de borda para interrupção

Page 13: Trabalho de Microcontroladores Familia 16fXXX

13

1 = Interrupção ativa na subida de borda em RB0/INT

0 = Interrupção ativa na descida de borda em RB0/INT

bit 5 -T0CS – Captura do clock do timer

1 = Transição em RA4/T0CKI

0 = Instrução interna, oscilador interno

bit 4 - T0SE – Seleção de borda para clock

1 = Incrementa no nível alto para baixo na transição em RA4/T0CKI

0 = Incrementa no nível baixo para alto na transição em RA4/T0CKI

bit 3 - PSA – Seleção da Divisão Escalar do Timer

1 = Divisão ligada ao WDT

2 = Divisão ligada ao TMR0

bits 2..0 - PS2...PS0 – Divisão para contagem do timer e WDT (Cão de Guarda)

Valor Proporção no TMR0 Proporção no WDT

000 1 : 2 1 : 1

001 1 : 4 1 : 2

010 1 : 8 1 : 4

011 1 : 16 1 : 8

100 1 : 32 1 : 16

101 1 : 64 1 : 32

110 1 : 128 1 : 64

111 1 : 256 1 : 128

Fig.08- Tabela WDT (Cão de Guarda)

4.3- REGISTRADOR INTCOM

Este registrador controla as várias interrupções. Também podemos, através

deste registrador, saber exatamente qual interrupção foi solicitada.

Page 14: Trabalho de Microcontroladores Familia 16fXXX

14

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

Escrita

Leitura

GIE EEIE T0IE INTE RBIE T0IF INTF RBIF

bit 7 bit 0

Fig.09 – Configuração do INTCOM

bit 7 - GIE – Bit de habilitação global das interrupções

1 = Habilita todas as interrupções

0 = Desabilita todas as interrupções

bit 6 - EEIE – Habilita interrupção de “fim de escrita” para EEPROM

1 = Habilita interrupção de “fim de escrita”

0 = Desabilita interrupção de “fim de escrita”

bit 5 - T0IE – Habilita interrupção para over-flow do Timer

1 = Habilita interrupção pelo timer

0 = Desabilita interrupção pelo timer

bit 4 - INTE – Habilita interrupção pelo pino RB0/INT

1 = Habilita interrupção pelo pino RB0/INT

0 = Desabilita interrupção pelo pino RB0/INT

bit 3 - RBIE – Habilita interrupção na mudança de estado no PORTB

1 = Habilita interrupção na mudança de estado no PORTB

0 = Desabilita interrupção na mudança de estado no PORTB

bit 2 - T0IF – Flag para leitura da interrupção over-flow para o timer

1 = Houve interrupção pelo timer

0 = Não houve interrupção pelo timer

bit 1 - INTF – Flag para leitura da interrupção pelo pino RB0/INT

Page 15: Trabalho de Microcontroladores Familia 16fXXX

15

1 = Houve interrupção pelo pino RB0/INT

0 = Não houve interrupção pelo pino RB0/INT

bit 0 - RBIF – Flag para leitura da interrupção na mudança de estado no PORTB

1 = Houve interrupção na mudança de estado no PORTB

0 = Não houve interrupção na mudança de estado no PORTB

4.4- REGISTRADOR PCL

Este registrador contém o endereço da instrução a executar. Ele é

incrementado automaticamente e contém os 8 bitsmenos significativos do PC

(Progam Couter).

4.5- REGISTRADOR STACK

Este registrador contém os endereços de retorno para as sub-rotinas que

utilizam a instrução CALL ou de retorno após a execução de uma interrupção. Note

que no PIC16F84 só existem 8 níveis de stack, ou seja, não é possível executar

mais que oito instruções CALL sem executar ao menos uma instrução RETURN. Se

isso for ignorado, o PIC ficarrá “desorientado” e o microcontrolador não funcionará

corretamente.

4.6- REGISTRADORES INDF e FSR

Estes registradores permitem endereçar indiretamente o banco de memória

RAM. Isso é muito útil quando deseja-se, por exemplo, escrever ou ler dados

seqüencialmente na memória. O registrador FSR deve conter o endereço indireto de

memória que precisa-se ler ou escrever. No registro INDF será encontrado o dado

do endereço apontado indiretamente por FSR.

4.7- REGISTRADORES PORTA e PORTB

Page 16: Trabalho de Microcontroladores Familia 16fXXX

16

Estes registradores contêm o estado atual dos “port’s” de I/O. Pode-se

através de instruções acessa-los individualmente ou de forma “inteira”. Sem dúvida

alguma estes registradores são os mais utilizados no PIC. Sempre que for preciso

escrever ou ler um pino de I/O, estes registradores serão utilizado.

4.8- REGISTRADORES TRISA e TRISB

Estes registradores permitem configurar os pinos de I/O como entrada ou

saída. Isto é feito de acordo com cada necessidade. TRISA configura o “PORTA” e

TRISB configura o “PORTB”. Se for preciso configurar um pino de I/O como entrada

faz-se o bit deste pino igual a 1 e para saída o bit deve ser igual a zero.

5- 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.

5.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"

Page 17: Trabalho de Microcontroladores Familia 16fXXX

17

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.

Fig.10- Datasheet

As tabelas seguintes apresentam todas as instruções do PIC16F628A, com

os seus respectivos operandos.

5.1.1- ORIENTADAS A BIT

13 12 11 10 9 8 7 6 5 4 3 2 1 0

Mnemônico ciclos Descrição OPCODEBIT

(0-7)

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

BTFSS f,b 1(2) Testa o Bit b de f, pula se um(set) 0 1 1 1 B B B F F F F F F F

5.1.2- ORIENTADAS A BYTE

Page 18: Trabalho de Microcontroladores Familia 16fXXX

18

13 12 11 10 9 8 7 6 5 4 3 2 1 0

Mnemônico ciclos Descrição OPCODE DREGISTRADOR

(00h - 127h)

NOP 1 Gasta um ciclo 0 0 0 0 0 0 0 0 0 0 0 0 0 0

CLRWDT 1 Zera o timer watch dog 0 0 0 0 0 0 0 1 1 0 0 1 0 0

MOVWF f 1 Copia o conteudo de w em f 0 0 0 0 0 0 1 F F F F F F F

CRLW 1 Zera o conteudo do resgistrador W 0 0 0 0 0 1 0 X X X X X X X

CLRF f 1 Zera o conteudo de f 0 0 0 0 0 1 1 F F F F F F F

SUBWF f,d 1 subtrai W de f e armazena em d(d <= f − W) 0 0 0 0 1 0 D F F F F F F F

DECF f,d 1 decrementa f e armazena em d(d <= f − 1) 0 0 0 0 1 1 D F F F F F F F

IORWF f,d 1 OU normal (Inclusivo) de W com F (d <= f OR W) 0 0 0 1 0 0 D F F F F F F F

ANDWF f,d 1 E entre W e F (d <= f AND W) 0 0 0 1 0 1 D F F F F F F F

XORWF f,d 1 OU exclusivo entre W e F (d <= f XOR W) 0 0 0 1 1 0 D F F F F F F F

ADDWF f,d 1 Adiciona W com F (d <= f + W) 0 0 0 1 1 1 D F F F F F F F

MOVF f,d 1 Move F (d <= f) 0 0 1 0 0 0 D F F F F F F F

COMF f,d 1 Complemento de f (d <= NOT f) 0 0 1 0 0 1 D F F F F F F F

INCF f,d 1 incrementa f e armazena em d(d <= f − 1) 0 0 1 0 1 0 D F F F F F F F

DECFSZ f,d 1(2) Decrementa f (d <= f − 1) e salta se zero 0 0 1 0 1 1 D F F F F F F F

RRF f,d 1 Rotaciona F para direita com carry out 0 0 1 1 0 0 D F F F F F F F

RLF f,d 1 Rotaciona F para esquerda com carry out 0 0 1 1 0 1 D F F F F F F F

SWAPF f,d 1 Troca os nibbles mais e menos significativos de f 0 0 1 1 1 0 D F F F F F F F

INCFSZ f,d 1(2) incrementa f (d <= f − 1) e salta se zero 0 0 1 1 1 1 D F F F F F F F

5.1.3- DE CONTROLE (QUANDO EFETUAM DESVIOS GASTAM 2 CICLOS)

13 12 11 10 9 8 7 6 5 4 3 2 1 0

Mnemônico ciclos Descrição OPCODE K literal

RETURN 2 Retorna de uma subrotina chamada por CALL 0 0 0 0 0 0 0 0 0 0 1 0 0 0

RETFIE 2 Retorna de uma interrupção 0 0 0 0 0 0 0 0 0 0 1 0 0 1

SLEEP 0 Põe o controlador em stand-by 0 0 0 0 0 0 0 1 1 0 0 0 1 1

Mnemônico ciclos Descrição OPCODE K posição de memória

CALL k 2Salva 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

Page 19: Trabalho de Microcontroladores Familia 16fXXX

19

5.1.4- OPERAÇÕES COM LITERAIS

13 12 11 10 9 8 7 6 5 4 3 2 1 0

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)

5.2- MNEMÔNICOS

Uma instrução do PIC é normalmente da seguinte forma:

INST OP1,OP2

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=0 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:

Page 20: Trabalho de Microcontroladores Familia 16fXXX

20

- (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=25

É 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:

Page 21: Trabalho de Microcontroladores Familia 16fXXX

21

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.

- (S)kip – Refere-se ao ato de promover algum desvio no fluxo sequencia de

instrução com base em alguma condição. A instruções que realizam saltos tem um S

na sua formação.

OBS.: Para desvios incondicionais normais existem as instruções GOTO e

CALL.

- (Z)ero – Refere-se ao teste se o resultado de uma operação especifica é zero,

normalmente verificando o registrador de STATUS (03h,2). As instruções que fazem

esse tipo de teste apresentam Z na sua formação. Essas instruções normalmente

trabalham com bytes.

Exemplos:

BTFSC 0x3h,2 ;Bit Test File Skip Clear – se bit 2 de 3h iguala a zero

;salta a próxima instrução

DECFSZ 0x7h ;Decrementa (DEC) File Skip Zero – se o resultado do

;decremento for zero salta a próxima instrução

Combinando os termos acima com um dos termos seguir com os termos

acima formam-se as instruções do PIC que trabalham com bytes:

ADD – Adiciona dois operandos que podem ser W, F ou L. O resultado

sempre será armazenado em W ou F

AND – Faz o E lógico entre dois operandos que podem ser W, F ou L. O

resultado sempre será armazenado em W ou F

CLR – torna zero Work ou um determinado registrador F

COM – Complemento de registrador F

DEC – Decrementa

INC - Incrementa

Page 22: Trabalho de Microcontroladores Familia 16fXXX

22

IOR – OU inclusivo

MOV – Move um dado ou literal

RL – Rotaciona para a esquerda (x2)

RR – Rotaciona para a direita (x2)

SUB - Subtração

SWAP – Troca interna entre o bits mais ou menos significativos

XOR – OU exclusivo

Hello world em PIC

Agora que já conhecemos, ainda que superficialmente, o funcionamento do

PIC e o seu conjunto de instruções, podemos implementar um programa. O

programa hello world é usado em todas as literaturas sobre linguagens de

programação para descrever de maneira simplória um programa numa linguagem

qualquer. Aqui será feito um programa que faça um acender.

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=0

;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)

Page 23: Trabalho de Microcontroladores Familia 16fXXX

23

GOTO MAIN

END

Listagem 1: Hello World

A seguir um breve comentário sobre as principais instruções exibidas na

tabela acima

5.3- 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 armazendo 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),

Page 24: Trabalho de Microcontroladores Familia 16fXXX

24

entretando o intevalo 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 0x00

MOVWF 05h

Page 25: Trabalho de Microcontroladores Familia 16fXXX

25

A instrução CLRF pode zerar um registrador em apenas um ciclo,

economizando com isso posições, na escassa memória de programação.

CRLF 05h

A instrução CLRW, é usada para zerar o registrador W, neste caso não tem

vantagem, em termos de ciclos, em relação a instrução MOVLW. No entanto as

instruções CRLF e CRLW ajustam o bit Z no registrador STATUS, mantendo a

consistência, diferentemente das instruções de movimentação.

Lógicas (ANDWF, ANDLW, IORWF, IORLW, XORWF, XORLW, COMF)

Aritméticas (ADDWF, ADDLW, SUBWF, SUBLW, INCF, DECF)

5.4- INSTRUÇÕES ORIENTADAS A BIT

As instruções orientadas da BIT permitem operar com bits dentro de um

determinado registrador.

BSF, BCF

A instrução BSF (Bit Set File) permite setar (nível lógico 1) um determindo bit

de um registrador. O exemplo a seguir seta o bit 3 do registrador 86H:

BSF 86h,3;

Já instrução BCF (Bit Clear File) permite limpar (nível lógico 0) um determindo

bit de um registrador. O exemplo a seguir limpa o bit 7 do registrador 85H:

BCF 85h,7;

RRF, RLF

As instruções RRF e RLF permitem rotacionar (deslocar a cadeia de bits) os

bits de um determinado registrador e escolher se o resultado será armazenado em

W (d=0) ou no próprio registrador (d=1). Existem vária razões para se rotacionar um

Page 26: Trabalho de Microcontroladores Familia 16fXXX

26

conjunto de bits, dentre elas podemos citar a multiplicação ou divisão por 2, ou ainda

conseguir o efeito luminoso de sequencial na saída do PIC.

A instrução RRF (Rotate Right File) permite rotacionar o registrador um bit

para DIREITA.

Por exemplo imagine o registrador 07H cujo o valor armazenado é 16 (em

Hexa é 10H e em binário é 00010000) a instrução:

RRF 07H,1

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,1

Irá fazer o conteúdo de 07H igual á 8 (em Hexa é 8H e em binário é

00001000).

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,1

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).

5.5- 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

Page 27: Trabalho de Microcontroladores Familia 16fXXX

27

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.

5.5.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,d0 ≤ 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,d0 ≤ 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,b0 ≤ f ≤ 127

0 ≤ b ≤ 7Salta se o bit b do registrador f estiver em nível lógico 1.

BTFSS f,b0 ≤ f ≤ 127 

0 ≤ b ≤ 7Salta 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.

5.5.2- 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=8

Page 28: Trabalho de Microcontroladores Familia 16fXXX

28

ELSE

PORTA=24

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)=0

Se W>15 então Z (STATUS,2) = 0 e C (STATUS,0)=1

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

BTFSS STATUS,2 ; Verifica se Z(STATUS,2) igual 1 (A igual

a B)

GOTO DIFERENTE ; Salta para o rotulo DIFERENTE

GOTO IGUAL ; Salta para o rotulo IGUAL

IGUAL

Page 29: Trabalho de Microcontroladores Familia 16fXXX

29

MOWLW D'8' ; Move 8 para W

MOVWF PORTA ; Move W(8) para PORTA

GOTO FIM ; Pula para o rótulo FIM

DIFERENTE

MOWLW D'24' ; Move 8 para W

MOVWF PORTA ; Move W(24) para PORTA

FIM

END ; Fim do programa

Listagem 2: Comparação

5.5.3- LAÇO

Os laços permitem a execução de um mesmo bloco de código por várias

vezes seguidas, a seguir um exemplo em uma pseudolinguagem:

PARA I=10 ATÉ 0 FAÇA:

VAR=VAR+1

Na maioria das arquiteturas a Implementação de um laço se dá com auxílio

de saltos, no caso do PIC16F628A será usado a instrução goto, a listagem a seguir

mostra uma possibilidade para implementar o laço acima:

VAR EQU H'007'

I EQU H'008'

F EQU D'1'

MOVLW D'10'

MOVWF VAR

LOOP

INCF VAR

DECFSZ I,F

GOTO LOOP

END

Listagem 3: Laço

Page 30: Trabalho de Microcontroladores Familia 16fXXX

30

5.5.4- DESVIOS INCONDICIONAIS

O desvio incondicional é uma mudança no fluxo de execução independente

de qualquer teste. As seguintes instruções se encaixam neste tipo:

Mnemônico Operando Limites Descrição

GOTO k 0 ≤ k ≤ 255Desvia o Fluxo do programa para a posição k. No programa a k é substituído por um

rótulo.

CALL k 0 ≤ k ≤ 2048Chama como procedimento a posição k, empilha PC+1. No programa a k é substituído por

um rótulo.

RETURN - - Faz o PC=topo da pilha. Deve ser chamado em conjunto com CALL.

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.

Page 31: Trabalho de Microcontroladores Familia 16fXXX

31

BIBLIOGRAFIA

The Most Widely Used Computer on a Chip – The TMS 1000

http://smithsonianchips.si.edu/augarten/p38, disponível em 17/02/15 as 10:30 hs.

David José de Souza; Desbravando o PIC: Baseado no microcontrolador PIC16F84;

Editora Érica; 5ª. Edição.

http://www.newtoncbraga.com.br/index.php/microcontroladores/103-microchip-

pic/1243-mic001.html

http://www.radioamadores.net/files/microcontroladores_pic.pdf

http://www.parallax.com/sites/default/files/downloads/28123-O-que-e-um-

Microcontrolador-Portugese.pdf