Você está na página 1de 80

MARCOS ROBERTO DE SOUZA

marcosrobertosouza74@gmail.com

MICROCONTROLADORES

PIC
BASEADO NO MICROCONTROLADOR
PIC16F84

MIP
SUMÁRIO

LISTA DE FIGURAS.............................................................................................................. V

LISTA DE TABELAS ........................................................................................................... VI

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

REFERÊNCIAS BIBLIOGRÁFICAS ................................................................................. 80

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

TABELA 1 - CARACTERÍSTICAS ELÉTRICAS ................................................................... 9


TABELA 2 - DESCRIÇÃO DOS PINOS DO PIC16F84........................................................ 10
TABELA 3 - TIPOS DE OSCILADOR ................................................................................... 16
TABELA 4 - VALORES TIPICOS PARA OS CAPACITORES C1 E C2............................. 18
TABELA 5 - FORMAS DE REPRESENTAR UM NÚMERO .............................................. 50

vi
CAPÍTULO 1
1 MICROCONTROLADORES

Um sistema computacional é composto por uma unidade de processamento, memória e portas de


entrada/saída (I/O).
A maioria das pessoas limita o conceito de sistema computacional ao computador que temos em
casa, vulgo PC (Personal Computer). No entanto todo sistema que a partir de dados de entrada, executa
algum processamento mediante um programa armazenado em uma memória gerando uma saída é
chamado de sistema computacional. Podemos definir microcontrolador como sendo um sistema
computacional integrado, pois ele possui unidade de processamento, memória, entradas e saídas
integradas em um único chip.

1.1 ARQUITETURA DOS 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:

Arquitetura de Von Neumann : A Unidade Central de Processamento é interligada à memória por um


único barramento. O sistema é composto por uma única memória onde são armazenados dados e
instruções.

Arquitetura de Harvard: A Unidade Central de Processamento é interligada a memória de dados e a


memória de programa por barramento específico.

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

Figura 1 - Arquiteturas Harvard versus Von Neumann

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

Os microcontroladores com a arquitetura Harvard, são também designados por


"microcontroladores RISC". RISC provém de Computador com um Conjunto Reduzido de Instruções
(Reduced Instruction Set Computer). Os microcontroladores com uma arquitetura Von Neumann são
designados por 'microcontroladores CISC'. O nome CISC deriva de Computador com um Conjunto
Complexo de Instruções (Complex Instruction Set Computer).
Como o PIC16F84 é um microcontrolador RISC, disso resulta que possui um número reduzido de
instruções, mais precisamente 35 (por exemplo, os microcontroladores da Intel e da Motorola têm mais de
cem instruções). Todas estas instruções são executadas num único ciclo, exceto no caso de instruções de
salto e de ramificação. De acordo com o que o seu fabricante refere, o PIC16F84 geralmente atinge
resultados de 2 para 1 na compressão de código e 4 para 1 na velocidade, em relação aos outros
microcontroladores de 8 bits da sua classe.

1.3 APLICAÇÕES

Um microcontrolador é perfeitamente adequado para muitas variedades de aplicações, como a


indústria de automóvel, sensores remotos, fechaduras elétricas e dispositivos de segurança. É também um
dispositivo ideal para cartões inteligentes, bem como para dispositivos alimentados por baterias, por causa
do seu baixo consumo.
A memória EEPROM, faz com que se torne mais fácil usar microcontroladores em dispositivos
onde o armazenamento permanente de vários parâmetros, seja necessário (códigos para transmissores,
velocidade de um motor, freqüências de recepção, etc.). O baixo custo, baixo consumo, facilidade de
manuseio e flexibilidade fazem com que o microcontrolador se possa utilizar em áreas que estes não eram
anteriormente empregados como por exemplo: funções de temporização, substituição de interfaces em
sistemas de grande porte, etc.

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

2.2 CARACTERÍSTICAS ELÉTRICAS

Temperatura de trabalho -55oC até 125oC


Temperatura de armazenamento -65oC até 150oC
Tensão de trabalho 2.0V a 6.0V
Voltagem máxima no pino Vdd (em relação ao Vss) -0.3V até 7.5V
Voltagem máxima no pino /MCLR (em relação ao Vss) -0.3V até 14V
Voltagem máxima nos demais pinos (em relação ao Vss) -0.6V até (Vdd + 0.6V)
Dissipação máxima de energia 800mW
Corrente máxima de saída no pino Vss 150mA
Corrente máxima de entrada no pino Vdd 100mA
Corrente máxima de entrada em um pino (quando em Vss) 25mA
Corrente máxima de saída em um pino (quando em Vdd) 20mA
Corrente máxima de entrada no PORTA 80mA
Corrente máxima de saída no PORTA 50mA
Corrente máxima de entrada no PORTB 150mA
Corrente máxima de saída no PORTB 100mA

Tabela 1 - Características elétricas

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.

Tabela 2 - Descrição dos pinos do PIC16F84


10
Legenda:
I = Input (entrada)
O = Output (saída)
I/O = Input/Output (entrada ou saída)
P = Power (Alimentação)
- = Não utilizado
TTL = Entrada do tipo TTL
ST = Entrada do tipo Schmitt Trigger

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.

2.4 ESTRUTURA INTERNA

Figura 3 - Estrutura interna do PIC16F84

2.5 MAPAS DE MEMÓRIA

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

A memória de programa é onde as instruções do programa são armazenadas. No caso do 16F84


esta memória é de 1024 palavras (words) de 14 bits cada uma. Parte destes 14 bits informam o OPCODE
(código da instrução) e o restante traz consigo o argumento da instrução correspondente. Na família PIC
existem três tipos de memória de programa: EPROM (O.T.P. – One Time Programable), EEPROM
(janelado) e FLASH. O 16F84 possui memória de programa Flash. Este tipo de memória é regravável
eletronicamente. Este modelo de PIC só permite gravar nesta memória através de um gravador, existem
modelos que possibilita acessar esta memória por software, possibilitando que o programa seja reescrito
dinamicamente ou ainda, que ela seja utilizada como uma expansão da memória EEPROM.

Figura 4 - Memória de programa

2.5.2 PILHA (STACK)

A pilha é um local fisicamente separado da memória de programa utilizado para armazenar os


endereços de retorno quando utilizamos instruções de desvio. Quando no programa utilizamos a instrução
CALL ou uma interrupção é gerada, o endereço seguinte ao ponto onde estava sendo executado o
programa é armazenado na pilha. Quando utilizamos os comandos RETURN, RETLW, RETFIE o PIC
busca da pilha o endereço de retorno para que o programa possa voltar ao ponto onde estava.
É bom lembrar que a pilha tem somente 8 níveis, isto é, é possível armazenar 8 endereços de
retorno, possibilitando 8 desvios consecutivos. Caso se tente chamar um número de rotinas maior que
o tamanho da pilha, o endereço de retorno mais antigo será perdido.

Figura 5 - Pilha (Stack)

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.

 Registradores especiais: São os chamados SFRs (Special Functions Registers), estes


registradores são utilizados para execução do programa e processamento da ULA (Unidade
Lógica e Aritmética).
 Registradores de uso geral: Trata-se de uma área destinada ao armazenamento das variáveis
definidas pelo usuário.

