Trabalho de Microcontroladores Familia 16fXXX

29
1 FACULDADE POLITECNICA DE UBERLANDIA - FPU Ângelo Henrique Dias – EEN9A Edson dos Anjos Teixeira – EMN8A Murilo Barbosa Lopes – EEN9A Rodrigo Lucio de Melo – EMN8A MICROCONTROLADORES PIC – Familia 16FXXX Uberlândia 2015

description

Trabalho de microcontroladores

Transcript of Trabalho de Microcontroladores Familia 16fXXX

1

FACULDADE POLITECNICA DE UBERLANDIA - FPU

Ângelo Henrique Dias – EEN9A Edson dos Anjos Teixeira – EMN8A

Murilo Barbosa Lopes – EEN9A Rodrigo Lucio de Melo – EMN8A

MICROCONTROLADORES PIC – Familia 16FXXX

Uberlândia 2015

2

Ângelo Henrique Dias – EEN9A Edson dos Anjos Teixeira – EMN8A

Murilo Barbosa Lopes – EEN9A Rodrigo Lucio de Melo – EMN8A

Microcontroladores PIC – 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ândia 2015

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- ARQUIVOS DE REGISTROS ESPECIAIS – SFR 9

4. REGISTRADORES 10

4.1 – REGISTRADOR DE STATUS 10

4.2- REGISTRADOR OPTION_REG 11

4.3- REGISTRADOR INTCOM 12

4.4- REGISTRADOR PCL 14

4.5- REGISTRADOR STACK 14

4.6- REGISTRADOR INDF E FSR 14

4.7- REGISTRADOR PORTA E PORTB 14

4.8- REGISTRADOR TRISA E TRISB 14

5. CONJUNTO DE INSTRUÇÕES DO PIC 15

5.1- FORMATO DO CONJUNTO DE INSTRUÇÕES 15

5.1.1- ORIENTADAS A BITE 16

5.1.2- ORIENTADAS A BYTE 16

5.1.3- DE CONTROLE (QUANDO EFETUAM DESVIO

GASTAM 2 CICLOS)

17

5.1.4- OPERAÇÕES COM LITERAIS 17

5.2- MNEMONICOS 18

5.3- INSTRUÇÕES ORIENTADAS A BYTE 21

5.4- INSTRUÇÕES ORIENTADAS A BITE 23

4

5.5- INSTRUÇÕES DE CONTROLE 25

5.5.1- DESVIOS CONDICIONAIS 25

5.5.2- COMPARAÇÃO 26

5.5.3- LAÇO 27

5.5.4- DESVIOS INCONDICIONAIS 28

6. REFERÊNCIAS BIBLIOGRÁFICAS 29

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

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.

6

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

Figura 02- Pinagem do PIC 16F84

Fig.03- Arquitetura Interna PIC 16F84

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.

7

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)

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

8

Fig.04- 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.

Fig.05- 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.

9

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.

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.06- Tabela do que significa cada bloco de memória

10

4- REGISTRADORES

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

11

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

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

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

12

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

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.10 – Configuração do INTCOM

13

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

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

14

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

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.

15

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" 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.11- Instrução Orientada BIT

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

respectivos operandos.

16

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 OPCODE BIT

(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

Tabela 01 – Orientada a BIT

5.1.2- ORIENTADAS A BYTE

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

Mnemônico ciclos Descrição OPCODE D REGISTRADOR

(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

17

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

Tabela 02 – Orientada a Byte

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

Tabela 03- De controle

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

18

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

Tabela 04- Operações com Literais

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:

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

19

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

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.

20

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

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

21

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)

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:

22

Figura 12 - Caminho Logico de Dados

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

23

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

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:

24

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

25

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

Tabela 05 - Mnemonicos

Essas instruções normalmente são usadas em conjunto com a instrução GOTO. Vejamos

alguns exemplos.

26

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

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

27

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

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

28

LOOP

INCF VAR

DECFSZ I,F

GOTO LOOP

END

Listagem 3: Laço

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 ≤ 255 Desvia o Fluxo do programa para a posição k. No programa a k é

substituído por um rótulo.

CALL k 0 ≤ k ≤

2048

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

Tabela 06- Desvios condicionais

29

REFERÊNCIAS BIBLIOGRÁFICAS

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

<http://smithsonianchips.si.edu/augarten/p38>, acesso em 17 fev 2015.

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

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

BRAGA, N. C. Microcontroladores <http://www.newtoncbraga.com.br/index.php/

microcontroladores/103-microchip-pic/1243-mic001.html> Acesso em 17 fev.2015.

TREVISAN, P. V. T. Microcontroladores PIC <http://www.radioamadores.net/files/

microcontroladores_pic.pdf> Acesso em 17 fev. 2015.

O Que é um Microcontrolador? Guia do Estudante, Editora Parallax Inc, 3 ed. Acesso em

17 fev 2015

Microchip Tecnology Inc, PIC 16F84 Datasheet 2001.