Apostila Sobre o PIC16F84A
Apostila Sobre o PIC16F84A
Apostila Sobre o PIC16F84A
marcosrobertosouza74@gmail.com
MICROCONTROLADORES
PIC
BASEADO NO MICROCONTROLADOR
PIC16F84
MIP
SUMÁRIO
LISTA DE FIGURAS.............................................................................................................. V
1 MICROCONTROLADORES ......................................................................................... 7
1.1 ARQUITETURA DOS MICROCONTROLADORES ............................................................... 7
1.2 TECNOLOGIA CISC X RISC ............................................................................................ 8
1.3 APLICAÇÕES ................................................................................................................ 8
2 MICROCONTROLADOR PIC16F84............................................................................ 9
2.1 CARACTERÍSTICAS ....................................................................................................... 9
2.2 CARACTERÍSTICAS ELÉTRICAS ..................................................................................... 9
2.3 PINAGEM ................................................................................................................... 10
2.4 ESTRUTURA INTERNA ................................................................................................ 11
2.5 MAPAS DE MEMÓRIA ................................................................................................. 11
2.5.1 Memória de programa ...................................................................................... 12
2.5.2 Pilha (Stack) ..................................................................................................... 12
2.5.3 Memória de dados volátil (RAM) ..................................................................... 13
2.5.4 Memória de dados não volátil (EEPROM) ...................................................... 14
2.6 UNIDADE LÓGICA E ARITMÉTICA ............................................................................... 14
2.7 TIMER ........................................................................................................................ 14
2.8 PRESCALE .................................................................................................................. 14
2.9 WATDOG ................................................................................................................... 14
2.10 POWER UP TIMER ....................................................................................................... 15
2.11 BROWN OUT............................................................................................................... 15
3 ALIMENTANDO O PIC ............................................................................................... 16
3.1 ALIMENTAÇÃO .......................................................................................................... 16
3.2 OSCILADORES ............................................................................................................ 16
3.2.1 Tempo de ciclo .................................................................................................. 18
3.3 POWER-ON RESET (POR) ........................................................................................... 18
4 REGISTRADORES ESPECIAIS ................................................................................. 19
4.1 REGISTRADORES DE USO GERAL ................................................................................ 20
4.1.1 Registrador STATUS ........................................................................................ 20
4.1.2 Registrador OPTION........................................................................................ 22
4.1.3 Registrador INTCON........................................................................................ 22
4.1.4 Registradores PCL e PCLATH ......................................................................... 23
4.2 I/OS ........................................................................................................................... 23
4.2.1 Registradores TRISA e TRISB .......................................................................... 24
4.2.2 Registradores PORTA e PORTB ...................................................................... 25
4.3 REGISTRADOR TMR0 ................................................................................................ 28
4.4 REGISTRADORES DA EEPROM ................................................................................. 28
4.4.1 Registrador EEADR ......................................................................................... 28
4.4.2 Registrador EEDATA ....................................................................................... 28
4.4.3 Registradores EECON1 e EECON2 ................................................................. 28
4.5 ENDEREÇAMENTO INDIRETO ...................................................................................... 29
ii
5 SET DE INSTRUÇÕES DO PIC .................................................................................. 30
5.1 FORMATO DAS INSTRUÇÕES DO PIC ............................................................................ 30
5.2 OS TERMOS UTILIZADOS ............................................................................................ 31
5.3 RESUMO DAS INSTRUÇÕES ......................................................................................... 32
5.4 SET DE INSTRUÇÕES COMPLETO ................................................................................. 33
6 PROGRAMAÇÃO ......................................................................................................... 47
6.1 DIRETIVAS ................................................................................................................. 47
6.1.1 Diretivas CBLOCK e ENDC ............................................................................ 47
6.1.2 Diretiva DEFINE.............................................................................................. 47
6.1.3 Diretiva INCLUDE .......................................................................................... 48
6.1.4 Diretiva ORG.................................................................................................... 48
6.1.5 Diretiva END .................................................................................................... 49
6.2 LABEL ....................................................................................................................... 49
6.3 COMENTÁRIOS ........................................................................................................... 49
6.4 FORMAS DE REPRESENTAR UM NÚMERO DENTRO DO PIC............................................ 50
6.5 VETOR DE RESET........................................................................................................ 50
6.6 ESTRUTURAÇÃO DO CÓDIGO FONTE ........................................................................... 51
7 INTERRUPÇÕES .......................................................................................................... 53
7.1 INTERRUPÇÃO DE TIMER0 .......................................................................................... 53
7.2 INTERRUPÇÃO EXTERNA ............................................................................................ 54
7.3 INTERRUPÇÃO POR MUDANÇA DE ESTADO ................................................................. 54
7.4 INTERRUPÇÃO DE FIM DE ESCRITA NA EEPROM .......................................................... 54
7.5 OPERANDO COM INTERRUPÇÕES ................................................................................ 55
8 EEPROM......................................................................................................................... 57
8.1 ESCRITA NA EEPROM ................................................................................................. 57
8.2 LEITURA NA EEPROM ................................................................................................. 58
9 MODO SLEEP................................................................................................................ 60
9.1 ENTRANDO NO MODO SLEEP ..................................................................................... 60
9.2 SAINDO DO MODO SLEEP ............................................................................................ 60
10 MPLAB ........................................................................................................................ 61
10.1 INICIANDO O MPLAB .................................................................................................. 61
10.1.1 Selecionando o processador ............................................................................. 61
10.1.2 Ajustando o clock para simulação .................................................................. 62
10.2 PROJETO .................................................................................................................... 63
10.2.1 Criando o projeto ............................................................................................. 63
10.2.2 Editando o projeto ............................................................................................ 64
10.2.3 Ajustando as propriedades do “nó” principal ................................................. 65
10.2.4 Adicionando um fonte (também chamado de nó) ............................................. 66
10.3 COMPILANDO O PROGRAMA ....................................................................................... 68
10.4 SIMULAÇÃO ............................................................................................................... 69
10.4.1 Principais teclas para o controle da simulação ............................................... 69
10.4.2 Realizando uma simulação dinâmica ............................................................... 70
10.4.3 Janela Stopwatch .............................................................................................. 70
10.4.4 Observando registros da CPU durante a simulação ....................................... 71
10.4.5 Simulando sinais externos ................................................................................ 72
iii
11 EXERCÍCIOS ............................................................................................................. 75
iv
LISTA DE FIGURAS
FIGURA 1 - ARQUITETURAS HARVARD VERSUS VON NEUMANN ............................ 7
FIGURA 2 – PIC16F84 ............................................................................................................ 10
FIGURA 3 - ESTRUTURA INTERNA DO PIC16F84........................................................... 11
FIGURA 4 - MEMÓRIA DE PROGRAMA............................................................................ 12
FIGURA 5 - PILHA (STACK) ................................................................................................ 12
FIGURA 6 - MEMÓRIA DE DADOS .................................................................................... 13
FIGURA 7 - ESQUEMA DE ALIMENTAÇÃO DO PIC ....................................................... 16
FIGURA 8 - MONTAGEM PARA RESISTOR/CAPACITOR .............................................. 17
FIGURA 9 - MONTAGEM PARA CRISTAL OU RESSONADOR CERÂMICO ............... 17
FIGURA 10 - CIRCUITO EXEMPLO PARA RESET MANUAL DO PIC ........................... 18
FIGURA 11 - NÍVEIS DE TENSÃO ....................................................................................... 24
FIGURA 12 - ESQUEMA ELÉTRICO DOS PINOS DE I/O ................................................. 25
FIGURA 13 - UTILIZANDO RA0 COMO ENTRADA ......................................................... 27
FIGURA 14 - UTILIZANDO RA3 COMO SAÍDA ................................................................ 27
FIGURA 15 - CHAVES E FLAGS RELACIONADOS COM AS INTERRUPÇÕES ........... 55
FIGURA 16 - AMBIENTE DE DESENVOLVIMENTO MPLAB......................................... 61
FIGURA 17 - SELEÇÃO DO PROCESSADOR..................................................................... 62
FIGURA 18 - CONFIGURAÇÃO DO OSCILADOR ............................................................ 62
FIGURA 19 - JANELA COM O NOVO FONTE ................................................................... 63
FIGURA 20 - JANELA "NEW PROJECT"............................................................................. 64
FIGURA 21 - EDITANDO O PROJETO ................................................................................ 65
FIGURA 22 - JANELA "NODE PROPERTIES" .................................................................... 66
FIGURA 23 - JANELA "ADD NODE" ................................................................................... 67
FIGURA 24 - JANELA "EDIT PROJECT" COMPLETA ...................................................... 67
FIGURA 25 - JANELA "BUILD RESULTS" APÓS A COMPILAÇÃO NORMAL ............ 68
FIGURA 26 - JANELA "BUILD RESULTS" APÓS ERRO NA COMPILAÇÃO ................ 69
FIGURA 27 - JANELA STOPWATCH .................................................................................. 70
FIGURA 28 - JANELA ADD WATCH SYMBOL ................................................................. 71
FIGURA 29 - AJUSTANDO AS PROPRIEDADES DO REGISTRO ESCOLHIDO ........... 72
FIGURA 30 - BOTÕES DE ESTÍMULO ................................................................................ 73
FIGURA 31 - AJUSTANDO OS BOTÕES DE ESTÍMULO ................................................. 73
FIGURA 32 - AJUSTANDO OS PINOS QUE RECEBERÃO OS ESTÍMULOS ................. 74
v
LISTA DE TABELAS
vi
CAPÍTULO 1
1 MICROCONTROLADORES
A arquitetura de um sistema digital define quem são e como as partes que compõe o sistema estão
interligadas. As duas arquiteturas mais comuns para sistemas computacionais digitais são as seguintes:
O PIC possui arquitetura Harvard. A memória de dados é do tipo RAM (volátil) e , no caso do
16F84, a memória de programa é do tipo Flash (letra F no código).
A arquitetura de Harvard é um conceito mais recente que a de Von Neumann. Ela adveio da
necessidade de pôr o microcontrolador a trabalhar mais rapidamente. Na arquitetura de Harvard, a
memória de dados está separada da memória de programa. Assim, é possível uma maior fluência de dados
através da unidade central de processamento e, claro, uma maior velocidade de funcionamento. A
separação da memória de dados da memória de programa, faz com que as instruções possam ser
representadas por palavras de mais que 8 bits. O PIC16F84, usa 14 bits para cada instrução, o que permite
que todas as instruções ocupem uma só palavra de instrução. É também típica da arquitetura Harvard ter
um repertório com menos instrução que a de Von Neumann, instruções essas, geralmente executadas
apenas num único ciclo de máquina.
7
1.2 TECNOLOGIA CISC X RISC
1.3 APLICAÇÕES
8
CAPÍTULO 2
2 MICROCONTROLADOR PIC16F84
Este componente de 18 pinos pode ser classificado na faixa intermediária em termos de recursos
disponíveis pois ele possui interrupções mas, no entanto, não dispõe de periféricos como PWM,
conversores A/D ou portas de comunicação serial.
2.1 CARACTERÍSTICAS
Microcontrolador de 18 pinos;
Set de instruções reduzido (35 instruções);
Freqüência de clock de até 20 MHz com 200ns de ciclo de instrução;
1K de memória de programa FLASH;
64 bytes de memória EEPROM (não volátil) interna;
68 bytes de memória RAM;
13 pinos de I/O com controle de direção individual (configuráveis como entrada ou saída);
4 interrupções disponíveis
TMR0
Externa
Mudança de estado
EEPROM
15 registradores especiais para controle do chip e seus periféricos;
8 níveis de Stack (pilha);
Alta capacidade de corrente nos pinos de I/O, podem acender leds diretamente;
Timer de 8 bits;
Gravação In-Circuit
9
A Tabela 1 mostra que o PIC16F84 pode fornecer até 20mA em um pino quando em Vdd, isto
não quer dizer que todos os pinos podem estar fornecendo esta corrente ao mesmo tempo. Por
exemplo, o PORTB, pela tabela acima vemos que pode fornecer até 100mA, como o PORTB tem 8 pinos,
se todos estiverem fornecendo esta corrente à soma será 160mA (8pinos x 20mA), muito acima do valor
que o PORTB suporta. Isto vale também para o PORTA. Esta mesma regra vale também para os pinos
quando em Vss.
2.3 PINAGEM
Figura 2 – PIC16F84
NOME DO NÚMERO
I/O/P TIPO DESCRIÇÃO
PINO DO PINO
Entrada para cristal.
OSC1/CLKIN 16 I ST/CMOS(3)
Entrada para osciladores externos (híbridos ou RC).
Saída para cristal. Os cristais ou ressonadores devem ser ligados
aos pinos OSC1 e OSC2.
OSC2/CLKOUT 15 O - Saída com onda quadrada em ¼ da freqüência imposta em OSC1
quando em modo RC. Esta freqüência equivale aos ciclos de
máquina internos.
Master Clear (reset) externo. O microcontrolador só funciona
/MCLR 4 I/P ST
quando este pino encontra-se em nível alto.
PORTA (I/Os digitais bidirecionais).
RA0 17 I/O TTL RA0: I/O digital.
RA1 18 I/O TTL RA1: I/O digital.
RA2 1 I/O TTL RA2: I/O digital.
RA3 2 I/O TTL RA3: I/O digital.
RA4/T0CKI 3 I/O ST RA4: I/O digital (quando saída é open drayn, isto é, não
consegue impor nível alto) ou entrada externa do contador TMR0.
PORTB (I/Os digitais bidirecionais). Todos os pinos deste PORT
possuem pull-up interno que podem ser ligados/desligados pelo
software.
RB0/INT 6 I/O TTL/ST(1) RB0: I/O digital com interrupção externa.
RB1 7 I/O TTL RB1: I/O digital.
RB2 8 I/O TTL RB2: I/O digital.
RB3 9 I/O TTL RB3: I/O digital.
RB4 10 I/O TTL RB4: I/O digital com interrupção por mudança de estado.
RB5 11 I/O TTL RB5: I/O digital com interrupção por mudança de estado.
RB6 12 I/O TTL/ST(2) RB6: I/O digital com interrupção por mudança de estado ou clock
da programação serial ou pino de in-circuit debugger.
RB7 13 I/O TTL/ST(2) RB7: I/O digital com interrupção por mudança de estado ou clock
da programação serial ou pino de in-circuit debugger.
VSS 5 P - GND
VDD 14 P - Alimentação positiva.
Notas:
(1) Esta entrada é do tipo ST somente quando configurado como interrupção externa.
(2) Esta entrada é do tipo ST somente durante o modo de programação serial.
(3) Esta entrada é ST quando em modo RC e CMOS nos demais casos.
O PIC16F84 possui quatro tipos de memória, memória de programa (Flash), pilha ou stack,
memória de dados volátil (RAM) e memória de dados não volátil (EEPROM). A seguir veremos cada
uma delas.
11
2.5.1 MEMÓRIA DE PROGRAMA
12
2.5.3 MEMÓRIA DE DADOS VOLÁTIL (RAM)
A memória de dados é uma memória volátil do tipo R.A.M. (Random Access Memory) de 8 bits.
O mapa de memória é divido em duas partes: registradores especiais (special function register - S.F.R.) e
registradores de uso geral (general purpose register - G.P.R.). Como o ponteiro da memória de programa
tem capacidade de endereçar somente 128 posições de memória de cada vez (7 bits), a memória de
programa é dividida em bancos (banco 0 e banco 1 no 16F84).
Esta divisão implica em termos posições de memória que somente poderão ser acessadas caso o
banco a que ela pertença seja previamente selecionado através de um bit específico do S.F.R. STATUS.
A Figura 6 mostra a memória de dados do PIC16F84, podemos ver que esta memória esta dividida
em dois bancos, Banco 0 e Banco 1. Cada registrador esta em uma posição definida da memória como
por exemplo o TMR0, podemos ver que este registrador esta armazenado na posição 01h (banco 0), já o
registrador INDF esta nas posições 00h (banco 0) e 80h (banco 1), neste caso a posição 80h do banco 1 é
um espelho da posição 00h do banco 0. Entenda como espelho um registrador único que pode ser
acessado por mais de uma posição de memória.
13
É MUITO IMPORTANTE LEMBRAR QUE ANTES DE UTILIZARMOS QUALQUER
COMANDO QUE TRABALHE COM ESTES REGISTRADORES DEVEMOS MUDAR PARA O
BANCO ONDE O REGISTRADOR SE ENCONTRE. Para fazer a mudança entre os bancos
utilizamos os bits RP1 e RP0 do registrador STATUS. Mais adiante será visto como trabalhar com os
registradores.
A unidade lógica e aritmética é onde todas as operações lógicas (funções lógicas booleanas: e ou,
exclusivo e complemento) e aritméticas (soma e subtração) são efetuadas. O registrador W sempre estará
envolvido de alguma forma em toda operação lógica ou aritmética. Existem dois destinos possíveis para
estas operações: o W (work) ou um registrador (posição da memória de dados) definido no argumento da
instrução.
2.7 TIMER
2.8 PRESCALE
2.9 WATDOG
O watchdog é um recurso disponível no PIC que parte do princípio que todo sistema é passível de
falha. Se todo sistema pode falhar, cabe ao mesmo ter recursos para que, em ocorrendo uma falha, algo
seja feito de modo a tornar o sistema novamente operacional. Dentro do PIC existe um contador
incrementado por um sinal de relógio (clock) independente. Toda vez que este contador extrapola o seu
valor máximo retornando a zero, é provocado a reinicialização do sistema (reset).
Clear Watchdog: Se o sistema estiver funcionado da maneira correta, de tempos em tempos uma
instrução denominada clear watchdog timer (CLRWDT) zera o valor deste contador, impedindo que o
mesmo chegue ao valor máximo. Desta maneira o Watchdog somente irá "estourar" quando algo de
errado ocorrer.
14
O período normal de estouro do Watchdog Timer é de aproximadamente 18 ms. No entanto,
algumas vezes este tempo é insuficiente para que o programa seja normalmente executado. A saída neste
caso é alocar o recurso de PreScale de modo a aumentar este período. Se sem o prescale o período é de
18ms, quando atribuímos ao Watchdog Timer um PRESCALE de 1:2 (um para dois) nos dobramos este
período de modo que o processamento possa ser executado sem que seja feita uma reinicialização.
O Power UP Timer faz com que o PIC só comece a operar cerca de 72ms após o pino /MCLR ser
colocado em nível alto. Este recurso pode ser habilitado ou não na hora da gravação.
Esse sistema é recomendado em casos que possuem uma fonte que demora muito para atingir a
tensão estabilizada.
O Brown Out monitora a diferença de tensão entre VDD e VSS, provocando a reinicialização do
PIC (reset) quando esta cai para um valor inferior ao mínimo definido em manual.
15
CAPÍTULO 3
3 ALIMENTANDO O PIC
Neste capítulo iremos ver o que é necessário para que o PIC comece a funcionar.
3.1 ALIMENTAÇÃO
Para alimentar o PIC basta termos uma fonte segura de 5Vcc, ligando o GND ao pino 5 (Vss) e o
+5V ao pino 14 (Vdd). É importante porem que esta fonte não tenha grandes variações de tensão e ruídos.
Para garantir um melhor funcionamento recomenda-se que seja montado um capacitor de desacoplamento
entre os pinos 5 e 14. Sugere-se que este capacitor seja cerâmico com valores entre 100pF e 100nF. A
Figura 7 mostra o esquema de ligação do PIC.
3.2 OSCILADORES
O PIC16F84 utiliza um oscilador externo, sem ele o programa não é executado e nada funciona.
Existem basicamente quatro tipos de osciladores que podem ser utilizados no PIC como mostra a Tabela
3.
RC – Este tipo de oscilador é o mais simples e mais barato mas também o menos preciso
variando muito com a tolerância dos componentes, tensão e temperatura, Figura 8.
16
Figura 8 - Montagem para Resistor/Capacitor
1 1
f T RC f
T RC
Exemplo: Suponha que se deseje uma freqüência de 4Mhz, utilizando um capacitor de 25pF o
resistor deve ser de:
1 1 1
f 4 Mhz R R 12500
RC R * 25 pF 4Mhz * 25 pF
RESSONADOR – O ressonador não é tão barato quanto o RC mas é bem mais preciso e
estável, Figura 9.
CRISTAL – É o tipo mais preciso e também o mais caro, a Figura 9 mostra o esquema de
montagem.
A Tabela 4 mostra valores típicos de capacitor para oscilador do tipo cristal e ressonador
cerâmico:
17
MODO FREQÜÊNCIA C1 C2
32 KHz 68 – 100 pF 68 – 100 pF
LP
200 KHz 15 – 30 pF 15 – 30 pF
100 KHz 68 – 150 pF 150 – 200 pF
XT 2 MHZ 15 – 30 pF 15 – 30 pF
4 MHz 15 – 30 pF 15 – 30 pF
8 MHz 15 – 30 pF 15 – 30 pF
HS 10 MHz 15 – 30 pF 15 – 30 pF
20 MHz 15 – 30 pF 15 – 30 pF
A velocidade que o PIC executa uma instrução dependerá da freqüência do oscilador utilizado.
Quanto maior a freqüência do oscilador menor será o tempo gasto para execução de uma instrução. Nos
microcontroladores PIC, o sinal de clock é internamente dividido por quatro. A formula para cálculo do
tempo de ciclo é:
Além da alimentação e do oscilador, para que o PIC possa funcionar é necessário criar um POR. A
forma mais simples para isto é ligar o pino /MCLR diretamente ao Vcc.
A Figura 10 mostra o esquema de um circuito com um botão para reset manual do
microcontrolador. Enquanto a botoeira denominada RESET estiver solta, o pino /MCLR esta em nível
alto, desta forma o microcontrolador esta funcionando. Quando a botoeira for pressionada, o pino /MCRL
estará em nível baixo resetando desta forma o microcontrolador. É importante observar que o
microcontrolador só voltará a funcionar quando a botoeira for solta.
18
CAPÍTULO 4
4 REGISTRADORES ESPECIAIS
O PIC possui uma série de registradores especiais denominados SFR (Special Function Registers),
estes registradores servem para guardar a configuração e o estado de funcionamento atual da máquina.
Para entender melhor para que serve um registrador, vamos fazer uma analogia com um carro.
Suponha que vc foi até uma concessionária comprar um carro, vamos imaginar que todos os itens
opcionais do carro estão em um registrador chamado OPCIONAIS como no exemplo abaixo.
Registrador: OPCIONAIS
Número
do Bit
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Descrição Direção Ar- Vidros Câmbio Limpador Pintura Aros de
Teto Solar
do Bit Hidráulica Condicionado Elétricos Automático Traseiro Metálica Liga Leve
Habilitar/
1 1 0 1 1 1 0 0
Desabilitar
A primeira linha mostra o número do bit, vemos que o bit mais a esquerda é o bit 7 e que o bit
mais a direita é o bit 0. A segunda linha nos mostra a descrição do bit dentro do byte. Na terceira linha
quando desejarmos um opcional escrevemos 1 caso contrário escrevemos 0. Observe que a linha 3 pode
assumir um entre dois valores distintos, 0 ou 1.
Agora vamos começar a preencher o registrador OPCIONAIS, se desejarmos nosso carro com
direção hidráulica devemos setar o bit 7 do registrador, ou seja, devemos coloca-lo em 1. Caso não
desejarmos direção hidráulica devemos colocar o bit 7 em 0. Se desejarmos ter um carro com ar-
condicionado devemos colocar o bit 6 em 1, caso contrário devemos coloca-lo em 0. E assim vamos
preenchendo nosso registrador até o bit 0 (Teto Solar). Da mesma forma se quisermos um carro com teto
solar devemos colocar o bit 0 em 1 caso contrário devemos coloca-lo em 0. Com este exemplo podemos
ver que o registrador OPCIONAIS contem todos os itens opcionais do carro e que cada bit deste
registrador corresponde a um opcional do carro (teto solar, ar-condicionado etc).
Vamos supor que o carro tenha outro registrador chamado ESTADO como podemos ver na tabela
abaixo:
Registrador: ESTADO
Número
do Bit
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Descrição
Pisca Alerta Pisca-Pisca - - - Óleo Luz Alta Bateria
do Bit
Habilitar/
0 0 x x x 0 1 1
Desabilitar
Este registrador serve para indicar ao motorista o estado em que o carro se encontra, por exemplo,
se o bit 7 (Pisca alerta) estiver em 1, isto indica que o pisca alerta esta ligado, se o bit 7 estiver em 0, isto
indica que o pisca alerta esta desligado, veja que ele não é utilizado para ligar o pisca alerta e sim para
indicar se este esta ou não ligado. O bit 2 indica se o nível de óleo do carro esta baixo, já o bit 1 indica se
a luz alta esta ligada ou não. Neste exemplo os bits 3,4 e 5 não estão habilitados, isto serve para mostrar
que nem sempre todos os bits de um registrador estão habilitados ou seja, nem todos têm uma
determinada função.
Através dos exemplos anteriores podemos observar que existe uma lógica na separação dos
registradores, o registrador OPCIONAIS contem os bits relacionados com os itens opcionais do carro, já o
registrador ESTADO contem os bits que indicam as condições atuais do carro. Esta mesma separação
acontece com os registradores do PIC independente do modelo.
19
4.1 REGISTRADORES DE USO GERAL
Este registrador serve para mostrar o estado da ULA, a forma do último reset e também para
configurar a página de programação atual (bancos), quando necessário.
Bit 2: ( Z ) – Exemplo:
Como saber se o valor de um determinado registrador é zero?
MOVF REG, F
BTFSC STATUS, Z
GOTO EH_ZERO
GOTO NAO_EH_ZERO
Se o valor de REG for 0 o bit Z do registrador STATUS ira para 1, caso contrário será 0.
Quero saber se o registrador REG contem o valor 20, como posso fazer isso?
Condição 1: REG = 90
MOVLW .20 00010100 20
XORWF REG, W 01011010 90
BTFSC STATUS, Z 01001110 78
GOTO SAO_IGUAIS
GOTO NAO_SAO_IGUAIS
Como resultado desta operação não foi 0 o bit Z do registrador STATUS será 0.
20
Condição 2: REG = 20
MOVLW .20 00010100 20
XORWF REG, W 00010100 20
BTFSC STATUS, Z 00000000 0
GOTO SAO_IGUAIS
GOTO NAO_SAO_IGUAIS
Bit 0: ( C ) – Exemplo:
Quero somar um determinado valor ao registrador REG e verificar se o resultado passou dos 8 bits
disponíveis.
Se REG = 20
MOVLW .10
ADDWF REG, F REG= 30
BTFSC STATUS, C
GOTO ULTRAPASSOU_8_BITS
GOTO NAO_ULTRAPASSOU_8_BITS
Neste caso o bit C do registrador STATUS será 0 porque o resultado não ultrapassou os 8 bits
disponíveis.
Se REG = 254
MOVLW .10
ADDWF REG, F REG= 8
BTFSC STATUS, C
GOTO ULTRAPASSOU_8_BITS
GOTO NAO_ULTRAPASSOU_8_BITS
Neste caso o bit C do registrador STATUS será 1 porque o resultado ultrapassou os 8 bits disponíveis.
Subtração
É bom observar que no caso da subtração o carry trabalha com a lógica invertida.
CONDIÇÃO 1
SUBWF REG, F (REG - W)
Antes da instrução
REG = 3 W = 2 C = ?
Após a instrução
REG = 1 W = 2 C = 1 (positivo)
CONDIÇÃO 2
SUBWF REG, F (REG - W)
Antes da instrução
REG = 2 W = 2 C = ?
Após a instrução
REG = 0 W = 2 C = 1 (zero)
CONDIÇÃO 3
SUBWF REG, F (REG - W)
Antes da instrução
REG = 1 W = 2 C = ?
Após a instrução
REG = 255 W = 2 C = 0 (negativo)
21
4.1.2 REGISTRADOR OPTION
Serve para configurar uma série de opções para a operação do microcontrolador. Apesar deste
registrador receber o nome de OPTION, ele deverá ser referenciado por OPTION_REG, pois os PIC’s
mais antigos possuem uma instrução chamada option.
A área de memória de programa do PIC16F84 é maior que 256, desta forma não é possível
acessa-la completamente com apenas os 8 bits do PCL. O PCLATH possui os 5 bits mais significativos
do PC, porem este registrador é controlado diretamente pelo hardware. Em alguns modelos de PIC’s a
manipulação deste registrador é necessária.
4.2 I/Os
A primeira coisa que devemos saber sobre os I/Os de um microcontrolador é que eles são
agrupados por PORTs. Este agrupamento se da geralmente por características elétricas particulares e para
facilitar o gerenciamento da máquina. O PIC16F84 possui seus I/Os divididos da seguinte forma:
Ao total temos 13 I/Os que podem ser configurados como entrada ou saída pelo programador,
conforme as necessidades do projeto. Outras características importantes que devemos saber sobre estas
portas dizem respeito a sua operação elétrica. Internamente estes pinos são ligados de formas diferentes,
principalmente pela sobrecarga de recursos aplicados a cada um deles.
Outro ponto importante é que algumas portas são do tipo TTL e outras são do tipo Schmitt
Trigger. Este dado é muito relevante quando estamos operando com um pino como entrada, porque
interfere diretamente nos níveis de tensão interpretados pelo PIC como 0 (zero) e 1 (um). Vejamos como
isto acontece:
23
Figura 11 - Níveis de tensão
Pela Figura 11 podemos observar que ao utilizarmos entradas do tipo ST necessitamos um nível
de tensão bem mais elevado para que o PIC interprete a mudança de estado. Isto é muito útil para
enquadrarmos uma senóide, por exemplo. Por outro lado, isto é ruim quando possuímos um hardware que
gera níveis de tensão menores, como pode acontecer quando sobrecarregamos o mesmo pino com
diversas funções. Esta explicação sobre TTL e ST é aplicável a todas as portas.
Esses registradores servem para configurar os pinos das portas como entrada ou saída. Quando é
colocado ‘1’ em um bit do TRIS, o pino relacionado a ele é configurado como entrada. Para configurar o
pino como saída, o bit deve ser colocado em ‘0’.
Observe que o TRISA possui apenas 5 pinos de I/O, os bits 5,6 e 7 não estão implementados.
24
4.2.2 REGISTRADORES PORTA E PORTB
O PIC16F84 possui duas portas, PORTA e PORTB. Quando um pino dessas portas é configurado
como entrada, ao lermos o seu bit relacionado, encontraremos diretamente o nível lógico aplicado a este
pino. Da mesma maneira, ao configurarmos um pino como saída, podemos alterar o seu estado,
escrevendo diretamente no bit relacionado. É através destes pinos que o PIC interage com dispositivos
externos como por exemplo, ligar um motor, ler uma tecla. Todos os pinos dos PORTA e PORTB são
bidirecionais ou seja, podem ser configurados como entrada ou como saída.
Para compreender melhor quando configurar um pino como entrada ou saída observe a Figura 12.
Vemos que ligado ao pino 17 (RA0) existe um botão, desta forma o pino 17 deve ser configurado como
entrada pois queremos saber o estado do botão, ou seja, se ele esta pressionado ou não. Ligado ao pino 2
(RA3) vemos um triac, desta forma este pino deve ser configurado como saída pois queremos que o PIC
ligue e desligue este triac. Ligado ao pino 3 (RA4) vemos uma micro-chave, desta forma este pino deve
ser utilizado como entrada porque queremos saber se a micro-chave esta acionada ou desacionada. E
finalmente no pino 10 (RB4) vemos um relé, logo este pino deve ser configurado como saída porque
queremos acionar e desacionar o relé.
Resumindo, sempre que desejarmos saber o estado de um elemento seja ele um sensor, um botão,
uma micro-chave, devemos configurar o pino relacionado como entrada. Sempre que desejarmos acionar
algum dispositivo seja ele um triac, rele, transistor, devemos configurar o pino correspondente como
saída.
25
A Figura abaixo mostra o diagrama de blocos do PORTA.
26
Agora vamos recapitular, o TRISA configura quais pinos do PORTA serão entrada ou saída, o
TRISB configura quais pinos do PORTB serão entrada ou saída.
Na Figura 13 vemos um botão ligado ao pino 17 (RA0), desta forma utilizaremos este pino como
entrada. Para configurar o pino RA0 como entrada devemos escrever 1 no bit 0 do TRISA. Quando
desejarmos saber qual o nível de tensão (alto ou baixo) no pino 17, devemos ler o bit 0 do PORTA, se
este bit estiver em 1 sabemos que temos nível de tensão alto neste pino, caso o bit esteja em 0, sabemos
que o nível de tensão é baixo.
A Figura 14 mostra um triac ligado ao pino 2 (RA3), desta forma devemos utilizar este pino como
saída, para fazer isto devemos escrever 0 no bit 3 do TRISA. Sempre que desejarmos ligar o triac
devemos escrever 1 no bit 3 do PORTA, para desligar o triac devemos escrever 0 no bit 3 do PORTA.
27
4.3 REGISTRADOR TMR0
No processo de escrita na EEPROM, coloca-se neste registrador o dado a ser escrito na memória.
Na operação de leitura na EEPROM, este registrador recebe o dado lido na memória.
O FSR é um registrador em que pode ser escrito um outro endereço de memória que será
acessado indiretamente, como se ele fosse apenas um ponteiro. Já o INDF não é um registrador realmente
verdadeiro, trata-se de um espelho do endereço apontado pelo FSR.
29
CAPÍTULO 5
5 SET DE INSTRUÇÕES DO PIC
30
5.2 OS TERMOS UTILIZADOS
A construção dos nomes das instruções do PIC segue uma seqüência, neste momento vamos
estudar os termos utilizados na construção dos nomes das instruções e seus argumentos:
31
5.3 RESUMO DAS INSTRUÇÕES
Agora você já está apto a conhecer todo o set de instruções do PIC16F84. Reveja os termos
apresentados para que você compreenda corretamente a utilização de cada uma, facilitando também sua
memorização.
33
Exemplo
ANDLW .95
Antes da instrução ; 0101 1111 (.95 )
W = .163 ; 1010 0011 (.163)
Após a instrução ;---------- ------
W = .3 ; 0000 0011 (.3 )
35
Exemplo
CALL GRAVA_EEPROM
Antes da instrução
PC = Linha 1
Após a instrução
PC = posição de memória da sub-rotina GRAVA_EEPROM
36
Exemplo
CLRWDT
Antes da instrução
WDT counter= x
WDT prescaler =1:128
Após a instrução
WDT counter= .0
WDT prescaler count=0
/TO = 1
/PD = 1
WDT prescaler =1:128
COMF Complemento de F
Sintaxe [ label ] COMF f,d
Descrição Calcula o complemento do registrador f (255 - f). O resultado é armazenado no lugar
definido por d.
Operação (f) destination
Status afetado Z
Número de palavras 1
Número de ciclos 1
Exemplo
COMF REG1, 0
Antes da instrução
REG1= .19
Após a instrução
REG1= .19
W = .236
39
IORWF Operação “OR” entre os registradores W e F
Sintaxe [ label ] IORWF f,d
Descrição Executa um “OU” lógico bit a bit entre o registrador W e o registrador f. Se ‘d’ = 0 o
resultado é armazenado em W. Se ‘d’ = 1 o resultado é armazenado no registrador f.
Operação (W).OR. (f) destino
Status afetado Z
Número de palavras 1
Número de ciclos 1
Exemplo
IORWF FSR, 1
Antes da instrução ; 0001 0111 (.23 )
W = .23 ; 1100 0010 (.194)
FSR = .194 ;---------- ------
Após a instrução ; 1101 0111 (.215)
Exemplo 2
MOVF FSR, 1
Caso 1: Antes da instrução
FSR = .43
Após a instrução
40
FSR = .43
Z = 0
Caso 2: Antes da instrução
FSR = .0
Após a instrução
FSR = .0
Z = 1
41
RETLW Retorna de uma sub-rotina com uma literal em W
Sintaxe [ label ] RETLW k
Descrição Retorna de uma sub-rotina, recuperando o último endereço da pilha e colocando o valor
passado por k no registrador W.
Operação k W;
TOS PC
Status afetado Nenhum
Número de palavras 1
Número de ciclos 2
Exemplo
RETLW .10
Após a instrução
PC = TOS
W = .10
42
RRF Rotaciona F um bit para a direita
Sintaxe [ label ] RRF f,d
Descrição Rotaciona o conteúdo do registrador f um bit para a direita. O conteúdo do carry é
colocado no bit 7 e o bit 0 é colocado no carry. O resultado é armazenado no lugar
definido por d.
Operação
Status afetado C
Número de palavras 1
Número de ciclos 1
Exemplo
RRF REG1,0
Antes da instrução
REG1 = 1110 0110
W = xxxx xxxx
C = 0
Após a instrução
REG1 = 1110 0110
W = 0111 0011
C = 0
44
W = .2
C = x
Z = x
Após a instrução
REG1 = .255
W = .2
C = 0 ; o resultado é negativo
Z = 0
45
Exemplo
XORWF REG, 1 ; 1010 1111 (.175)
Antes da instrução ; 1011 0101 (.181)
REG= .175
W = .181
Após a instrução ; --------- ------
REG= .26 ; 0001 1010 (.26)
W = .181
46
CAPÍTULO 6
6 PROGRAMAÇÃO
6.1 DIRETIVAS
Uma diretiva é parecida com uma instrução mas, ao contrário desta, é independente do tipo de
microcontrolador e é uma característica inerente à própria linguagem assembly. As diretivas servem-se de
variáveis ou registros para satisfazer determinados propósitos.
O PIC16F84 tem 68 bytes de memória RAM para uso geral. Esta memória vai do endereço 0x0C
até 0x4F. A maneira mais fácil de definir as variáveis utilizadas no programa é através Ds diretivas
CBLOCK e ENDC. Veja um exemplo:
CBLOCK 0X0C
CONTADOR_SH ; UTILIZADA PARA CONTAGEM DO TEMPO (PARTE ALTA)
CONTADOR_SL ; UTILIZADA PARA CONTAGEM DO TEMPO (PARTE BAIXA)
DADO_EEPROM ; DADO A SER GRAVADO NA EEPROM
FLAG ; UTILIZADA PARA DEFINIÇÃO DE FLAGS
ENDC
Após o comando CBLOCK vem o endereço 0X0C, este é o endereço da primeira variável e para
cada variável o endereço é incrementado automaticamente. Sem a diretriz CBLOCK e ENDC a definição
das variáveis ficaria da seguinte forma:
BOTAO é o nome da definição ou seja, um apelido para a expressão. Desta forma sempre que no
programa desejarmos nos referir ao bit RA0 precisamos escrever apenas BOTAO.
47
Definição de Flags
Flags são bits que definimos dentro de um byte para serem utilizadas como chaves on/off. Desta
forma em um único endereço de memória (variável) poderemos guardar até 8 flags que registrarão 8
estados diferentes. Por exemplo, um flag pode marcar se um byte já foi transmitido ou não, outro pode
indicar se um byte já foi recebido ou não e assim por diante.
O primeiro passo para trabalharmos com flags é definir uma variável onde estas serão
armazenadas. Veja um exemplo abaixo:
CBLOCK 0X0C
CONTADOR_SH ; UTILIZADA PARA CONTAGEM DO TEMPO (PARTE ALTA)
CONTADOR_SL ; UTILIZADA PARA CONTAGEM DO TEMPO (PARTE BAIXA)
DADO_EEPROM ; DADO A SER GRAVADO NA EEPROM
FLAG ; UTILIZADA PARA DEFINIÇÃO DE FLAGS
ENDC
Para cada variável definida podemos definir até 8 flags. O primeiro flag DIRECAO_MOTOR
definimos que, quando este flag estiver em 0 o sentido de giro do motor é horário, caso o flag estiver em 1
o sentido de giro do motor é anti-horário.
Esses arquivos nada mais são do que arquivos de texto, ou mesmo código fonte, que serão
inclusos no programa. Desta forma a própria Microchip já criou um arquivo include para cada tipo de
microcontrolador, em que serão definidos os nomes e endereços de todos os FSR’s e uma série de outras
definições necessárias para a utilização dos microcontroladores. Com esses arquivos evita-se a redigitação
de todas essas informações na hora de começar um novo programa. Abaixo esta a sintaxe para utilização
de um arquivo de definição.
Exemplo:
Inicio org 0x00
movlw 0xFF ; será armazenada no endereço 0X00
movwf PORTB ; será armazenada no endereço 0X01
48
6.1.5 DIRETIVA END
No fim do programa, é necessário colocar a diretiva 'end', para que o tradutor do assembly
(assembler), saiba que não existem mais instruções no programa.
Exemplo:
.
.
movlw 0xFF
movwf PORTB
goto loop
end
6.2 LABEL
Um Label (rótulo) é uma designação textual (geralmente de fácil leitura) de uma linha num
programa ou de um ponto no programa para onde um microcontrolador deve saltar ou, ainda, o início de
um conjunto de linhas de um programa. Também pode ser usado para executar uma ramificação de um
programa (tal como Goto....), o programa pode ainda conter uma condição que deve ser satisfeita, para
que uma instrução Goto seja executada. É importante que um rótulo (label) seja iniciado com uma letra
do alfabeto ou com um traço baixo “_”. O comprimento de um rótulo pode ir até 32 caracteres.
Exemplo:
.
.
CALL DELAY_MS ;CHAMA A SUB-ROTINA DELAY_MS
.
.
DELAY_MS ;SUB-ROTINA DELAY_MS
MOVWF CONTADOR1
LOOP_MS
MOVLW .200
MOVWF CONTADOR2
LOOP_1MS
NOP
NOP
DECFSZ CONTADOR2, F
GOTO LOOP_1MS
CLRWDT
DECFSZ CONTADOR1, F
GOTO LOOP_MS
RETURN ;RETORNA DA SUB-ROTINA
6.3 COMENTÁRIOS
Comentário é um texto que o programador escreve no programa afim de tornar este mais claro e
legível. É colocado logo a seguir a uma instrução e deve começar com ponto-e-vírgula ";".
49
6.4 FORMAS DE REPRESENTAR UM NÚMERO DENTRO DO PIC
No PIC um número pode ser representado de várias formas como mostra a Tabela 5:
Sempre que um reset ocorre, seja ele pela energização dos sistema, pelo máster clear externo
(/MCLR) ou pelo estou do WDT o programa é desviado para o endereço 0x00. Desta forma a primeira
instrução a ser executada pelo microcontrolador é a instrução que esta neste endereço. Abaixo é listado
uma maneira de iniciarmos o sistema:
INICIO
BANK1 ; ALTERA PARA BANCO 1
MOVLW B'00000000'
MOVWF TRISA ; DEFINE ENTRADAS E SAÍDAS DO PORTA
MOVLW B'00000000'
MOVWF TRISB ; DEFINE ENTRADAS E SAÍDAS DO PORTB
MOVLW B'10000000'
MOVWF OPTION_REG ; DEFINE OPÇÕES DE OPERAÇÃO
MOVLW B'00000000'
MOVWF INTCON ; DEFINE OPÇÕES DE INTERRUPÇÃO
BANK0 ; RETORNA PARA BANCO 0
50
6.6 ESTRUTURAÇÃO DO CÓDIGO FONTE
;
; AUTOR : NOME
; TÍTULO: PROJETO XYZ
#INCLUDE<P16F84.INC>
#DEFINE BANK0 BCF STATUS, RP0 ; SETA O BANCO 0 DE MEMÓRIA
#DEFINE BANK1 BSF STATUS, RP0 ; SETA O BANCO 1 DE MEMÓRIA
;--------------------------------------------------------------------------------------
; IDENTIFICAÇÃO DAS POSIÇÕES DE MEMÓRIA DA EEPROM ;
;--------------------------------------------------------------------------------------
;--------------------------------------------------------------------------------------
; DEFINIÇÃO DAS VARIÁVEIS ;
;--------------------------------------------------------------------------------------
CBLOCK 0X0C
W_TEMP ; USADO PARA GUARDAR O VALOR DO REGISTRADOR WORK
STATUS_TEMP ; USADO PARA GUARDAR O VALOR DO REGISTRADOR STATUS
FLAG1 ; UTILIZADA PARA DECLARAR FLAGS
ENDC
;--------------------------------------------------------------------------------------
; DEFINIÇÃO DOS FLAGS ;
;--------------------------------------------------------------------------------------
;--------------------------------------------------------------------------------------
; DEFINICAO DAS SAÍDAS ;
;--------------------------------------------------------------------------------------
;--------------------------------------------------------------------------------------
; DEFINICAO DAS ENTRADAS ;
;--------------------------------------------------------------------------------------
;--------------------------------------------------------------------------------------
; VETOR DE RESET ;
;--------------------------------------------------------------------------------------
ORG 0X00
GOTO INICIO
;--------------------------------------------------------------------------------------
; TRATAMENTO DE INTERRUPÇÃO ;
;--------------------------------------------------------------------------------------
ORG 0X04
51
;--------------------------------------------------------------------------------------
; SALVA O CONTEXTO ;
;--------------------------------------------------------------------------------------
MOVWF W_TEMP
SWAPF STATUS, W
MOVWF STATUS_TEMP
;--------------------------------------------------------------------------------------
;--------------------------------------------------------------------------------------
; RESTAURA O CONTEXTO ;
;--------------------------------------------------------------------------------------
SAI_INT
SWAPF STATUS_TEMP, W
MOVWF STATUS
SWAPF W_TEMP, F
SWAPF W_TEMP, W
RETFIE
;--------------------------------------------------------------------------------------
; CONFIGURAÇÃO DO MICROCONTROLADOR ;
;--------------------------------------------------------------------------------------
INICIO
BANK1 ; ALTERA PARA BANCO 1
MOVLW B'11111100'
MOVWF TRISA ; DEFINE ENTRADAS E SAÍDAS DO PORTA
MOVLW B'11111111'
MOVWF TRISB ; DEFINE ENTRADAS E SAÍDAS DO PORTB
MOVLW B'10000000'
MOVWF OPTION_REG ; DEFINE OPÇÕES DE OPERAÇÃO
MOVLW B'00000000'
MOVWF INTCON ; DEFINE OPÇÕES DE INTERRUPÇÃO
BANK0 ; RETORNA PARA BANCO 0
;--------------------------------------------------------------------------------------
; INICIALIZAÇÃO DAS VARIÁVEIS/PORTAS ;
;--------------------------------------------------------------------------------------
CLRF PORTA
CLRF PORTA
;--------------------------------------------------------------------------------------
; ROTINA PRINCIPAL ;
;--------------------------------------------------------------------------------------
PRINCIPAL
; CORPO DO LOOP PRINCIPAL
GOTO PRINCIPAL
;--------------------------------------------------------------------------------------
; FIM DO PROGRAMA ;
;--------------------------------------------------------------------------------------
END
52
CAPÍTULO 7
7 INTERRUPÇÕES
As Interrupções são causadas através de eventos assíncronos (podem ocorrer a qualquer momento)
que causam um desvio no processamento. Este desvio tem como destino o vetor de interrupção.
Uma boa analogia para melhor entendermos o conceito de interrupção é a seguinte: você está
trabalhando digitando uma carta no computador quando o seu ramal toca. Neste momento você,
interrompe o que está fazendo, para atender ao telefone e verificar o que a pessoa do outro lado da linha
está precisando. Terminada a conversa, você coloca o telefone no gancho novamente e retoma o seu
trabalho do ponto onde havia parado. Observe que não precisamos verificar a todo instante, se existe ou
não alguém na linha, pois quando o ramal é chamado, o telefone toca avisando que existe alguém
querendo falar com você.
O PIC16F84 possui um total de 4 interrupções diferentes. Entretanto como os demais modelos,
todas gerarão o desvio do programa para o mesmo vetor de interrupção, desde que devidamente
configuradas para isto. Sempre que uma interrupção ocorre, o PIC guarda o endereço da próxima linha a
ser executada na pilha, e desvia para o endereço fixo na memória de programação (004H). Neste endereço
deve ser escrita a rotina de reconhecimento e tratamento de interrupção. Quando a rotina de interrupção
terminar, o programa automaticamente volta ao ponto em que estava antes da interrupção ocorrer.
Esta interrupção ocorre sempre que um contador interno chamado de TMR0 estoura, ou seja,
passa de 255 para 0. O timer 0 é o melhor auxiliar para contagem de tempo dentro do PIC. Ele nada mais
é do que um contador automático de 8 bits para os ciclos de máquina ou pulsos externos. Esta interrupção
é utilizada normalmente para contagem de tempo.
53
TMR0 = Tempo Desejado
TC * Prescaler
Configure o prescaler e o TMR0 para gerar uma interrupção a cada 10ms. prescaler
1:64
TMR0 = 10ms TMR0 = 156 MOVLW (.256 - 156)
1s * 64 MOVWF TMR0 = 100
Obs.: Alem de configurar o prescaler o TMR0 também deve ser iniciado com o valor calculado.
Esta interrupção é gerada por um sinal externo ligado ao pino RB0, caso ele esteja configurado
como entrada. Desta maneira podemos identificar e processar imediatamente um sinal externo. Esta
interrupção pode ser utilizada para diversas finalidades como por exemplo para a comunicação entre dois
micros, garantindo o sincronismo, para o reconhecimento de botão ou outro sinal que necessite uma ação
imediata. Esta interrupção pode ser configurada para a borda de subida ou para a borda de descida.
A principal diferença entre esta interrupção e a interrupção externa é que esta acontece em ambas
as bordas (subida e descida). Esta interrupção esta relacionada as portas RB4, RB5, RB6 e RB7
simultaneamente. Desta forma, se estas portas forem configuradas como entrada, a mudança de estado em
qualquer uma destas portas ira gerar uma interrupção. Este tipo de interrupção pode ser utilizado, por
exemplo, para criar um sincronismo com a rede de 60Hz, para o controle de um triac ou outro sistema
semelhante.
Esta interrupção serve para detectarmos o final de uma rotina de escrita nessa memória. A
utilização da interrupção não é obrigatória para que a escrita funcione, mas como a escrita na EEPROM é
lenta, em alguns sistemas a sua utilização pode ser necessária para evitar uma parada durante a escrita.
54
7.5 OPERANDO COM INTERRUPÇÕES
1. Uma ação relacionada a interrupção deve acontecer (estouro do TMR0, estimulo externo
etc.);
55
Ocorreu a ação
Sim
Religa a chave geral (GIE)
Desliga chave
geral (GIE)
Fim
1. Como a chave GIE é desligada antes de desviar para o vetor de interrupção, duas
interrupções não serão tratadas ao mesmo tempo, isto é, uma interrupção não gerará um
desvio caso outra interrupção já esteja sendo tratada.
2. Como todas as interrupções desviam para o mesmo ponto, é necessário testar os flags de
todas as interrupções ligadas para saber qual realmente ocorreu.
56
CAPÍTULO 8
8 EEPROM
A escrita na EEPROM é um pouco complexa, mais esta complexidade é necessária para evitar
escritas acidentais na memória.
A escrita na EEPROM deve acompanhar o seguinte roteiro:
57
Abaixo é apresentado uma rotina completa para escrita na EEPROM.
.
.
.
BCF INTCON, RPO ; Muda para o banco 0
MOVLW .10 ; Deve-se escrever em EEADR a posição de memória
MOVWF EEADR ; a ser escrita na EEPROM
MOVLW .2 ; dois é o dado a ser escrito na EEPROM
CALL GRAVA_EEPROM
.
.
.
GRAVA_EEPROM
MOVWF EEDATA ; Move o conteúdo de w para o registrador EEDATA
BCF INTCON, GIE ; Desabilita a chave geral de interrupção
BSF STATUS, RP0 ; Muda para o banco 1
BSF EECON1, WREN ; Habilita a escrita
MOVLW 0X55 ;
MOVWF EECON2 ; Escreve 55h no registrador EECON2
MOVLW 0XAA ;
MOVWF EECON2 ; Escreve AAh no registrador EECON2
BSF EECON1,WR ; Inicia escrita
BTFSC EECON1,WR ; Testa se a escrita terminou
GOTO $-1 ; Volta uma linha
BCF INTCON, RPO ; Muda para o banco 0
BSF INTCON, GIE ; Habilita novamente as interrupções
RETURN
O processo de leitura é muito mais simples, pois não necessita tanta proteção, e também é muito
mais rápido.
A leitura na EEPROM deve acompanhar o seguinte roteiro:
58
Abaixo é apresentado uma rotina completa para leitura na EEPROM.
.
.
.
BCF INTCON, RPO ; Muda para o banco 0
MOVLW .10 ; Deve-se escrever em EEADR a posição de memória
MOVWF EEADR ; a ser lida na EEPROM
CALL LE_EEPROM
.
.
.
LE_EEPROM
BSF STATUS, RP0 ; Muda para banco 1
BSF EECON1, RD ; Inicia leitura
BTFSC EECON1, RD ; Testa se acabou a leitura
GOTO $-1 ; Volta uma linha
BCF STATUS, RP0 ; Volta para banco 0
MOVF EEDATA, W ; Move para W o dado lido
RETURN
59
CAPÍTULO 9
9 MODO SLEEP
O modo de operação Sleep foi incluído na família PIC para atender um mercado cada vez maior
de produtos que devem funcionar com pilhas ou baterias. Estes equipamentos devem ter um consumo
mínimo para que a autonomia seja a máxima. Quando o PIC é colocado em modo Sleep (dormir), através
da instrução SLEEP, o consumo passa da ordem de grandeza de mA (mili ampéres) para uA (micro
ampéres). Quando o PIC entra no modo SLEEP o oscilador é paralisado, desta forma todo o
processamento também é paralisado. O estado das portas é mantido, ou seja, aquelas que eram entras
continuam sendo entradas assim como os níveis lógicos das que eram saída.
Para entrar no modo SLEEP é muito simples, devemos apenas executar a instrução SLLEP. Antes
do oscilador ser desligado, o bit /PD do registrador STATUS é limpo (0) e o bit /TO é setado (1). Estes
bits são utilizados na hora de sair do modo SLEEP.
1. Por meio de um reset externo através do pino /MCRL. Quando isto ocorrer o sistema é
reiniciado independente do PIC estar no modo SLEEP ou não.Esse reset pode ser identificado
testando o estado dos bits /T0 = 1 e /PD =0.
2. Por um estouro do WDT caso ele esteja habilitado. Mesmo estando no modo SLEEP timer do
WDT não é paralisado e como a instrução CLRWDT não esta sendo executada o WDT ira
estourar reiniciando o sistema. Quando isto ocorre, o programa continuará a ser executado na
linha seguinte a instrução SLEEP. Esta situação pode ser checada através do bit /T0 = 0. É
muito importante ressaltar que alguns modelos de PIC resetam quando acontece um
estouro do WDT, voltando ao início do programa e não a linha seguinte ao comando
SLEEP.
3. Devido a uma interrupção externa, interrupção por mudança de estado ou interrupção de final
de escrita na EEPROM.
60
CAPÍTULO 10
10 MPLAB
Quando se clica no ícone do MPLAB aparece a tela como mostra a Figura 16.
Se o processador indicado no rodapé não for o 16F84A, siga a seguinte seqüência nos menus:
Options/Development Mode, e selecione a ficha “Tools” e teremos a tela da Figura 17. Marque a opção
MPLAB-SIM Simulator e selecione PIC16F84A no menu à direita, deixando sua seleção conforme acima
e depois dê um click no botão Apply e em seguida em OK.
61
Figura 17 - Seleção do processador
Para podermos obter do simulador informações precisas sobre nosso programa quando simulado,
devemos informar ao mesmo qual a freqüência de clock com que o chip funcionará. Selecione na linha do
menu do MpLab Options/Development Mode e selecione a ficha “Clock” e obteremos a janela da Figura
18: - Inicialmente selecione se a freqüência estará em MHz, kHz ou Hz; - No campo “Desired Frequency”
entre com a freqüência desejada, por exemplo, 4 para 4 MHz ( o campo “Actual Frequency” mostra a
freqüência atual com que o simulador está calculando os eventos); - No box “Oscilator Type” selecione
modo XT; - Dê um clique em “OK” e na nova janela apenas responda “OK” novamente. - Veja no rodapé
do MpLab a freqüência sendo reconhecida pelo programa.
62
10.2 PROJETO
Entende-se por projeto um conjunto de arquivos e informações que diz ao MpLab qual a situação
de um certo trabalho em particular. Por exemplo, num certo projeto designado EXEMPLO.PJT temos
duas janelas abertas: exemplo.asm e exemplo.lst. Em outro projeto designado TESTE.PJT temos três
janelas abertas: teste.asm, teste.lst. e File Register Window. Com o gerenciamento de projetos presente no
MpLab não precisamos “lembrar” quais as janelas que cada projeto estava usando no momento em que
encerramos o trabalho, pois ao carregarmos o projeto desejado todas as informações relativas ao mesmo
serão recuperadas.
IMPORTANTE: Ao encerrar seus trabalhos não vá fechando as janelas abertas. Feche apenas o
MpLab e na janela “Save Project” selecione Yes, ou caso pretenda apenas encerrar o trabalho atual,
selecione no menu “Project > Close Project”, e responda Yes se necessário, para salvar as alterações.
Iniciaremos um novo projeto sempre pela criação de um novo fonte. Execute a seguinte seqüência:
Um novo fonte de nome Untitled1 será criado, e o MpLab lhe perguntará se deseja criar um novo
projeto. Responda “NO” para prosseguir na criação do fonte. Você obterá a tela da Figura 19. Nesta
janela será escrito o programa que será gravado no PIC.
63
Antes de começar a escrever o programa é interessante salvar o arquivo para evitar que se perca o
que foi escrito. Para isto execute a seguinte seqüência:
Na janela aberta digite o nome para o fonte e selecione o local onde deve ser gravado. Agora dê
um click no botão OK. Neste momento o MPLAB troca o nome na barra de título, ao invés de Untiled1,
com o nome e caminho completos que você escolheu.
Agora que já criamos o fonte vamos criar o projeto para trabalharmos com o mesmo. Selecione
Project > New Project e a janela da Figura 20 se abrirá (veja na janela do fonte o nome e caminho do
arquivo). Escreva no campo "File Name" o nome do projeto e de um click em OK. Lembre-se de salvar
o projeto no mesmo local onde foi salvo o fonte do programa.
Sempre que um novo projeto é criado, a janela “Edit Project” será exibida automaticamente.
Entende-se por editar o projeto escolher qual fonte fará parte do mesmo, sendo usado no processo
de compilação, além de ajustar os parâmetros do compilador. Quando o projeto é novo, esta opção
aparecerá automaticamente. Podemos ainda usar a edição do projeto para trocar o fonte ou o compilador
usado no desenvolvimento.
64
Figura 21 - Editando o projeto
Em nosso exemplo teremos a tela da Figura 21. Observe que em nosso caso, o campo “Target
filename” indica que o alvo, isto é, o objetivo final de nosso trabalho, é a geração do arquivo
exemplo.hex, que será o arquivo hexadecimal a ser gravado no PIC. Ajuste o campo “Development
mode” para exibir MpLab-SIM, 16F84A. Ajuste o campo “Language tool suite” para Microchip. No
Campo “Project files” dê um click com o mouse em cima do texto “exemplo[.hex]” e observe que os
botões Add Node e Node Properties ficarão realçados (caso ainda não estejam). Sua janela deve estar
como a Figura 21 mostrada. Se não estiver, repita os ajustes. Vamos começar a ajustar o Mplab para
trabalhar com nosso “projeto”.
Dê um click no botão Node Properties. A janela da Figura 22 deve surgir (suas opções pré-
selecionadas podem estar diferentes). Caso as opções marcadas sejam diferentes, use o mouse e ajuste os
campos de forma que suas opções fiquem iguais às da Figura 22 e depois dê um click no botão OK. Este
ajuste é muito importante ! Sua tela retornará à da Figura 21 (Edit Project). Neste ponto informamos ao
65
MpLab qual compilador usar, que arquivos gerar (listagem, erros, ...), formato do arquivo .HEX, entre
outros. Para cada projeto novo você deverá ajustar desta forma.
Agora vamos informar ao MpLab qual fonte será usado na compilação, dando um click no botão
Add Node. Nossa janela ficará como a Figura 23. Lembre-se que o fonte deve estar na mesma pasta do
projeto. Observe que a janela já aparece com a pasta atual do projeto e mostra em nosso caso o fonte
criado anteriormente, exemplo.asm. Selecione o fonte e dê um click em “OK”. Agora sua janela “Edit
Project” deve estar conforme a Figura 24. Então, basta dar um click no botão OK que o processo de
edição do projeto estará completo. A partir deste ponto já podemos compilar e simular o nosso programa.
66
Figura 23 - Janela "Add Node"
67
10.3 COMPILANDO O PROGRAMA
Caso ocorra algum erro na hora da compilação, vá com o cursor para a linha do primeiro erro, veja
a descrição do mesmo e então dê dois clicks rápidos com o mouse sobre esta linha, e a janela com o fonte
será mostrada por cima da janela Build Results, com o cursor já posicionado na linha que gerou o erro.
Basta corrigir e repetir todo o processo teclando F10 novamente, até que nenhum erro ocorra.
68
Figura 26 - Janela "Build Results" após erro na compilação
10.4 SIMULAÇÃO
Veremos agora técnicas para simular nosso programa, desde execução passo a passo até animação.
F6 RESET
Equivale ao reset da CPU. Posiciona o contador de programa no endereço 0000, e coloca uma
barra preta sobre a linha correspondente. Esta barra indica “a próxima” instrução a ser simulada.
F7 STEP
A cada toque em F7 o MpLab executa uma instrução do programa. É como se nosso processador
rodasse uma instrução de cada vez. Se for mantida pressionada, executará as instruções no intervalo de
repetição automática da tecla.
CTRL + F9 ANIMATE
69
Roda o programa passo a passo dinamicamente, tornando possível acompanhar visualmente a
seqüência do programa.
F9 RUN
Realiza a simulação rápida, sem atualizar a tela. Ideal para simular situações que tomariam
demasiado tempo na animação. Apenas a janela StopWatch é atualizada (veremos mais tarde)
F5 STOP
Pressione a tecla F6, depois vá pressionando F7 e veja que a barra preta, indicativa da próxima
instrução a ser simulada, vai se deslocando, acompanhando a execução do programa. Pressione Control +
F9 e veja a simulação ocorrer dinamicamente. Para parar, pressione F5. Veremos a seguir como abrir uma
outra janela que nos mostrará o tempo decorrido de simulação.
Esta janela é utilizada para vermos o tempo de execução do programa. Para abrir a janela
Stopwatch, siga a seqüência no menu:
Para que a simulação ocorra, a janela do fonte deve ser a janela ativa, para isto basta dar um click
dentro da mesma. Veja que as teclas de simulação não funcionam, até que a janela do fonte seja
selecionada. Pressione F6 ( reset) e veja que a cada F7 pressionado os campos “Cycles” e “Time” do
stopwatch vão se alterando, indicando o número de ciclos e o tempo decorrido desde o reset (ou desde o
ultimo click no botão Zero).
Pare a simulação (F5) e dê um click no botão Zero do stopwatch, e veja que os valores “Cycles” e
“Time” serão zerados, mas ao voltar à janela do fonte, a simulação pode prosseguir do ponto onde parou.
Esta característica permite-nos determinar o tempo exato de um certo trecho de programa.
70
10.4.4 OBSERVANDO REGISTROS DA CPU DURANTE A SIMULAÇÃO
Além de podermos ver o tempo de execução, podemos observar como os registros internos se
comportam durante a execução do programa. No menu selecione a seqüência:
Aparecerá a janela da Figura 28. Na janela ativa (Add Watch Symbol), no campo “Symbol:”
escreva PORTB (os registros do PIC devem ser selecionados em maiúsculas) e depois click no botão
Properties. Você pode ainda correr a barra de rolagem vertical e selecionar com o mouse o registro
desejado. Deverá aparecer uma nova janela como a da Figura 29, nesta janela ajustaremos as
“propriedades” de visualização do registro selecionado. Ajuste Format para DECIMAL e Size para 8 bits,
e então dê um click no botão OK, fechando a janela de propriedades do registro selecionado. Veja que ao
fechar a janela PROPERTIES a janela Watch_1 já conterá a seguinte linha: Address Symbol Value 06
PORTB D ’0’.
Se desejar, acrescente outros registros da CPU e então dê um clique em “Close” para fechar a
janela “Add Watch Symbols”. Faça da janela do código fonte a janela ativa e divirta-se com os recursos
de simulação do MpLab.
71
Figura 29 - Ajustando as propriedades do registro escolhido
Este recurso tem como objetivo simular variações externas nos pinos do PIC. No menu principal
selecione:
72
Figura 30 - Botões de estímulo
Observe que existem 12 “botões” com nomes de Stim 1 a Stim 12 e dentro dos parênteses a letra
P. Vamos ver cada ajuste em detalhes. Com o botão direito do mouse dê um click no botão Stim 1 (P) e
você obterá o menu da Figura 31.
Observe que a opção Pulse está selecionada. Esta é a opção padrão, indicada dentro dos parênteses
como (P). As opções para estímulo externo são:
Observe que a primeira opção do menu é Assign pin.... Selecionando esta opção um novo menu se
abre, conforme a Figura 32.
73
Figura 32 - Ajustando os pinos que receberão os estímulos
Então, para associarmos o botão desejado a um certo pino do PIC, basta dar um duplo click no
pino desejado. Agora, durante a simulação, podemos fazer com que sinais externos sejam aplicados ao
PIC e ver seu comportamento. Basta durante a simulação clicar sobre os botões desejados, e o estímulo
associado ao mesmo será aplicado ao PIC e o simulador responderá de acordo.
74
CAPÍTULO 11
11 EXERCÍCIOS
Exe 1: Utilizando o esquema elétrico abaixo, faça um programa no PIC para ler duas teclas, caso uma
tecla esteja pressionada, deverá sinalizar ligando o led correspondente, após a tecla solta o led deve ser
desligado.
Exe 2: : Modifique o exemplo anterior de forma que quando uma tecla seja pressionada, o programa
devera modificar o estado do led correspondente, ou seja, se o led estiver ligado este deve ser desligado
caso contrário deverá ser ligado.
Exe 3: Faça o esquema elétrico dos pinos de I/O e o programa no PIC para o controle de um reservatório
que atenda as seguintes condições:
1. Se o sensor A for ativado, a eletro-válvula P deve ser desligada.
2. Se o sensor B for desativado, a eletro-válvula P deve ser ligada.
Obs.: Quando um sensor estiver ativo, este impõe 5V no pino de I/O correspondente no PIC.
Exe 4: Faça um programa no PIC para o controle de uma máquina de dosagem de grãos que atenda as
seguintes exigências:
1- Quando a botoeira L for pressionada, inicia-se o processo.
2- Quando a botoeira D for pressionada o processo é finalizado, mais somente depois de concluir
um ciclo de dosagem.
3- O ciclo de dosagem inicia-se ligando a eletro-válvula EV1 até que o sensor PF do cilindro 1
seja ativado. Espera-se 200ms e desliga-se a eletro-válvula EV1 fazendo com que a haste do
cilindro avance novamente. A eletro-válvula EV2 deve ser acionada logo depois que o sensor
PI do cilindro 1 ser ativado e desligada 200ms após o sensor PF do cilindro 2 se ativado. Um
novo ciclo é iniciado após o sensor PI do cilindro 2 ser ativado.
75
Observações:
1. Quando um sensor for ativado este impõe 5V no pino de I/O correspondente no PIC.
2. As eletro-válvulas são do tipo retorno-mola, ou seja, para fazer com que o cilindro recue deve-
se ligar a eletro-válvula e para fazer com que o cilindro avance basta desligar a eletro-válvula.
Exe 4: Faça a representação dos pinos de I/O e o programa no PIC16F84 para o controle de uma máquina
de solda que atenda as seguintes condições:
Quando o operador acionar o gatilho (G), a máquina deve entrar em funcionamento atuando
primeiramente o relé (E) para avanço do motor do eletrodo e após 0,3 segundos deve acionar o
atuador (A) para fechamento do arco.
No momento que o operador soltar o gatilho uma operação reversa deve ocorrer ou seja,
primeiramente desliga-se o eletrodo (A) e depois de 0,3 segundo desliga-se o motor (E).
Obs.: Quando o gatilho (G) for acionado, a tensão no pino de I/O correspondente será 0, quando o gatilho
for solto a tensão vai para 5V.
Exe 5: Faça o esquema elétrico dos pinos de I/O e o programa no PIC para um sistema de controle de
garrafas que atenda as seguintes condições:
1. Quando a botoeira L for pressionada, o motor M deve ser ligado.
2. Quando a botoeira D for pressionada, o motor M deve ser desligado.
O sistema deverá permitir apenas a passagem de garrafas grandes isto é, se o sensor A for acionado e o
sensor B não, isto indica que não é uma garrafa grande. Quando isto ocorrer o motor M deve ser
desligado.
76
Obs.: Quando um sensor estiver ativo, este impõe 5V no pino de I/O correspondente no PIC. Quando uma
tecla for acionada, esta impõe 0V no pino de I/O correspondente no PIC.
EXE 6: Faça o esquema elétrico dos pinos de I/O e o programa no PIC para o controle de um reservatório
que atenda as seguintes condições:
1. Se o nível for A então fecha-se a válvula P.
2. Acima de B as bombas M1 e M2 trabalham.
3. Se o nível for inferior a B então abre-se a válvula P e somente a bomba M1 trabalha.
4. Abaixo de C soa o alarme AL.
5. Abaixo de D nenhuma das bombas deve funcionar.
Obs.: Quando um sensor estiver ativo, este impõe 5V no pino de I/O correspondente no PIC.
EXE 7: Faça o esquema elétrico dos pinos de I/O e o programa no PIC para um sistema de controle de
garrafas que atenda as seguintes condições:
1. Quando a botoeira L for pressionada, o motor M deve ser ligado.
2. Quando a botoeira D for pressionada, o motor M deve ser desligado.
3. O sistema deve permitir apenas a passagem de garrafas grandes isto é, se o sensor A for
acionado e o sensor B não, isto indica que não é uma garrafa grande. Quando isto ocorrer a
eletro-válvula P deve ser acionada por 400ms descartando desta forma a garrafa indesejada.
4. Quando a botoeira L for acionada o sistema deve contar quantas garrafas válidas (garrafas
grandes) passaram. Quando o número de garrafas válidas chegar a 200 o sistema deve parar o
motor M e ligar o alarme AL por 500ms avisando desta forma o operador da máquina.
5. Se a contagem de garrafas for interrompida devido a botoeira D ser acionada, quando a
botoeira L for acionada o sistema deve começar a contagem de garrafas do zero.
Obs.: Quando um sensor estiver ativo, este impõe 5V no pino de I/O correspondente no PIC. Quando uma
tecla for acionada, esta impõe 0V no pino de I/O correspondente no PIC.
77
EXE 8: A Figura abaixo mostra uma máquina para bobinagem de carretéis. Faça um programa que
acione o motor M sempre que o botão B for acionado. O motor deve ficar ligado até que o carretel seja
preenchido com 200 voltas de fio. A indicação de volta é indicado pelo chanfro do carretel cada vez que
aciona a micro-fim-de-curso A.
EXE 9: Faça um programa em PIC utilizando interrupções para fazer o led da Figura abaixo ficar
piscando. O led deve ficar um segundo acesso e um segundo apagado.
EXE 10: Faça a representação dos pinos de I/O e o programa no PIC16F84 para o controle de uma esteira
transportadora formada por 3 cilindros pneumáticos comandados por 3 eletro-válvulas, sensores de
posição para cada cilindro, sendo PI (Posição Inicial), PM (Posição Média) e PF (Posição Final), dois
sensores de presença (A e B) e de duas esteiras rolantes de saída. O sensor (A) percebe a presença de uma
caixa e o sensor (B) identifica o tamanho da caixa, pois atua quando ela for do tipo grande como mostra a
Figura 1. O programa deve atender as seguintes condições:
1. Quando o sensor (A) detectar a presença de uma nova caixa e esta for uma caixa pequena
(sensor B desativado), a eletro-válvula (EV 1) deve ser acionada fazendo com que o cilindro 1
avance. A eletro-válvula deve permanecer acionada até que o sensor (PM) do cilindro 1 seja
acionado. Neste momento a eletro-válvula (EV 2) deve ser acionada fazendo com que o
cilindro 2 avance. A eletro-válvula deve permanecer ligada até que o sensor (PF) do cilindro 2
seja acionado. O sistema deve esperar que os sensores (PI) dos cilindros 1 e 2 sejam acionados
para evitar colisão das caixas. Após isto o sistema poderá fazer nova leitura do sensor (A) para
verificar se chegou uma nova caixa.
2. Quando o sensor (A) detectar a presença de uma nova caixa e esta for uma caixa grande
(sensor B ativado), a eletro-válvula (EV 1) deve ser acionada fazendo com que o cilindro 1
avance. A eletro-válvula deve permanecer acionada até que o sensor (PF) do cilindro 1 seja
acionado. Neste momento a eletro-válvula (EV 3) deve ser acionada fazendo com que o
cilindro 3 avance. A eletro-válvula deve permanecer ligada até que o sensor (PF) do cilindro 3
seja acionado. O sistema deve esperar que os sensores (PI) dos cilindros 1 e 3 sejam acionados
78
para evitar colisão das caixas. Após isto o sistema poderá fazer nova leitura do sensor (A) para
verificar se chegou uma nova caixa.
Observações:
3. Quando um sensor for ativado este impõe 5V no pino de I/O correspondente no PIC.
4. As eletro-válvulas são do tipo retorno-mola, ou seja, para fazer com que o cilindro avance
deve-se ligar a eletro-válvula e para fazer com que o cilindro retorne basta desligar a eletro-
válvula.
79
Referências Bibliográficas
[3] ROSÁRIO, João Maurício. Microcontroladores Família PIC – Curso de Mecatrônica UNICAMP,
2002
[5] SOUZA, David José. Conectando o PIC / David José de Souza, Nicolás César Lavinia . Revisão 2
São Paulo: Mosaico Engenharia Eletrônica.
80