Figura 6 - Memória de dados

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.

2.5.4 MEMÓRIA DE DADOS NÃO VOLÁTIL (EEPROM)

O PIC16F84 possui 64 bytes de EEPROM. Os dados armazenados nesta memória ficam


armazenados mesmo quando o PIC é desenergizado. Um bom exemplo do uso desta memória é uma
discadora telefônica, o usuário só precisa programar o número a ser discado uma única vez.

2.6 UNIDADE LÓGICA E ARITMÉTICA

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

O PIC possui internamente um recurso de hardware denominado Timer0. Trata-se de um contador


de 8 bits incrementado internamente pelo ciclo de máquina ou por um sinal externo (borda de subida ou
descida), sendo esta opção feita por software durante a programação (SFR). Como o contador possui 8
bits ele pode assumir 256 valores distintos (0 até 255). Caso o ciclo de máquina seja de 1μs, cada
incremento do Timer corresponderá a um intervalo de 1μs. Caso sejam necessário intervalos de tempos
maiores para o mesmo Ciclo de Máquina, utilizamos o recurso de PRESCALE.

2.8 PRESCALE

O PreScale é um divisor de freqüência programável do sinal que incrementa o Timer0. Quando


temos um prescale de 1:1, cada ciclo de máquina corresponde a um incremento do Timer0 (unidade de
Timer0). Ao alterarmos o prescale para, por exemplo 1:4 (os valores possíveis são as potencias de dois até
256), o Timer0 será incrementado uma vez a cada quatro ciclos de máquina.

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.

2.10 POWER UP TIMER

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.

2.11 BROWN OUT

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.

Figura 7 - Esquema de alimentaçã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.

LP Cristal ou ressonador de baixa freqüência


XT Cristal/Ressonador
HS Cristal/Ressonador de alta freqüência (acima de 4 MHz)
RC Resistor/Capacitor

Tabela 3 - Tipos de oscilador

 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

Abaixo é listada a fórmula da freqüência

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.

Figura 9 - Montagem para Cristal ou Ressonador Cerâmico

 CRISTAL – É o tipo mais preciso e também o mais caro, a Figura 9 mostra o esquema de
montagem.

 HÍBRIDO OU CIRCUITOS DE OSCILAÇÃO – Podem ser utilizados ainda cristais


híbridos ou circuitos próprios para oscilação, que devem ser ligados diretamente no pino
OSC1. Geralmente é utilizado quando existem mais de um microcontrolador e queremos
garantir o sincronismo entre eles.

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

Tabela 4 - Valores tipicos para os capacitores C1 e C2

3.2.1 TEMPO DE CICLO

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

Portanto, para um clock de 4MHz, o PIC executa cada instrução em 1s.

3.3 POWER-ON RESET (POR)

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.

Figura 10 - Circuito exemplo para reset manual do PIC

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

4.1.1 REGISTRADOR STATUS

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.

Registrador: STATUS Endereços: 03h e 83h


Bit 7 R/W IRP Este bit não é utilizado no PIC16F84, manter sempre em 0
Bit 6 R/W RP1 Este bit não é utilizado no PIC16F84, manter sempre em 0
Seletor de banco de memória utilizado para endereçamento direto.
Bit 5 R/W RP0 0=Banco 0 (00h – 7Fh)
1=Banco 1 (80h – FFh)
Indicação de Time-Out
Bit 4 R /T0 0=Indica que ocorreu um estouro do WatchDog (WDT).
1=Indica que ocorreu um power-up ou foram executadas as instruções CLRWDT ou SLEEP.
Indicação de Power-Down
Bit 3 R /PD 0=Indica que a instrução SLEEP foi executada.
1=Indica que ocorreu um power-up ou foi executada a instrução CLRWDT.
Indicação de zero.
Bit 2 R/W Z 0=Indica que o resultado da última operação (lógica ou aritmética) não foi zero.
1=Indica que a última operação (lógica ou aritmética) resultou em zero.
Digit Carry/borrow
0=A última operação da ULA não ocasionou em estouro de dígito.
Bit 1 R/W DC 1=A última operação da ULA ocasionou um estouro (carry) entre o bit 3 e 4, isto é, o resultado
ultrapassou os 4 bits menos significativos.
Utilizado quando se trabalha com números de 4 bits.
Carry/borrow
0=A última operação da ULA não ocasionou um estouro (carry).
Bit 0 R/W C 1=A última operação da ULA ocasionou um estouro (carry) no bit mais significativo, isto é, o
resultado ultrapassou os 8 bit disponíveis.
É bom observar que no caso da subtração o Carry trabalha com a lógica invertida.

Abaixo é apresentado alguns exemplos práticos de como utilizar os bits de controle Z e C.

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

Como resultado desta operação foi 0 o bit Z do registrador STATUS será 1.

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.

Registrador: OPTION Endereço: 81h


Habilitação dos pull-ups internos para o PORTB
Bit 7 R/W /RBPU 0=Pull-ups habilitados para todos os pinos do PORTB configurados como entrada.
1=Pull-ups desabilitados.
Configuração da borda que gerará a interrupção externa do RB0
Bit 6 R/W INTEDG 0=A interrupção ocorrerá na borda de descida.
1=A interrupção ocorrerá na borda de subida.
Configuração do incremento para o TMR0
Bit 5 R/W T0CS 0=TMR0 será incrementado internamente pelo clock da máquina.
1=TMR0 será incrementado externamente pela mudança no pino RA4/T0CKI.
Configuração da borda que incrementará o TMR0 no pino RA4/T0CKI, quando T0CS = 1
Bit 4 R/W TOSE 0=O incremento ocorrerá na borda de subida.
1=O incremento ocorrerá na borda de descida.
Configuração de aplicação do prescaler
Bit 3 R/W PSA 0=O prescaler será aplicado ao TMR0.
1=O prescaler será aplicado ao WDT.
Bit 2 R/W PS2 Configuração de valor de prescaler
Bit 1 R/W PS1 Bits 2,1,0 TMR0 WDT
000 1:2 1:1
001 1:4 1:2
010 1:8 1:4
011 1:16 1:8
Bit 0 R/W PS0
100 1:32 1:16
101 1:64 1:32
110 1:128 1:64
111 1:256 1:128

4.1.3 REGISTRADOR INTCON

Este registrador serve para configurar e identificar as interrupções.

Registrador: INTCON Endereços: 0Bh e 8Bh


Habilitação geral das interrupções (chave geral)
Bit 7 R/W GIE 0=Nenhuma interrupção será tratada.
1=As interrupções habilitadas individualmente serão tratadas.
Habilitação da interrupção de final de escrita na EEPROM (chave individual).
Bit 6 R/W EEIE 0=A interrupção não será tratada.
1=A interrupção será tratada.
Habilitação da interrupção de estouro de TMR0 (chave individual)
Bit 5 R/W T0IE 0=A interrupção não será tratada.
1=A interrupção será tratada.
Habilitação de interrupção externa no pino RB0 (chave individual)
Bit 4 R/W INTE 0=A interrupção não será tratada.
1=A interrupção será tratada.
Habilitação da interrupção por mudança de estado nos pinos RB4 a RB7 (chave individual)
Bit 3 R/W RBIE 0=A interrupção não será tratada.
1=A interrupção será tratada.
Bit 2 R/W TOIF Identificação da interrupção de estouro de TMR0
22
0=Esta interrupção não ocorreu.
1=Esta interrupção ocorreu.
Identificação da interrupção externa no pino RB0
Bit 1 R/W INTF 0=Esta interrupção não ocorreu.
1=Esta interrupção ocorreu.
Identificação da interrupção por mudança de estado nos pinos RB4 a RB7
Bit 0 R/W RBIF 0=Esta interrupção não ocorreu.
1=Esta interrupção ocorreu.

