Trabalho de Microcontroladores Familia 16fXXX
-
Upload
edson-teixeira -
Category
Documents
-
view
31 -
download
6
description
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.