Apostila de PIC

Transcrição

Apostila de PIC
Universidade Católica de Goiás
Departamento de Engenharia
Curso de Engenharia Elétrica
MICROCONTROLADORES
PIC16F87x
Prof. Eider Lúcio de Oliveira
Prof. Éderson Lacerda Fideles
2
Microcontrolador PIC16F87x
SUMÁRIO
INTRODUÇÃO .......................................................................................................................................................... 4
CAPÍTULO I - O QUE É O PIC16F628 .................................................................................................................. 6
PINAGEM DO PIC16F87X .................................................................................................................................... 6
CAPÍTULO II - CARACTERÍSTICAS DO PIC16F87X ...................................................................................... 10
CAPÍTULO III - MEMÓRIA DE PROGRAMA (FLASH EPROM), MEMÓRIA DE DADOS (RAM) E
MEMÓRIA DE DADOS PERMANENTES (EEPROM) ..................................................................................... 12
MEMÓRIA DE PROGRAMA (FLASH EPROM) ............................................................................................... 12
MEMÓRIA DE DADOS (RAM) .......................................................................................................................... 13
CAPÍTULO IV - REGISTRADORES DE FUNÇÕES ESPECIAIS ................................................................... 16
REGISTRADOR W (ACUMULADOR OU REGISTRADOR DE TRABALHO) E A ALU (UNIDADE LÓGICA E ARITMÉTICA) 16
REGISTRADOR STATUS (ENDEREÇO 03H E 83H) ................................................................................................... 17
REGISTRADOR PORTA (ENDEREÇO 05H)............................................................................................................... 18
REGISTRADOR PORTB (ENDEREÇO 06H)............................................................................................................... 18
REGISTRADOR PORTC (ENDEREÇO 07H)............................................................................................................... 18
REGISTRADOR PORTD (ENDEREÇO 08H)............................................................................................................... 19
REGISTRADOR PORTE (ENDEREÇO 09H) ............................................................................................................... 19
REGISTRADOR TRISA (ENDEREÇO 85H) ................................................................................................................ 19
REGISTRADOR TRISB (ENDEREÇO 86H) ................................................................................................................ 19
REGISTRADOR TRISC (ENDEREÇO 87H) ................................................................................................................ 20
REGISTRADOR TRISD (ENDEREÇO 88H) ................................................................................................................ 20
REGISTRADOR TRISE (ENDEREÇO 89H)................................................................................................................. 20
REGISTRADOR INDF (ENDEREÇOS 00H E 80H) E O FSR (ENDEREÇOS 04H E 84H)................................................... 20
REGISTRADOR TRM0 (ENDEREÇO 01H).................................................................................................................. 21
REGISTRADOR PCL (ENDEREÇOS 02H E 82H) E O PCLATH (ENDEREÇOS 0AH E 8AH)........................................... 21
REGISTRADOR EEDATA (ENDEREÇO 08H) ............................................................................................................ 23
REGISTRADOR EEADR (ENDEREÇO 09H) ............................................................................................................... 24
REGISTRADOR INTCON (ENDEREÇOS 0BH E 8BH)................................................................................................ 24
REGISTRADOR OPTION_REG(ENDEREÇO 81H)..................................................................................................... 25
REGISTRADOR EECON1 (ENDEREÇO 88H) ............................................................................................................. 26
REGISTRADOR EECON2 (ENDEREÇO 89H) ............................................................................................................. 26
CAPÍTULO V - CONJUNTO DE INSTRUÇÕES DO PIC16F87X.................................................................... 27
EXPLICAÇÃO DETALHADA DO CONJUNTO DE INSTRUÇÕES DO PIC.......................................................................... 30
CAPÍTULO VI - AS INTERRUPÇÕES DO PIC16F87X .................................................................................... 40
INTERRUPÇÃO DE TIMER 0.................................................................................................................................... 41
INTERRUPÇÃO EXTERNA (RB0/INT)....................................................................................................................... 41
INTERRUPCÇÃO POR MUDANÇA DE ESTADO (RB4 A RB7) ...................................................................................... 41
INTERRUPÇÃO DE FIM DE ESCRITA NA EEPROM ................................................................................................... 41
REGISTRADOR INTCON......................................................................................................................................... 42
CAPÍTULO VII - O CONTADOR/TEMPORIZADOR (TMR0)........................................................................ 44
CAPÍTULO VIII – MODO POWER DOWN, MODO SLEEP E O WDT ......................................................... 48
O WACHTDOG TIMER (WDT)........................................................................................................................... 48
CAPÍTULO IX - ESCRITA E LEITURA NA EEPROM DO PIC16F87X ........................................................ 50
BIBLIOGRAFIA ...................................................................................................................................................... 52
Microcontrolador PIC16F87x
3
APÊNDICE A - INTRODUÇÃO AO MPLAB ...................................................................................................... 53
APÊNDICE B – DETALHES DOS PORTS .......................................................................................................... 67
APÊNDICE C - KIT DIDÁTICO PARA PIC16F87X .......................................................................................... 72
APÊNDICE D – DISPLAY DE CRISTAL LÍQUIDO - LCD .............................................................................. 74
Microcontrolador PIC16F87x
4
INTRODUÇÃO
Um microprocessador é um componente eletrônico, que devido às suas modernas técnicas de
fabricação, consegue efetuar com rapidez, várias funções e operações lógicas e aritméticas, sob
controle de um programa externo, que dita para a máquina a “seqüência” das funções e os
operandos a serem utilizados.
A diferença básica entre um microcontrolador e um microprocessador é que o
microcontrolador já possui internamente vários circuitos eletrônicos que o microprocessador
precisa usar externamente para ser funcional, tais como: memória de programa, memória de
dados, portas de entrada e saída de sinais (portas de I/O, Input/Output), circuito de reset, circuito
oscilador, contador/temporizador, portas lógicas para selecionar endereços, circuito de
comunicação serial e paralela, conversor A/D, etc.
Ao escolher um projeto microcontrolado em relação aos projetos digitais tradicionais, visa
entre outras coisas: redução de custo; redução do consumo de energia; redução do tamanho do
equipamento; aumento da confiabilidade; proteção de software que vai gravado internamente e a
facilidade de implementação e de suas possíveis modificações através de programação.
Atualmente muitos equipamentos de nosso uso diário, tais como: eletrodomésticos,
videocassetes, alarmes, celulares e brinquedos, entre outros, utilizam microcontroladores para
execução de suas funções básicas. Muitos microcontroladores são conhecidos pelos
desenvolvedores de projetos no Brasil, podemos citar os seguintes:
•
Microcontroladores da família 8051 (INTEL e outros fabricantes)
•
Microcontroladores da família PIC (MICROCHIP)
•
Microcontroladores da família COP8 (NATIONAL SEMICONDUTORES)
•
Microcontroladores da TEXAS, exemplo: MSP430F13x/14x
•
Microcontroladores da HOLTEK, exemplo: HT48500
•
Microcontroladores da MOTOROLA.
O PIC pode ser visto externamente como um circuito integrado TTL ou CMOS normal,
mas internamente dispõe de todos os dispositivos típicos de um sistema microprocessado, ou
seja:
•
Uma CPU (Central Processor Unit - Unidade de Processamento Central) cuja finalidade
é interpretar as instruções de programa.
•
Uma memória de programa Flash EPROM que possibilita a gravação cerca de 1000
vezes sem a necessidade de apagamento com ultravioleta.
•
Uma memória RAM (Random Access Memory - Memória de Acesso Aleatório) –
Microcontrolador PIC16F87x
5
utilizada para memorizar as variáveis utilizadas pelo programa.
•
Uma série de LINHAS de I/O para controlar dispositivos externos ou receber pulsos de
sensores, chaves, etc.
•
Uma memória EEPROM para gravar dados permanentes. Cada posição pode ser gravada
cerca de um milhão de vezes.
•
Uma série de dispositivos auxiliares ao funcionamento, ou seja, gerador de clock,
barramento de dados e controle, contador/temporizador, conversor A/D, comunicação
serial, etc.
A presença de todos estes dispositivos em um espaço extremamente pequeno, dá ao
projetista ampla gama de trabalho e enorme vantagem em usar um sistema microprocessado,
onde em pouco tempo e com poucos componentes externos podemos fazer o que seria oneroso
fazer com circuitos tradicionais.
O PIC está disponível em uma ampla gama de modelos para melhor se adaptar as
exigências de projetos específicos, diferenciando-se pelo número de linha de I/O e pelo conteúdo
do dispositivo. Inicia-se com modelos pequenos identificados pela sigla PIC12Cxx dotados de 8
pinos, até chegar a modelos maiores com sigla PIC16Fxxx dotados de 40 ou mais pinos e os
DSPics (processadores digitais de sinais). Como foi dito na introdução, uma descrição detalhada
do PIC está disponível no site da microchip www.microchip.com , onde se pode encontrar
grandes e variadas quantidades de informações técnicas, manuais, software de apoio, exemplos
de aplicações e atualizações disponíveis.
Mas, qual microcontrolador escolher?
Ao escolher um microcontrolador devemos analisar o seguinte: facilidade de uso;
disponibilidade de ferramentas de programação, teste e depuração; suporte técnico; custo e
disponibilidade no mercado; e principalmente, se a família de microcontroladores possui várias
opções de modelos e periféricos, possibilitando assim o reaproveitamento de código para outros
projetos.
A família de microcontroladores PIC é uma das que atende os requisitos do parágrafo
anterior. A escolha do microcontrador fica a cargo do projetista, mas temos certeza que uma
escolha muito boa, para começar os estudos, é a Família PIC da Microchip. Nesta apostila é feito
um estudo detalhado do PIC16F87x.
6
Microcontrolador PIC16F87x
Capítulo I - O QUE É O PIC16F628
O PIC16F87x é um circuito integrado produzido pela Microchip, que pertence a
categoria dos microcontroladores, ou seja, é um componente integrado, que em um único
dispositivo, contém todos os circuitos necessários para realizar um completo sistema digital
programável. A Figura 1, a seguir, mostra o encapsulamento DIP (DIP = dual in line) e os nomes
descritivos dos pinos do PIC16F628.
PINAGEM DO PIC16F87X
Figura 1 – Pinagem do PIC16F87x
A Tabela 1 mostra a descrição de todas as funções de cada pino do
microcontrolador em questão.
7
Microcontrolador PIC16F87x
Tabela 1 - Descrição da pinagem do PIC16F87x
NOME
FUNÇÃO
DESCRIÇÃO
RA0
Porta de I/O digital
AN0
Entrada analógica
RA1
Porta de I/O digital
AN1
Porta de I/O digital
RA2
Porta de I/O digital
AN3
Entrada analógica
VREF-/ CVREF
Tensão de referência negativa analógica
RA3
Porta de I/O digital
AN3
Entrada analógica
VREF+
Tensão de referência negativa analógica
RA4
Porta de I/O digital – Exige resistor de pull-up.
T0CKI
Entrada de clock do TIMER 0
C1OUT
Saída do comparador 1
RA5
Porta de entrada
SS
Habilitação externa (slave select) para comunicação SPI
AN4
Entrada analógica
C2OUT
Saída do comparador 2
RB0
Porta de I/O digital. Pode ter Pull-up interno habilitado por software.
INT
Interrupção externa.
RB1
RB1
Porta de I/O digital. Pode ter Pull-up interno habilitado por software.
RB2
RB2
Porta de I/O digital. Pode ter Pull-up interno habilitado por software.
RB3
Porta de I/O digital. Pode ter Pull-up interno habilitado por software.
PGM
Pino de programação em baixa tensão.
RB4
RB4
Porta de I/O digital. Interrupção na mudança do estado do pino. Pode
ter Pull-up interno habilitado por software.
RB5
RB5
Porta de I/O bidirecional. Interrupção na mudança do estado do pino.
Pode ter Pull-up interno habilitado por software.
RB6/PGC
RB6
Porta de I/O digital. Interrupção na mudança do estado do pino. Pode
ter Pull-up interno habilitado por software.
PGC
Clock da programação serial.
RB7
Porta de I/O digital. Interrupção na mudança do estado do pino. Pode
RA0/AN0
RA1/AN1
RA2/AN2/VREF-/ CVREF
RA3/AN3/VREF+
RA4/T0CKI/C1OUT
RA5/SS/AN4/C2OUT
RB0/INT
RB3/PGM
RB7/PGD
8
Microcontrolador PIC16F87x
ter Pull-up interno habilitado por software.
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
PGD
Data da programação serial.
RC0
Porta de I/O digital.
T1OSO
Saída para oscilador externo para timer 1(TMR1).
T1CKI
Entrada de incremento para TMR1.
RC1
Porta de I/O digital.
T1OSI
Entrada para oscilador externo para TMR1.
CCP2
Entrada do capture2 ou saídas para capture2/PWM2.
RC2
Porta de I/O digital.
CCP1
Entrada do capture1 ou saídas para capture1/PWM1.
RC3
Porta de I/O digital.
RC2/CCP1
RC3/SCK/SCL
SCK
Entrada/saída de clock para comunicação serial SPI/I2C.
SCL
RC4/SDI/SDA
RC4
Porta de I/O digital.
SDI
Entrada de dados para SPI.
SDA
Via de dados (entrada/saída) para I2C.
RC5
Porta de I/O digital.
SDO
Saída de dados para SPI.
RC6
Porta de I/O digital.
TX
Transmissão (TX) de comunicação serial USART.
CK
Clock para comunicação síncrona.
RC7
Porta de I/O digital.
RX
Recepção (RX) de comunicação serial USART.
DT
Data para comunicação síncrona.
RD0
Porta de I/O digital.
PSP0
Dado 0 (comunicação paralela).
RD1
Porta de I/O digital.
PSP1
Dado 1 (comunicação paralela).
RD2
Porta de I/O digital.
RC5/SDO
RC6/TX/CK
RC7/RX/DT
RD0/PSP0
RD1/PSP1
RD2/PSP2
Dado 2 (comunicação paralela).
PSP2
RD3/PSP3
RD3
Porta de I/O digital.
9
Microcontrolador PIC16F87x
PSP3
Dado 3 (comunicação paralela).
RD4
Porta de I/O digital.
PSP4
Dado 4 (comunicação paralela).
RD5
Porta de I/O digital.
PSP5
Dado 0 (comunicação paralela).
RD6
Porta de I/O digital.
PSP6
Dado 0 (comunicação paralela).
RD7
Porta de I/O digital.
PSP7
Dado 0 (comunicação paralela).
RE0
Porta de I/O digital.
RD
Controle de leitura de porta paralela.
AN5
Entrada analógica.
RE1
Porta de I/O digital.
WR
Controle de escrita de porta paralela.
AN6
Entrada analógica.
RE2
Porta de I/O digital.
CS
Habilitação externa da porta paralela.
AN7
Entrada analógica.
OSC1
Entrada para cristal.
CLKIN
Entrada para osciladores externos (híbridos ou RC).
OSC2
Saída para cristal.
CLKOUT
Saída com onda quadrada em ¼ da freqüência imposta em OSC1
quando no modo RC. Essa freqüência equivale aos ciclos de máquina
internos.
MCLR
Máster Clear (reset) externo.
Vpp
Entrada para tensão de programação (13V).
Vss
Vss
GND – terra – 0Volt.
VDD
VDD
Vcc – Alimentação positiva (5Volt).
RD4/PSP4
RD5/PSP5
RD6/PSP6
RD7/PSP7
RE0/RD/AN5
RE1/WR/AN6
RE2/CS/AN7
OSC1/CLKIN
OSC2/CLKOUT
MCLR/Vpp
Como é possível ver na figura acima, o PIC16F87x é dotado de um total de 40 pinos
dispostos em duas fileiras paralelas de 20 pinos cada uma (DIP - dual in line). São 33 pinos de
linhas de entrada e saída de sinais (linhas de I/O) para a nossa aplicação, um pino de
alimentação, um de terra (referência), um de reset (MCLR) e dois de clock (OSC1/CLKIN e
OSC2/CLKOUT).
Microcontrolador PIC16F87x
10
Capítulo II - Características do PIC16F87x
Para o PIC16F87x, podemos citar, entre outras, as seguintes características:
•
•
•
•
•
•
•
•
•
•
•
•
Microcontrolador de 40 pinos;
33 portas configuráveis como entrada ou saída;
Cada porta, pode drenar no máximo 25 mA e fornecer no máximo 20 mA;
Freqüência máxima de operação de 4 a 20 MHz, depende das especificações do chip;
Possui 15 fontes de interrupção, que são:
1. a interrupção externa;
2. interrupção por “overflow” do timer TMR0;
3. interrupção por “overflow” do timer TMR1;
4. interrupção por “overflow” do timer TMR2;
5. interrupção por mudança de nível nos pinos da porta B (pinos RB7 a RB4);
6. interrupção por escrita completa na EEPROM;
7. interrupção da porta paralela (PSP);
8. interrupção dos conversores A/D;
9. interrupção de recepção da USART;
10. interrupção de transmissão da USART;
11. interrupção da comunicação serial (SPI e I2C);
12. interrupção do CCP1 (Capture/Compare/PWM);
13. interrupção do CCP2;
14. interrupção dos comparadores;
15. interrupção de colisão de dados (Bus Collision).
Memória de programação FLASH EPROM de 4 Kbytes (PIC16F874) ou 8 Kbytes
(PIC16F877). Pode-se escrever nessa memória cerca de 1000 vezes sem danificá-la.
Memória de dados temporários, RAM separada em bancos de memória. As primeiras
posições de cada banco são reservadas para registradores de funções especiais (SFR - Special
Function Registers). O restantes de cada banco são reservadas aos registradores de propósitos
gerais (GPR - General Purpose Registers). Todos os registradores da RAM são programáveis
bit a bit;
Memória de dados permanentes, EEPROM de 256 Bytes. Pode-se escrever em cada bit dessa
memória cerca de 1 milhão de vezes sem danificá-la;
Via de programação com 14 bits e 35 instruções;
3 Módulos de timer/counter ;
A faixa de tensão de trabalho está na faixa de 3 a 5,5 volts;
Baixa potência de consumo - menos de 2 mA para 5 V, 4Mhz; cerca de 15 µA para 2 V, 32
KHz e menos de 1µA para 2 V (modo Standby);
Os microcontroladores PIC apresentam uma estrutura de máquina interna do tipo
Havard, enquanto grande parte dos microcontradores tradicionais apresenta uma arquitetura tipo
Von-Neumann. A diferença está na forma como os dados e o programa são processados pelo
microcontrolador. Na arquitetura tradicional, tipo Von-Neumann, existe apenas um barramento
(bus) interno (geralmente de 8 bits), por onde passam as instruções e os dados. Já na arquitetura
tipo Havard existem dois barramentos internos, sendo um de dados e outro de instruções. No
caso dos microcontroladores PIC, o barramento de dados é sempre de 8 bits e o de instruções
Microcontrolador PIC16F87x
11
pode ser de 12, 14 ou 16 bits, dependendo do microcontrolador. Esse tipo de arquitetura permite
que enquanto uma instrução é executada outra seja “buscada” na memória, o que torna o
processamento mais rápido. Além disso, como o barramento de instruções é maior do que 8 bits,
o OPCODE da instrução já inclui o dado e o local onde ela vai operar (quando necessário), o que
significa que apenas uma posição de memória é utilizada por instrução, economizando assim
muita memória de programa.
Desta forma, podemos observar que dentro da palavra o OPCODE, que pode ser de 12,
14 ou 16 bits, não sobra muito espaço para o código da instrução propriamente dito. Por isso, os
PICs utilizam uma tecnologia chamada RISC, que significa Reduced Instruction Set Computer
(Computador com conjunto de instruções reduzido). Desta forma, os PICs possuem cerca de 35
instruções (o número correto varia de acordo com o microcontrolador), muito menos que os
microcontroladores convencionais (CISC) que chegam a possuir mais de 100 instruções. Isto
torna o aprendizado muito mais fácil e dinâmico, mas, por outro lado, implica no fato de que
muitas funções devem ser “construídas”, pois não possuem uma instrução direta, exigindo maior
habilidade do programador.
Nos microcontroladores PIC, o sinal de clock é internamente dividido por quatro.
Portanto, para um clock externo de 4 MHz, temos um clock interno de 1 MHz, e
consequentemente, cada ciclo de máquina dura 1us.
A divisão do clock por quatro forma as fases Q1, Q2, Q3 e Q4. O program counter
(registrador PC) é incrementado automaticamente na fase Q1 do ciclo de máquina e a instrução
seguinte é buscada da memória de programa e armazenada no registrador de instruções no ciclo
Q4. Ela é decodificada e executada no próximo ciclo, no intervalo de Q1 até Q4. Esta
característica de buscar a informação num ciclo de máquina e executá-la no próximo é
conhecida como PIPELINE. Ela permite que quase todas as instruções sejam executadas em
apenas um ciclo, gastando assim 1us (para um clock de 4 MHz) e tornando o sistema muito mais
rápido. As únicas exceções referem-se às instruções que geram “saltos” no program counter,
como chamadas de rotinas e retornos. Ao executar essas instruções, o PIPELINE deve ser
primeiramente limpo para depois poder ser carregado novamente com o endereço correto,
consumindo para isso 2 ciclos de máquina. Esse PIPELINE é facilmente implementado devido à
arquitetura Havard.
12
Microcontrolador PIC16F87x
Capítulo III - MEMÓRIA DE PROGRAMA (FLASH EPROM), MEMÓRIA DE
DADOS (RAM) E MEMÓRIA DE DADOS PERMANENTES (EEPROM)
MEMÓRIA DE PROGRAMA (FLASH EPROM)
Em particular o PIC16F628 dispõe de uma memória para armazenar o programa, do tipo
Flash EPROM, que pode ser escrita cerca de 1000 vezes e que é ideal para o nosso experimento
tornando a conecção para a programação on-board, ou seja podemos colocar o programa dentro
do chip sem ter que removê-lo do circuito de prova.
A sua capacidade de memorização é de 8.192 locações (8 K Byte de 14 bits cada) para o
PIC16F877 e que poderão conter, cada uma, somente uma instrução básica do PIC. Logo, o
programa mais complexo que poderemos realizar não poderá ter mais do que 8.192 instruções.
Os endereços reservados para Flash EPROM começam em 0000H e vão até 1FFFH. O
PIC pode somente executar instruções memorizadas nestas locações. Não se pode de maneira
nenhuma ler, escrever ou cancelar dados nesses endereços, a não ser com o uso de um
dispositivo externo chamado programador.
A primeira localização de memória de programa que será executada quando o PIC
começar a rodar (após a alimentação ou um reset) é o endereço 0000H, por isso essa localização
de memória é denominada Reset Vector (Vetor de Reset). Já, quando ocorre uma interrupção, a
primeira instrução a ser executada está no endereço 0004H, por isto, este endereço denomina-se
endereço de Interrupt Vector (Vetor de Interrupção). O “template”, exemplo padrão, a seguir
mostra como deve ser a estrutura de um programa em Assembly escrito para o PIC16F877 no
MPLAB (compilador, simulador e emulador para o PIC).
;**********************************************************************
list
p=16F877
; diretiva list para definir o processador
#include <p16F877.inc>
; definições de variáveis do processador
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _XT_OSC
& _WRT_ENABLE_ON & _LVP_OFF & _CPD_OFF
; Variáveis utilizadas pelo usuário
TEMP1 equ 20h
TEMP2 equ 21h
TEMP3 equ 22h
; Três variáveis temporárias
;**********************************************************************
13
Microcontrolador PIC16F87x
ORG 00H
; vetor de reset
goto Inicio
; vai para o inicio do programa
;**********************************************************************
;**********************************************************************
ORG 04H
; vetor de interrupção
retfie
; retorno de interrupção
;**********************************************************************
Inicio
bsf STATUS,RP0
movlw 06H
movwf ADCON1
clrf TRISA
clrf TRISB
clrf TRISC
clrf TRISD
clrf TRISE
bcf STATUS,RP0
;Vai para o banco 1
PORTA funcionará como I/O
; seta todos os bits dos PORTs como saídas
;Vai para o banco 0
loopmain
; Restante do código do programa vai aqui
END
; diretiva de fim de programa
;**********************************************************************
MEMÓRIA DE DADOS (RAM)
Diferentemente da memória Flash EPROM destinada a conter o programa, a área de
memória RAM é visível pelo resto do programa. Nela podemos escrever, ler, ou modificar
tranqüilamente qualquer registrador do nosso programa a qualquer momento que for necessário.
A única limitação consiste de que alguns desses registradores desenvolvem funções especiais
para o PIC que não podem ser utilizados para outra coisa a não ser para aquilo a qual eles estão
reservados. Estes registradores encontram-se nas locações base da área de memória RAM
mostrada na Tabela 2.
A localização de memória presente na RAM é endereçada diretamente em um espaço de
memória que vai de 00H a 7FFH dando um total de 2048 bytes, denominado página 0 (ou banco
0). Um segundo espaço de endereçamento denominado página 1 (ou banco 1) vai de 800H a
FFFH. Para acessar esse segundo espaço é necessário recorrer a dois bits auxiliares RP0 e RP1
do registrador de STATUS segundo a modalidade que iremos explicar mais adiante. As
primeiras locações de cada página são aquelas reservadas as funções especiais para o
funcionamento do PIC e, como já foi dito, não podem ser utilizadas para outra coisa. As 96
locações no final da página 0 são reservadas para as nossas variáveis podem ser endereçadas de
020H a 7FH. Podemos, aqui, utilizar livremente pelo nosso programa para memorizar variáveis,
contadores, etc.
Em resumo, podemos dizer que a memória RAM do PIC está dividida em quatro bancos.
14
Microcontrolador PIC16F87x
O banco 0 que é selecionado zerando os bits RP0 (STATUS<5>) e RP1 (STATUS<6>). O banco
1 que é selecionado setando o bit RP0. Os primeiros bytes da RAM são reservados aos
Registradores de Funções Especiais (SFR – Special Function Registers), os bytes restantes de
cada banco são reservados aos Registradores de Propósitos Gerais (GPR – General Purpose
Registers).
Tabela 2 – Mapa da memória de dados do PIC16F628
End. Indir.
00h
End. Indir.
80h
End. Indir.
100h
End. Indir.
180h
TMR0
01h
OPTION REG
81h
TMR0
101h
OPTION REG
181h
PCL
02h
PCL
82h
PCL
102h
PCL
182h
STATUS
03h
STATUS
83h
STATUS
103h
STATUS
183h
FSR
04h
FSR
84h
FSR
104h
FSR
PORTA
05h
TRISA
85h
PORTB
06h
TRISB
86h
PORTC
07h
TRISC
87h
107h
187h
PORTD
08h
TRISD
88h
108h
188h
PORTE
09h
TRISE
89h
109h
189h
PCLATH
0Ah
PCLATH
8Ah
PCLATH
10Ah
PCLATH
INTCON
0Bh
INTCON
8Bh
INTCON
10Bh
INTCON
18Bh
PIR1
0Ch
PIE1
8Ch
EEDATA
10Ch
EECON1
18Ch
EECON2
18Dh
105h
PORTB
106h
184h
185h
TRISB
186h
18Ah
PIR2
0Dh
PIE2
8Dh
EEADR
10Dh
TMR1L
0Eh
PCON
8Eh
EEDATH
10Eh
18Eh
TMR1H
0Fh
8Fh
EEADRH
10Fh
18Fh
T1CON
10h
90h
TMR2
11h
SSPCON2
91h
T2CON
12h
PR2
92h
SSPBUF
13h
SSPADD
93h
SSPCON
14h
SSPSTAT
94h
CCPR1L
15h
95h
CCPR1H
16h
96h
CCP1CON
17h
97h
RCSTA
18h
TXSTA
98h
TSREG
19h
SPBRG
99h
TXREG
1Ah
9Ah
CCPR2L
1Bh
9Bh
CCPR2H
1Ch
9Ch
CCP2CON
1Dh
ADRESH
1Eh
CMCON
ADCON0
1Fh
CVRCON
16 BYTES
REGISTRADORES
DE PROPÓSITO
GERAL
9Dh
20h
REGISTRADORE
S DE PROPÓSITO
GERAL
REGISTRADORES DE
PROPÓSITO GERAL
16 BYTES
9Eh
9Fh
11Fh
A0h
120h
REGISTRADORES DE
PROPÓSITO GERAL
REGISTRADORES
DE PROPÓSITO
GERAL
80 BYTES
14Fh
80 BYTES
150h
96 BYTES
EFh
ESPELHO DO
BANCO 0
BANCO 0
BANCO 1
16Fh
F0h
170h
ESPELHO DO BANCO 0
BANCO 2
1EFh
ESPELHO DO
BANCO 0
BANCO 3
1F0h
Microcontrolador PIC16F87x
15
Os registradores de funções especiais (SFR) do PIC serão utilizados com muita
freqüência nos programas. Por exemplo, os registradores TRISA, TRISB, TRISC, TRISD e
TRISE são usados para definir quais linhas de I/O serão entradas e quais serão saídas. O
PORTA, PORTB, PORTC, PORTD e PORTE definem o estado lógico das linhas de I/O. Outro
exemplo é o registrador STATUS que registra o estado de funcionamento interno do PIC ou o
resultado de operações aritméticas e lógicas. É necessário conhecer, portanto, exatamente qual
função desenvolve cada um dos registradores especiais e qual efeito se obtém ao manipular seus
conteúdos.
A memória EEPROM interna ao PIC pode ser utilizada pelo usuário para guardar dados.
Entretanto, ao contrário da memória de dados vista anteriormente, esta é uma memória não
volátil, que consegue manter as informações mesmo sem alimentação. A EEPROM do
PIC16F877 contém 256 Bytes, endereçadas de 0 a 255. Pode-se escrever em cada bit dessa
memória cerca de 1 milhão de vezes sem danificá-la.
A PILHA (STACK) é um local totalmente separado da memória de programação, em que
serão armazenados os endereços de retorno quando utilizarmos instruções de chamadas de
rotinas. Quando o programa é desviado para o começo de uma rotina por meio da instrução
correta (call), o endereço seguinte ao ponto que estava sendo rodado é armazenado na pilha para
que, ao fim da rotina, o programa possa retornar. O tamanho determina a quantidade de rotinas
que podem ser chamadas ao mesmo tempo. Caso se tente chamar um número de rotinas maior
que o tamanho da pilha, o endereço de retorno mais antigo será perdido.
Ainda podemos utilizar OUTRAS MEMÓRIAS, por exemplo, memórias externas. Já
estão disponíveis no mercado memórias EEPROM serial de 64 Kbytes, que podem ser
interligadas ao PIC utilizando apenas duas portas de I/O. Essas memórias podem ser úteis para
armazenar parâmetros de programação diferentes daqueles do programa principal.
Microcontrolador PIC16F87x
16
Capítulo IV - Registradores de Funções Especiais
Os registradores de funções especiais, também denominados de SFR (Special Function
Registers) são usados pela CPU e funções periféricas para controlar as operações do PIC,
servem para guardar a configuração e o estado de funcionamento atual da máquina. Estes
registradores estão localizados na memória RAM.
A seguir faremos uma descrição detalhada de todos os registradores do PIC16F87x.
Observações quanto à sintaxe:
„ R/W, bit de leitura e de escrita.
„ R, bit somente de leitura.
„ W, bit somente de escrita.
„ U, bit não implementado, ler como ‘0’.
„ -1, bit após o reset vale 1.
„ -0, bit após o reset vale 0.
„ -x, bit após o reset possui valor indefinido (desconhecido).
„ -u, bit não se altera após o reset.
„ -q, valor do bit depende de condição.
Exemplo1: R/W-0, bit de leitura e escrita, após o reset vale 0.
Exemplo2: U, bit não implementado, ler como 0.
Exemplo3: R-u, bit somente de leitura, após o reset o bit possui um valor inalterado.
Registradores:
Registrador W (Acumulador ou registrador de trabalho) e a ALU (Unidade Lógica e
Aritmética)
A ALU (Arithmetic and Logic Unit) ou ULA (Unidade Lógica e Aritmética) é a
componente mais complexa do PIC por conter todos os circuitos destinados a desenvolver as
funções de cálculo e manipulação de dados durante a execução de um programa. A ALU é uma
componente presente em todos os microprocessadores e dessa depende diretamente a capacidade
de cálculo do micro em si.
A ALU do PIC16F87x está preparada para operar com 8 bits, ou seja valor numérico não
maior do que 255. Existem processadores com ALU de 16, 32, 64 bits ou mais. A família Intel
Pentium, por exemplo, dispõe de uma ALU de 64 bits. A capacidade de cálculo presente nesses
17
Microcontrolador PIC16F87x
micros é notavelmente superior em detrimento da complexidade dos circuitos internos e
consequentemente do espaço ocupado.
A ALU referencia diretamente o registrador W denominado antigamente de acumulador.
Este registrador consiste de uma localização de memória destinada a conter um só valor de 8
bits. A diferença entre o registrador W e outras localizações de memória consiste no fato de que,
por referenciar o registrador W, a ALU não pode fornecer nenhum endereço, mas podemos
acessá-los diretamente. O registrador W será utilizado freqüentemente para intermediar
instruções do PIC.
Façamos um exemplo prático. Suponhamos querer colocar na localização de memória
0CH da RAM o valor 01H. Procurando entre as instruções do PIC veremos rapidamente que não
existe uma única instrução capaz de efetuar esta operação, mas deveremos necessariamente
recorrer ao acumulador e usar duas instruções em seqüência. Vejamos porque:
Como dissemos anteriormente, o opcode de uma instrução não pode exceder aos 14 bits e
assim teremos:
•
8 bits para especificar o valor que queremos colocar na localização de memória,
•
7 bits para especificar em qual localização de memória queremos inserir o nosso valor,
•
6 bits para especificar qual instrução queremos usar.
Teremos um total de 8 + 7 + 6 = 21 bits. Devemos então recorrer a duas instruções, ou
seja:
movlw
movwf
01H
0CH
onde a primeira instrução colocará no registrador W o valor 01H com a instrução MOVe Literal
para W e depois "moveremos" (copiaremos) esse valor para a localização 0CH com a instrução
MOVe W para F.
Registrador STATUS (endereço 03h e 83h)
Esse registrador serve para mostrar o estado da ULA (bits de Carry e Zero), a forma do
último reset e também para configurar a página de programação atual, quando necessário.
Nº dos bits
Bit 7
bit 6
Bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
Bits
IRP
RP1
RP0
/TO
/PD
Z
DC
C
Power on reset
R/W-0
R/W-0
R/W-0
R-1
R-1
R/W-x
R/W-x
R/W-x
Obs.: O valor dos bits após os demais resets será: 000qquuu
Descrição dos bits:
Bit 7: IRP, Bit de seleção de banco de registradores (usado para endereçamento indireto), p/
bit7=0 seleciona Bancos 0 e banco 1 (endereços 00 - FFh); já para bit7 = 1 seleciona bancos 2 e
3 (100h - 1FFh). Obs.: Este bit não é usado no PIC16F628 (considerar IRP=0).
Bit 6-5: RP1:RP0, Bit de seleção de banco de registradores (usado para endereçamento direto).
18
Microcontrolador PIC16F87x
P/ bits 6-5=00 implica seleção do banco 0 (00 - 7Fh), para bits 6-5=01 implica seleção do banco
1 (80h - FFh), para bits 6-5=10 implica seleção do banco 2 (100 - 17Fh) e, para bits 6-5=11
implica seleção do banco 3 (180h - 1FFh). obs.: Cada banco é de 128 bytes e somente o bit RP0
é usado no PIC16F628 (considerar RP1=0).
Bit 4: /TO, bit de Time-Out. Vai a 1 após power-up, instrução CLRWDT ou instrução SLEEP.
Vai a 0 após ocorrer uma interrupção de WDT (Watch Dog Timer).
Bit 3: /PD, bit de Power-Down. Vai a 1 após power-up ou instrução CLRWDT. Vai a 0 na
execução da instrução SLEEP.
Bit 2: Z, bit de Zero. Vai a 1 quando o resultado de uma operação aritmética ou lógica é zero.
Vai a 0 quando o resultado de uma operação aritmética ou lógica é diferente de zero.
Bit 1: DC, Bit de Digit Carry/Borrow. Este bit vai a 1 quando ocorre um estouro dos 4 bits
inferiores de um registrador numa instrução de soma (addlw ou addwf) ou quando a subtração
(sublw ou subwf) entre dois nibles inferiores é negativa. É zero quando a última operação na
ULA não ocasionou um estouro de dígito.
Bit 0: C, Bit de Carry/Borrow. Este bit vai a 1 quando ocorre um estouro do byte de um
registrador numa instrução de soma (addlw ou addwf) ou quando a subtração (sublw ou subwf)
entre dois bytes é positiva. Note que no caso da subtração o Carry trabalha com a lógica
invertida. Obs.: As instruções de rotação de bits (rlf ou rrf) também alteram o valor do Carry.
Registrador PORTA (endereço 05H)
Nº dos bits
Bit 7
bit 6
Bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
Bits
-
-
RA5
RA4
RA3
RA2
RA1
RA0
Power on reset
-
-
R\W-x
R\W-x
R/W-x
R/W-x
R/W-x
R/W-x
Obs: Valor dos bits após os demais resets: ---uuuuu
Registrador PORTB (endereço 06H)
Nº dos bits
Bit 7
bit 6
Bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
Bits
RB7
RB6
RB5
RB4
RB3
RB2
RB1
RB0/INT
Power on reset
R/W-x
R/W-x
R/W-x
R\W-x
R/W-x
R/W-x
R/W-x
R/W-x
Obs.: Valor dos bits após os demais resets: uuuuuuuu
Registrador PORTC (endereço 07H)
Nº dos bits
Bit 7
bit 6
Bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
Bits
RC7
RC6
RC5
RC4
RC3
RC2
RC1
RC0
Power on reset
R/W-x
R/W-x
R/W-x
R\W-x
R/W-x
R/W-x
R/W-x
R/W-x
Obs.: Valor dos bits após os demais resets: uuuuuuuu
19
Microcontrolador PIC16F87x
Registrador PORTD (endereço 08H)
Nº dos bits
Bit 7
bit 6
Bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
Bits
RD7
RD6
RD5
RD4
RD3
RD2
RD1
RD0
Power on reset
R/W-x
R/W-x
R/W-x
R\W-x
R/W-x
R/W-x
R/W-x
R/W-x
Obs.: Valor dos bits após os demais resets: uuuuuuuu
Registrador PORTE (endereço 09H)
Nº dos bits
Bit 7
bit 6
Bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
Bits
-
-
-
-
-
RE2
RE1
RE0
Power on reset
-
-
-
-
-
R/W-x
R/W-x
R/W-x
Obs.: Valor dos bits após os demais resets: uuuuuuuu
Registrador TRISA (endereço 85H)
Registrador de direção de dados da porta A.
Os registradores TRIS 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 com entrada.
Para configurar o pino com saída, você deve escrever “0” no bit relacionado. Uma maneira
prática para memorizar esta regra é associar o “1” ao “I” de Input (entrada), e o “0” de Output
(saída). Para configurar o PORTA, deve ser utilizado o TRISA, e para configurar o PORTB,
deve ser utilizado o TRISB.
Nº dos bits
bit 7
bit 6
Bit 5
Bit 4
bit 3
bit 2
bit 1
bit 0
Bits
-
-
-
TRISA4
TRISA3
TRISA2
TRISA1
TRISA0
Power on reset
-
-
-
R\W-1
R/W-1
R/W-1
R/W-1
R/W-1
Obs.: Valor dos bits nos demais resets: ---11111
Registrador TRISB (endereço 86H)
Registrador de direção de dados da porta B.
Nº dos bits
bit 7
Bit 6
Bit 5
Bit 4
bit 3
bit 2
bit 1
bit 0
Bits
TRISB7
TRISB6
TRISB5
TRISB4
TRISB3
TRISB2
TRISB1
TRISB0
Power on reset
R/W-1
R/W-1
R/W-1
R\W-1
R/W-1
R/W-1
R/W-1
R/W-1
Obs.: Valor dos bits nos demais resets: 11111111
20
Microcontrolador PIC16F87x
Registrador TRISC (endereço 87H)
Registrador de direção de dados da porta C.
Nº dos bits
bit 7
Bit 6
Bit 5
Bit 4
bit 3
bit 2
bit 1
bit 0
Bits
TRISC7
TRISC6
TRISC5
TRISC4
TRISC3
TRISC2
TRISC1
TRISC0
Power on reset
R/W-1
R/W-1
R/W-1
R\W-1
R/W-1
R/W-1
R/W-1
R/W-1
Obs.: Valor dos bits nos demais resets: 11111111
Registrador TRISD (endereço 88H)
Registrador de direção de dados da porta D.
Nº dos bits
bit 7
Bit 6
Bit 5
Bit 4
bit 3
bit 2
bit 1
bit 0
Bits
TRISD7
TRISD6
TRISD5
TRISD4
TRISD3
TRISD2
TRISD1
TRISD0
Power on reset
R/W-1
R/W-1
R/W-1
R\W-1
R/W-1
R/W-1
R/W-1
R/W-1
Obs.: Valor dos bits nos demais resets: 11111111
Registrador TRISE (endereço 89H)
Registrador de direção de dados da porta E.
Nº dos bits
bit 7
Bit 6
Bit 5
Bit 4
bit 3
bit 2
bit 1
bit 0
Bits
-
-
-
-
-
TRISE2
TRISE1
TRISE0
Power on reset
-
-
-
-
-
R/W-1
R/W-1
R/W-1
Obs.: Valor dos bits nos demais resets: 11111111
Registrador INDF (endereços 00h e 80h) e o FSR (endereços 04h e 84h)
O registrador INDF usa o conteúdo de FSR para endereçamento indireto de memória de
dados (não é um registrador físico). 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 somente de um espelho do endereço
apontado pelo FSR.
O INDF não é um registrador verdadeiro, é usado para o endereçamento indireto.
Os bits de FSR estão representados a seguir:
Nº dos bits
bit 7
bit 6
bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
Bits
-
-
-
-
-
-
-
-
Power on reset
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
Obs.: O valor dos bits após os demais resets será: uuuuuuuu
21
Microcontrolador PIC16F87x
Registrador TRM0 (endereço 01h)
É um contador automático de 8 bits. A diferença entre o registrador TMR0 e os demais
registradores é que seu incremento é automático e pode ser feito pelo clock da máquina ou por
um sinal externo. Esse registrador será estudado em detalhes no capítulo VI.
Nº dos bits
Bit 7
bit 6
bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
Bits
-
-
-
-
-
-
-
-
Power on reset
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
Obs.: O valor dos bits após os demais resets será: uuuuuuuu
Registrador PCL (endereços 02h e 82h) e o PCLATH (endereços 0Ah e 8Ah)
O PCL é a parte baixa (8 bits menos significativo) do Contador de Programa (PC =
‘Program Counter’).
Nº dos bits
Bit 7
bit 6
bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
Bits
-
-
-
-
-
-
-
-
Power on reset
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
Obs.: O valor dos bits após os demais resets será: 00000000
O PCLATH, parte alta (5 bits mais significativos) do Contador de Programa. Como a
área de memória de programação do PIC16F87X é maior que 256 bytes, não é possível acessá-la
completamente com somente 8 bits do PCL. Por isso, o PCLATH possui os 5 bits mais altos do
PC.
Nº dos bits
Bit 7
bit 6
Bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
Bits
-
-
-
-
-
-
-
-
Power on reset
-
-
-
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
Obs.: O valor dos bits após os demais resets será: ---00000
O Contador de Programa (Program Counter = PC) e a Pilha (Stack) são dois
componentes importantes para a compreensão da instrução de salto e chamada a subrotina.
Como foi visto no capítulo anterior, o PIC16F628 inicia a execução do programa a partir do
Reset Vector, ou seja, da localização de memória 0000H. Depois de ter executado esta instrução
passa para a próxima instrução memorizada na localização 0001H e assim por diante. Se não
existisse instrução capaz de influenciar a execução progressiva do programa, o PIC chegaria até
o final na última instrução memorizada na última localização e não saberia mais como continuar.
Sabemos obviamente que não é bem assim e qualquer sistema a microprocessador ou
linguagem de programação dispõe de instrução de desvio, ou seja, instruções capazes de
modificar o fluxo de execução do programa. Uma destas instruções é o goto (do inglês go to, vá
para). Quando o PIC encontra um goto não segue mais a instrução imediatamente após, mas
Microcontrolador PIC16F87x
22
desvia-se diretamente para a localização de memória especificada na instrução.
Façamos um exemplo:
ORG
Point1
movlw
goto
00H
10
Point1
No reset o PIC seguirá a instrução movlw 10 memorizada na localização 0000H que
colocará no acumulador o valor decimal 10. Onde então passará a executar a próxima instrução
goto Point1. Esta instrução determinará um desvio incondicional para localização de memória
especificada pelo label Point1, ou seja, de novo para localização 0000H. O programa não fará
outra coisa se não a de executar um ciclo infinito seguindo continuamente as instruções
especificadas. Durante este ciclo, para determinar qual é a próxima instrução a ser seguida, o
PIC utiliza um registrador especial denominado Program Counter, ou seja, contador de
programa. Este terá sempre o endereço da próxima instrução a ser executada. No RESET este
estará sempre zerado, determinando o início da execução no endereço 0000H, e cada instrução
terá um incremento de um para poder passar para próxima instrução. A instrução goto permite a
colocação de um novo valor no Program Counter e consequentemente desvia a uma localização
qualquer da área de programa do PIC.
Uma outra instrução muito interessante é o call, ou seja, a chamada a subrotina. Esta
instrução funciona de maneira muito similar ao goto com a única diferença que, a primeira,
desvia para uma localização de memória especificada e continua a execução do programa,
enquanto o call desviará o programa para uma subrotina especificada e executará a mesma, e
retornará a execução da instrução imediatamente após a chamada call, o valor imediatamente
após a chamada call será armazenado em uma área particular da memória denominada Stack
(Pilha).
Vejamos melhor com um exemplo:
ORG
Point1
movlw
call
goto
Point2
movlw
return
00H
10
Point2
Point1
11
Neste caso o PIC, após ter executado movlw 10 passa a executar o call Point2. Antes de
desviar memoriza no Stack o endereço 0002H, ou seja, a próxima localização ao call. Passa
então a executar a instrução movlw 11, memorizada em correspondência ao label Point2. E neste
ponto encontra uma nova instrução o return que, como podemos deduzir de seu nome, permite o
"RETORNO", ou seja, retorne a execução da instrução imediatamente após o call. Esta operação
é denominada de: "chamada a subrotina", ou seja, uma interrupção momentânea do fluxo normal
do programa para "chamar" a execução de uma série de instruções, para depois retornar a
execução normal do programa. Para poder retornar para onde havia interrompido, o PIC utiliza o
último valor armazenado no Stack e o coloca de novo no Program Counter. A palavra stack em
inglês significa "pilha" e por esse fato é possível empilhar um endereço sobre o outro para ser
recuperado quando necessário. Este tipo de memorização era antes denominado de LIFO do
23
Microcontrolador PIC16F87x
inglês Last In First Out, onde o último elemento armazenado (last in) deve necessariamente ser
o primeiro a sair (last out). Graças ao Stack é possível efetuar vários call, um dentro do outro, e
manter sempre o retorno ao fluxo do programa quando se encontra uma instrução return.
Vejamos um outro exemplo:
ORG
Point1
movlw
call
goto
Point2
movlw
call
return
Point3
movlw
return
00H
10
Point2
Point1
11
Point3
12
No exemplo acima a rotina principal Point1 promove a chamada do primeiro call para
subrotina Point2, a subrotina Point2 chama outra subrotina no caso Point3, este último por sua
vez, encontra um returm e retorna para Point2 que encontra o outro return e retorna para a
execução da rotina Point1 que no caso é a principal. Os endereços a serem memorizados no
stack são dois e quando vir a encontrar um segundo call procurará pelo return correspondente ao
primeiro e assim por diante. Diz-se então que o call é "nidificante", ou seja, um dentro do outro.
O PIC16F87X dispõe de um stack de 8 níveis, ou seja um Stack que consegue armazenar
no máximo 8 chamadas à subrotina. É importante assegurar-se, durante a formulação de um
programa que, se tenha sempre uma instrução returm em correspondência a um call para evitar o
perigo de desalinhamento do stack que em execução pode gerar erros que dificilmente
encontraremos.
Registrador EEDATA (endereço 08h)
EEDATA é o registrador de dados da EEPROM. Ele possui duas funções distintas: nas
operações de escrita da EEPROM, ele deve ser preenchido com o dado a ser armazenado, já nas
operações de leitura, ele armazena o dado lido.
Nº dos bits
Bit 7
bit 6
bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
Bits
-
-
-
-
-
-
-
-
Power on reset
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
Obs.: O valor dos bits após os demais resets será: uuuuuuuu
24
Microcontrolador PIC16F87x
Registrador EEADR (endereço 09h)
EEADR é o registrador de endereços da EEPROM. Ele especifica o endereço de escrita ou
leitura do endereço da EEPROM interna ao PIC.
Nº dos bits
Bit 7
bit 6
bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
Bits
-
-
-
-
-
-
-
-
Power on reset
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
R/W-x
Obs.: O valor dos bits após os demais resets será: uuuuuuuu
Registrador INTCON (endereços 0BH e 8Bh)
Contém os vários bits de habilitação e estados de todas as fontes de interrupção do
PIC16F628. Ele serve para configurar e identificar as interrupções.
Nº dos bits
Bit 7
bit 6
bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
Nomes dos bits
GIE
EEIE
T0IE
INTE
RBIE
T0IF
INTF
RBIF
Power-on-reset
R/W-0
R/W-0
R/W-0
R\W-0
R/W-0
R/W-0
R/W-0
R/W-x
Obs.: Valor dos bits após os demais resets: 0000000u
Descrição dos bits:
bit 7: GIE, Bit de habilitação da interrupção global, p/ bit7=1 habilita todas as interrupções não
mascaráveis e p/ bit7=0 desabilita todas as interrupções.
Bit 6: EEIE, Bit de habitação da interrupção completa de escrita na EEPROM interna do PIC, p/
bit6=1 habilita interrupção de escrita na EEPROM e p/ bit6=0 desabilita a interrupção.
Bit 5: T0IE, Bit de habitação da interrupção de overflow do Timer 0 (TMR0), p/ bit5=1 habilita
a interrupção de TMR0 e p/ bit5=0 desabilita a interrupção.
Bit 4: INTE, Bit de habitação da interrupção RB0/INT, p/ bit4=1 habilita a interrupção de
RB0/INT e p/ bit4=0 desabilita a interrupção.
Bit 3: RBIE, Bit de habitação da interrupção de mudança de nível na porta B (bits RB7 a RB4),
p/ bit3=1 habilita a interrupção de mudança de nível na porta B e p/ bit3=0 desabilita a
interrupção.
Bit 2: T0IF, Bit de “flag” da interrupção de overflow do Timer 0 (TMR0), se bit2=1 implica que
ocorreu um overflow no TMR0 (deve ser zerado no programa) e se bit2=0 implica que não
ocorreu a interrupção.
Bit 1: INTF, Bit de “flag” da interrupção RB0/INT, se bit1=1 implica que ocorreu uma RB0/INT
e se bit1=0 implica que não ocorreu a interrupção.
Bit 0: RBIF, Bit de “flag” da interrupção de mudança de nível na porta B, se bit0=1 implica que
ocorreu uma mudança de estado num dos pinos RB7:RB4 (deve ser zerado no programa) e se
bit0=0 implica que não ocorreu a interrupção.
25
Microcontrolador PIC16F87x
Registrador OPTION_REG(endereço 81h)
Contém vários bits de controle. Serve para configurar uma série de opções para a operação
do microcontrolador.
Nº dos bits
Bit 7
bit 6
bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
Bits
/RBPU
INTEDG
T0CS
T0SE
PSA
PS2
PS1
PS0
Power on reset
R/W-1
R/W-1
R/W-1
R\W-1
R/W-1
R/W-1
R/W-1
R/W-1
Obs.: Valor dos bits após os demais resets: 11111111
Descrição dos bits:
bit 7: /RBPU, bit de habilitação de pull-up na porta B, p/ bit7 = 1 desabilita pull-up e p/ bit7=0
habilita pull-up.
bit 6: INTEDG, bit de seleção de borda de interrupção, p/ bit6 = 1 interrupção na borda de
subida do pino RB0/INT e p/ bit6 = 0 interrupção na borda de descida do pino RB0/INT.
bit 5: T0CS, bit de seleção da fonte de clock do TMR0, p/ bit5 = 1 clock colocado na entrada do
pino RA4/T0CKI e p/ bit5 = 0 clock interno.
bit 4: T0SE, bit de seleção da borda da fonte de clock do TMR0, p/ bit4 = 1 incrementa na
transição de alto para baixo no pino RA4/T0CKI e p/ bit4 = 0 incrementa na transição de baixo
para alto no pino RA4/T0CKI.
Bit 3: PSA, bit de sinalização do “prescaler”, p/ bit3 = 1 assinala o “prescaler” ao WDT e p/
bit3=0 assinala o “prescaler” ao TMR0.
Bit 2-0: PS2, PS1 e PS0, bits de seleção da razão do “prescaler”.
PS2
PS1
PS0
Divisor p/ o TMR0
Divisor p/ o WDT
0
0
0
2
1
0
0
1
4
2
0
1
0
8
4
0
1
1
16
8
1
0
0
32
16
1
0
1
64
32
1
1
0
128
64
1
1
1
256
128
26
Microcontrolador PIC16F87x
Registrador EECON1 (endereço 88h)
O EECON1 é o registrador de controle de escrita e leitura na EEPROM interna do PIC.
Nº dos bits
bit 7
Bit 6
Bit 5
Bit 4
bit 3
bit 2
bit 1
bit 0
Bits
-
-
-
EEIF
WRERR
WREN
WR
RD
Power on reset
U
U
U
R\W-0
R/W-x
R/W-0
R/S-0
R/S-0
Obs.: Valor dos bits nos demais resets: ---0q000
Descrição dos bits:
bit 7-5: Não implementados, ler como ‘0’.
bit 4: EEIF, bit de flag de interrupção na operação de escrita na EEPROM, se bit4 = 1 implica
que a operação de escrita foi completado (deve ser zerado no programa) e se bit4 = 0 implica
que a operação de escrita não foi completada ou ainda não foi inicializada.
bit 3: WRERR, bit de flag de erro da EEPROM, se bit3 = 1 implica que uma operação de escrita
foi prematuramente terminada e se bit3 = 0 implica que a operação de escrita foi completada.
bit 2: WREN, bit de habilitação de escrita na EEPROM, p/ bit2 = 1 segue ciclos de escrita e p/
bit2 = 0 inibe escrita de dados na EEPROM.
bit 1: WR, bit de controle de escrita na EEPROM, p/ bit1 = 1 inibe um ciclo de escrita (obs.:
esse bit é zerado por hardware uma vez que a escrita é completada, o bit WR não pode ser
zerado no programa). Se bit1 = 0 indica que o ciclo de escrita de dados na EEPROM foi
completado.
bit 0: RD, bit de controle de leitura na EEPROM, p/ bit0 = 1 inicializa uma leitura na EEPROM
(obs.: esse bit é zerado por hardware uma vez que a leitura é completada, o bit RD não pode ser
zerado no programa, pode somente ser setado). Se bit0 = 0 indica que a leitura de dados da
EEPROM não foi inicializada.
Registrador EECON2 (endereço 89h)
EECON2 não é um registrador físico. O EECON2 é usado exclusivamente em uma
seqüência de escrita de dados na EEPROM. Veja o Capítulo IX para mais detalhes.
27
Microcontrolador PIC16F87x
Capítulo V - Conjunto de Instruções do PIC16F87X
Observações quanto aos termos utilizados na construção dos nomes das instruções e seus
argumentos:
•
•
•
•
•
Work: Trata-se de um registrador temporário para as operações da ULA. No Assembler do
PIC, ele é conhecido como W. Também é comum chamá-lo de acumulador.
File: Referência a um registrador (posição de memória) propriamente dito. Utilizaremos a
letra F para sua representação nos nomes de instruções e f nos argumentos delas.
Literal: Um número qualquer que pode ser escrito na forma decimal, hexadecimal ou
binária. Utilizaremos a letra L para sua representação nos nomes de instruções e k nos
argumentos delas.
Destino: O local onde deve ser armazenado o resultado da operação. Os destinos podem ser
0 (W ) ou 1 (F). A letra d será usada para indicar o destino de uma instrução, o destino pode
ser o acumulador (d=0) ou o registrador (d=1).
Bit: Refere-se a um bit específico dentro de um byte. Utilizaremos a letra B para sua
representação nos nomes das instruções e b nos argumentos delas.
Para facilitar as operações de seus registradores especiais na RAM (que como
recordamos estava incluído no código com a diretiva INCLUDE), a Microchip inseriu uma lista
de nomes que identificam univocamente qualquer registrador especial e a qual está associado o
endereço correspondente na área da memória RAM.
Se, por exemplo, quisermos definir toda a linha do PORTB do PIC como saída, devemos
agir sobre o TRISB. Podemos escolher e referenciar diretamente o registrador com o seu
endereço:
movlw B'00000000'
movwf 86H
; Endereço de TRISB
ou então, referenciar o mesmo registrador com o seu nome simbólico, neste caso tendo que ter a
certeza de ter inserido a diretiva INCLUDE "P16F628.INC" (mostrado no Apêndice A desta
apostila):
movlw B'00000000'
movwf TRISB
; Nome simbólico do endereço de TRISB
Para facilitar o estudo das instruções do PIC, organizamos a seguir duas tabelas. Uma
com as instruções em ordem alfabética e a outra com as instruções divididas em quatro grupos,
conforme as suas aplicações:
•
Operações com registradores;
•
Operações com literais;
•
Operações com bits;
•
Controles.
Microcontrolador PIC16F87x
28
Conjunto de instruções do PIC16F628
Operações em ordem alfabética
Instrução Argumento
Descrição
s
ADDLW
K
Soma k com W, guardando o resultado em W (W = W + k).
ADDWF
f,d
Soma W e f, guardando o resultado em d (d = W + f).
ANDLW
K
Lógica “E” entre k e W, guardando o resultado em W (W = W AND k).
ANDWF
f,d
Lógica “E” entre W e f, guardando o resultado em d (d = W AND f).
BCF
f,b
Zera o bit b do registrador f.
BSF
f,b
Seta o bit b do registrador f.
BTFSC
f,b
Testa o bit b do registrador f, e pula a próxima linha se ele for 0 (zero).
BTFSS
f,b
Testa o bit b do registrador f, e pula a próxima linha se ele for 1 (um).
CALL
Label
Chamada a uma subrotina no endereço Label.
CLRF
F
Limpa o registrador f (f = 0).
CLRW
Limpa o acumulador (W = 0).
CLRWDT
Limpa o registrador WDT para evitar o reset (Watchdog timer = 0).
COMF
f,d
Pega o complemento de f, guardando o resultado em d (d = not f).
DECF
f,d
Decrementa f, guardando o resultado em d (d = f -1).
DECFSZ
f,d
Decrementa f, guardando o resultado em d, e pula a próxima linha se o
resultado for zero (d = f –1, skip se zero).
GOTO
Label
Desvia para o endereço Label.
INCF
f,d
Incrementa f, guardando o resultado em d (d = f +1).
INCFSZ
f,d
Incrementa f, guardando o resultado em d, e pula a próxima linha se o
resultado for zero (d = f+1, skip se zero).
IORLW
K
Lógica OU entre k e W, guardando o resultado em W (W = W OR k).
IORWF
f,d
Lógica OU entre W e f, guardando o resultado em d (d = f OR W).
MOVLW
K
Move (copia) valor literal k para o acumulador W (W = k).
MOVF
F,d
Move (copia) valor de registrador f para destino d (d = f).
MOVWF
F
Move (copia) valor do acumulador W para o registrador f (f = W).
NOP
Nenhuma operação, gasta um ciclo de máquina sem fazer nada.
RETFIE
Retorno de uma interrupção.
RETLW
K
Retorno de uma rotina, com k em W.
RETURN
Retorna de uma rotina.
RLF
f,d
Rotaciona f um bit a esquerda, guardando o resultado em d (d = f << 1).
RRF
f,d
Rotaciona f um bit a direita, guardando o resultado em d (d = f >> 1).
SLEEP
Coloca o PIC em modo sleep (dormindo) para economia de energia.
SUBLW
K
Subtrai W de k, guardando o resultado em W (W = k – W).
SUBWF
f,d
Subtrai W de f, guardando o resultado em d (d = f - W).
SWAPF
f,d
Executa uma inversão entre o nibble da parte alta e o nibble da parte
baixa de f, guardando o resultado em d.
XORLW
W
Lógica ou-exclusivo entre k e W, guardando o resultado em W (W=W
XOR k).
XORWF
f,d
Lógica ou-exclusivo entre W e f, guardando o resultado em d (d=W
XOR f).
29
Microcontrolador PIC16F87x
Conjunto de instruções do PIC16F628
Instrução
Argumentos
Descrição
Grupo 1: Operações com registradores
ADDWF
ANDWF
CLRF
COMF
DECF
DECFSZ
f,d
f,d
F
f,d
f,d
f,d
Soma W e f, guardando o resultado em d (d = W + f).
Lógica “E” entre W e f, guardando o resultado em d (d = W AND f).
Limpa o registrador f (f = 0).
Pega o complemento de f, guardando o resultado em d (d = not f).
Decrementa f, guardando o resultado em d (d = f -1).
Decrementa f, guardando o resultado em d, e pula a próxima linha se o resultado
for zero (d = f –1, skip se zero).
INCF
f,d
Incrementa f, guardando o resultado em d (d = f +1).
INCFSZ
f,d
Incrementa f, guardando o resultado em d, e pula a próxima linha se o resultado
for zero (d = f+1, skip se zero).
IORWF
f,d
Lógica OU entre W e f, guardando o resultado em d (d = f OR W).
MOVF
F,d
Move (copia) valor de registrador f para destino d (d = f).
MOVWF
F
Move (copia) valor do acumulador W para o registrador f (f = W).
RLF
f,d
Rotaciona f um bit a esquerda, guardando o resultado em d (d = f << 1).
RRF
f,d
Rotaciona f um bit a direita, guardando o resultado em d (d = f >> 1).
SUBWF
f,d
Subtrai W de f, guardando o resultado em d (d = f - W).
SWAPF
f,d
Executa uma inversão entre o nibble da parte alta e o nibble da parte baixa de f,
guardando o resultado em d.
XORWF
f,d
Lógica ou-exclusivo entre W e f, guardando o resultado em d (d=W XOR f).
Grupo 2: Operações com literais
ADDLW
K
Soma k com W, guardando o resultado em W (W = W + k).
ANDLW
K
Lógica “E” entre k e W, guardando o resultado em W (W = W AND k).
IORLW
K
Lógica OU entre k e W, guardando o resultado em W (W = W OR k).
MOVLW
K
Move (copia) valor literal k para o acumulador W (W = k).
SUBLW
K
Subtrai W de k, guardando o resultado em W (W = k – W).
XORLW
W
Lógica ou-exclusivo entre k e W, guardando o resultado em W (W=W XOR k).
Grupo 3: Operações com bits
BCF
f,b
Zera o bit b do registrador f.
BSF
f,b
Seta o bit b do registrador f.
BTFSC
f,b
Testa o bit b do registrador f, e pula a próxima linha se ele for 0 (zero).
BTFSS
f,b
Testa o bit b do registrador f, e pula a próxima linha se ele for 1 (um).
Grupo 4: Controles
CALL
Label
Chamada a uma subrotina no endereço Label.
CLRW
Limpa o acumulador (W = 0).
CLRWDT
Limpa o registrador WDT para evitar o reset (Watchdog timer = 0).
GOTO
Label
Desvia para o endereço Label.
NOP
Nenhuma operação, gasta um ciclo de máquina sem fazer nada.
RETFIE
Retorno de uma interrupção.
RETLW
K
Retorno de uma rotina, com k em W.
RETURN
Retorna de uma rotina.
SLEEP
Coloca o PIC em modo sleep (dormindo) para economia de energia.
30
Microcontrolador PIC16F87x
Explicação detalhada do conjunto de instruções do PIC.
1) ADDLW k
; Soma a constante k a W
Descrição: Soma a constante k ao valor memorizado no acumulador W e coloca o resultado no
acumulador.
Exemplo:
movlw 10
addlw
12
; após o trecho de programa, o acumulador W terá o valor 22
2) ADDWF f,d
; Soma o valor contido em W com o valor contido no registrador F
Descrição: Esta instrução soma o valor contido no acumulador W com o valor contido no
registrador endereçado pelo parâmetro f.
Exemplo: Vejamos um exemplo de soma entre dois registradores:
add1
equ
0CH
add2
equ
0DH
org
00H
movlw 10
;Primeiro somador = 10
movwf add1
movlw 15
;Segundo somador = 15
movwf add2
movf
add1,W
;W = add1
addwf
add2,W
;W = add1 + add2
3) ANDLW k
; Efetua o AND bit a bit entre W e uma constante k
Descrição: Efetua o AND bit a bit entre o valor contido no acumulador W e o valor constante k.
O resultado será memorizado no acumulador.
Exemplo:
movlw ‘10101010’B
andlw
‘11110000’B
...
Depois de haver executado este trecho de programa o acumulador W irá valer
10100000B.
4) ANDWF f,d
; Efetua o AND bit a bit entre o valor contido em W e o valor
contido no registrador F.
Descrição: Esta instrução efetua o AND bit a bit entre o valor contido no acumulador W e o
valor contido no registrador endereçado pelo parâmetro f.
Exemplo: Freqüentemente o AND será utilizado para mascarar o valor de algum bit dentro de
um registrador. Se por exemplo quiséssemos extrair do número binário 01010101B os quatro
bits menos significativo a fim de obter o seguinte valor 00000101B, bastará preparar uma
máscara do tipo 00001111B e fazer o AND com o nosso valor, vejamos como:
movlw 01010101B ; Armazena em W o valor binário
movwf 0CH
; Usa o endereço 0CH para armazenar o valor inicial da
máscara
movlw 00001111B ; Prepara a máscara do bit
andwf 0CH,W
; Efetua o AND e memoriza o resultado no acumulador W
O resultado em W será 00000101B como descrito.
Microcontrolador PIC16F87x
31
W = 00001111 AND
f = 01010101 =
---------------W = 00000101
5) BCF f,b
; Zera o bit b do registrador F
Descrição: Esta instrução zera o bit b do registrador no endereço f .
Exemplo:
parm1
equ
0CH
movlw ‘11111111’B ;Valor inicial
movwf parm1
bcf
parm1,0
Ao término do programa o registrador parm1 será 11111110B.
6) BSF f,b
;Coloca em nível alto o bit b no registrador F.
Descrição: Esta instrução coloca em “um” no bit b do registrador que está no endereço f.
Exemplo:
parm1 equ
0CH
movlw 00000000B ;Valore inicial
movwf parm1
bsf
parm1,0 ;D0=1
Ao terminar o programa o registrador parm1 será 00000001B.
7) BTFSC f,b
; Pula a próxima instrução se o bit b do registrador F for 0
Descrição: Testa o bit b contido no registrador no endereço f e pula a próxima instrução se este
valer 0.
Exemplo:
parm1 equ
0CH
org
00H
movlw 11111110B ;Valor inicial
movwf parm1
loop
btfsc parm1,0
;bit0 = 0? Se for, pular próxima instrução.
goto
loop
;Se não, ficar no loop
Este programa executa um loop infinito. Entretanto, o mesmo programa não executará o
loop se substituirmos a instrução: movlw
11111110B
pela instrução: movlw
11111111B.
8) BTFSS f,b
; Pula a próxima instrução se o bit b do registrador F for 1
Descrição: Testa o bit b contido no registrador do endereço f e pula a instrução seguinte se este
for 1.
Exemplo:
parm1 equ
0CH
32
Microcontrolador PIC16F87x
org
00H
movlw 11111111B ;Valor inicial
movwf parm1
loop
btfss parm1,0 ;bit0 = 1 ? Se for, pular próxima instrução.
goto loop
;Se não, ficar no loop
Este programa executa um loop infinito. O mesmo programa não executará o loop se
substituirmos a instrução:
movlw 11111111B pela instrução: movlw 11111110B.
9) CALL k
; Chamada a uma subrotina
Descrição: Chama uma subrotina memorizada no endereço k. O parâmetro k pode ser
especificado utilizando-se diretamente o valor numérico do endereço ou então o relativo label.
Exemplo:
#define
LED1
1
org
00H
call
ledOn
; Chama a rotina ledOn
ledOn
btfsc PORTB,LED1
return
; testa o bit 1 da porta B
Quando a CPU do PIC encontra uma instrução CALL, memoriza no STACK o valor do
registrador PC+1 de modo a poder retornar para instrução após o CALL, em seguida
escreve no PC o endereço da subrotina pulando a execução desta ultima. O valor original
do PC será recuperado pela subrotina com a execução da instrução de retorno RETURN
ou RETLW.
No PIC16F628 estão disponíveis 8 níveis de stack (pilha), ou seja a instrução CALL
dentro de uma subrotina pode ter no máximo 8 chamadas ou 8 níveis. As demais
chamadas serão sobrepostas às primeiras.
9) CLRF f
; Zera o registrador F
Descrição: Esta instrução zera o valor contido no registrador endereçado pelo parâmetro f.
Exemplo: Se quisermos zerar o registrador TMR0 no qual o endereço é 01H hexadecimal, a
instrução a se executar será:
clrf 01H
Ou, se no endereço do nosso código incluirmos o arquivo P16F628.INC, poderemos utilizar
o nome simbólico do registrador TMR0, ou seja, clrf TMR0.
11) CLRW
; Zera o registrador W
Descrição: Zera o valor contido no registrador W.
Exemplo:
clrw
12) CLRWDT
; Limpa o registrador WDT para não acontecer o Reset
Descrição: Esta instrução deve ser utilizada quando programarmos o PIC com a opção
Watchdog (fusível WDTE). Nesta modalidade o PIC habilita um timer que, uma vez
Microcontrolador PIC16F87x
33
transcorrido um determinado tempo, efetua o reset do mesmo. Para evitar o reset do nosso
programa deveremos executar ciclicamente a instrução CLRWDT para zerar o timer antes deste
tempo. Se não zerarmos o WDT neste tempo, o circuito de watchdog (do inglês cão de guarda)
interpretará este como um bloco de programa em execução e efetuará o reset para bloquea-lo.
Exemplo:
org
00H
loop
clrwdt
goto loop
13) COMF f,d
; Efetua o complemento do registrador F
Descrição: Esta instrução efetua o complemento do valor contido no registrador
endereçado pelo parâmetro f.
Exemplo:
parm1 equ
0CH
org
00H
movlw 01010101B
movwf parm1
comf parm1,F
Ao término da execução do programa o valor do registrador parm1 será 10101010B.
14) DECF f,d
; Decrementa o conteúdo do registrador F
Descrição: Esta instrução decrementa o conteúdo do registrador endereçado pelo parâmetro f.
Exemplo:
movlw 23H
;Escreve em W o valor 23H
movwf 0CH
;Copia no registrador 0CH o valor de W
decf
0CH,F
;Decremente o valor contido no registrador 0CH
15) DECFSZ f,b
; Decrementa o valor do registrador f e pula a próxima instrução se o
resultado for zero.
Descrição: Decrementa o valor de registrador do endereço f e se o resultado for zero pula a
próxima instrução. Exemplo:
counter equ
0CH
org
00H
movlw 10
;counter = 10
movwf counter
loop
decfsz counter,F
;counter = counter –1, se counter = 0, pula próxima instrução
goto loop
;se não, continua no loop
Este programa executa 10 vezes a instrução decfsz até que counter seja = 0.
16) GOTO k
; Desvia a execução do programa para o endereço especificado k.
Descrição: Determina o desvio incondicional do programa em execução para o endereço k. O
parâmetro k pode ser especificado utilizando-se diretamente um valor numérico do endereço ou
então o relativo label.
Microcontrolador PIC16F87x
34
Exemplo:
org
00H
loop
goto loop
Este programa executa um cilclo (loop) infinito.
17) INCF f,d
; Incrementa o valor do registrador no endereço F.
Descrição: Incrementa o conteúdo do registrador no endereço f.
Exemplo:
movlw 23H
;Escreve em W o valor 23H
movwf 0CH
;Copia no registrador 0CH o valor de W
incf
0CH,F
;Incrementa de 1 valor contido no registrador 0CH
18) INCFSZ f,b
; Incrementa o valor do registrador f e pula a próxima instrução se o
resultado for zero.
Descrição: Incrementa o valor do registrador f e se o resultado for zero pula a próxima
instrução.
Exemplo:
counter
equ
0CH
org
00H
movlw 250
;counter = 250
movwf counter
loop
incfsz counter,F ;counter = counter + 1, se counter = 0 ? pular próxima instrução
goto loop
; se não, continuar no loop
Este programa executa para 256-10 = 6 vezes a instrução incfsz até que counter seja 0.
Sendo counter um registrador de 8 bit's quando for incrementado do valor 255 assume
novamente o valor 0 e dai a formula 256 - 10 = 6.
19) IORLW k
; Efetua o OU inclusive entre W e uma constante k
Descrição: Efetua o OR inclusive entre o valor contido no acumulador W e o valor da constante
k.
Exemplo:
org
00H
start
movlw 00001111B
iorlw 11110000B
Após ser executado esse programa o acumulador W será 11111111B.
20) IORWF f,d
; Efetua o OR inclusive entre o valor contido em W e o valor contido no
registrador F
Descrição: Esta instrução efetua o OR inclusive entre o valor contido no acumulador W e o
valor contido no registrador endereçado pelo parâmetro f.
Exemplo:
parm1 equ 0CH
org
00H
movlw 00001111B
Microcontrolador PIC16F87x
35
movwf parm1
movlw 11111111B
iorwf
parm1,F
Ao término do programa o valor do registrador parm1 será 11111111B.
21) MOVLW k
; Copia para W o valor constante k
Descrição: Passa ao acumulador W um valor constante k.
Exemplo:
org
00H
movlw 20
Após ter executado este programa o acumulador W irá a 20.
22) MOVF f,d
;Copia o conteúdo do registrador f para o destino d
Descrição: Esta instrução copia o conteúdo do registrador endereçado pelo parâmetro f para o
parâmetro de destino d. Exemplo: O exemplo a seguir copia o valor contido no registrador do
endereço 0CH no acumulador W:
movf 0CH,W
23) MOVWF f
; Copia o conteúdo do registrador W para o registrador F
Descrição: Esta instrução copia o conteúdo do registrador W no registrador de parâmetro f.
Exemplo: Para copia o valor 10H no registrador TMR0. A instrução a se executar será a
seguinte:
movlw 10H
;Escreve no registrador W o valor 10H
movwf TMR0
;e o memoriza no registrador TMR0
24) NOP
; Nenhuma operação
Descrição: Esta instrução não executa nenhuma operação mas é útil para inserir atrasos de um
ciclo de maquina ou mais.
Exemplo:
nop
nop
Os dois nops acima vai provocar um atraso de 2 uS se utilizarmos um cristal de 4MHz no nosso
hardware.
25) RETFIE
; Retorna de uma rotina de interrupção
Descrição: Esta instrução deve ser colocada no término de cada subrotina de controle de
interrupções para retornar o controle ao programa principal.
Exemplo:
org 00H
loop
goto loop ;Loop infinito
org 04H ;Interrupt vector
intHandler
retfie
;Retorna da interrupção
Neste código o programa principal executa um loop infinito. Se habilitarmos uma das
interrupções do 16F628 ele não apenas verificará o controle como irá automaticamente ao
programa alocado no endereço 04H (no exemplo intHandler), a instrução RETFIE
determinará então o retorno ao loop principal.
Microcontrolador PIC16F87x
36
26) RETLW k
; Retorna de uma rotina com uma constante k em W
Descrição: Esta instrução retorna o controle de uma rotina ao programa principal. A diferença
desta em relação à instrução RETURN é que retflw permite retornar, através do acumulador W,
o valor k ao programa principal.
Exemplo:
rtc equ
0CH
org
00H
call
mySub1
movwf rtc
...
mySub1
nop
retlw 10
Uma vez executado esse programa ele memorizará no registrador rtc o valor 10 passado
pela subrotina mySub1.
27) RETURN
; Retorna de uma rotina
Descrição: Esta instrução deve ser inserida no termino de cada subrotina para retornar a
execução ao programa principal.
Exemplo:
org 00H
call mySub1
....
mySub1
nop
return
Nota: No PIC16F628 podemos fazer apenas 8 chamadas a subrotinas, do tipo:
org 00H
call mySub1
....
mySub1
call mySub2
return
mySub2
call mySub3
return
mySub3
return
28) RLF f,b
;Rotaciona a esquerda o conteúdo do registrador f passando pelo Carry
Descrição: Rotaciona o bit contido no registrador do endereço f para a esquerda (ou seja do bit
menos significativo para o mais significativo) passando pelo CARRY do registrador STATUS
como ilustrado na figura a seguir:
37
Microcontrolador PIC16F87x
BIT7
BIT6
BIT5
BIT4
BIT3
BIT2
BIT1
BIT0
CARRY
Figura 7 – Rotação de bit a esquerda
O conteúdo do bit CARRY do registrador STATUS será deslocado para o bit0
enquanto que o valor do bit7 será deslocado para o CARRY.
Exemplo:
parm1 equ
0CH
org
00H
bcf
STATUS,C
;Zera o CARRY
movlw
01010101B
;Valor inicial
movwf
parm1
rlf
parm1,F
Ao término do programa o registrador parm1 será 10101010B enquanto o CARRY será
0.
29) RRF f,b
; Rotaciona para a direita o conteúdo do registrador f passando
pelo Carry
Descrição: Rotaciona o bit contido no registrador do endereço f para direita (ou seja do bit mais
significativo para o menos significativo) passando pelo bit CARRY do registrador STATUS
como ilustrado na figura a seguir:
BIT7
BIT6
BIT5
BIT4
BIT3
BIT2
BIT1
BIT0
CARRY
Figura 8 – Rotação de bit a direita
O conteúdo do bit CARRY do registrador STATUS será deslocado para o bit7 enquanto
o valor do bit0 será deslocado para o CARRY.
Exemplo:
parm1 equ
0CH
org
00H
bcf
STATUS,C
;Zera o CARRY
movlw 01010101B
;Valor inicial
movwf parm1
rrf
parm1,F
Ao término do programa o registrador parm1 será 00101010B enquanto o CARRY será
1.
30) SLEEP ; Coloque o PIC (para dormir) em standby
Descrição: Esta instrução bloqueia a execução do programa em andamento e coloca o PIC em
standby (sleep do inglês = dormir).
Exemplo:
org 00H
start
Microcontrolador PIC16F87x
38
sleep
31) SUBLW k
; Subtraia de k o valor em W
Descrição: Subtrai a constante k do valor memorizado no acumulador W.
Exemplo:
org 00H
start
movlw
10
; W = 10
sublw
12
; W = 12 - 10
...
Depois de haver executado este programa o acumulador W será 2.
32) SUBWF f,d
;Subtraia o valor contido em W do valor contido no registrador F.
Descrição: Esta instrução subtrai o valor contido no registrador W do valor contido no
registrador endereçado pelo parâmetro f.
Exemplo: Analisando um exemplo extraído do datasheet da Microchip:
Se inserirmos a instrução:
subwf REG1,F
Onde reg1 é o endereço de um registrador qualquer especificado com a diretiva:
REG1 RES 1
Para o valor inicial de REG1=3 e W=2, teremos REG1=1 e C=1 porque o resultado é
positivo.
Para o valor inicial de REG1=2 e W=2, teremos REG1=0 e C=1 porque o resultado é
positivo.
Para o valor inicial de REG1=1 e W=2, teremos REG1=FFH ou seja -1 e C=0 porque o
resultado é negativo.
33) SWAPF f,d
; Troca de nibbles.
Descrição: Troca o valor dos quatro bits mais significativo (D7-D4) contido no registrador do
endereço f com os quatro bits menos significativo(D3-D0) do mesmo.
Exemplo:
movlw ‘11110000’B
;Valor inicial
swapf
parm1,F
Ao término do programa o registrador parm1 será 00001111B.
34) XORLW k
; Efetua o OR exclusivo entre W e uma constante k
Descrição: Efetua o OR exclusivo entre o valor contido no acumulador W e o valor constante k.
Exemplo:
org
00H
start
movlw 00000000B
xorlw 11110000B
...
Após haver executado este programa o acumulador W será 11110000B.
35) XORWF f,d ; Efetua o OR exclusivo entre o valor contido em W e o valor contido no
registrador
Descrição: Esta instrução efetua o OR exclusivo(XOR) entre o valor contido no acumulador W
e o valor contido no registrador endereçado pelo parâmetro f.
Exemplo: Efetuar um XOR entre o registrador W e o registrador REG1 por nós definido no
endereço 0CH com a diretiva:
Microcontrolador PIC16F87x
39
REG1 EQU 0CH
podemos utilizar a instrução IORWF de duas formas, dependendo onde queremos colocar o
resultado, ou seja:
xorwf COUNTER,F ;COUNTER = COUNTER XOR W
ou então:
xorwf COUNTER,W ;W = COUNTER XOR W
Microcontrolador PIC16F87x
40
Capítulo VI - AS INTERRUPÇÕES DO PIC16F87X
A interrupção é uma técnica particular do PIC que permite interceptar eventos externos
ao programa em execução, interrompe momentaneamente a operação do programa em
andamento, controla o evento com uma subrotina apropriada e retorna para a execução do
programa.
Fazendo uma analogia, podemos dizer que a interrupção é para o PIC o que para nós
representaria uma chamada telefônica. Para recebermos um telefonema não precisamos nos
preocupar em ficar levantando continuamente o monofone do gancho para ver se tem alguém
querendo falar conosco, mas podemos tranqüilamente aguardar pelo toque da campainha quando
alguém nos chamar. Quando então apenas levantamos o monofone do gancho e interrompemos
momentaneamente o sistema de chamada, respondemos ao telefonema e, uma vez terminada a
conversação, retornamos o monofone ao gancho, ou seja, do ponto onde havíamos interrompido.
•
•
•
•
Transportando o termo deste parágrafo ao PIC veremos que:
O nosso telefone corresponde ao programa em execução;
A chamada de alguém corresponde ao evento de controle;
O monofone corresponde a requisição de interrupção;
A nossa reposta ao telefone corresponde a subrotina de controle da interrupção.
É evidente que assim como é extremamente mais eficaz se ter uma campainha conectada
ao telefone é extremamente mais eficaz controlar nosso evento com uma interrupção ao invés de
diretamente pelo programa.
O PIC16F87x esta preparado para controlar interrupções ao final de 15 eventos
diferentes, vejamos quais são:
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
interrupção externa EM RB0;
interrupção por “overflow” do timer TMR0;
interrupção por “overflow” do timer TMR1;
interrupção por “overflow” do timer TMR2;
interrupção por mudança de nível nos pinos da porta B (pinos RB7 a RB4);
interrupção por escrita completa na EEPROM;
interrupção da porta paralela (PSP);
interrupção dos conversores A/D;
interrupção de recepção da USART;
interrupção de transmissão da USART;
interrupção da comunicação serial (SPI e I2C);
interrupção do CCP1 (Capture/Compare/PWM);
interrupção do CCP2;
interrupção dos comparadores;
interrupção de colisão de dados (Bus Collision).
Microcontrolador PIC16F87x
41
Nesta apostila serão detalhadas as seguintes interrupções:
Interrupção de TIMER 0
Eessa interrupção acontece sempre que um contador de tempo interno, denominado
TMR0 (Timer 0), estoura, ou seja, como ele é um contador de 8 bits, sempre que passar de 0xFF
para 0x00. Ela é utilizada normalmente para a contagem de tempo. Como pode acontecer a
qualquer momento, a contagem de tempo fica precisa, não dependendo de análises constantes
durante o programa para garantir que o tempo seja contado. Como veremos em exemplos, o
TMR0 pode tanto ser incrementado internamente pelo clock da máquina, como também por um
sinal externo. Neste caso, ele passa a ser um contador de pulsos, podendo ser utilizado para
outras finalidades.
Interrupção externa (RB0/INT)
Essa interrupção é gerada por um sinal externo ligado a uma porta específica do PIC, que
no caso é a porta RB0, caso ela esteja configurada como entrada. Desta maneira, podemos
identificar e processar imediatamente um sinal externo. Ela é utilizada para diversas finalidades,
como, por exemplo, a comunicação entre micros, garantindo o sincronismo, o reconhecimento
de botão ou outro sinal do sistema que necessite de uma ação imediata. Essa interrupção
acontece ou na borda de subida ou na borda de descida conforme a configuração da mesma.
Interrupcção por mudança de estado (RB4 a RB7)
Essa interrupção acontece em ambos os casos, na borda de subida ou na borda de
descida, basta haver mudança de estado. Esse tipo de interrupção pode ser utilizado, por
exemplo, para criar um sincronismo com a rede de 60 Hz, para o controle de um triac ou outro
sistema semelhante.
Interrupção de fim de escrita na EEPROM
Essa interrupção serve para detectarmos o final de uma rotina de escrita na EEPROM do
PIC. A utilização da interrupção não é obrigatória para que a escrita funcione, mas como a
EEPROM é lenta na hora de escrever, em alguns sistemas a sua utilização pode ser necessária
para evitar uma parada durante a escrita na EEPROM.
A interrupção de qualquer um destes eventos pode ser conseguida agindo sobre os bits do
registrador INTCON, podemos habilitar ou desabitar esses bits independentemente uns dos
outros. A Figura abaixo mostra os bits do INTCON.
42
Microcontrolador PIC16F87x
Figura 9 – Quatro interrupções do PIC16F87x
Registrador INTCON
GIE
EEIE
T0IE
INTE
RBIE
T0IF
INTF
RBIF
•
INTE (bit 4) se este bit estiver em 1 habilitará a interrupção de troca de estado sobre a
linha RB0
•
T0IE (bit 5) se este bit estiver em 1 habilitará a interrupção de final de contagem do
registrador TMR0
•
RBIE (bit 3) se este bit estiver em 1 habilitará a interrupção de troca de estado sobre uma
das linhas de RB4 a RB7
•
EEIE (bit 6) se este bit estiver em 1 habilitará a interrupção de final de escrita sobre um
endereço da EEPROM
•
GIE (bit 7) bit de habilitação geral de interrupção. Esse bit deve ser setado em 1 antes
dos demais.
Vetor de Interrupção e Controle de Interrupção (Interrupt vector e Interrupt handler),
qualquer que seja o evento habilitado, ao se manifestar, o PIC interrompe a execução do
programa em andamento, memoriza automaticamente no STACK o valor corrente do
PROGRAM COUNTER (PC) e pula para a instrução presente no endereço de memória 0004H
denominada Interrupt vector (vetor de interrupção). Deste ponto em diante devemos colocar a
nossa subrotina de controle denominada Interrupt Handler (controle de interrupção). Pode-se
habilitar mais interrupções e, a primeira providência da interrupt handler é a de verificar qual o
evento habilitado que gerou a interrupção e a execução da parte do programa relativo. Este
controle pode ser efetuado utilizando a Interrupt flag.
Interrupt flag (sinalizador de interrupção), dado que qualquer interrupção gera uma
Microcontrolador PIC16F87x
43
chamada do endereço 04H, no registrador INTCON está presente o flag que indica qual o evento
que gerou a interrupção vejamos:
•
INTF (bit 1), se for 1 é porque a interrupção RB0/INT ocorreu.
•
T0IF (bit 2), se for 1 é porque ocorreu uma interrupção de TMR0.
•
RBIF (bit 0), se for 1 é porque ocorreu uma interrupção de troca de estado de uma das
linhas de RB4 a RB7.
Como se pode ver a interrupção de final de escrita na EEPROM não tem previsto
nenhum flag de sinalização para que a interrupt handler deva considerar que a interrupção é um
estado gerado deste evento quando todos os três flags supra citados irão a 0.
Importante: Uma vez conhecido qual o flag que está ativo, a interrupt handler deve zerálo, ou então não mais gerará interrupção correspondente.
Retorno de uma interrupt handler, quando for gerada uma interrupção o PIC é
desabilitada automaticamente o bit GIE (global Interrupt Enable) do registrador INTCON de
modo a desabilitar todas as interrupções restantes. Para poder retornar ao programa principal e
reinicializar em 1 este bit deve-se utilizar a instrução: RETFIE
Microcontrolador PIC16F87x
44
Capítulo VII - O CONTADOR/TEMPORIZADOR (TMR0)
O registrador TMR0 é um contador, ou seja, um registrador particular, na qual, seu
conteúdo vê-se incrementado com cadência regular e programada ditada pelo hardware do PIC.
Na prática, a diferença de um outro registrador, é que o TMR0 não mantém inalterado o valor
que é memorizado, mas o incrementa continuamente, se, por exemplo, escrevermos nele o valor
10 com a instrução:
movlw 10
movwf TMR0
Após um tempo por quatro ciclos de máquina, o conteúdo do registrador começa a ser
incrementado de +1, ou seja, 11, 12, 13 e assim por diante com a cadência constante e
independente da execução do resto do programa.
Se por exemplo, após ter colocado um valor no registrador TMR0, executarmos um loop
infinito
movlw
movwf
10
TMR0
loop
goto
loop
o registrador TMR0 será incrementado pelo hardware interno do PIC durante a execução do
loop. Uma vez atingido o valor 255 o registrador TMR0 será zerado automaticamente
recomeçando então a contagem, mas não do valor originalmente imposto e sim do zero.
A freqüência é diretamente proporcional a freqüência de clock aplicada ao chip e pode
ser modificada programando-se oportunamente os seus bits de configuração. Na figura seguinte
está representada a cadeia de blocos interno do PIC que determina o funcionamento do
registrador TMR0.
Figura 10 - Funcionamento do registrador TMR0
Microcontrolador PIC16F87x
45
O bloco Fosc/4 e T0CKI representados à esquerda representam as duas possíveis fontes
de sinal para o contador TMR0. Fosc/4 é um sinal gerado internamente no PIC pelo circuito de
clock e é igual a freqüência de clock dividida por quatro. T0CKI é um sinal gerado de um
eventual circuito externo e aplicado ao pino T0CKI correspondente ao pino 3 no PIC 16F87x.
O blocos T0CS e PSA são dois comutadores de sinal na qual estão representando um dos
dois tipos de sinal de entrada com base no valor dos bits TOCS e PSA do registrador OPTION.
O bloco PRESCALER é um divisor programável e que seu funcionamento será explicado
no próximo passo.
Vejamos na prática como é possível agir sobre este bloco para obter diferentes
modalidades de contagem pelo registrador TMR0. Iniciaremos programando o bit T0CS em 0 e
PSA em 1. A configuração de funcionamento que obteremos é a representada na figura abaixo:
Figura 11 - Percurso do sinal usando o clock interno
A parte em vermelho (de cima, a partir de Fosc/4) mostra-nos o percurso que efetua o
sinal antes de chegar ao contador TMR0.
Como já havia dito anteriormente, a freqüência Fosc/4 é igual a um quarto da freqüência
de clock. Utilizando-se um cristal de quartzo de 4Mhz teremos uma freqüência igual a 1 MHz.
Tal freqüência será enviada diretamente ao registrador TMR0 sem nenhuma modificação. A
cadência de contagem que se obtém é então igual a de 1 milhão de incrementos por segundo do
valor presente no TMR0.
Imaginemos agora modificar o registrador de STATUS, o bit T0CS de 0 para 1 a
configuração que obteremos é seguinte:
46
Microcontrolador PIC16F87x
Figura 12 - Percurso do sinal usando clock externo pelo pino T0CKI
Desta vez será o sinal aplicado ao pino TOCKI do PIC a ser enviado diretamente ao
contador TMR0 determinando a freqüência de contagem. Aplicando-se por exemplo a este pino
uma freqüência par de 100Hz obteremos uma de contagem igual a cem incrementos por
segundo.
A presença da porta lógica XOR (exclusive OR) na entrada TOCKI do PIC permite
determinar o caminho do bit TOSE do registrador OPTION se o contador TMR0 deve ser
incrementado na descida do pulso (TOSE=1) ou na subida do pulso (TOSE=0) do sinal externo
aplicado.
Na figura seguinte está representada a correspondência entre a cadência do sinal externo
e o valor que assume o contador TMR0 :
Figura 13 - Cadência do sinal externo
O último bloco a ser analisado para poder utilizar complemente o registrador TMR0 é o
PRESCALER. Se configurar-mos o bit PSA do registrador OPTION em 0 enviamos ao
registrador TMR0 o sinal de saída do PRESCALER como é visível na figura abaixo:
47
Microcontrolador PIC16F87x
Figura 14 - O PRESCALER como divisor
O PRESCALER consiste na prática de um divisor programável de 8 bits utilizado no
caso pela freqüência de contagem enviada ao contador TMR0 que é demasiada alta para nossos
propósitos. No exemplo descrito na lição anterior haviamos visto que utilizando um cristal de
4Mhz era obtido uma freqüência de contagem igual a 1 Mhz que para muitas aplicações poderá
ser muito elevada. Com o uso do PRESCALER podemos dividir interiormente a freqüência
Fosc/4 configurando os bits PS0, PS1, PS2 do registrador OPTION segundo a tabela abaixo:
PS2
PS1
PS0
Divisor
Freqüência de saída do prescaler (Hz) p/ cristal de 4 MHz
0
0
0
2
500.000 = 4MHz/(4 * 2)
0
0
1
4
250.000 = 4MHz/(4 * 4)
0
1
0
8
125.000 = 4MHz/(4 * 8)
0
1
1
16
62.500 = 4MHz/(4 * 16)
1
0
0
32
31.250 = 4MHz/(4 * 32)
1
0
1
64
15.625 = 4MHz/(4 * 64)
1
1
0
128
7.813 = 4MHz/(4 * 128)
1
1
1
256
3.906 = 4MHz/(4 * 256)
Microcontrolador PIC16F87x
48
Capítulo VIII – MODO POWER DOWN, MODO SLEEP E O WDT
O modo Power Down/Sleep é um estado particular de funcionamento do PIC utilizado
para reduzir o consumo de corrente no momento em que o PIC não é utilizado. Se pegarmos
como exemplo um controle remoto para TV veremos que na maior parte do tempo o PIC
permanece aguardando que alguém pressione uma tecla. Apenas quando à pressionamos, o PIC
efetua uma breve transmissão e se coloca de novo a espera de um novo pressionar de tecla. O
tempo de utilização efetivo da CPU do PIC é então limitado a poucos milisegundos necessário
para efetuar a transmissão. Para evitar o consumo inútil frente a limitada energia da bateria é
possível desligar boa parte do circuito de funcionamento do PIC e reativá-lo somente quando um
evento externo ocorrer.
Para entrar no modo Power Down, basta executar a instrução sleep, nesse modo, como o
próprio nome diz, o microcontrolador é colocado para “dormir” e reduzir consequentemente a
corrente absorvida que passará de cerca de 2mA (a 5 volts com clock de 4Mhz) para cerca dos
2uA, ou seja 1000 vezes menos.
Quando entramos neste modo, o oscilador é imediatamente paralisado, e com ele todo o
processamento. O estado das portas é mantido, isto é, aquelas que eram entradas continuam
como entradas, assim como o nível lógico das portas que eram saídas. No entanto, como o
objetivo normalmente é economizar energia, o estado das portas deve ser minuciosamente
checado e acertado antes de entrarmos neste modo. Configurar as portas para entrada, quando
possível, resulta em maior economia de energia.
Para despertar o PIC do seu sono, podemos utilizar três maneiras possíveis:
1. Por meio de um reset externo, colocando em 0 o pino /MCLR (pino 4).
2. Por um estouro de WDT, no caso de ele estar habitado.
3. Por meio de um interrupção externa RB0/INT, ou por mudança de estado na porta B
(RB4, RB5, RB6 e RB7) ou no término da operação de escrita na EEPROM.
No primeiro caso, o PIC será resetado e a execução começará da posição 00h. No
segundo caso o programa continuará a ser executado na linha seguinte à instrução SLEEP. E no
terceiro caso, o PIC se comporta como no atendimento de uma interrupção, o programa irá para
a rotina de interrupção e então retornará para execução após a instrução SLEEP.
O WACHTDOG TIMER (WDT)
O Wachtdog Timer é na prática um contador automático incrementado por meio de um
oscilador interno do PIC, mas complemente independente do resto do circuito. Com o prescaler
de 1:1, o seu tempo de estouro, ou seja, 256 incrementos, é equivalente a 18 ms. O prescaler é
utilizado para aumentarmos este tempo. Caso o WDT estoure, um reset do sistema irá ocorrer
imediatamente. Para evitar o reset automático deve-se utilizar a instrução CLRWDT em algum
trecho do programa para zerar o prescaler e assim não permitindo o mesmo, terminar sua
contagem. Se a CPU não executa esta instrução antes de terminar a contagem será entendido
49
Microcontrolador PIC16F87x
como um bloqueio de programa por motivo qualquer, e será efetuado o reset da CPU.
O período mínimo para que a CPU seja resetada é de cerca de 18ms (isso dependerá da
temperatura e da tensão de alimentação). Porem é possível programar o PRESCALER para
Wachtdog Timer para obter um tempo de retardo maior com cerca de 2 a 3 segundos.
Para configurar o Wachtdog Timer devemos habilitar na fase de programação o bit
WDTE do byte de configuração (no __CONFIG, início do programa) .
Para ajustar o PRESCALER ao WDT, devemos agir sobre o bit PSA do registrador
OPTION_REG. O bit PSA deverá setado em 1 com a instrução:
BSF OPTION_REG,PSA
Caso contrário o prescaler estará ligado ao TIMER 0. Obviamente ajustando o prescaler
ao WTD não será possível ajustá-lo para TIMER 0 e vice-versa.
Intervindo sobre o valor do bit PS0, PS1 e PS2 do mesmo registrador OPTION_REG
podemos obter diversos intervalos de retardo. A habilitação correta deverá ser feita tendo em
conta o máximo retardo que podemos obter dentro do nosso programa entre a execução de duas
instruções CLRWD sucessivas.
Na tabela seguinte está representada a correspondência entre os valores destes bit's e
os intervalos que obteremos.
PS2
PS1
PS0
Divisor
Período de retardo do WDT
0
0
0
1
18ms
0
0
1
2
36ms
0
1
0
4
72ms
0
1
1
8
144ms
1
0
0
16
288ms
1
0
1
32
576ms
1
1
0
64
1.152s
1
1
1
128
2.304s
50
Microcontrolador PIC16F87x
Capítulo IX - Escrita e Leitura na EEPROM do PIC16F87X
A memória EEPROM do PIC16F87x pode armazenar até 256 bytes de dados, endereços
de 00h a FFh. Os registradores de controle, de dado e de endereço da EEPROM para esse PIC
são os seguintes:
1. EECOM1: registrador de controle, veja definição dos bits no Capítulo IV.
2. EECOM1: registrador não implementado fisicamente, ele é usado exclusivamente em uma
escrita sequencial de dados na EEPROM.
3. EEDATA: registrador de dados.
4. EEADR: registrador de endereços.
Passos que deverão ser seguidos para a leitura de dados na EEPROM:
1. Escrever o endereço no registrador EEADR;
2. Colocar em nível alto o bit de controle RD (EECON1<0>);
3. O dado é colocado na registrador EEDATA e está pronto para ser pego no próximo
ciclo de máquina. EEDATA segurará o valor até que uma outra leitura seja ativada ou
até que seja escrita em EEDATA um outro valor diferente.
Exemplo:
bcf
STATUS,RP0
; Vai para o banco 0
movf
movwf
bsf
bsf
bcf
movf
Endereco,W
EEADR
STATUS,RP0
EECON1,RD
STATUS,RP0
EEDATA,W
; W = Endereço onde vai ser armazenado o dado
; Escrita do endereço em EEADR
; Vai para o banco 1
; Habilita a leitura
; Vai para o banco 0
; Armazena o dado em W (W=EEDATA)
Passos que deverão ser seguidos para a escrita de dados na EEPROM:
Escrever o endereço no registrador EEADR;
Escrever o dado no registrador EEDATA;
Programar sequência de controle para habilitar a escrita;
Colocar em nível alto o bit de controle WR (EECON1<1>) para iniciar a escrita.
Obs.: Tipicamente uma operação de escrita demora 10 ms.
1.
2.
3.
4.
Exemplo: bcf
movf
movwf
movf
STATUS,RP0 ; Vai para o banco 0
Endereço,W
; W = Endereço onde vai ser armazenado o dado
EEADR
; Escrita do endereço em EEADR
Dado,W
; W = Dado que será armazenado na EEPROM
Microcontrolador PIC16F87x
51
movwf EEDATA
; Escrita do dado em EEDATA
bsf
STATUS,RP0 ; Vai para o banco 1
;programação da seqüência de controle
bsf
EECOM1,WREN
movlw 55h
; W = 55h
movwf EECON2
movlw 0Aah
; W = AAh
movwf EECON2
; Escrita do dado em EEDATA
; fim da programação da seqüência de controle
bsf
EECON1,WR ; Habilita a escrita
bcf
STATUS,RP0 ; Retorna ao banco 0
Obs.: Para economizar energia, recomenda-se colocar os bits 6 e 7 de EEADR (EEADR<7:6>)
desligados (“clear”). Com eles “setados” o consumo é cerca de 400 µA, já com eles “clear” o
consumo é cerca de 150 µA.
Microcontrolador PIC16F87x
52
BIBLIOGRAFIA
1. Souza, David José de, Desbravando o PIC, Baseado no Microcontrolador PIC16F628;
Editora Érica, 2a edição, 2000.
2. PIC16/17 MICROCONTROLLER DATA BOOK, Microchip, 1996/1997.
3. Sites: www.microchip.com
4. http://www2.ele.ufes.br/~hans/pic/index.html,
Apêndice A - INTRODUÇÃO AO MPLAB
O MPLAB é um ambiente integrado para o estudo e desenvolvimento com a família PIC de
microcontroladores. 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. Neste
ambiente, além da edição de código-fonte, podemos também compilar programas e corrigir seus erros, caso
existam. Outra ferramenta importante é a simulação do programa, que pode ser realizada passo-a-passo para
verificarmos se o trabalho têm erros de lógica.
A Figura 1 mostra a janela principal do MPLAB onde temos um menu principal, uma barra de
ferramentas com vários ícones e uma janela do gerenciador de projeto e janela de mensagens de saída.
Barra de Ferramentas
Menu Principal
Janela de mensagens de saída
Janela do
gerenciador
Figura 1 – Tela principal do MPLAB
Para se escrever um programa no MPLAB, precisamos antes assimilar o conceito de “projeto”.
Microcontrolador PIC16F87x
54
O “Projeto” no MpLab
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.MCP temos duas janelas abertas: a janela do gerenciador de projeto
e o código-fonte exemplo.asm. Em outro projeto podemos ter outros arquivos sendo
simulados o que caracteriza outro projeto. 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.
Para a montagem de um projeto vamos supor que foi desenvolvido o programa para
controlar 8 leds dispostos no PORTB do PICF628 ou PIC16F87x. Gravamos este programa
na pasta PIC com o nome de SEQLEDS.ASM. A listagem deste programa para o
PIC16F628 encontra-se em anexo.
CRIAÇÃO DO PROJETO - PRIMEIRO PASSO
Uma vez que você abriu o MPLAB a primeira coisa a se fazer é criar um projeto ou
abrir um projeto criado anteriormente. O projeto que vamos criar terá o nome de
LED.MCP. É importante ressaltar que o projeto e o código-fonte SEQLEDS.ASM têm
que ser salvos na mesma pasta.
No menu principal, na opção Project o MPLAB possui o Project Wizard que nos
facilita o trabalho de criação do projeto. A Figura 2 mostra a janela inicial do Project
Wizard.
55
Microcontrolador PIC16F87x
Figura 2 – Project Wizard
Click em avançar para executarmos a próxima etapa.
A seguir, precisamos definir com qual microcontrolador vamos trabalhar. Neste
exemplo será selecionado o PIC16F628. A Figura 3 detalha este passo no MPLAB.
56
Microcontrolador PIC16F87x
Figura 3 – Seleção do microcontrolador.
CRIAÇÃO DO PROJETO - SEGUNDO PASSO
Os programadores de micorcontrolador usam basicamente dois tipos de código-fonte: ASSEMBLY
e LINGUAGEM C.
O código Assembly, que utilizamos neste curso, usa mnemônicos para trabalhar cada operação
(instrução). As instruções atuam nos bits e bytes dos registradores internos do PIC.
Já a linguagem C, tem prontos comandos que realizam, muitas vezes, mais de uma
instrução assembly.
A vantagem de usar Assembly é que a arquitetura interna do microcontrolador
estudado fica muito clara, além do desenvolvimento de programas menores e mais rápidos.
57
Microcontrolador PIC16F87x
A linguagem C traz a vantagem da rapidez no desenvolvimento dos programas.
A Figura 4 mostra a próxima janela do Project Wizard. Nesta etapa, selecionamos o
compilador que iremos trabalhar e verificamos o local onde o mesmo está gravado. Para
trabalharmos com a programação Assembly, selecionaremos a opção MPASM, como
mostra a figura. Em Active ToolSuite estão as outras opções de compiladores.
Figura 4 – Escolha do compilador.
58
Microcontrolador PIC16F87x
CRIAÇÃO DO PROJETO - TERCEIRO PASSO
Nessa etapa, definiremos o nome do projeto e o local de gravação dos arquivos do
mesmo. O projeto e o codigo-fonte têm que ser salvos na mesma pasta. A Figura 5 mostra a
janela que controla esta etapa.
CRIAÇÃO DO PROJETO - QUARTO PASSO
Agora transferiremos o código-fonte Assembly (ASM) para o projeto como
mostrado na Figura 6. O arquivo que vamos trabalhar é o SEQLEDS.ASM.
Figura 5- Nome e local do proejto.
59
Microcontrolador PIC16F87x
Figura 6 – Código-fonte do projeto.
Na última janela, temos um resumo do projeto como mostra a Figura 7.
60
Microcontrolador PIC16F87x
Figura 7- Conclusão da montagem do projeto.
Compilando o Projeto
Compilar é transformar o código-fonte em linguagem de máquina para o
microcontrolador poder executar. A ferramenta Assembler é que realiza essa tarefa, mas
continuaremos a utilizar a palavras compilação e copilar para nos referir a isso.
Para compilarmos o código-fonte SEQLEDS.ASM, presente no projeto LED.MCP,
basta irmos ao menu principal, selecionarmos a opção Project e depois Build All. Podemos
também pressionarmos simultaneamente as teclas <CTRL> e <F10>. Com uma dessas
ações, aparece na janela de mensagens do MPLAB informações sobra a compilação
executada. Se algum erro foi detectado aparecerá mensagem de erro. Clicando em cima da
mensagem o MPLAB leva ao erro no códifo-fonte. Se nenhum erro foi detectado pelo
compilador aparecerá a mensagem:
BUILD SUCCEEDED
61
Microcontrolador PIC16F87x
A Figura 8 mostra as janelas e mensagens do processo de compilação.
Figura 8 – Processo de compilação.
Executando o programa passo-a-passo
Para podermos executar o programa passo-a-passo para eliminarmos os erros de
lógica que por ventura possam existir teremos que sair do modo de compilação para o
modo SIMULAÇÃO.
Para isso vamos clicar na opção Debugger (menu principal), depois Select Tools e
3-MPLAB SIM. A Figura 9 mostra estes passos em detalhes. Quando o modo de simulação
estiver escolhido várias ferramentas novas aparecem na opção Debugger. Uma dessa
62
Microcontrolador PIC16F87x
opções é Step InTo (execução passo-a-passo). A tecla <F7> também realiza essa tarefa.
A Figura 10 mostra a como é realizada a execução passo-a-passo.
Figura 9 – Seleção do modo Simulação.
63
Microcontrolador PIC16F87x
Figura 10 – Execução passo-a-passo.
Acompanhando o valor registradores
Podemos acompanhar o valor dos registradores que fazem parte da arquitetura
interna do PIC de duas formas:
1) Janela com todos os registradores: esta opção pode ser verificada na Figura 11.
2) Janela com registradores escolhidos pelo usuário: esta opção pode ser verificada
na Figura 12. A tecla ADD SFR faz a adição de registradores à janela de
observação.
64
Microcontrolador PIC16F87x
Figura 11 – Registradores de Funções Especiais.
Figura 12 – Janela de observação de registradores.
Alterando valor de bit de entrada
Como sabemos os pinos que compõem as portas de entrada/saída dos
65
Microcontrolador PIC16F87x
microcontroladores PIC podem ser configurados como entrada ou saída. Quando
configuramos algum pino como entrada e necessitamos simular o programa com essa
configuração, temos a necessidade de alterar, de maneira assíncrona, o valor (nível alto
para baixo ou vice-versa) desse pino.
A Figura 13 mostra como abrir o Modo de Estímulos do PIC. Basta clicar em
Debugger e depois Stimulus Controller.
Figura 13 – Controle de Estímulos Externos.
Figura 14 – Janela de Estímulos Externos.
66
Microcontrolador PIC16F87x
A Figura 14 mostra a janela que faz o controle dos estímulos externos. Para
acrescentar um pino que foi previamente configurado como entrada, basta clicar em Add
Row e configurar de acordo com a necessidade as colunas Pin e Action. A tecla Fire
habilita o estimulo externo.
Gravando um programa no microcontrolador
Inicialmente é necessário definir o programador e habilitá-lo. É necessário que o
programador esteja conectado à porta serial do PC com o microcontrolador instalado.
A Figura 15 mostra a opção Programmer Æ PicStart Plus no menu principal de
MPLAB.
Figura 15 – Definindo o programador.
Depois do passo anterior basta acionar a opção Program no mesmo caminho
apontado pela figura anterior.
Apêndice B – DETALHES DOS PORTs
Vamos ver agora explicações mais detalhadas sobre as portas de entrada e saída e os
respectivos registradores de direção de dados: PORTA, PORTB, TRISA e TRISB.
Iniciaremos com o grupo RA0, RA1, RA2 e RA3 na qual representamos, na figura
seguinte, o esquema do estado de escrita extraído do data sheet da Microchip
(www.microchip.com):
Figura 3 - Diagrama de blocos dos pinos RA3:RA0
Como dito acima, a configuração de uma linha como entrada ou saída depende do estado
do bit no registrador TRIS (TRISA para o PORTA e TRISB para o PORTB).
Pegaremos como exemplo a linha RA0 e analisaremos o funcionamento do estado de
saída seja quando a mesma funciona como entrada ou como saída.
Funcionamento como entrada
Para configurar a linha RA0 como entrada, devemos colocar em 1 o bit 0 do registrador
Microcontrolador PIC16F87x
68
TRISA com a instrução:
bsf
TRISA,0
Esta instrução determinará uma comutação a 1 do estado lógico do flip-flop do D-latch
indicado no bloco com o nome TRIS latch. Para outra linha de I/O existe um destes flip-flop e o
estado lógico em que se trava depende estritamente do estado lógico do relativo bit no
registrador TRIS (ou melhor dizendo, todos os bit's do registrador TRIS é fisicamente
implementado com um TRIS latch).
A saída Q do TRIS latch é conectada a entrada de uma porta lógica do tipo OR. Isto
significa que, independente do valor presente a outra entrada, a saída da porta OR estará sempre
em 1 enquanto uma de suas entradas valer 1 (veja na tabela verdade). E nesta condição o
transistor P não conduz e mantém a linha RA0 desconectada do positivo da alimentação.
Do mesmo modo a saída negativa Q do TRIS latch é conectada a entrada de uma porta
AND onde a saída desta estará sempre em 0 enquanto uma de suas entradas valer 0 (veja tabela
verdade). E nesta condição em que o transistor N não conduz mantendo a linha RA0
desconectada da massa. O estado lógico da linha RA0 dependerá exclusivamente do circuito
externo a que o conectarmos.
Aplicando 0 ou 5 volts ao pino RA0, será possível lermos o estado presente no circuito
externo a entrada do bloco representado por TTl input buffer e do latch de entrada.
Funcionamento como saída
Para configurar a linha de RA0 como saída, devemos colocar em 0 o bit 0 do registrador
TRISA com a instrução: bcf TRISA,0
Esta determina a comutação para 0 da saída Q do TRIS latch ( e para 1 a saída Q
negativa). E neste estado o valor da saída da porta OR e AND depende exclusivamente do estado
de saída do Q negativo do Data Latch. Como para o TRIS latch, em que o Data Latch depende
do estado de um bit em um registrador, particularmente do registrador PORTA. A sua saída
negativa será enviada para entrada das duas portas lógicas OR e AND e que estão diretamente
sobre a base do transistor P e N.
Se colocarmos em 0 o bit 0 do registrador PORTA com a instrução:
PORTA,0
bcf
obtermos a condução do transistor N e portanto irá a 0 a linha RA0. Se ao invés colocarmos em
1 o bit 0 com a instrução:
bsf
PORTA,0
obteremos a condução do transistor P e portanto irá a +5 volts a linha RA0. Nesta condição será
sempre possível rever o valor enviado sobre a linha através do circuito de entrada.
Estado de saída da linha RA4
Analisaremos agora o funcionamento do estado de saída da linha RA4 que é diferente de
todas as outras linhas de I/O enquanto compartilha o mesmo pino do PIC16c84 com o TOCKI o
qual iremos analisar no próximo passo.
Na figura seguinte está descrito o esquema de blocos do estado de saída extraído do data
sheet Microchip:
69
Microcontrolador PIC16F87x
Figura 4 - Diagrama de blocos do pino RA4
A lógica de comutação é substancialmente idêntica ao grupo das linha RA0 a 3 com
exceção da ausência da porta OR e do transistor P, ou seja de todos os circuitos que permitem a
ligação ao positivo, da linha RA4. Isto significa em termos práticos, que quando a linha RA4
está programada em saída poderá assumir um nível que dependerá do circuito externo pois na
realidade não está conectada ao positivo e sim desconectada. Este tipo de circuito de saída
chama-se "coletor aberto" e é útil para aplicações em que é necessário compartilhar uma mesma
ligação com mais pinos de saída ou que se tenha a necessidade de colocar em alta impedância
uma linha de saída e podendo assim reprogramá-la como linha de entrada.
Se quisermos tornar seguro que a linha RA4 vá a 1 devemos conectar externamente um
resistor de pull-up, ou seja um resistor conectado ao positivo da alimentação.
Veremos em seguida a utilização da linha indicada no esquema acima TMR0 clock input.
Estado de saída das linhas RB0, RB1, RB2 e RB3
Onde que para este grupo de linhas permanece substancialmente invariada a lógica de
comutação. Estas dispõe de um circuito a mais, o weak pull-up ativável quando a linha for
programada como entrada.
A entrada de fato, como explicado anteriormente, a linha vem completamente desligada
do PIC. O estado da linha depende então exclusivamente do circuito externo. Se o circuito é do
tipo de coletor aberto ou simplesmente é constituído de uma simples chave que, quando
pressionada, conecta a massa a linha de I\O, é necessário inserir um resistor de pull-up vinda do
positivo para tornar seguro quando a chave for solta o nível voltar a uma condição lógica 1
estável sobre a linha de entrada. O circuito de weak pull-up permite evitar o uso do resistor de
pull-up e é possível de ser ativado agindo sobre o bit RBPU do registrador OPTION.
Na figura seguinte esta representado o esquema de blocos do estado de saída extraído do
Microcontrolador PIC16F87x
70
data sheet da Microchip:
Figura 5 - Diagrama de blocos dos pinos RB3:RB0
Além disso a linha RB0 sozinha, apresenta uma característica muito particular. Esta,
quando for configurada como linha de entrada, pode gerar, em correspondência a uma troca de
estado lógico, uma interrupt, ou seja uma interrupção imediata do programa em execução e uma
chamada a uma subrotina especial denominada interrupt handler. Mas falaremos disso em
seguida.
Estado de saída das linhas RB4, RB5, RB6 e RB7
O circuito de comutação deste grupo de linhas é idêntico ao grupo RB0 a 3. Esta linha
dispõe também de um circuito de weak pull-up. E mais, com respeito a linha RB0 - 3 tem a
vantagem de poder revelar variações de estado sobre qualquer linha e gerar uma interrupção da
qual falaremos no capítulo sobre interrupções.
Na figura seguinte está reproduzido o esquema de blocos do estado de saída extraído do
data sheet Microhip.
Microcontrolador PIC16F87x
Figura 6 - Diagrama de blocos dos pinos RB7:RB4
71
Microcontrolador PIC16F87x
72
Apêndice C - KIT DIDÁTICO PARA PIC16F87x
O kit didático apresentado tem a função de ensinar programar o PIC através de
dispositivos lógicos como:
•
LED (diodo emissor de luz);
•
Teclado push-boton;
•
Teclado matricial (telefônico);
•
Display de 7 segmentos;
•
Display de Cristal Líquido;
•
Controle de relês;
•
Comunicação serial USART;
•
Conversor A/D;
•
PWM;
•
Projeto de frequencímetro.
Na figura dada abaixo mostra-se a interligação do PIC16F87x com esses dispositivos.
73
Microcontrolador PIC16F87x
TECLADO
MATRICIAL
L1
1
2
3
4
5
6
7
8
9
*
0
#
L2
L3
Vcc
L4
10KΩ
C1
MCLR
1 MCLR
RB7 40
2 RA0
RB6 39
3 RA1
RB5 38
4 RA2
RB4 37
RELÊ 1
5 RA3
RB3 36
RELÊ 2
6 RA4
RB2
35
RELÊ 3
7 RA5
RB1
34
8 RE0
RB0
33
ENT. AN. 1
ENT. AN. 2
ENTRADAS
ANALÓGICAS
ENT. AN. 3
9 RE1
10 RE2
PIC16F87X
C3
C2
PUSH-BOTON
INTERRUPÇÃO EXTERNA
32
VCC
31
GND
Buzzer
VCC
11
RD7 30
GND
12
RD6 29
13
RD5 28
14
RD4 27
15 RC0
RC7 26
16 RC1
RC6
17 RC2
RC5 24
E
18 RC3
RC4 23
RS
19 RD0
RD3 22
20 RD1
RD2 21
470Ω
470Ω
ULN2803
LEDS
4MHz
4511
470Ω
RX
COM. SERIAL
TX
25
BCD/7SEG
DISPLAYs 7 SEG
RS
10KΩ
V0
Vcc
E
R/W
4
5
6
B4
B0
B1
B2
B3
7
8
9
10
11
B5
12
3
2
1
DISPLAY DE CRISTAL LÍQUIDO - LCD
B6
13
B7
14
74
Microcontrolador PIC16F87x
Apêndice D – Display de Cristal Líquido - LCD
Adaptado de apostila dos Professores:
Ilton L. Barbacena
Claudio Afonso Fleury
1. INTRODUÇÃO
Os módulos LCD são interfaces de saída muito útil em sistemas microprocessados. Estes
módulos podem ser gráficos e a caracter. Os módulos LCD gráficos são encontrados com
resuluções de 122x32, 128x64, 240x64 e 240x128 dots pixel, e geralmente estão disponíveis
com 20 pinos para conexão. Os LCD comuns (tipo caracter) são especificados em número de
linhas por colunas e são encontrados nas configurações previstas na Tabela 1.
Tabela 1 - Módulos LCD disponíveis
Número de
Colunas
Número de
Linhas
Quantidade de
pinos
8
2
14
12
2
14/15
16
1
14/16
16
2
14/16
16
4
14/16
20
1
14/16
20
2
14/16
20
4
14/16
24
2
14/16
24
4
14/16
40
2
16
40
4
16
75
Microcontrolador PIC16F87x
Os módulos podem ser encontrados com LED backlight (com uma iluminação de fundo)
para facilitar as leituras durante a noite. Neste caso, a alimentação deste led faz-se normalmente
pelos pinos 15 e 16 para os módulos comuns e 19 e 20 para os módulos gráficos, sendo os pinos
15 e 19 para ligação ao anodo e os pinos 16 e 20 para o catodo. A corrente de alimentação deste
led varia de 100 a 200mA, dependendo do modelo.
Estes módulos utilizam um controlador próprio, permitindo sua interligação com com
outras placas através de seus pinos, onde deve ser alimentado o módulo e interligado o
barramento de dados e controle do módulo com a placa do usuário. Naturalmente que além de
alimentar e conectar os pinos do módulo com a placa do usuário deverá haver um protocolo de
comunicação entre as partes, que envolve o envio de bytes de instruções e bytes de dados pelo
sistema do usuário.
A Tabela 2 descreve cada pino do módulo ou do display para conexão deste a outras
placas:
Tabela 2 - Pinagem dos Módulos LCD
Pino
Função
Descrição
1
Alimentação
Terra ou GND
2
Alimentação
VCC ou +5V
3
V0
Tensão para ajuste de contraste (ver Figura 1)
4
RS
5
R/W Seleção:
1 - Leitura, 0 - Escrita
6
E
1 ou (1 → 0) - Habilita, 0 - Desabilitado
7
B0
8
B1
9
B2
Barramento
10
B3
de
11
B4
Dados
12
B5
13
B6
14
B7
15
A (qdo existir)
Anodo p/ LED backlight
16
K (qdo existir)
Catodo p/ LED backlight
Seleção:
Chip select
1 - Dado, 0 - Instrução
LSB
MSB
Microcontrolador PIC16F87x
76
Assim como em um rádio-relógio todo módulo LCD permite um ajuste na intensidade da
luz emitida ou ajuste de contraste, isto é possível variando-se a tensão no pino 3. A Figura 1
mostra um circuito típico e recomendado pela maioria dos fabricantes para efetuar este ajuste.
Alguns fabricantes recomenda o uso de um resistor de 4K7 em série com o potenciômetro de
10K.
Figura 1 - Detalhe do controle de contraste do módulo LCD
2. PROGRAMAÇÃO / INSTRUÇÕES
A Tabela 3 traz um resumo das instruções mais usadas na comunicação com os
módulos LCD.
77
Microcontrolador PIC16F87x
Tabela 3 - Instruções mais comuns
DESCRIÇÃO
MODO
RS
R/W
Código
(Hexa)
Display
Liga (sem cursor)
0
0
0C
Desliga
0
0
0A / 08
0
0
01
Liga
0
0
0E
Desliga
0
0
0C
Desloca para Esquerda
0
0
10
Desloca para Direita
0
0
14
Cursor Home
0
0
02
Cursor Piscante
0
0
0D
Cursor com Alternância
0
0
0F
Sentido de deslocamento do
Para a esquerda
0
0
04
cursor ao entrar com caracter
Para a direita
0
0
06
Deslocamento da mensagem
Para a esquerda
0
0
07
ao entrar com caracter
Para a direita
0
0
05
Deslocamento da mensagem
Para a esquerda
0
0
18
sem entrada de caracter
Para a direita
0
0
1C
End. da primeira posição
primeira linha
0
0
80
segunda linha
0
0
C0
Limpa Display com
Home cursor
Controle do Cursor
78
Microcontrolador PIC16F87x
2.1- DESCRIÇÃO DETALHADA DAS INSTRUÇÕES
2.1.1
Limpa Display
RS
CÓDIGO
0
R/W
0
B7
B6
B5
B4
B3
B2
B1
B0
0
0
0
0
0
0
0
1
MSB
LSB
Esta instrução escreve o caracter ASCII 32 que corresponde ao branco ou barra de espaço
em todos os endereços da DDRAM apagando a mensagem que estiver escrita. O cursor
retorna ao endereço “zero”, ou seja, à posição mais a esquerda da primeira linha.
2.1.2 - Cursor Home
RS
CÓDIGO
0
R/W
0
B7
B6
B5
B4
B3
B2
B1
B0
0
0
0
0
0
0
1
*
MSB
LSB
Faz retornar o cursor para a posição mais a esquerda da primeira linha e faz voltar à
posição original mensagens previamente deslocadas. O conteúdo da DDRAM permanece
inalterado.
2.1.3 - Fixa o modo de operação
RS
CÓDIGO
0
R/W
0
B7
B6
B5
B4
B3
B2
B1
B0
0
0
0
0
0
1
X
S
MSB
LSB
Esta instrução tem efeito somente durante a leitura ou escrita de dados, portanto, deve ser
ativada na inicialização.
-Estabelece o sentido de deslocamento do cursor (X=0 p/ esquerda, X=1 p/
direita)
79
Microcontrolador PIC16F87x
-Estabelece se a mensagem deve ou não ser deslocada com a entrada de um novo
caracter
S=1 SIM, S=0 NÃO. Exemplo: X=1 e S=1 => mensagem desloca p/ direita.
2.1.4 - Controle do Display
RS
CÓDIGO
0
R/W
0
B7
B6
B5
B4
B3
B2
B1
B0
0
0
0
0
0
D
C
B
MSB
LSB
A mensagem fica aparente quando D=1 e desaparece quando D=0, porém o conteúdo da
DDRAM fica inalterado. O cursor fica aparente quando C=1 e desaparece quando C=0,
porém as propriedades de escritas vigentes permanecem inalteradas. O cursor quando
aparente liga a última linha que compõem o caracter, exceto quando B=1, que apresenta
em alternância com uma matriz com todos os pontos negros em intervalos de 0,4
segundos. Quando B=1 e C=0, obteremos a ativação intermitente de uma matriz
completa (todos os pontos da matriz).
2.1.5 - Deslocamento do Cursor ou da Mensagem
RS
CÓDIGO
0
R/W
0
B7
B6
B5
B4
B3
B2
B1
B0
0
0
0
1
C
R
*
*
MSB
LSB
Desloca o cursor ou a mensagem sem que para isso tenha que escrever ou ler dados do
display. Utilizado para posicionamento dos dados no display.
C
R
FUNÇÃO
0
0
Desloca o cursor para a esquerda e decrementa o contador de endereço.
0
1
Desloca o cursor para a direita e incrementa o contador de endereço.
1
0
Desloca a mensagem e o cursor para a esquerda.
1
1
Desloca a mensagem e o cursor para a direita
2.1.6 - Estabelece o modo de utilização do Módulo LCD
80
Microcontrolador PIC16F87x
RS
CÓDIGO
0
R/W
0
B7
B6
B5
B4
B3
B2
B1
B0
0
0
1
Y
N
F
*
*
MSB
LSB
Y estabelece o modo de comunicação. Se Y=1 estabelece 8 bits e quando Y=0 será 4 bits,
enviados em duas operações, com os 4 bits (Nible) mais significativos sendo enviados
primeiro. N fixa o número de linhas: N=0 para uma linha e N=1 para duas ou mais
linhas. F fixa o tipo da matriz: F=0 para matriz 7x5 ou 8x5 e F=1 para matriz 10x5
(somente possível quando apresentando em uma linha).
2.1.7 - Endereçamento da CGRAM
CGRAM é uma região da memória RAM destinada para criação de caracteres especiais,
como por exemplo: ç, é, Ê, etc.
RS
CÓDIGO
0
R/W
0
B7
B6
B5
B4
B3
B2
B1
B0
0
1
A
A
A
A
A
A
MSB
LSB
Estabelece o endereço da CGRAM no contador de endereços (AC) como um número
binário AAAAAA e após isto os dados serão escritos ou lidos pela CPU neste endereço.
Cada caracter especial ocupa 8 endereços na CGRAM.
2.1.8 - Endereçamento da DDRAM
RS
CÓDIGO
0
R/W
0
B7
B6
B5
B4
B3
B2
B1
B0
1
A
A
A
A
A
A
A
MSB
LSB
Estabelece o endereço da DDRAM no contador de endereços (AC) como um número
binário AAAAAAA e após isto os dados serão escritos ou lidos pela CPU neste
endereço. Para os display de uma linha AAAAAAA varia de 80H a CFH. Já para todos
os display de duas linhas varia de 80H a A7H para a primeira linha e de C0H a E7H para
81
Microcontrolador PIC16F87x
a segunda linha.
2.1.9 - Busy Flag (BF)
RS
CÓDIGO
0
R/W
1
B7
B6
B5
B4
B3
B2
B1
B0
BF
A
A
A
A
A
A
A
MSB
LSB
Busy Flag ou o bit 7 indica ao sistema onde está conectado o módulo LCD, se o
controlador do módulo está ocupado com alguma operação interna (BF=1), e neste caso,
não aceita nenhuma instrução até que BF volte para 0.
Além disso, permite a leitura do conteúdo do contador de endereços (AC) expressa por
AAAAAAA. O contador de endereços pode conter tanto endereço da CGRAM como da
DDRAM, depende neste caso, da instrução anterior.
2.1.10 - Escrita de dados na DDRAM ou CGRAM
RS
CÓDIGO
1
R/W
0
B7
B6
B5
B4
B3
B2
B1
B0
A
A
A
A
A
A
A
A
MSB
LSB
Escreve o byte AAAAAAAA tanto na CGRAM como na DDRAM, dependendo da
instrução anterior (que define o endereço). Após a escrita, o endereço é automaticamente
incrementado ou decrementado de uma unidade dependendo do modo escolhido (ver
item 3.1.3).
2.1.11 - Leitura de dados na DDRAM ou CGRAM
82
Microcontrolador PIC16F87x
RS
CÓDIGO
1
R/W
1
B7
B6
B5
B4
B3
B2
B1
B0
A
A
A
A
A
A
A
A
MSB
LSB
Faz uma leitura na CGRAM ou na DDRAM, dependendo da instrução anterior (que
define o endereço). É importante que precedendo a esta leitura seja executado a instrução
de estabelecimento do endereço da CGRAM ou DDRAM, pois caso contrário o dado lido
é inválido.
2.3- INICIALIZAÇÃO DOS MÓDULOS LCD
Toda vez que alimentamos o módulo LCD deve ser executado o procedimento de
inicialização, que consiste no envio de uma seqüência de instruções para configurar o modo de
operação para execução de um dado programa de interfaceamento. Em muitos display este
procedimento ocorre automaticamente, dentro de condições específicas que envolve
temporizações mínimas referente a transição do nível lógico 0 para 1, ao ligarmos a fonte. Em
caso de dúvidas, recomendamos o envio destas instruções após o reset do sistema.
2.3.1- Inicialização para sistemas 8 bits de dados (5 instruções)
Entre as duas primeiras instruções recomendamos um delay de 15 mS. As demais
instruções podem ser escritas após checar o Busy Flag.
Instruções em Hexadecimal (8 bits)
MÓDULO LCD
1
2
3
1 linha - Matriz 7x5 e 8x5
30
15mS
30
15mS
06
BF
0E
BF
01
1 linha - Matriz 10x5
34
15mS
34
15mS
06
BF
0E
BF
01
2 linha - Matriz 7x5 e 8x5
38
15mS
38
15mS
06
BF
0E
BF
01
2.3.2 - Inicialização para sistemas 4 bits de dados (5 instruções)
4
5
83
Microcontrolador PIC16F87x
Entre as quatro primeiras instruções recomendamos um delay de 15 mS. As demais
instruções podem ser escritas após checar o Busy Flag. Estes bits (nible) devem estar
conectados aos pinos 11, 12.13 e 14.
Instruções em Hexadecimal (4 bits)
MÓDULO LCD
1
2
3
4
5
6
7
8
9
10
11
12
1 linha - Matriz 7x5 e 8x5
3
3
3
2
2
0
0
8
0
1
0
1
1 linha - Matriz 10x5
3
3
3
2
2
4
0
8
0
1
0
1
2 linha - Matriz 7x5 e 8x5
3
3
3
2
2
8
0
8
0
1
0
1
3. ROTEIRO PARA PROGRAMAÇÃO
A seguir passaremos a descrever um resumo dos procedimentos para utilização de um
módulo ou display LCD:
1. Ao energizar o módulo ajuste o potenciômetro de controle do brilho ou contraste até obter a
visualização da matriciação na primeira linha para módulo de duas linhas ou até a matriciação
de meia linha para módulos de uma linha.
2. Alguns módulos de uma linha só funcionam com a instrução 38 ao invés de 30, conforme
instruções de inicialização.
3. O sinal de Enable (pino 6) deverá ser gerado conforme a temporização mostrada na Figura 2.
Os códigos de dados ou de instruções só serão processados pelo processador do módulo após
a descida do sinal do Enable.
4. Para ajustar a velocidade de comunicação entre a CPU do usuário e o módulo LCD existem
duas possibilidades:
• Intercalar uma rotina de atraso de aproximadamente 15 mS entre as instruções.
• Fazer a leitura do Busy Flag antes do envio de cada instrução e só enviar quando o
mesmo for 0. Neste caso, a única exceção será durante a inicialização.
5. Durante a inicialização enviar a seqüência correta das instruções de inicialização conforme
item 3.4
6. Para programar caracteres na CGRAM, faça inicialmente o endereçamento da mesma.
Microcontrolador PIC16F87x
84
7. Após a escrita de dados na CGRAM envie a instrução 01, para posicionar o cursor.
8. Para escrever os caracteres especiais previamente gravados na CGRAM, utilize os códigos de
00 até 07 correspondente aos endereços bases de 40, 48 até 78 em hexa.
9. Comandos úteis:
FIXAÇÃO DAS CONDIÇÕES DE UTILIZAÇÃO
Instrução
1 linha 5x7 (8 bits)
30H
2 linha 5x7 (8 bits)
38H
1 linha 5x10 (8 bits)
34H
1 linha 5x7 (4 bits)
20H
2 linha 5x7 (4 bits)
28H
1 linha 5x10 (4 bits)
24H
CONTROLE DISPLAY
Instrução
Display aceso c/ cursor fixo
0EH
Display aceso c/ cursor intermitente
0FH
Display aceso sem cursor
0CH
Display apagado
08H
MODO DE OPERAÇÃO
Instrução
Escreve deslocando a mensagem para esquerda (cursor fixo)
07H
Escreve deslocando a mensagem para a direita (cursor fixo)
05H
Escreve deslocando o cursor para a direita
06H
Microcontrolador PIC16F87x
Escreve deslocando o cursor para a esquerda
OUTROS COMANDOS ÚTEIS
85
04H
Instrução
Limpa display e retorna o cursor para o inicio
01H
Retorna o cursor para o inicio (sem alterar a DDRAM)
02H
Desloca somente o cursor para a direita
14H
Desloca somente o cursor para a esquerda
10H
Desloca o cursor + mensagem para a direita
1CH
Desloca o cursor + mensagem para a esquerda
18H
Desloca o cursor para posição inicial da segunda linha
C0H
Desloca o cursor para posição inicial da primeira linha
80H
CGRAM (caracteres especiais)
Instrução
Endereço inicial para construir caracteres especiais
40H
Para escrever o primeiro caracter (previamente construídos)
00H
Para escrever o último caracter (previamente construídos)
07H
Obs:
Após o endereçamento da CGRAM, o cursor se desloca para a primeira posição
da segunda linha (ou metade), portanto é recomendado enviar a instrução 01 ou
“limpa display e cursor home”.
Microcontrolador PIC16F87x
86
4. CUIDADOS ESPECIAIS COM MÓDULOS LCD
4.1- MANUSEIO
• Somente retire o módulo de sua embalagem protetora imediatamente antes de sua
instalação
• Não guarde os módulos em recintos de alta temperatura e alta umidade. A temperatura
de armazenamento deverá estar compreendida entre 5 e 30 oC.
• O LCD é coberto por uma lâmina plástica polarizada a qual não pode ser riscada.
Cuidado em seu manuseio. Para a limpeza da lâmina utilize cotonetes embebido em
benzina. Não utilize outros tipos de solventes.
• Observe cuidadosamente os procedimentos de controle anti-estático quando manusear
os módulos. Eles incorporam circuitos integrados CMOS LSI os quais são sensíveis à
descarga eletrostática. Não toque nos terminais do conector, trilhas do circuito
impresso e/ou terminais do CI.
4.2- INSTALAÇÃO
•
•
•
•
Nunca desmonte o módulo
Use uma estação de solda aterrada para soldagem de conectores ou terminais.
montador deverá também ser convenientemente aterrado.
Sempre que o projeto o permita, instale o módulo atrás de uma janela protetora de
plástico ou vidro.
• Somente retire a fita adesiva que protege a lâmina plástica frontal imediatamente antes
de seu uso.
4.3 - OPERAÇÃO
• Nunca instale ou desconecte o módulo com sua alimentação ligada.
• Sempre opere os módulos respeitando sua gama de temperatura de operação.
• Observe cuidadosamente os valores das tensões de alimentação e os níveis dos sinais
de controle.
• Ajuste a tensão no pino 3 (V0) para obter o contraste mais conveniente para uma dada
aplicação.

Documentos relacionados

microprocessadores e microcontroladores

microprocessadores e microcontroladores Cada um dos bits do PORTB dispõe de um pull-up interno que é controlado pelo bit 7 do registo OPTION (RBPU). Quando este bit é igual a 0, todos os pull-ups estão activados. A configuração de um bit...

Leia mais