4.1.4 REGISTRADORES PCL E PCLATH

O PC (Program Counter) especifica o endereço da próxima instrução a ser executada. O PC é um


registrador de 13 bits sendo que os 8 bits menos significativos é chamado de PCL. O valor do PCL pode
ser lido e alterado pelo programa, mais isto deve ser feito com muito cuidado para que o programa não
trave ou se perca.

Registrador: PCL Endereço: 02h e 82h


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
Parte baixa do PC

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.

Registrador: PCLATH Endereço: 0Ah e 8Ah


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
- - - R/W R/W R/W R/W R/W
Parte alta do PC

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:

 1 PORT de 5 I/Os (PORTA);


 1 PORT de 8 I/Os (PORTB).

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.

4.2.1 REGISTRADORES TRISA E TRISB

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

Registrador: TRISA Endereço: 85h


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
- - - R/W R/W R/W R/W R/W
- - - Ref. RA4 Ref. RA3 Ref. RA2 Ref. RA1 Ref. RA0

Observe que o TRISA possui apenas 5 pinos de I/O, os bits 5,6 e 7 não estão implementados.

Registrador: TRISB Endereço: 86h


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
Ref. RB7 Ref. RB6 Ref. RB5 Ref. RB4 Ref. RB3 Ref. RB2 Ref. RB1 Ref. RB0

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.

Figura 12 - Esquema elétrico dos pinos de I/O

Registrador: PORTA Endereço: 05h


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
- - - R/W R/W R/W R/W R/W
- - - RA4 RA3 RA2 RA1 RA0

25
A Figura abaixo mostra o diagrama de blocos do PORTA.

Registrador: PORTB Endereço: 06h


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

A Figura abaixo mostra o diagrama de blocos do PORTB.

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.

Figura 13 - Utilizando RA0 como entrada

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.

Figura 14 - Utilizando RA3 como saída

27
4.3 REGISTRADOR TMR0

O TMR0 é um registrador de 8 bits que trabalha independentemente do programa. No fim de cada


conjunto de quatro ciclos de relógio do oscilador, ele incrementa o valor armazenado, até atingir o valor
máximo (255), nesta altura recomeça a contagem. Como nós sabemos o tempo exato entre dois
incrementos sucessivos do conteúdo deste registrador, podemos utilizar este para medir intervalos de
tempo, o que o torna muito útil em vários dispositivos.

Registrador: TMR0 Endereço: 01h


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
Contador automático de 8 bits

4.4 REGISTRADORES DA EEPROM

4.4.1 REGISTRADOR EEADR

Neste registrador é escrito o endereço da EEPROM que será acessado.

Registrador: EEADR Endereço: 09h


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
Endereço de acesso na EEPROM

4.4.2 REGISTRADOR EEDATA

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.

Registrador: EEDATA Endereço: 08h


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
Dado lido/gravado na EEPROM

4.4.3 REGISTRADORES EECON1 E EECON2

Existem dois registradores de configuração da EEPROM: EECON1 e EECON2. O registrador


EECON1 é responsável pelas operações de escrita e leitura na EEPROM.

Registrador: EECON1 Endereços: 88h


Bit 7 - -
Bit 6 - -
Bit 5 - -
Identificação de final de escrita na EEPROM
Bit 4 R/W EEIF
1 = Operação de escrita terminada.
0 = A operação escrita ainda não terminou ou não começou.
Identificação de erro durante a escrita na EEPROM. Este bit é posto a '1' só em casos em que a
Bit 3 R/W WRERR
escrita na EEPROM tenha sido interrompida por um sinal de reset ou por um transbordo no
28
temporizador do watchdog (no caso de este estar ativo).
1 = Ocorreu um erro
0 = Não houve erros
Bit de habilitação de escrita na EEPROM.
Bit 2 R/W WREN 1 = A escrita é permitida
0 = Não se pode escrever
Bit de controle de escrita. Pôr este bit em '1' faz iniciar-se a escrita do dado a partir do registro EEDATA para
o endereço especificado no registro EEADR.
Bit 1 R/S WR 1 = Inicia a escrita
0 = Não inicia a escrita
Bit de controle de leitura. Ao pôr este bit em '1', tem início a transferência do dado do endereço
definido em EEADR para o registro EEDATA.
Bit 0 R/S RD
1 = Inicia a leitura
0 = Não inicia a leitura
O registrador EECON2 não existe fisicamente e serve para proteger a EEPROM de uma escrita
acidental.

Registrador: EECON2 Endereço: 89h


Utilizado para inicializar corretamente a escrita na EEPROM

4.5 ENDEREÇAMENTO INDIRETO

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.

Registrador: FRS Endereço: 04h e 84h


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
R/W R/W R/W R/W R/W R/W R/W R/W
Ponteiro para endereçamento indireto

Registrador: INDF Endereço: 00h e 80h


Valor do endereçamento indireto

29
CAPÍTULO 5
5 SET DE INSTRUÇÕES DO PIC

O PIC16F84 possui 1024 words de memória de programa. Quando falamos da memória de


programa sempre nos referimos ao termo WORD e nunca ao termo BYTE, isto porque esta memória é de
14 bits, enquanto um byte possui apenas 8 bits.

5.1 FORMATO DAS INSTRUÇÕES DO PIC

 Operação com registradores


13 8 7 6 0
OPCODE d f(file)
d = 0 – destino W
d = 1 – destino f
f = 7 bit – endereço do registrador

 Operação com bits


13 10 9 7 6 0
OPCODE B(bit) f(file)
b = 3 bits – bit de endereço
f = 7 bit – endereço do registrador

 Operação de controle e com literais


13 8 7 0
OPCODE k(literal)
k = 8 bits – constante de 8 bits

 Operação com instruções CALL e GOTO


13 11 10 0
OPCODE k(literal)
k = 11 bits – constante de 8 bits

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:

Trata-se de um registrador temporário para as operações da ULA. No


Work assembler do PIC, ele é conhecido como W. Também é comum chamá-lo de
acumulador.
Referência a um registrador (posição de memória) propriamente dita.
File Utilizaremos a letra F para sua representação nos nomes de instruções e f
nos argumentos delas.
Um número qualquer que pode ser escrito na forma decimal, hexadecimal ou
Literal binária. Utilizaremos a letra L para sua representação nos nomes de
instruções e k nos argumentos delas.
O local onde deve ser armazenado o resultado da operação. Existem
Destino somente dois destinos possíveis: F, que guardará o resultado no próprio
registrador passado como argumento, ou W, que coloca o resultado em Work.
Referência a um bit específico dentro de um byte. Utilizaremos a letra B para
Bit
sua representação nos nomes das instruções e b nos argumentos delas.
Quando queremos testar o estado de um bit, para descobrirmos se ele é
Teste ZERO ou UM. Utilizaremos a letra T para representa-lo nos nomes das
instruções.
Significa “pulo”, é utilizado para criar desvios, pulando a próxima linha.
Skip
Utilizaremos a letra S para representa-lo nos nomes das instruções.
Refere-se ao ato de setar um bit, isto é, torna-lo equivalente a UM.
Set
Utilizaremos a letra S para representa-lo nos nomes das instruções.
Refere-se ao ato de “clear” um bit, isto é, torna-lo equivalente a ZERO.
Clear
Utilizaremos a letra C para representa-lo nos nomes das instruções.
Algumas instruções podem gerar desvios se o resultado da operação efetuada
Zero
for zero. Neste caso utilizaremos a letra Z para indicar tal condição.

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.

Instrução Argumentos Descrição Status Afetado


Operações com registradores
ADDWF f, d Soma W e f, guardando o resultado em d. C, DC, Z
ANDWF f, d Lógica “E” entre W e f, guardando o resultado em d. Z
CLRF f Limpa f. Z
CLRW - Limpa W. Z
COMF f, d Calcula o complemento de f, guardando o resultado em d. Z
DECF f, d Decrementa f, guardando o resultado em d. Z
Decrementa f, guardando o resultado em d, e pula a próxima
DECFSZ f, d -
linha se o resultado for zero.
INCF f, d Incrementa f, guardando o resultado em d. Z
Incrementa f, guardando o resultado em d, e pula a próxima
INCFSZ f, d -
linha se o resultado for zero.
IORWF f, d Lógica “OU” entre W e f, guardando o resultado em d. Z
MOVF f, d Move f para d (cópia). Z
MOVWF f Move W para f (cópia). -
RLF f, d Rotaciona f 1 bit p/ esquerda guardando o resultado em d. C
RRF f, d Rotaciona f 1 bit p/ a direita guardando o resultado em d. C
SUBWF f, d Subtrai W de f (f - W), guardando o resultado em d. C, DC, Z
Executa uma inversão entre as partes alta e baixa de f,
SWAPF f, d -
guardando o resultado em d.
Lógica “OU exclusivo” entre W e f, guardando o resultado em
XORWF f, d Z
d.
Operação com literais
ADDLW k Soma k com W, guardando o resultado em W. C, DC, Z
ANDLW k Lógica “E” entre k e W, guardando o resultado em W. Z
MOVLW k Move k para W -
IORLW k Lógica “OU” entre k e W, guardando o resultado em W. Z
Lógica “OU exclusivo” entre k e W, guardando o resultado em
XORLW K Z
W.
SUBLW k Subtrai W de k (k – W) , guardando o resultado em W. C, DC, Z
Operação com bits
BCF f, b Impõe 0 (zero) ao bit b do registrador f. -
BSF f, b Impõe 1 (um) ao bit b do registrador f. -
Testa o bit b do registrador f, e pula a próxima linha se ele for
BTFSC f, b -
0 (zero).
Testa o bit b do registrador f, e pula a próxima linha se ele for
BTFSS f, b -
1 (um).
Controles
NOP - Gasta um ciclo de máquina sem fazer absolutamente nada -
CALL R Executa a rotina R -
CLRWDT - Limpa o registrador WDT para não acontecer o reset. /T0, /PD
GOTO R Desvia para ponto R, mudando o PC. -
RETFIE - Retorna de uma interrupção. -
RETLW k Retorna de uma rotina, com k em W. -
RETURN - Retorna de uma rotina, sem afetar W. -
Coloca o PIC em modo sleep (dormindo) para economia de
SLEEP - /T0, /PD
energia.
32
5.4 SET DE INSTRUÇÕES COMPLETO

ADDLW Soma de um literal com o registrador W


Sintaxe [label] ADDLW k
Descrição O conteúdo do registrador W é somado com uma literal e o resultado é armazenado no
próprio W.
Operação (W) + kW
Status afetado C, DC, Z
Número de palavras 1
Número de ciclos 1
Exemplo
ADDLW .15
Antes da Instrução
W = .10
Após a instrução
W = .25

ADDWF Soma entre o registrador W e o registrador F


Sintaxe [ label ] ADDWF f,d
Descrição Soma o conteúdo do registrador W com o registrador f. Se ‘d’ = 0 o resultado é
armazenado em W. Se ‘d’ = 1 o resultado é armazenado no registrador f.
Operação W) + (f) destino
Status afetado C, DC, Z
Número de palavras 1
Número de ciclos 1
Exemplo
ADDWF FSR, 0
Antes da instrução
W = .8
FSR = .2
Após a instrução
W = .10
FSR = .2
Exemplo 2
ADDWF FSR, 1
Antes da instrução
W = .8
FSR = .2
Após a instrução
W = .8
FSR = .10

ANDLW Operação “E” entre um literal e o registrador W


Sintaxe [ label ] ANDLW k
Descrição Executa um “E” lógico bit a bit entre o registrador W e uma literal. O resultado é
armazenado no registrador W.
Operação (W).AND. (k) W
Status afetado Z
Número de palavras 1
Número de ciclos 1

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 )

ANDWF Operação “E” entre os registradores W e F


Sintaxe [ label ] ANDWF f,d
Descrição Executa um “E” 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).AND. (f) destino
Status afetado Z
Número de palavras 1
Número de ciclos 1
Exemplo
ANDWF FSR, 1
Antes da instrução ; 0001 0111 (.23 )
W = .23 ; 1100 0010 (.194)
FSR = .194 ;---------- ------
Após a instrução ; 0000 0010 (.2 )
W = .23
FSR = .2

BCF Limpa um bit do registrador F


Sintaxe [ label ] BCF f,b
Descrição Limpa o bit de número b do registrador f.
Operação 0 f<b>
Status afetado Nenhum
Número de palavras 1
Número de ciclos 1
Exemplo
BCF FLAG_REG, 7
Antes da instrução
FLAG_REG = .199
Após a instrução ; 1100 0111
FLAG_REG = .71 ; 0100 0111

BSF Liga um bit do registrador F


Sintaxe [ label ] BSF f,b
Descrição Liga o bit de número b do registrador f.
Operação 1 f<b>
Status afetado Nenhum
Número de palavras 1
Número de ciclos 1
Exemplo
BSF FLAG_REG, 7
Antes da instrução
FLAG_REG =.10
Após a instrução ; 0000 1010
FLAG_REG =.138 ; 1000 1010
34
BTFSC Testa o bit, pula se for zero
Sintaxe [ label ] BTFSC f,b
Descrição Se o bit b do registrador f for 0, então pula a próxima instrução. Se o bit for 1 então
executa a próxima instrução. Neste caso a instrução leva dois ciclos.
Operação pula se (f<b>) = 0
Status afetado Nenhum
Número de palavras 1
Número de ciclos 1(2)
Exemplo
BTFSC LED
GOTO APAGA_LED
GOTO ACENDE_LED
Antes da instrução
PC = Linha 1
Após a instrução
Se LED = 1
PC = Linha 2
Se LED = 0
PC = Linha 3

BTFSS Testa o bit, pula se for um


Sintaxe [ label ] BTFSS f,b
Descrição Se o bit b do registrador f for 1, então pula a próxima instrução. Se o bit for 0 então
executa a próxima instrução. Neste caso a instrução leva dois ciclos.
Operação pula se (f<b>) = 1
Status afetado Nenhum
Número de palavras 1
Número de ciclos 1(2)
Exemplo
BTFSS LED
GOTO ACENDE_LED
GOTO APAGA_LED
Antes da instrução
PC = Linha 1
Após a instrução
Se LED = 0
PC = Linha 2
Se LED = 1
PC = Linha 3

CALL Chama uma sub-rotina


Sintaxe [ label ] CALL k
Descrição Chama uma sub-rotina representada pelo endereço k, que é um endereço de memória de
programa. Antes do desvio, o endereço de retorno (PC+1) é armazenado na pilha.
Operação (PC)+ 1TOS,
k PC<10:0>,
(PCLATH<4:3>) PC<12:11>
Status afetado Nenhum
Número de palavras 1
Número de ciclos 2

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

CLRF Limpa o registrador F


Sintaxe [ label ] CLRF f
Descrição Limpa o conteúdo do registrador f e o bit Z do registrador STATUS é setado.
Operação 00h f
1 Z
Status afetado Z
Número de palavras 1
Número de ciclos 1
Exemplo
CLRF FLAG_REG
Antes da instrução
FLAG_REG= .5
Após a instrução
FLAG_REG= .0
Z = 1

CLRW Limpa o registrador W


Sintaxe [ label ] CLRW
Descrição Limpa o conteúdo do registrador W e o bit Z do registrador STATUS é setado.
Operação 00h W
1 Z
Status afetado Z
Número de palavras 1
Número de ciclos 1
Exemplo
CLRW
Antes da instrução
W = .5
Após a instrução
W = .0
Z = 1

CLRWDT Limpa o Watchdog Timer


Sintaxe [ label ] CLRWDT
Descrição Limpa o valor do contador WDT, resetando o valor do contador de prescaler. Os bits /T0
e /PD são setados.
Operação 00h WDT
0 WDT prescaler count,
1 TO
1 PD
Status afetado /TO, /PD
Número de palavras 1
Número de ciclos 1

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

DECF Decrementa o registrador F


Sintaxe [ label ] DECF f,d
Descrição Decrementa em 1 unidade o valor do registrador f. O resultado é armazenado no lugar
definido por d.
Operação (f) - 1 destination
Status afetado Z
Número de palavras 1
Número de ciclos 1
Exemplo
DECF CNT, 1
Antes da instrução
CNT = .1
Z = 0
Após a instrução
CNT = .0
Z = 1

DECFSZ Decrementa o registrador F e pula se o resultado for zero


Sintaxe [ label ] DECFSZ f,d
Descrição Decrementa em uma unidade o conteúdo do registrador f. O resultado é armazenado no
lugar definido por d. Se o resultado for zero, pula a linha seguinte levando para isto 2
ciclos. Se o resultado for diferente de zero executa a linha seguinte, neste caso leva
apenas 1 ciclo.
37
Operação (f) - 1 destino; pula se o resultado = 0
Status afetado Nenhum
Número de palavras 1
Número de ciclos 1(2)
Exemplo
INICIO DECFSZ CNT, 1
GOTO LOOP
CONTINUE

Caso 1: Antes da instrução


PC = endereço INICIO
CNT = .1
Após a instrução
CNT = .0
PC = endereço CONTINUE
Caso 2: Antes da instrução
PC = endereço INICIO
CNT = .2
Após a instrução
CNT = .1
PC = ENDEREÇO INICIO + 1

GOTO Desvio incondicional


Sintaxe [ label ] GOTO k
Descrição Desvia para outro ponto do programa representado por k.
Operação k PC<10:0>
PCLATH<4:3> PC<12:11>
Status afetado Nenhum
Número de palavras 1
Número de ciclos 2
Exemplo
GOTO CONTINUA
Após a instrução
PC = endereço CONTINUA

INCF Incrementa o registrador F


Sintaxe [ label ] INCF f,d
Descrição Incrementa em 1 unidade o valor do registrador f. O resultado é armazenado no lugar
definido por d.
Operação (f) + 1 destination
Status afetado Z
Número de palavras 1
Número de ciclos 1
Exemplo 1
INCF CNT, 1
Antes da instrução
CNT = .255
Z = 0
Após a instrução
CNT = .0
Z = 1
38
Exemplo 2
INCF CNT, 1
Antes da instrução
CNT = .10
Z = 0
Após a instrução
CNT = .11
Z = 0

INCFSZ Incrementa o registrador F e pula se o resultado for zero


Sintaxe [ label ] INCFSZ f,d
Descrição Incrementa em uma unidade o conteúdo do registrador f. O resultado é armazenado no
lugar definido por d. Se o resultado for zero, pula a linha seguinte levando para isto 2
ciclos. Se o resultado for diferente de zero executa a linha seguinte, neste caso leva
apenas 1 ciclo.
Operação (f) + 1 destino; pula se o resultado = 0
Status afetado Nenhum
Número de palavras 1
Número de ciclos 1(2)
Exemplo
INICIO INCFSZ CNT, 1
GOTO LOOP
CONTINUE

Caso 1: Antes da instrução


PC = endereço INICIO
CNT = .255
Após a instrução
CNT = .0
PC = endereço CONTINUE
Caso 2: Antes da instrução
PC = endereço INICIO
CNT = .2
Após a instrução
CNT = .3
PC = ENDEREÇO INICIO + 1

IORLW Operação OU entre W e um literal


Sintaxe [ label ] IORLW k
Descrição Executa um “OU” lógico bit a bit entre o registrador W e uma literal. O resultado é
armazenado no registrador W.
Operação W).OR. k W
Status afetado Z
Número de palavras 1
Número de ciclos 1
Exemplo
IORLW .27
Antes da instrução ; 0001 1011 (.27 )
W = .163 ; 1010 0011 (.163)
Após a instrução ;---------- ------
W = .255 ; 1011 1011 (.187)

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)

MOVLW Move uma literal para o registrador W


Sintaxe [ label ] MOVLW k
Descrição Move o conteúdo de uma literal para o registrador W.
Operação k W
Status afetado Nenhum
Número de palavras 1
Número de ciclos 1
Exemplo
MOVLW .20
Após a instrução
W = .20

MOVF Move o valor de F


Sintaxe [ label ] MOVF f,d
Descrição O valor do registrador f é movido para o local especificado por d. Se d = 0 o destino é o
registrador W. Se d = 1 o destino é o próprio registrador. Mover o conteúdo de um
registrador para ele mesmo é utilizado para testar o bit Z do registrador STATUS.
Operação (f) destination
Status afetado Z
Número de palavras 1
Número de ciclos 1
Exemplo 1
MOVF FSR, 0
Antes da instrução
W = .0
FSR = .30
Após a instrução
W = .30
FSR = .30
Z = 0

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

MOVWF Move o conteúdo de W para o registrador F


Sintaxe [ label ] MOVWF f
Descrição Move o conteúdo do registrador W para o registrador f.
Operação (W) f
Status afetado Nenhum
Número de palavras 1
Número de ciclos 1
Exemplo
MOVWF OPTION_REG
Antes da instrução
OPTION_REG = .255
W = .40
Após a instrução
OPTION_REG = .40
W = .40

NOP Não faz nada


Sintaxe [ label ] NOP
Descrição Não faz nada e perde um ciclo de máquina.
Operação Nenhuma
Status afetado Nenhum
Número de palavras 1
Número de ciclos 1
Exemplo
NOP

RETFIE Retorno de interrupção


Sintaxe [ label ] RETFIE
Descrição Retorna da interrupção, recuperando o último endereço da pilha e setando o bit GIE.
Operação TOS PC,
1 GIE
Status afetado Nenhum
Número de palavras 1
Número de ciclos 2
Exemplo
RETFIE
Após a instrução
PC = TOS
GIE = 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

RETURN Retorna de uma sub-rotina


Sintaxe [ label ] RETURN
Descrição Retorna de uma sub-rotina, recuperando o último endereço da pilha.
Operação TOS PC
Status afetado Nenhum
Número de palavras 1
Número de ciclos 2
Exemplo
RETURN
Após a instrução
PC = TOS

RLF Rotaciona F um bit para a esquerda


Sintaxe [ label ] RLF f,d
Descrição Rotaciona o conteúdo do registrador f um bit para a esquerda. O conteúdo do carry é
colocado no bit 0 e o bit 7 é 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
RLF REG1,0
Antes da instrução
REG1 = 1110 0110
W = xxxx xxxx
C = 0
Após a instrução
REG1 = 1110 0110
W = 1100 1100
C = 1

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

SLEEP Entra no modo de economia de energia


Sintaxe [ label ] SLEEP
Descrição O microcontrolador entra no modo SLEEP. Geralmente utilizado em sistemas alimentado
por bateria.
Operação 00h WDT,
0 WDT prescaler count,
1 TO,
0 PD
Status afetado /TO, /PD
Número de palavras 1
Número de ciclos 1
Exemplo
SLEEP

SUBLW Subtrai o valor de W de uma literal


Sintaxe [ label ] SUBLW k
Descrição Subtrai o valor de W da constante passada por k. O valor é armazenado no próprio W.
Operação k - (W) W
Status afetado C, DC, Z
Número de palavras 1
Número de ciclos 1
Exemplo
SUBLW .2
Caso 1: Antes da instrução
W = .1
C = x
Z = x
Após a instrução
43
W = .1
C = 1 ; o resultado positivo
Z = 0
Caso 2: Antes da instrução
W = .2
C = x
Z = x
Após a instrução
W = .0
C = 1 ; o resultado é zero
Z = 1
Caso 3: Antes da instrução
W = .3
C = x
Z = x
Após a instrução
W = .255
C = 0 ; o resultado é negativo
Z = 0

SUBWF Subtrai W do registrador F


Sintaxe [ label ] SUBWF f,d
Descrição Subtrai do valor do registrador f o valor de W. O resultado é armazenado no lugar
definido por d.
Operação (f) - (W) destination
Status afetado C, DC, Z
Número de palavras 1
Número de ciclos 1
Exemplo
SUBWF REG1,1
Caso 1: Antes da instrução
REG1 = .3
W = .2
C = x
Z = x
Após a instrução
REG1 = .1
W = .2
C = 1 ; o resultado é positivo
Z = 0
Caso 2: Antes da instrução
REG1 = .2
W = .2
C = x
Z = x
Após a instrução
REG1= .0
W = .2
C = 1 ; o resultado é zero
Z = 1
Caso 3: Antes da instrução
REG1 = .1

44
W = .2
C = x
Z = x
Após a instrução
REG1 = .255
W = .2
C = 0 ; o resultado é negativo
Z = 0

SWAPF Inversão do registrador F


Sintaxe [ label ] SWAPF f,d
Descrição Inverte a parte alta (bits 4 a 7) com a parte baixa (bits 0 a 3) do registrador f. O resultado
é armazenado no lugar definido por d.
Operação (f<3:0>) destination<7:4>,
(f<7:4>) destination<3:0>
Status afetado Nenhum
Número de palavras 1
Número de ciclos 1
Exemplo
SWAPF REG, 0
Antes da instrução
REG1 = .165 10100101
Após a instrução
REG1 = .165 10100101
W = .90 01011010

XORLW Operação “OU exclusivo” entre uma literal e o registrador W


Sintaxe [ label] XORLW k
Descrição Executa um ”OU exclusivo” entre o valor de W e a literal passada como parâmetro. O
resultado é armazenado no próprio W.
Operação (W).XOR. k W
Status afetado Z
Número de palavras 1
Número de ciclos 1
Exemplo
XORLW .175 ; 1010 1111 (.175)
Antes da instrução ; 1011 0101 (.181)
W = .181 ; --------- ------
Após a instrução ; 0001 1010 (.26)
W = .26
Z = 0

XORWF Operação “OU exclusivo” entre o valor do registrador F e o registrador W


Sintaxe [ label ] XORWF f,d
Descrição Executa um ”OU exclusivo” entre o valor de W e o valor do registrador f. O resultado é
armazenado no lugar definido por d.
Operação (W).XOR. (f) destination
Status afetado Z
Número de palavras 1
Número de ciclos 1

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.

6.1.1 DIRETIVAS CBLOCK E ENDC

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:

CONTADOR_SH EQU 0X0C ; UTILIZADA PARA CONTAGEM DO TEMPO (PARTE ALTA)


CONTADOR_SL EQU 0X0D ; UTILIZADA PARA CONTAGEM DO TEMPO (PARTE BAIXA)
DADO_EEPROM EQU 0X0E ; DADO A SER GRAVADO NA EEPROM
FLAG EQU 0X0F ; UTILIZADA PARA DEFINIÇÃO DE FLAGS

Obs.: Sempre que definimos uma variável é interessante colocarmos um comentário


indicando para que finalidade esta variável será utilizada.

6.1.2 DIRETIVA DEFINE

Essa diretriz é comumente utilizada para definirmos os pinos de entrada e saída do


microcontrolador e para definição de flags. Para nos referenciarmos a um pino, devemos especificar o bit
correto dentro do registrador do PORT em questão. Podemos então dar um nome a este conjunto
registrador/bit para facilitar o entendimento do programa. Veja abaixo um exemplo:

#DEFINE BOTAO PORTA, 0


#DEFINE TRIAC PORTA, 1
#DEFINE RELE PORTB, 0

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

#DEFINE DIRECAO_MOTOR FLAG,0 ; 0-SENTIDO HORÁRIO 1-SENTIDO ANTI-HORÁRIO


#DEFINE LUMINOSIDADE FLAG,1 ; 0-DECREMENTA 1-INCREMENTA
#DEFINE TRANSMITIDO FLAG,2 ; 0-NÃO TRANSMITIDO 1-TRANSMITIDO
#DEFINE RECEBIDO FLAG,3 ; 0-NÃO RECEBIDO 1-RECEBIDO
#DEFINE GRAVADO FLAG,4 ; 0-DADO NÃO GRAVADO 1-DADO JA GRAVADO

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.

6.1.3 DIRETIVA INCLUDE

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.

#INCLUDE <P16F84.INC> (Arquivo de include para o microcontrolador PIC16F84)


#INCLUDE <P16F877.INC> (Arquivo de include para o microcontrolador PIC16F877)

6.1.4 DIRETIVA ORG

A diretiva ORG define o endereço a partir do qual o programa é armazenado na memória do


microcontrolador.

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:

Base Forma de representação


Decimal D’??’ ou .??
Hexadecimal H’??’ ou 0X??
Binário B’????????’
ASCII A’?’

Tabela 5 - Formas de representar um número

6.5 VETOR DE RESET

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:

ORG 0X00 ; ENDEREÇO INICIAL DO PROGRAMA (VETOR DE RESET)


GOTO INICIO ; INSTRUÇÃO ARMAZENADA NO ENDEREÇO 0X00

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

Sempre que iniciarmos o sistema devemos configurar os registradores TRISA, TRISB,


OPTION_REG e INTCON.

50
6.6 ESTRUTURAÇÃO DO CÓDIGO FONTE

Abaixo é mostrado um modelo de estruturação de um programa no PIC.

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

;POSIÇÃO 0: DESCRIÇÃO DO CONTEÚDO DA POSIÇÃO 0


;POSIÇÃO 1: DESCRIÇÃO DO CONTEÚDO DA POSIÇÃO 1

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

#DEFINE SENTIDO FLAG1, 0 ; 0-SENTIDO HORÁRIO, 1-SENTIDO ANTI-HORÁRIO


#DEFINE LUMINOSIDADE FLAG1, 1 ; 0-INCREMENTA LUMINOS. 1-DECREMENTA LUMINOS.

;--------------------------------------------------------------------------------------
; DEFINICAO DAS SAÍDAS ;
;--------------------------------------------------------------------------------------

#DEFINE S_MOTOR_BOMBA PORTA, 0


#DEFINE S_RELE PORTA, 1

;--------------------------------------------------------------------------------------
; DEFINICAO DAS ENTRADAS ;
;--------------------------------------------------------------------------------------

#DEFINE E_BOTAO_LIGA_MOTOR PORTB, 0 ;


#DEFINE E_BOTAO_EMERGENCIA PORTB, 1 ;

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

; AQUI SERÃO ESCRITAS AS ROTINAS DE RECONHECIMENTO E TRATAMENTO DE INTERRUPÇÃO

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

7.1 INTERRUPÇÃO DE TIMER0

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.

Passos para utilizar a interrupção do TMR0:


1 Passo: Configurar o registrador OPTION (OPTION_REG)
1.1 - BIT TOCS - Configuração do incremento para o TMR0
0 :TMR0 será incrementado internamente pelo clock da máquina.

1.2 - BIT PSA - Configuração de aplicação do prescaler


0 : O prescaler será aplicado ao TMR0.

1.3 – BITS PS0, PS1 e PS2 - Configuração de valor de prescaler.


Caso o prescaler seja configurado em 1:2, serão necessários 2 ciclos de máquina para
incrementar em 1 unidade o TMR0. Se o prescaler for configurado em 1:8 serão
necessários 8 ciclos de máquina para incrementar em 1 unidade o TMR0.

A interrupção ocorre quando o TMR0 passar de 255 para 0.


Para gerar uma interrupção a cada 1 ms, devemos trabalhar com duas variáveis: O valor do
TMR0 e o prescaler. Por exemplo, inicialmente regularemos o prescaler em 1:4. Nestas
condições serão necessários 250 incrementos do TMR0 para contar 1ms.

Tempo de ciclo(1s) x prescaler(4) x TMR0(250) = 1ms


Como o TMR0 gera a interrupção quando passar de 255 para 0, devemos iniciar o TMR0
com o valor 6 porque 6 mais 250 = 256.

53
TMR0 = Tempo Desejado
TC * Prescaler

Exemplo prescaler 1:4


TMR0 = 1ms TMR0 = 250 MOVLW (.256 - 250)
1s * 4 MOVWF TMR0 = 6

Exemplo prescaler 1:8


TMR0 = 1ms TMR0 = 125 MOVLW (.256 - 125)
1s * 8 MOVWF TMR0 = 131

Configure o prescaler e o TMR0 para gerar uma interrupção a cada 10ms. prescaler
1:64
TMR0 = 10ms TMR0 = 156 MOVLW (.256 - 156)
1s * 64 MOVWF TMR0 = 100

Obs.: Alem de configurar o prescaler o TMR0 também deve ser iniciado com o valor calculado.

2 Passo: Configurar o registrador INTCON


2.1 - BIT GIE - Habilitação geral das interrupções (chave geral)
1: As interrupções habilitadas individualmente serão tratadas.
2.1 – BIT T0IE - Habilitação da interrupção de estouro de TMR0 (chave individual)
1: A interrupção será tratada.

7.2 INTERRUPÇÃO EXTERNA

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.

7.3 INTERRUPÇÃO POR MUDANÇA DE ESTADO

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.

7.4 INTERRUPÇÃO DE FIM DE ESCRITA NA EEPROM

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

Para que as interrupções ocorram, algumas questões devem ser verificadas:

1. Uma ação relacionada a interrupção deve acontecer (estouro do TMR0, estimulo externo
etc.);

2. Quando a ação acontece, o flag da interrupção é marcado;

3. Caso as chaves de habilitação da interrupção (geral e individual) estejam ligadas, o sistema


será paralisado e desviado para o vetor de interrupção.

A ação é exatamente o que queremos monitorar. Mas e as chaves individuais de acesso?


Tratam-se de bits específicos que servem como chaves ON/OFF para ligar e desligar as interrupções,
individualmente ou em grupo. A Figura 15 ilustra todas as chaves e flags relacionados com as
interrupções.

Figura 15 - Chaves e flags relacionados com as interrupções

O fluxograma seguinte ajuda a entender melhor a lógica de tratamento de uma interrupção.

55
Ocorreu a ação

Desvia o programa para


o vetor de interrupção
Seta i fkag relativo
a interrupção

escrita pelo programador


Testar os flags.

Esta Rotina deve ser


Não Chaves individuas
Rotina implementada pelo programador
ligadas?
para tratamento das interrupções.

Fim Sim Limpar os flags tratados.

Finalizar rotina com o comando RETFIE


Chave geral
(GIE) ligada?
Não

Sim
Religa a chave geral (GIE)
Desliga chave
geral (GIE)

Retorna ao ultimo endereço


guardado na pilha
Grava endereço
de retorno na pilha.

Fim

Alguns pontos devem ser ressaltados:

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.

3. Os flags de interrupções não limpos automaticamente pelo sistema. Cabe ao usuário


efetuar esta operação na rotina de tratamento de interrupção. Caso o flag relacionado a
interrupção não seja limpo, após o comando RETFIE o sistema voltará imediatamente para
a rotina de tratamento de interrupção.

56
CAPÍTULO 8
8 EEPROM

O PIC16F84 tem 64 bytes de localizações de memória EEPROM, correspondentes aos endereços


de 00h a 63h e onde podemos ler e escrever. A característica mais importante desta memória é de não
perder o seu conteúdo quando a alimentação é desligada, ao contrário da RAM, que perde todas as suas
informações quando o PIC é desligado. Na prática, isso significa que o que lá foi escrito permanece no
microcontrolador, mesmo quando a alimentação é desligada. Sem alimentação, estes dados permanecem
no microcontrolador durante mais de 40 anos (especificações do fabricante do microcontrolador
PIC16F84), além disso, esta memória suporta até 1.000.000 operações de escrita.
Na prática, a memória EEPROM é usada para guardar dados importantes ou alguns parâmetros de
processamento. Um parâmetro deste tipo, é uma dada temperatura, atribuída quando ajustamos um
regulador de temperatura para um processo. Se esse valor se perder, seria necessário reintroduzi-lo
sempre que houvesse uma falha na alimentação. Como isto é impraticável (e mesmo perigoso), os
fabricantes de microcontroladores começaram a instalar nestes uma pequena quantidade de memória
EEPROM.

8.1 ESCRITA NA 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:

1. O endereço (posição da memória na EEPROM) para a escrita deve ser colocado no


registrador EEADR.
2. O dado a ser escrito deve ser colocado no registrador EEDATA.
3. As interrupções devem ser desligadas para evitar conflitos.
4. A operação de escrita deve ser habilitada através do bit EECON1, WREN.
5. O registrador EECON2 deve ser carregado com os valores 0x55 e 0xAA, nesta seqüência.
Este procedimento é obrigatório e utilizado para a proteção da escrita.
6. A escrita deve ser iniciada setando o bit EECON1, WR e limpando o bit EECON1,
WREN.
7. As interrupções podem ser novamente ligadas.
8. A indicação de termino da escrita é feita pelo próprio hardware através do bit
EECON1,WR que será limpo automaticamente.
9. Caso ocorra algum erro, o bit EECON1, WRERR será setado. Caso não ocorra nenhum
erro este bit será mantido em zero.

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

A parte do programa em negrito deve ser feito obrigatoriamente nesta seqüência.

8.2 LEITURA NA EEPROM

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:

1. O endereço para a leitura deve ser colocado no registrador EEADR.


2. O processo de leitura deve ser ligado através do bit EECON1, RD. A informação de
término de leitura é feita pelo hardware colocando este bit automaticamente para zero.
3. O dado lido é colocado no registrador EEDATA.

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.

9.1 ENTRANDO NO MODO SLEEP

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.

9.2 SAINDO DO MODO SLEEP

Existem três maneiras possíveis 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

O MpLab é um ambiente integrado de desenvolvimento (I.D.E.: Integrated Development


Enviroment). No mesmo ambiente o usuário pode executar todos os procedimentos relativos ao
desenvolvimento de um software para micro-controlador, tornando o trabalho do projetista mais
produtivo. Sua principal característica é a total integração de seus módulos com o ambiente Windows,
permitindo a fácil cópia de arquivos e trechos de arquivos de um aplicativo para outro.

10.1 INICIANDO O MPLAB

Quando se clica no ícone do MPLAB aparece a tela como mostra a Figura 16.

Figura 16 - Ambiente de desenvolvimento MPLAB

10.1.1 SELECIONANDO O PROCESSADOR

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

10.1.2 AJUSTANDO O CLOCK PARA SIMULAÇÃO

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.

Figura 18 - Configuração do oscilador

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.

10.2.1 CRIANDO O PROJETO

Iniciaremos um novo projeto sempre pela criação de um novo fonte. Execute a seguinte seqüência:

File > New

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.

Figura 19 - Janela com o novo fonte

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:

File > Save as...

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.

Figura 20 - Janela "New Project"

Sempre que um novo projeto é criado, a janela “Edit Project” será exibida automaticamente.

10.2.2 EDITANDO O PROJETO

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

Para indicarmos o fonte de um projeto ou caso desejemos alterar os parâmetros do compilador,


devemos usar a seqüência:

Project -> Edit Project

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

10.2.3 AJUSTANDO AS PROPRIEDADES DO “NÓ” PRINCIPAL

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.

Figura 22 - Janela "Node Properties"

10.2.4 ADICIONANDO UM FONTE (TAMBÉM CHAMADO DE NÓ)

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"

Figura 24 - Janela "Edit Project" completa

67
10.3 COMPILANDO O PROGRAMA

Compilar significa traduzir um programa escrito em Assembler (mnemônicos) para linguagem de


máquina (números). A compilação gera um arquivo com extensão .hex (hexadecimal) a partir dos
arquivos de código fonte (.asm) e de projeto (.pjt). É o conteúdo do arquivo hexadecimal que é gravado
na memória de programa do PIC.
Para compilar o fonte basta teclar F10. Se não houver erros de sintaxe (escrita) ou outros, haverá a
indicação de tudo OK pela janela Build Results, mensagem “Build completed successfully”, conforme a
Figura 25. Feche a janela Build Results. IMPORTANTE: O fato da compilação não apresentar erros não
significa que o programa funcionará conforme o desejado, pois erros de lógica não são detectados pelo
compilador. Se houver erros, uma janela como a da Figura 26 aparecerá indicando todos os avisos e erros
detectados pelo compilador.

Figura 25 - Janela "Build Results" após a compilação normal

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.

10.4.1 PRINCIPAIS TECLAS PARA O CONTROLE DA SIMULAÇÃ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

Interrompe a simulação dinâmica iniciada pelo Ctrl+F9 ou pelo F9.

10.4.2 REALIZANDO UMA SIMULAÇÃO DINÂMICA

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.

10.4.3 JANELA STOPWATCH

Esta janela é utilizada para vermos o tempo de execução do programa. Para abrir a janela
Stopwatch, siga a seqüência no menu:

Window > Stopwatch...

Figura 27 - Janela StopWatch

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:

Window > Watch window > New watch window

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.

Figura 28 - Janela Add Watch Symbol

71
Figura 29 - Ajustando as propriedades do registro escolhido

10.4.5 SIMULANDO SINAIS EXTERNOS

Este recurso tem como objetivo simular variações externas nos pinos do PIC. No menu principal
selecione:

Debug > Simulator Stimulus > Asynchronous Stimulus

A janela da Figura 30 deverá aparecer.

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.

Figura 31 - Ajustando os botões de estímulo

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:

 Pulse (P) - Dá um pulso no pino selecionado (de 0 para 1 e retorna a 0)


 Low (L) - Coloca nível ‘0’ no pino
 High (H) - Coloca nível ‘1’ no pino
 Toggle(T) - Inverte o estado no pino (inicia sempre em 0)

Relacionando os pinos do PIC aos botões

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

[1] MICROCHIP Technology Inc. Technical Library CD-ROM, 2002

[2] MICROCHIP Technology Inc. Technical Library CD-ROM, 2000

[3] ROSÁRIO, João Maurício. Microcontroladores Família PIC – Curso de Mecatrônica UNICAMP,
2002

[4] SOUZA, David José. Desbravando o PIC. 3. ed. São Paulo:


Erica, 2000.

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

[6] VIDAL. Mini-curso MPLAB passo-a-passo.

[7] Microcontroladores PIC on-line GRÁTIS!


http://www.mikroelektronika.co.yu/portuguese/product/books/picbook/capitulo2.htm

[8] Microcontroladores PIC on-line GRÁTIS!


http://www.mikroelektronika.co.yu/portuguese/product/books/picbook/capitulo4.htm#Introdução

80