Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila Programacao PIC16 Exsto PDF
Apostila Programacao PIC16 Exsto PDF
Tecnologia
Kit de Microcontroladores PIC
Microcontroladores PIC16F877A
Reviso
Principais Autores
Descrio da Verso
Data de Trmino
Exsto Tecnologia
Microcontroladores PIC16F877A
NDICE
PGINA
Introduo .............................................................................................................................................. 6
1
1.1.3
1.1.4
Barramentos ...................................................................................................................... 9
1.1.5
1.1.6
Perifricos ........................................................................................................................ 13
1.1.7
CPU .................................................................................................................................. 14
1.2
Arquitetura Computacional................................................................................................... 17
1.2.1 Arquitetura von-Neumann .............................................................................................. 17
1.2.2
2
A Microchip .......................................................................................................................... 20
2.2
2.3
2.4
Gerao de clock................................................................................................................... 22
2.4.1 Modos LP,XT e HS ............................................................................................................ 23
2.4.2
Modos RC......................................................................................................................... 25
2.4.3
2.4.4
2.4.5
2.5
Memrias .............................................................................................................................. 27
2.5.1 Memria de programa .................................................................................................... 27
2.5.2
2.6
RESET .................................................................................................................................. 31
2.6.1 POR Power-On Reset .................................................................................................... 31
2.6.2
2.6.3
2.6.4
2.6.5
2.6.6
2.7
2.8
Microcontroladores PIC16F877A
2.9
Caractersticas especiais ....................................................................................................... 34
2.9.1 Proteo de Cdigo (Code Protect) ................................................................................. 34
2.9.2
2.9.3
2.10
Gravao ............................................................................................................................... 36
2.11
O conjunto de instrues do PIC16F877A ........................................................................... 37
2.11.1
Manipulao de Byte .................................................................................................. 39
2.11.2
2.11.3
Matemticas ............................................................................................................... 41
2.11.4
Lgicas ......................................................................................................................... 44
2.11.5
Testes .......................................................................................................................... 48
2.11.6
Chamadas e desvio...................................................................................................... 49
2.11.7
Controle....................................................................................................................... 51
2.12
2.13
2.14
Programao estruturada....................................................................................................... 56
Diretivas ................................................................................................................................ 58
3.2
Variveis ............................................................................................................................... 61
3.3
Sub-rotinas ............................................................................................................................ 62
3.3.1 Passagem de Parmetros ................................................................................................ 63
3.3.2
3.4
Atribuio ............................................................................................................................. 66
3.5
3.6
Estruturas de Deciso............................................................................................................ 68
3.7
Condies ............................................................................................................................. 69
3.8
Se .......................................................................................................................................... 71
3.9
Se seno ................................................................................................................................ 72
3.10
Se seno se ............................................................................................................................ 73
3.11
Caso ...................................................................................................................................... 75
3.12
Estruturas de repetio .......................................................................................................... 77
3.12.1
Faa-Enquanto ............................................................................................................ 78
3.12.2
Enquanto ..................................................................................................................... 78
3.12.3
Para ............................................................................................................................. 79
3.13
4
4.2
Teclado ................................................................................................................................. 87
Exsto Tecnologia
Microcontroladores PIC16F877A
4.3
Interrupes .......................................................................................................................... 89
4.3.1 Utilizao das Interrupes ............................................................................................. 92
4.3.2
4.3.3
5.1.3
5.2
Mdulo CCP ....................................................................................................................... 101
5.2.1 Modo captura ................................................................................................................ 102
5.2.2
5.2.3
5.2.4
5.3
Comunicao Serial ............................................................................................................ 106
5.3.1 Comunicao Paralela ................................................................................................... 106
5.3.2
5.3.3
5.3.4
5.3.5
5.3.6
5.4
Conversor Analgico para digital ADC........................................................................... 114
5.4.1 Configurao e uso ........................................................................................................ 116
5.5
Memrias EEPROM e Flash............................................................................................... 118
5.5.1 Memria EEPROM ......................................................................................................... 118
5.5.2
5.5.3
5.5.4
Exsto Tecnologia
Microcontroladores PIC16F877A
Introduo
Est apostila tem o objetivo de servir como livro texto para um curso de microcontroladores PIC16.
Esse contedo foi preparado para ser usado em disciplinas de microcontrolador/microprocessadores
em cursos tcnicos ou superiores na rea de tecnologia.
Os pr-requisitos para o bom aproveitamento do curso so conhecimentos bsicos de informtica,
eletrnica bsica, eletrnica digital bsica (principalmente memrias, contadores, portas lgicas e
flip-flops ). Tambm recomendvel para o bom andamento do curso que os alunos j tenham
freqentada alguma matria de programao (seja qual for a linguagem estudada).
O curso estruturado em 5 captulos que abordam o funcionamento do PIC16F877A, partindo de
conceitos mais gerais e especializando a cada passo, at tratar vrios dos perifricos.
O captulo inicial com os conceitos bsicos sobre microcontroladores e sistemas computacionais, e
tem o objetivo de equalizar os pr-requisitos sobre o assunto. Este captulo pode ser omitido, sem
qualquer prejuzo no andamento do curso, caso esses conceitos j tenham sido estudados em outras
disciplinas.
O captulo 2 apresenta os microcontroladores PIC16 , tratando tanto de hardware como de
software, alm de trazer os fundamentos de programao em linguagem assembly. So discutidos
organizao de memria e funcionamento da CPU, alm das principais caractersticas destes
microcontroladores.
De posse dos conhecimentos do Captulo 2 feito um estudo mais aprofundado de tcnicas de
programao segundo os preceitos da programao estruturada e engenharia de software. Vale
ressaltar a importncia dessa unidade, visto que ela visa formar as bases da lgica de programao e
que o desenvolvimento com microcontroladores basicamente um desenvolvimento de software.
O captulo 4 apresenta algumas aplicaes avanadas de programao, com displays LCD, teclados
matriciais e, principalmente, interrupes.
No ltimo captulo so apresentados alguns dos principais perifricos do PIC16F877A, tambm
encontrados em outros microcontroladores da famlia PIC16. Destes, so fundamentais os timers e
comunicao serial. Os demais podero ser sacrificadas ou resumidas, caso a carga horria no
suporte a totalidade do contedo, apesar de ser recomendado dar uma maior ateno ao conversor
analgico para digital.
Exsto Tecnologia
Microcontroladores PIC16F877A
1 CONCEITOS BSICOS
Inicialmente ser apresentado o conceito de microcontroladores de forma genrica, que
posteriormente ser estendido ao PIC16F877A e pode ser aplicado a qualquer outro
microcontrolador.
importante este embasamento terico no somente para garantir um melhor aproveitamento no
estudo do PIC 16F877A como tambm para tornar o leitor apto a entender o funcionamento de
outros microcontroladores, tanto da linha PIC como de outros fabricantes. Esses conhecimentos
tambm so importantes na escolha do microcontrolador a ser utilizado em um projeto, pois permite
estabelecer as bases conceituais para a comparao de suas caractersticas.
Microcontroladores PIC16F877A
Memria
Dados
Controle
(CPU)
Programa
Barramento de
Dados
Dispositivos de
Entrada e sada e
perifricos
Mundo
Externo
1.1.1 Memrias
Memrias so dispositivos que armazenam informaes. No caso de um sistema computacional, essa
informao, assim como a memria, pode ser dividida em dois tipos: de programa e de dados.
Existem tambm Registros (bytes de memria) com funes especiais que trabalham junto ao
processador (CPU).
Exsto Tecnologia
Microcontroladores PIC16F877A
Flash: uma memria eletricamente apagvel (EEPROM Electricaly Eresable Read Only
Memory) com tempos de acesso para leitura rpido. Oferece uma grande flexibilidade,
pois geralmente possvel reprogramar um equipamento sem troca de componentes.
1.1.4 Barramentos
As vrias partes de um sistema computacional (CPU, memrias, dispositivos de entrada e sada) so
ligadas entre si atravs de barramentos, ou vias, que so ligaes fsicas de comunicao paralela
entre os componentes. So eles:
Barramento de dados: pelo qual os dispositivos de I/O e memrias trocam dados com o
processador
Barramento de endereos: permite ao processador enderear qual dispositivo ser
acessado
Barramento de controle: indica se o acesso de leitura ou escrita, se feito a posio de
memria ou a I/O.
Barramento de programa: por onde o processador recebe as instrues que compe o
programa.
O tamanho do barramento de dados limita o tamanho de dados que trafegam pelo sistema. Por isso
comum classificar os sistemas computacionais pelo tamanho de seu barramento; temos ento
sistemas de 8 bits, 16 bits, 32bits, etc. Os microcontroladores so em sua maioria de 8 bits, apesar de
existirem alguns modelos de 16 bits.
J o tamanho do barramento de endereos nos informa qual a quantidade mxima de endereos de
memria ou dispositivos de I/O e perifricos podem ser acessados. Por exemplo, um barramento de
endereos de 10 bits permite acessar 210 = 1024 endereos.
Todos os dispositivos de um sistema computacional fazem uso do barramento de dados para trafegar
informaes. Para que o sistema funcione corretamente podemos apresentar o processo de forma
simplificada assim: o processador (que coordena o processo) escreve no barramento de endereos o
endereo do dispositivo a ser acessado. Atravs do barramento de controle ele informa ao
dispositivo se o acesso de leitura ou escrita (a definio de leitura ou escrita de dispositivos sempre
feita pelo ponto de vista do processador). No caso de um aceso de leitura o dispositivo escreve no
Exsto Tecnologia
Microcontroladores PIC16F877A
Exsto Tecnologia
10
Microcontroladores PIC16F877A
Exsto Tecnologia
11
Microcontroladores PIC16F877A
Exsto Tecnologia
12
Microcontroladores PIC16F877A
1.1.6 Perifricos
Alm dos portais de I/O e as memrias, podemos ter muitos outros tipos de dispositivos ligados ao
barramento de dados. Esses dispositivos nada mais so do que circuitos destinados a realizar funes
especiais. Esses dispositivos perifricos so particularmente importantes nos microcontroladores.
Como perifricos mais comuns podemos citar os temporizadores e contadores (Timers), os mdulos
de comunicao serial, conversores AD e DA, mdulos de CCP (Captura, comparao e PWM), drivers
de LCD, comparadores analgicos, etc.
Exsto Tecnologia
13
Microcontroladores PIC16F877A
O modo de acesso aos perifricos semelhante ao de acesso aos portais de I/O. Eles muitas vezes
possuem vrios registros de parmetros que podem ser configurados, e um ou mais registros de
entrada e sada de dados.
Quando estivermos tratando dos perifricos do PIC16F877A mostraremos como trabalhar com eles
e, apesar de cada microcontrolador apresentar um conjunto de perifricos diferentes, seu
funcionamento muito semelhante.
1.1.7 CPU
A CPU (Central Processing Unit Unidade Central de Processamento) ou processador parte
principal de um sistema computacional. comum se referir CPU dos microcontroladores como core
(ncleo). Sua funo executar as instrues do programa e processar dados. Para tanto ela controla
todas as demais partes do sistema e envia ou recebe dados dessas partes. Ela tambm capaz de
interpretar e colocar em execuo as instrues que compe o programa e realizar operaes lgicas
e aritmticas.
Genericamente um processador organizado conforme o diagrama em blocos da figura 1.4.
14
Microcontroladores PIC16F877A
Exsto Tecnologia
15
Microcontroladores PIC16F877A
Para indicar a prxima posio livre na pilha existe um registro (na verdade um contador) chamado
ponteiro da pilha (Stack Pointer) que aponta o topo. Esse registro incrementado cada vez que um
novo endereo de retorno armazenado na pilha e decrementado quando ocorre um retorno.
Uma vez determinado o endereo, seu contedo lido e armazenado em um registro chamado
registro de instruo (Instruction Register). Desse registro, parte da instruo vai para o
decodificador de instrues e parte pode ir para a ALU e/ou parte para o registro de endereamento
de dados (Data Addressing). Para entender o porque disso, devemos ter em mente que uma
instruo nada mais que uma palavra binria. Parte dela, que efetivamente a instruo, indica ao
decodificador de instrues qual a seqncia de aes deve ser executada (qual a pgina do
decodificador de instrues). O restante constitui os operandos da instruo, ou seja, os dados a
serem processados. Esses dados podem ser constantes ou endereos de dados variveis na memria
RAM. Conforme sua natureza e a instruo a ser executada eles tem um destino ou outro.
A unidade lgico-aritmtica ou ALU (Aritmetic and Lgic Unit) o circuito responsvel pelos clculos
em um processador. Como prprio nome diz, ela responsvel pela realizao de operaes lgicas,
(E, OU, OU-exclusivo, deslocamentos, rotaes, complemento), e aritmticas (incremento,
decremento, adio, subtrao, multiplicao, e diviso). Os processos de diviso e multiplicao so
feitos com a ALU utilizando seqncias somas e subtraes, o que efetivamente o que a ALU capaz
de fazer.
A ALU trabalha juntamente com dois registros especiais: o Acumulador (Accumulator) e o registro de
estado de operaes aritmticas (Status). comum se referir ao acumulador simplesmente como
Acc ou, no caso dos PICs, como W (Worker Trabalhador ). O acumulador quase sempre est
envolvido nas operaes realizadas pela ALU. Ele pode ser um dos operandos, pode ser onde se
armazena o resultado ou pode ser as duas coisas. H tambm microcontroladores onde qualquer
transferncia de dados entre dois endereos da RAM passa pelo acumulador.
Quanto ao registro de status, sua funo indicar resultados notveis das operaes matemticas.
Esses resultados so indicados por flags, que so bits desse registro. Atravs da anlise dos flags
possvel saber, dentre outras coisas, se uma operao resultou em zero; se houve estouro da
capacidade de armazenamento (overflow), que acontece quando um resultado maior que o
mximo valor possvel de ser representado pelo sistema; se o resultado de uma operao aritimtica
negativo ou positivo. Existe uma interao do registro status com o decodificador de instrues,
pois atravs da anlise de seus flags possvel realizar instrues de testes.
Para acessar a memria de dados e os perifricos existe um registro, que em nosso sistema
chamado de endereamento de dados (Data Addressing) que pode receber valores de duas formas.
A primeira diretamente de parte da instruo. Nesse caso se est fazendo referncia a endereos
da RAM conhecidos e fixos, pois so carregados valores constantes existentes no programa. Esse
modo chamado endereamento direto.
Em muitos casos necessrio fazer referncias a endereos variveis. Isso feito carregando o
registro de endereamento com dados provenientes de um outro registro, o registro de
endereamento indireto (Indirect Addressig). Como qualquer outro registro, ele pode ser carregado
com um valor, constante ou proveniente de uma varivel, pode ser incrementado, decrementado ou
participar que qualquer operao lgico-aritmtica. Sua funo semelhante a dos ponteiros em
linguagens de alto nvel.
Exsto Tecnologia
16
Microcontroladores PIC16F877A
Todo o sistema computacional trabalha sincronizado com um mesmo sinal de clock. Devemos
lembrar que esse clock o que faz o decodificador de instrues passar de uma instruo para a
outra, e tudo o mais deve estar sincronizado com ele, seno haveria o caos. Para gerar esse sinal de
clock necessrio um oscilador. Nos microcontroladores esse oscilador j faz parte do componente
Independente da forma como o clock gerado, esse sinal aplicado a CPU e aos perifricos.
comum que a freqncia do clock dos perifricos seja menor que a da CPU. Para tanto so utilizados
divisores de freqncia
Outro ponto importante o reset. Alm do reset que ocorre quando o sistema ligado, chamado de
Power-on reset, os microcontroladores apresentam vrias outras fontes de reset. Esses resets so
protees do sistema.
Sntese genrica de operao de uma CPU:
1) O iniciar um programa, o contador de programa aponta para o primeiro endereo na
memria de programa.
2) Neste endereo comea o programa.
3) O registrador de instruo armazena o dado guardado neste endereo. Este dado
composto da instruo e do operando. O operando pode ser proveniente da memria de
programa ou da memria RAM ( memria de dados ).
4) O decodificador de instruo recebe a instruo do registrador de instruo.
5) A instruo corresponde a uma seqncia de passos programados em uma ROM, o chamado
microcdigo.
6) Um contador dentro do decodificador de instruo varre essa seqncia de passos.
7) O decodificador de instruo comea ento a acionar os dispositivos dentro ou fora da CPU
atravs dos barramentos de dados, controle e endereo.
8) A partir desse ponto os dispositivos podem ser acionados nas mais diversas seqncias de
operao dependendo da necesidade de processamento imposta pelo cdigo, por exemplo:
O contador de programa aponta para o prximo endereo de memria de programa
onde pode estar o valor de uma instruo com operando. A memria de programa
habilitada e esse valor passado do para a ALU atravs do registro de instruo.
O contador de programa aponta para o prximo endereo na memria de dados. A
memria de dados habilitada e o valor armazenado nesse endereo passa para o
acumulador.
A ALU opera aritmeticamente esses dois dados, sinaliza para o registrador de estados
qual foi e estado da operao e disponibiza o resultado em sua sada.
Uma memria ou um dispositivo de sada pode ser habilitado e o resultado ser
armazenado em um desses dispositivos.
Em resumo sempre ocorre um processo de BUSCA e EXECUO da instruo. A busca se
refere a localizao das instrues e dos operandos na memria e a execuo se refere ao
acionamento de dispositivos em seqncia para conseguir o resultado desejado.
17
Microcontroladores PIC16F877A
Vale lembrar aqui que uma instruo como uma operao matemtica, isto , composta de
operadores, que indicam o que ser feito, e operandos, que so os parmetros envolvidos na
operao.Desta forma, o processo de execuo de cada instruo dividido em dois momentos: a
leitura da instruo e a leitura dos operandos (fetch) e a execuo da instruo propriamente dita.
Nota-se que dessa forma o processador est parte do tempo ocupado com a leitura da memria de
programa e, conseqentemente no fica executando o firmware o tempo todo. Outra caracterstica
da arquitetura von-Neumann que, visto que os operandos das instrues so geralmente do
mesmo tamanho do barramento de dados, quanto mais complexa a instruo maior ser a
quantidade de endereos ocupados por ela na memria. Isto quer dizer que por exemplo, para um
barramento de 8 vias, uma instruo de 16 bits buscada e executada em duas partes de 8 bits. Por
outro lado, como a complexidade da instruo no tem limite a no ser o espao ocupado, podemos
ter um set de instrues to complexo quanto se queira.
Podemos concluir que arquitetura von-Neumann consome muito tempo de processamento com a
leitura da instruo e dos operandos. Conclui-se tambm que instrues diferentes ocupam
quantidades diferentes de memria e so executadas em tempos diferentes.
Memria
Dados
Programa
CPU
Barramento de
Dados
I/O
Exsto Tecnologia
18
Microcontroladores PIC16F877A
Memria de
CPU
Programa
Barramento de
Programa
Memria de
Dados
I/O
Barramento de
Dados
Figura 1.7 Arquitetura Harvard
Pode-se notar ento que os tempos de execuo e de leitura esto atrelados e so os menores
possveis. Isso acarreta em as instrues no poderem executar uma grande seqncia de aes, ou
seja, no existem instrues complexas. Por isso, os PICs so considerados processadores RISC
(Reduced Instruction Set CPU CPU com Set de Instrues Reduzido). O nmero de instrues
reduzido, o que no significa que no se possa executar programas complexos, mas sim que
seqncias complexas de aes devem ser construdas por seqncias de instrues bsicas.
Exsto Tecnologia
19
Microcontroladores PIC16F877A
2 O MICROCONTROLADOR PIC16F877A
2.1 A Microchip
O fabricante dos microcontroladores PIC a empresa americana Microchip. Atualmente ela um dos
maiores fabricante mundiais de microcontroladores de 8, 16 e 32 bits, alm de possuir uma ampla
linha de memrias e componentes analgicos.
A Microchip trabalha com uma poltica de suporte ao cliente muito eficiente, que provavelmente
uma das causas de seu sucesso. Em seu site (www.microchip.com) existe uma grande quantidade de
informao disponvel. Alm dos manuais dos componentes, existem muitas notas de aplicao
(Application Notes) e projetos de referncia, que so de grande ajuda para a formao da base de
conhecimentos do estudante de microcontroladores PIC.
8 bits
o Famlia PIC10
o Famlia PIC12
o Famlia PIC14 e PIC17
o Famlia PIC16
o Famlia PIC18
16 bits:
o Famlias PIC24F e PIC24H
o Familias dsPIC30F e dsPIC33F
32 bits
Exsto Tecnologia
20
Microcontroladores PIC16F877A
o PIC32
o
Os componentes diferem entre si basicamente em:
Quantidade de memria RAM
Quantidade de memria EEPROM de dados (alguns no tm nada)
Quantidade de memria Flash de programa
Nmero de pinos (8,14,18,28,40, ...)
Freqncia mxima de clock
Perifricos
Nesse curso abordaremos o PIC16F877A, que um dos componentes mais completos da famlia
PIC16. Conforme foi dito anteriormente, ao se estudar um membro de uma famlia o estudante
torna-se apto a trabalhar com toda a famlia.
Exsto Tecnologia
21
Microcontroladores PIC16F877A
22
Microcontroladores PIC16F877A
Obs.: resistores, indutores, capacitores e cristais podem ser combinados formando circuitos
osciladores em freqncias determinadas. Mais detalhes sobre os conceitos, funcionamento e
projeto desse tipo de circuito podem ser encontrados em livros de eletrnica com captulos sobre
osciladores.
Exsto Tecnologia
23
Microcontroladores PIC16F877A
Freqncia do Cristal
Capacitores C1 e C2
32 kHz
33 pF
200 kHz
15 pF
100 kHz
47 a 68 pF
XT
1 MHz
15 pF
4 MHz
15 pF
4 MHz
15 pF
HS
8 MHz
15 a 33 pF
20 MHz
15 a 33 pF
Tabela 2.1 Seleo de capacitores para oscilador a cristal
LP
Exsto Tecnologia
24
Microcontroladores PIC16F877A
2.4.2 Modos RC
Tambm possvel trabalhar com osciladores RC (Resistor/Capacitor). Para isso utilizada a
montagem da figura 2.4 e selecionado o modo de oscilador como RC.
Exsto Tecnologia
25
Microcontroladores PIC16F877A
No modo RC com sada de clock o terminal OSC2/CLKOUT apresenta a freqncia do oscilador divida
por quatro, que pode ser utilizado como fonte de clock para outros pontos do circuito. J no modo
sem sada de clock, esse terminal pode ser utilizado como I/O.
Tipo de Oscilador
Cristal (HS, XT e HS) RC Externo
Preciso
Preciso
Impreciso
Estabilidade
Estvel
Instvel
Variedade de freqncias
Pequena
Grande
Custo
Alto
Baixo
Tabela 2.2 Seleo de capacitores para oscilador a cristal
RC Interno
Pouco preciso
Pouco Estvel
Nenhuma
Nenhum
Exsto Tecnologia
26
Microcontroladores PIC16F877A
2.5 Memrias
2.5.1 Memria de programa
O PIC16F877A possui 8K-palavras de memria de programa. J que se trata de um processador RISC,
o tamanho das palavras da memria de programa maior que o barramento de dados. Assim, apesar
de ser um microcontrolador de 8 bits, a memria de programa composta por palavras de 14 bits.
Cada palavra, isto , cada endereo de memria de programa guarda uma instruo. Dessa forma,
um programa de 500 instrues ocupar 500 bytes.
O vetor de reset o endereo 0000h. Como vimos, isso significa que o programa deve ser escrito a
partir desse endereo. O vetor de interrupo, para todas as interrupes o 0004h.
A memria do tipo FLASH, suportando um grande nmero de reescritas. possvel, atravs de
rotinas que trataremos em outro ponto do curso, realizar escrita na memria e programa.
Na estrutura das instrues de chamada e desvio da famlia 16F o espao reservado para endereo
de 11 bits. Portanto possvel enderear diretamente 2048 endereos de memria. Sendo que o
PIC16F877A tem 8k endereos de memria de programa, essa memria dividida em unidades que
chamaremos de pginas. Dentro de uma mesma pgina possvel realizar saltos e desvios para
qualquer ponto. Mas se um salto ou desvio vai de uma pgina para outra necessrio fazer um
ajuste prvio dos dois bits mais significativos do SFR PCLATH, conforme mostrado na tabela abaixo.
PCLATH
Bit 4
Bit 3
0
0
0
1
0
1
2
1
0
3
1
1
Tabela 2.3 Pginas de memria de programa
Pgina
Exsto Tecnologia
27
Microcontroladores PIC16F877A
0000h
Vetor de reset
0001h
0002h
Uso geral
0003h
0004h
Vetor de interrupo
0005h
Pgina 0
.
.
Uso geral
.
07FFh
0800h
.
.
Uso geral
Pgina 1
.
0FFFh
1000h
.
.
Uso geral
Pgina 2
.
17FFh
1800h
.
.
Uso geral
Pgina 3
.
1FFFh
Figura 1.6 Mapeamento de memria do PIC16F877A
Os demais microcontroladores da famlia PIC16F seguem esse mesmo mapeamento de memria,
contudo nem todos os modelos tm 8k-words, isto , alguns no tem todas as pginas
implementadas. Por exemplo, o PIC16F874A tem as pginas 0 e 1 mas no as 2 e 3, portanto tem 4kwords; j o 16F628A tem 2k-words, ou seja, somente a pgina 0.
Exsto Tecnologia
28
Microcontroladores PIC16F877A
se comportando como o byte acessado. Este ltimo modo de endereamento pode ser muito til em
algumas situaes e ser estudado mais adiante.
Para acesso direto, a RAM dividida em 4 bancos. Isso ocorre porque a capacidade de mxima de
acesso de memria dos microcontroladores PIC de 512 bytes. Portanto, so necessrios 9 bits para
compor os endereos. Como cada instruo tem apenas 14 bits, e esses bits devem ser divididos
entre operadores e operandos, no h espao para um endereo de 9 bits. Na verdade, as instrues
armazenam apenas 7 bits do endereo a ser acessado. Os dois bits restantes fazem parte do registro
de funo especial STATUS e so chamados RP1 e RP0. J que dois bits podem gerar 4 combinaes,
existe essa diviso em 4 bancos. Para acessar um registro em um banco diferente do banco atual,
necessrio ajustar previamente RP1 e RP0. Na prtica utilizamos o mximo possvel endereos do
banco 0, e mudamos para os demais bancos quando necessrio, retornando novamente ao banco 0.
A diviso de bancos feita conforme a tabela 1.3.
Banco
0
1
2
RP1
0
0
1
RP0
0
1
0
Endereos
00h ~ 7Fh
80h ~ FFh
100h ~ 17Fh
180h ~ 1FFh
R/W 0
IRP
Bit 7
R/W 0
RP1
R/W 0
RP0
R1
R 1
R/W x
R/W x
NOT_TO
NOT_PD
DC
R/W x
C
Bit 0
STATUS
Os bits so numerados de 0 a 7, da direita para a esquerda. O nome do registro aparece em baixo.
Sobre cada bit temos algumas informaes: se ele pode ser lido (R) escrito (W), se no
implementado. Tambm contm sua situao aps o reset, podendo ser 0, 1 ou desconhecida (x).
Por exemplo, sobre o bit RP0 est escrito R/W-0, que significa que pode ser lido ou escrito e seu valor
no reset 0.
No anexo B encontra-se o mapa de memria do PIC16F628A. Pode-se observar os nomes dos SFR e
as regies de uso geral. Note que apesar de ser possvel acessar 512 bytes, foram implementados
apenas 224 bytes. As posies no implementadas esto em cinza na figura. Note ainda que os
ltimos 16 endereos de todos os bancos acessam os mesmos bytes no banco 0.
Exsto Tecnologia
29
Microcontroladores PIC16F877A
A figura 1.7 trs o mapeamento de memria RAM do PIC16F877A com os nomes dos registros de
funo especial e as reas de uso geral (GPR). As regies em cinza correspondem a endereos para os
quais no h memria implementada. No manual do PIC16F877A existe um detalhamento maior dos
bits que compe os SPRs. A funo de vrios desses registros ser explicada no decorrer do curso.
Exsto Tecnologia
30
Microcontroladores PIC16F877A
2.6 RESET
O PIC possui vrias fontes de reset (reinicializao), que so:
O reset por MCLR acionado quando ao terminal MCLR (pino 4) aplicado nvel lgico baixo. MCLR
o terminal de Reset do componente, sendo um terminal baixo ativo, isto , o reset ocorre em 0.
Alm disso, o terminal de MCLR possui internamente um filtro para evitar que rudos possam causar
reset acidental.
O modo como os registros se comportam em cada reset variado. Para saber quais so os valores
iniciais de cada registro, deve ser consultada a tabela de situaes iniciais dos registros, presente no
manual de cada PIC.
A seguir so detalhadas algumas fontes e funcionalidades associadas ao reset.
Exsto Tecnologia
31
Microcontroladores PIC16F877A
NOT_TO
1
0
x
1
0
0
U
1
NOT_PD
1
X
0
1
1
0
U
0
Essa informao pode ser til, permitindo que providncias sejam tomadas em situaes especficas
de problema.
O esquema da figura 1.8 mostra como a lgica de reset.
Exsto Tecnologia
32
Microcontroladores PIC16F877A
Qualquer reset;
Estouro do Watch-Dog (se este estiver habilitado);
Qualquer perifrico que estiver com sua respectiva interrupo habilitada (incluso INT e
interrupo por mudana no Portal B).
Exsto Tecnologia
33
Microcontroladores PIC16F877A
Quando da ocorrncia de algum reset, o programa recomea sua execuo no vetor de reset
(0000h). Se, porm, ocorrer um estouro do Watch-Dog ou a chamada de alguma interrupo o
programa continua sua execuo a partir do endereo imediatamente posterior a instruo SLEEP
que ativou o modo de baixo consumo. E ainda, se o controle geral de interrupes estiver habilitado,
o programa recomea pelo vetor de interrupes (0004h) se desperto por interrupo. Assim, se
desejamos que uma interrupo simplesmente acorde o microcontrolador, devemos desabilitar
globalmente as interrupes.
Deve-se ter ateno ao fato de que no modo SLEEP o oscilador est desligado. Dessa forma no
podem ser utilizadas interrupes dos timers para a sada do modo, se estes timers utilizarem como
fonte de clock o oscilador interno, nem demais perifricos cujo funcionamento se baseie no oscilador
principal do sistema.
Exsto Tecnologia
34
Microcontroladores PIC16F877A
Min
-55
4
-
Max Unidade
125
C
5,5
V
300
mA
250
mA
25
mA
25
mA
200
mA
200
mA
200
mA
200
mA
Exsto Tecnologia
35
Microcontroladores PIC16F877A
Os nveis de tenso de entrada e sada para o PIC so apresentados na tabela abaixo. Os valores so
considerndo que a alimentao de 5,0 V. O buffer de entrada de cada pino pode ser do tipo TTL
simples ou Schmitt Trigger. Para saber qual o tipo de buffer deve-se consultar a parte do manual de
cada componente relativo aos portais de I/O.
Parmetro
VIH
VIH
VOL
VOH
Tipo de buffer
TTL
Schmitt Trigger
TTL
Schmitt Trigger
Min
Vss
Vss
2,0
4,0
4,3
Max
0,8
1,0
VDD
VDD
0,6
-
Unid
V
V
V
V
V
V
2.10 Gravao
A gravao do microcontrolador PIC pode ser realizada sem que o componente seja retirado da placa
(gravao in-circuit). Essa gravao feita de forma serial utilizando somente dois pinos: PB7/PGD
para envio de dados e RB6/PGC para clock.
Alm dos pinos RB7 e RB6 necessrio que o pino MCLR/VPP receba uma tenso de 13VDC +/- 0,5V
durante o processo de gravao. Tambm necessrio que o microcontrolador esteja devidamente
alimentado, portanto VDD e VSS devem estar devidamente conectados.
Exsto Tecnologia
36
Microcontroladores PIC16F877A
TOS
37
Microcontroladores PIC16F877A
R/W 0
IRP
RP1
R/W 0
RP0
R1
R/ 1
R/W x
R/W x
R/W x
NOT_TO
NOT_PD
DC
Bit 7
Bit 0
STATUS
Manipulao de byte
Manipulao e bit
Matemticas
Lgicas
Exsto Tecnologia
38
Microcontroladores PIC16F877A
No anexo A existe uma tabela resumo de todas as instrues. Recomenda-se tirar uma cpia desta
pagina e tela sempre mo para consulta rpida.
2.11.1
Manipulao de Byte
MOVLW
k
0 k 255
(W) k
Nenhum
1
MOVLW
35h
Exsto Tecnologia
39
Microcontroladores PIC16F877A
MOVF
Move o valor do registro (f) para o destino. Se d 0 destino W; se d 1 o destino o prprio
registro (f). Mover o valor do registro para ele mesmo til para testarmos se o valor 0, uma vez
que essa instruo afeta o bit Z do registro STATUS.
Sintaxe
Operadores
MOVF
f, d
0 f 127
d=0:W
d = 1 : registro f
(d) (f)
Z
1
MOVF
TEST,0
Operao
Flags Afetados
Ciclos
Exemplo
Alteraes nas Flags:
Z = 0: o valor movido, diferente de zero.
Z = 1: o valor movido, 0.
MOVWF
Move o contedo de W para o registro f.
Sintaxe
Operadores
Operao
Flags Afetados
Ciclos
Exemplo
2.11.2
MOVWF
f
0 f 127
(f) W
Nenhum
1
MOVWF
TEST
Manipulao de bit
BCF
f, b
0 f 127
0b7
f[b] 0
Nenhum
1
BCF
CONTROLE,5
Exsto Tecnologia
40
Microcontroladores PIC16F877A
BSF
"Seta" o bit b do registro f.
Sintaxe
Operadores
Operao
Flags Afetados
Ciclos
Exemplo
2.11.3
BSF
f, b
0 f 127
0b7
f[b] 1
Nenhum
1
BSF
CONTROLE,7
Matemticas
ADDLW
Realiza a adio do valor contido em W com a constante k. O resultado armazenado em W.
Sintaxe
Operadores
Operao
Flags Afetados
Ciclos
Exemplo
Alteraes nas Flags:
ADDLW
k
0 k 255
(W) (W) + k
C, DC, Z
1
ADDLW
35h
ADDWF
Realiza a adio do valor contido em W com o valor do registro f. O resultado armazenado no
destino: d=0 para W ou d=1 para o registro f.
Exsto Tecnologia
41
Microcontroladores PIC16F877A
Sintaxe
Operadores
Operao
Flags Afetados
Ciclos
Exemplo
Alteraes nas Flags:
ADDWF
f, d
0 f 127
d=0:W
d = 1 : registro f
(d) (W) + (f)
C, DC,Z
1
ADDWF
TEST,0
DECF
f,d
0 f 127
d=0:W
d = 1 : registro f
(d) (f) 1
Z
1
DECF
COUNT,0
INCF
f,d
0 f 127
d=0:W
d = 1 : registro f
(d) (f) + 1
Z
1
INCF
COUNT,0
Exsto Tecnologia
42
Microcontroladores PIC16F877A
SUBLW k
0 k 255
(W) k - (W)
C, DC, Z
1
SUBLW
23h
ATENO: nessa operao os bits C e DC tem significado inverso ao que seria esperado, isto ,
quando ocorre um borrow ("estouro para menos"), os bits C e DC ficam em zero, ao contrrio que
quando ocorre um Carry ("estouro para mais"), quando C e DC ficam em 1.
C = 1: o resultado da subtrao maior ou igual a 0.
C = 0: o resultado da subtrao menor a 0.
DC = 1: o resultado da subtrao no causou o transporte de 5o para o 4o bit
DC = 0: o resultado da subtrao causou o transporte de 4o para o 5o bit
Z = 0: o resultado da subtrao diferente de zero.
Z = 1: o resultado da subtrao igual a 0.
SUBWF
O valor contido em W subtrado, pelo mtodo do complemento 2, do valor contido no registro f. O
resultado armazenado no destino: d=0 para W ou d=1 para o registro designado por f.
Sintaxe
Operadores
Operao
Flags Afetados
Ciclos
Exemplo
Alteraes nas Flags:
SUBWF f,d
0 f 127
d=0:W
d = 1 : registro f
(W) (f) - (W)
C, DC, Z
1
SUBWF
TEST,0
ATENO: nessa operao os bits C e DC tm significado inverso ao que seria esperado, isto ,
quando ocorre um borrow ("estouro para menos"), os bits C e DC ficam em zero, ao contrrio que
quando ocorre um Carry ("estouro para mais"), quando C e DC ficam em 1.
Exsto Tecnologia
43
Microcontroladores PIC16F877A
2.11.4
Lgicas
Assim como as instrues matemticas, as instrues lgicas realizam operaes lgicas bsicas
fazendo uso da ALU.
ANDLW
Realiza uma operao lgica "E" entre o valor contido em W e a constante k. O resultado
armazenado em W.
Sintaxe
Operadores
Operao
Flags Afetados
Ciclos
Exemplo
Alteraes nas Flags:
Z = 0:
Z = 1:
ANDLW
k
0 k 255
(W) (W) E k
Z
1
ANDLW
0Fh
ANDWF
Realiza a operao "E" entre o valor contido em W o valor contido no registro f. O resultado
armazenado no destino: 0 para W ou 1 para o registro designado por f.
Sintaxe
Operadores
Operao
Flags Afetados
Ciclos
Exemplo
Alteraes nas Flags:
ANDWF
f, d
0 f 127
d=0:W
d = 1 : registro f
(d) (W) E (f)
Z
1
ANDWF
TEST,1
Exsto Tecnologia
44
Microcontroladores PIC16F877A
COMF
Complementa o valor contido no registro f. O resultado armazenado no destino: d=0 para W ou
d=1 para o registro designado por f.
Sintaxe
Operadores
Operao
Flags Afetados
Ciclos
Exemplo
Alteraes nas Flags:
COMF
f,d
0 f 127
d=0:W
d = 1 :registro f
(d) complemento de (f)
Z
1
COMF
TESTE,1
IORLW k
0 k 255
(W) (W) OU (f)
Z
1
IORLW
TEST
[label] IORWF
0 f 127
d=0:W
d = 1 : registro f
(d) (W) OU (f)
Z
1
IORWF
TEST,1
f, d
45
Microcontroladores PIC16F877A
RLF
O valor contido em f rotacionado para a esquerda atravs do bit de Carry (bit C do registro
STATUS). O resultado armazenado no destino: d=0 para W ou d=1 para o registro designado por f. A
operao de rotao a esquerda consiste no deslocamento sucessivo de bits de sua posio inicial
para a posio consecutiva de modo que o ltimo bit do registro f v para C e o bit que estava em C
v para o primeiro bit do registro f.
Sintaxe
Operadores
Operao
Flags Afetados
Ciclos
Exemplo
RLF
f,d
0 f 127
d=0:W
d = 1 : registro f
veja a figura abaixo
C
1
RLF
TEST,1
Registro f
RRF
O valor contido em f rotacionado para a direita atravs do bit de Carry (bit C do registro STATUS). O
resultado armazenado no destino: 0 para W ou 1 para o registro designado por f. A operao de
rotao a direita consiste no deslocamento sucessivo de bits de sua posio inicial para a posio
consecutiva de modo que o primeiro bit do registro f v para C e o bit que estava em C v para o
ltimo bit do registro f.
Sintaxe
Operadores
Operao
Flags Afetados
Ciclos
Exemplo
RRF
f,d
0 f 127
d=0:W
d = 1 : registro f
veja a figura abaixo
C
1
RRF
TEST,1
Registro f
46
Microcontroladores PIC16F877A
SWAPF
O nibble (conjuntos de 4 bits) mais significativo e o menos significativo do registro f so trocados. Ou
seja, os bits de 7 a 4 vo para as posies de 3 a 0 e os bits de 3 a 0 vo para as posies de 7 a 4. A
figura abaixo ilustra esse processo. O resultado armazenado no destino: d=0 para W ou d=1 para o
registro designado por f.
Sintaxe
Operadores
Operao
Flags Afetados
Ciclos
Exemplo
SWAPF f,d
0 f 127
d=0:W
d = 1 : registro f
Destino [7:4] f [3:0]
Destino [3:0] f [7:4]
Nenhum
1
SWAPF TEST,1
XORLW
Realiza uma operao "OU exclusivo" entre o valor contido em W e a constante de oito bits k. O
resultado armazenado em W.
Sintaxe
Operadores
Operao
Flags Afetados
Ciclos
Exemplo
Alteraes nas Flags:
XORLW
k
0 k 255
(W) (W) XOU (f)
Z
1
XORLW
OFh
XORWF
0 f 127
d= 0 W
f, d
Exsto Tecnologia
47
Microcontroladores PIC16F877A
Operao
Flags Afetados
Ciclos
Exemplo
Alteraes nas Flags:
d=1 registro f
(d) (W) XOU (f)
Z
1
XORWF
TEST,0
2.11.5
Testes
BTFSC
Testa o bit b do registro f : se o bit for '1' a prxima instruo executada; se o bit for '0' a prxima
instruo no executada, em seu lugar executada uma instruo NOP, seguindo o programa na
segunda instruo aps a BTFSC.
Sintaxe
Operadores
Operao
Flags Afetados
Ciclos
Exemplo
BTFSC f, b
0 f 127
0 b7
se f[b]=0 salta a prxima instruo
nenhum
se o bit no estiver em 1;
se o bit estiver em 1.
BTFSC
STATUS,Z
GOTO
ZERO
BTFSS
Testa o bit b do registro f : se o bit for '0' a prxima instruo executada; se o bit for '1' a prxima
instruo no executada, em seu lugar executada uma instruo NOP, seguindo o programa na
segunda instruo aps a BTFSS.
Sintaxe
Operadores
Operao
Flags Afetados
Ciclos
Exemplo
BTFSS f, b
0 f 127
0 b7
se f[b]=1 salta a prxima instruo
Nenhum
se o bit no estiver em 1;
se o bit estiver em 1.
BTFSS
STATUS,Z
GOTO
NO_ZERO
DECFSZ
Decrementa o valor contido no registro f. O resultado armazenado no destino: d=0 para W ou d=1
para o registro designado por f. Se o resultado for diferente de 0 a prxima instruo executada; se
o resultado for 0 a prxima instruo no executada, em seu lugar executada uma instruo NOP,
seguindo o programa na segunda instruo aps a DECFSZ.
Exsto Tecnologia
48
Microcontroladores PIC16F877A
Sintaxe
Operadores
Operao
Flags Afetados
Ciclos
Exemplo
DECFSZ
f,d
0 f 127
d=0W
d = 1 registro f
(d) (f) - 1
se f[b] = 1 salta a prxima instruo
Nenhum
1
DECFSZ
COUNT,1
INCFSZ
Incrementa o valor contido no registro f. O resultado armazenado no destino: d=0 para W ou d=1
para o registro designado por f. Se o resultado for diferente de 0 a prxima instruo executada; se
o resultado for 0 a prxima no executada, em seu lugar executada uma instruo NOP e o
seguindo o programa na segunda instruo aps a INCFSZ.
Sintaxe
Operadores
Operao
Flags Afetados
Ciclos
Exemplo
2.11.6
INCFSZ
f,d
0 f 127
d= 0 W
d=1 registro f
(d) (f)+1
se f[b]=1 salta a prxima instruo
Nenhum
1
INCFSZ
COUNT,1
Chamadas e desvio
CALL
Chamada de sub-rotina. O endereo de retorno (prxima instruo) guardado no topo da pilha
(TOS) e um valor de 11 bits carregado nos bits menos significativos do PC (PC[10:0]), fazendo a
seqncia do programa ser transferida para o endereo indicado por k. Os bits superiores do PC
(PC[12:11]) so carregados a partir de PCLATH. Ver tpico "Desvio X Chamada" para maiores
informaes.
Sintaxe
Operadores
Operao
Flags Afetados
Ciclos
Exemplo
CALL k
0 k 2047
TOS PC+1
PC[10:0] k
PC[12:11] (PCLATCH[4:3])
Nenhum
2
CALL
TX_SERIAL
Exsto Tecnologia
49
Microcontroladores PIC16F877A
GOTO
Realiza um desvio incondicional para endereo k. O endereo de 11 bits carregado no PC, fazendo a
seqncia do programa ser transferida para o endereo indicado por k. Os bits superiores do PC so
carregados de PCLATH. Ver tpico "Desvio X Chamada" para mais informaes.
Sintaxe
Operadores
Operao
Flags Afetados
Ciclos
Exemplo
GOTO k
0 k 2047
PC[10:0] k
PC[12:11] (PCLATCH[4:3])
Nenhum
2
GOTO
INICIO
RETURN
Retorno de sub-rotina. O endereo de retorno salvo na pilha quando da ocorrncia da interrupo
carregado no PC. Ver tpico "Desvio X Chamada" para mais informaes.
Sintaxe
Operadores
Operao
Flags Afetados
Ciclos
Exemplo
RETURN
Nenhum
PC TOS
Nenhum
2
RETURN
RETLW
Realiza o retorno de uma sub-rotina com o W contendo a constante de oito bits k . W passa a conter
k e o endereo de retorno salvo na pilha quando da ocorrncia da interrupo carregado no PC.
Sintaxe
Operadores
Operao
Flags Afetados
Ciclos
Exemplo
RETLW k
0 k 255
PC TOS
(W) k
nenhum
2
RETLW
69h
Exsto Tecnologia
50
Microcontroladores PIC16F877A
RETFIE
Retorno de interrupo. O endereo de retorno salvo na pilha quando da ocorrncia da interrupo
carregado no PC. O bit GIE do registro INTCON setado (as interrupes so reativadas).\
Sintaxe
Operadores
Operao
Flags Afetados
Ciclos
Exemplo
2.11.7
RETFIE
nenhum
PC TOS
GIE 1
nenhum
2
RETFIE
Controle
NOP
Um ciclo de instruo ocorre sem que nenhuma ao seja realizada.
Sintaxe
Operadores
Operao
Flags Afetados
Ciclos
Exemplo
NOP
Nenhum
Nenhuma
Nenhum
1
NOP
CLRWDT
Reseta o timer do Watchdog. O prescaler do Watchdog tambm resetado. O bits NOT_TO e
NOT_PD so setados.
Sintaxe
Operadores
Operao
CLRWDT
nenhum
WDT 00h
WDT prescaler 0
NOT_TO 1
NOT_PD 1
NOT_TO, NOT_PD
1
CLRWDT
Flags Afetados
Ciclos
Exemplo
Alteraes nos Flags:
NOT_PD = 1: indica que no houve queda de energia.
NOT_TO = 1: indica que no houve time-out.
Exsto Tecnologia
51
Microcontroladores PIC16F877A
SLEEP
O Processador entra no modo SLEEP, desativando oscilador. O bit NOT_PD zerado; O bit NOT_TO
setado. O timer do Watchdog e seu prescaler so zerados.
Sintaxe
Operadores
Operao
SLEEP
nenhum
WDT 00h
WDT prescaler 0
NOT_TO 1
NOT_PD 0
NOT_TO, NOT_PD
1
SLEEP
Flags Afetados
Ciclos
Exemplo
Alteraes nos Flags:
NOT_PD=0 e NOT_TO=1 indicam que o microcontrolador est em modo SLEEP.
52
Microcontroladores PIC16F877A
interpretao universal de fluxograma, foi desenvolvido um conjunto especfico para trabalho com
programao de microcontroladores para esse curso. Suas principais caractersticas so possuir
smbolos diferentes para entrada e sada de dados e possuir um smbolo de Atraso, devido
importncia desse conceito para sistemas microcontrolados.
Quanto s linguagens de programao, elas so classificadas em nveis, sendo as de nvel mais alto
as prximas da linguagem humana e as de baixo nvel as prximas linguagem de mquina, que o
que o microcontrolador/processador efetivamente entende. O Assembly do PIC uma linguagem de
baixo nvel.
Exsto Tecnologia
53
<variveis>
ENDC
; *** Definies de Hardware
; *** Software
org
0000H
GOTO
; vetor de reset
INICIO
;
;
Rotina
Principal
RETFIE
; *** Rotina principal
INICIO:
< aqui fica a inicializao>
PRINCIPAL:
Incio do
Programa
Definies de
hardware e
Software
20h
Tratamento de
Interrupo
; *** Variveis
CBLOCK
Configurae
;=============================================================
;
<Nome da empresa>
;
<Nome do projeto/programa>
;=============================================================
;
Verso:
;
<numero>
<descrio da verso>
;
<descrio da finalidade e operao do programa>
;
Cristal
<freqncia> - Ti = <tempo de instruo>
;
;
<autor>
;
<e-mail do autor>
;=============================================================
#include<P16F877A.INC> ; microcontrolador a ser utilizado
__CONFIG <opes>
; configuraes do programa
Cabealho
Microcontroladores PIC16F877A
<nome da subrotina>:
; Descrio da funo da sub-rotina
; Entrada: < parmetros de entrada>
; Sada:
< parmetros de sada >
;
(1)
(2)
(3)
Sub-rotinas
; FIM DO CDIGO
Exsto Tecnologia
54
Microcontroladores PIC16F877A
Como pude ser observado, vrias partes da estrutura do programa no constituem cdigo executvel
propriamente dito, mas comentrios e outras informaes. Isso feito visando documentar
adequadamente o projeto, permitindo realizar melhor o entendimento e a manuteno do software,
alm de seu desenvolvimento.
Cabealho
O cabealho contm informaes sobre o programa, como objetivo, autor, revises e seus motivos,
dentre outras. Sua finalidade e documentar um resumo do programa, quem o responsvel pela sua
implementao e outras observaes que permitam estabelecer a finalidade e o contexto para os
quais aquele cdigo foi desenvolvido.
Assim como no cabealho, em muitas outras partes do texto so feitos comentrio e explicaes
sobre o que est sendo realizado. Esse procedimento extremamente recomendado, pois, como
logo ser percebido, o cdigo em Assembly muitas vezes no deixa claro o que est sendo feito.
comum que um programador, ao retomar um programa com o qual no trabalhou por algumas
semanas, no se lembre mais do motivo de ter feito certas partes do cdigo. Quando necessria
alguma manuteno em um programa, por pessoas que no o desenvolveram, e no h comentrios,
o trabalho se torna virtualmente impossvel.
Configuraes
Nesse ponto do programa includo o arquivo de definies do microcontrolador a ser utilizado e
so realizadas as configuraes dos bits de configurao.
Definies de Hardware e Software
Aqui so realizadas as declaraes de variveis, as definies de constantes e as definies de
hardware.
Podemos fazer definies de hardware utilizando a diretiva #DEFINE para tornar o programa mais
claro. A idia atribuir nomes aos pinos e/ou aos portais, segundo sua funo. Dessa forma, na
escrita do programa, no necessrio lembrar qual funo est associada a cada pino, apenas a
funo. Por exemplo, suponhamos que existe um LED no pino RB2, isto , no bit 2 do PORTB. mais
cmodo nos referirmos a ele simplesmente por LED, no sendo preciso lembrar onde realmente est
o LED. Alm disso, se por algum motivo for preciso mudar o LED para o pino RB6, basta alterar
somente a definio, e no todo local onde se faa referncias ao LED.
O trecho de cdigo abaixo exemplificar o que discutimos acima.
...
CBLOCK
20h
ENTRADA
; ARMAZENA OS VALORES DE ENTRADA
CONT
; CONTADOR PARA TEMPORIZAO
...
ENDC
...
#DEFINE
LED
PORTB,2
; o LED est em RB2
...
Exsto Tecnologia
55
Microcontroladores PIC16F877A
BSF
...
LED
PORTB,2
Incio do programa
aqui que o programa que vai ser gravado no microcontrolador realmente comea. A diretiva ORG
indica que o programa vai ser escrito a partir do vetor de reset (0000h). Como logo em seguida
temos o vetor de interrupo, caso esta esteja sendo utilizada, necessrio fazer um desvio para a
rotina principal do programa.
Tratamento de interrupo
A partir do vetor de interrupo (0004h) colocado o cdigo para tratar das interrupes, quando
estas forem utilizadas, conforme ser discutido no futuro.
Rotina principal
o corpo principal do programa. Na quase totalidade de programas para microcontroladores essa
rotina constituda por uma seqncia de inicializao e um loop, que ser repetido
indefinidamente. No existe uma ordem obrigatria da posio onde deve estar essa rotina, mas
comum que ele seja a primeira, ou a ltima, rotina do programa, para facilitar sua localizao.
Na inicializao do microcontrolador sero realizadas todas as configuraes do componente para
que o programa opere conforme o desejado.
Sub-rotinas
As sub-rotinas devem ser devidamente identificadas com seus cabealhos, informando sua funo e
seus parmetros de entrada e sada. Ao utilizar sub-rotinas bem feitas e documentadas reduzimos o
tempo de desenvolvimento, pois passamos a simplesmente organizar a rotinas j desenvolvidas, cujo
funcionamento totalmente descrito pelo cabealho, no sendo necessrio refazer a rotina nem
mesmo perder tempo estudando-a.
2.14 Programao estruturada
Programar de forma estruturada seguir uma srie de regras que fazem com que o software final
tenha uma estrutura que facilite seu desenvolvimento, compreenso e manuteno.
O problema a ser resolvido, que geralmente um problema complexo, deve ser dividido em blocos
de problemas mais simples, e assim sucessivamente at que os sub-problemas atinjam uma
simplicidade tal que possam ser resolvidos com o uso de estruturas bsicas. Para resolver qualquer
tipo de problema, independente de sua complexidade, existe apenas trs tipos de estruturas: a
atribuio de valores, as estrutura de deciso e as estruturas de repetio.
importante que um programa estruturado seja modular. Isto quer dizer que deve ser composto por
partes independentes do todo, que resolvam problemas especficos. Essas partes so chamadas subrotinas. Harmoniosamente organizadas, as sub-rotinas nos permitem solucionar o problema, que o
objetivo do software.
A diviso do programa em mdulos acarreta uma srie de vantagens. Como cada funo trata de um
problema especfico, fica fcil identificar onde est ocorrendo algum problema e tambm solucionaExsto Tecnologia
56
Microcontroladores PIC16F877A
lo. Alm disso, uma funo pode facilmente ser levada para outro programa onde a mesma
soluo se faa necessria, reduzindo assim o tempo de desenvolvimento. E ainda, um programa
modular mais facilmente compreendido quando lido.
Exsto Tecnologia
57
Microcontroladores PIC16F877A
3 PROGRAMANDO O PIC16F877A
3.1 Diretivas
Diretivas podem ser vistas como instrues dadas ao montador, e no ao microcontrolador. Elas so
reconhecidas ou interpretadas pelo processador e realizam vrias funes na criao do programa.
Trataremos aqui de algumas diretivas principais, que sero utilizadas na grande maioria dos
programas.
ORG e END
Sintaxe
Exemplo
ORG
<endereo>
org
INICIO:
CALL
GOTO
0000h
; inicio do programa
INIT
PRINCIPAL
A diretiva ORG indica ao compilador que o cdigo que se segue ser alojado a partir da posio de
memria indicada por <endereo>. Sempre necessria uma diretiva ORG para indicar o comeo do
programa, conforme mostrado no exemplo.
Sintaxe
END
Exemplo
org
INICIO:
...
end
0000h
; inicio do programa
; corpo do programa
; fim do programa
A diretiva END indica o fim do programa. Todo cdigo escrito deve ser finalizado com END. Qualquer
cdigo escrito aps END ser ignorado pelo compilador.
#INCLUDE
Sintaxe
#include
<nome_do_arquivo>
Exemplo
#include
#include
<PIC16F628A.inc>
;definies do 16F628A
<MINHAS_MACROS.inc>; biblioteca de macros
Exsto Tecnologia
58
Microcontroladores PIC16F877A
A diretiva #INCLUDE permite incluir arquivos no cdigo fonte principal. Esses arquivos podem ser
arquivos de definies dos microcontroladores (cada microcontrolador tem seu arquivo de
definies, que deve ser includo no incio do programa) ou bibliotecas, que so conjuntos de
funes e/ou macros j prontas. No exemplo dado, temos esses dois casos
#DEFINE e EQU
Sintaxe
#define
<nome>
<texto>
Exemplo
#define
#define
#define
SETPOINT
ENTRADA
LED
32h
PORTA
PORTB,5
Sintaxe
<nome>
EQU
<texto>
Exemplo
MEDIDA
TESTE
SETPOINT
EQU
EQU
EQU
20h
21h
32h
; varivel
; varivel
; constante
Essas duas diretivas tm funo semelhante, que estabelecer uma substituio de texto. Em ambos
os casos, elas informam ao compilador que <nome> deve ser substitudo por <texto> quando o
programa for compilado. A diferena fundamental entre elas que #DEFINE aceita textos compostos
por virgulas, pontos, espaos, etc, enquanto EQU aceita apenas uma seqncia simples de
caracteres.
Ambas as diretivas pode ser utilizadas para declarar variveis. Como veremos, declarar uma varivel
nada mais que dar um nome a um endereo de memria, que a mesma coisa que declarar uma
constante. A diferena entre constante e varivel est somente no tratamento dado no programa.
Apesar disso, vamos estabelecer o critrio de utilizar EQU para definio de variveis e #DEFINE para
definio de constantes.
Veremos na prxima diretiva que existe um jeito mais eficiente de declarar variveis.
CBLOCK e ENDC
Sintaxe
Exemplo
CBLOCK
<valor_inicial>
<nome_1>
<nome_2>
...
<nome_N>
ENDC
CBLOCK
20h
;endereo inicial da RAM geral
TESTE
MEDIDAS
VALOR
...
ENDC
A diretiva CBLOCK permite criar um bloco de constantes consecutivas. especificado um valor inicial,
que ser o valor atribudo ao primeiro nome do bloco de constantes, a partir dele, cada nome recebe
Exsto Tecnologia
59
Microcontroladores PIC16F877A
um valor em ordem crescente a partir do valor inicial. No exemplo dado, o valor inicial 20h, o que
resulta em TESTE = 20h, MEDIDAS = 21h e VALOR = 22h.
O bloco sempre terminado pela diretiva ENDC.
Essa diretiva muito til para a definio de variveis, pois nos permite estabelecer o endereo onde
comea a RAM de uso geral e simplesmente dar o nomes as variveis, sem preocupao com o
endereo individual de cada varivel. Contudo, deve-se estar atento para que o nmero de variveis
no seja to grande que extrapole os endereos do banco.
BANKSEL
Sintaxe
BANKSEL
<endereo_de_memria>
EQU
EQU
Exemplo
MEDIDA
TESTE
...
MOVFW
BANKSEL
MOVWF
BANKSEL
20h
A0h
MEDIDA
TESTE
TESTE
MEDIDA
;
;
;
;
; varivel no banco 0
; varivel no banco 1
banco 0
muda para o banco 1
banco 1
retorna ao banco 0
Essas duas diretivas so utilizadas quando necessrio realizar mudanas de bancos de RAM de
dados. BANKSEL realiza automaticamente a alterao dos valores de RP0 e RP1 para acessar
<endereo_de_memria> diretamente. BANKISEL realiza a alterao de IRP para realizar acesso
indireto.
A vantagem de se utilizar essas diretivas que no preciso saber em qual banco est o registro
acessado, apenas que ele no est no banco corrente. Como elas geram cdigo para alterar os bits
em questo, sua utilizao deve ser cuidadosa.
No exemplo acima da diretiva BANKSEL so declaradas duas variveis, MEDIDA e TESTE, nos
endereos 20h (banco 0) e A0h (banco 1), respectivamente. Considerando a formao de endereos
por 7 bits essas duas variveis correspondem ao mesmo valor de operando na instruo, no entanto
se encontram em bancos diferentes. Para a manipulao de dados entre elas necessrio o ajuste de
banco, que feito atribudo os valores corretos a RP0 e RP1. A diretiva BANKSEL realiza essa ao. No
exemplo, o valor contido em MEDIDA carregado em W, a diretiva BANKSEL realiza o ajuste de
banco para acessar a varivel TESTE, ou seja, realiza a mudana de banco para o banco 1, o valor
contido em W transferido para TESTE e a diretiva BANKSEL novamente utilizada, agora para fazer
o ajuste para o banco de MEDIDA, isto , para o banco 0.
__CONFIG
Sintaxe
__CONFIG
Exemplo
<opes>
A diretiva __CONFIG (existem dois _ (dois caracteres underline) antes de CONFIG) permite
estabelecer a configurao dos fusveis utilizada pelo programa. Fusveis ou fuses so como so
Exsto Tecnologia
60
Microcontroladores PIC16F877A
chamados os bits de configurao das diversas caractersticas especiais, das quais trataremos mais
adiante. As vrias opes, que na verdade so constantes, so associadas pelo smbolo &, que realiza
uma operao E entre os valores dessas constantes.
Para cada PIC existem vrias opes, que podem ser encontradas no arquivo de definies. A tabela
4.1 contm as opes de configurao para os PIC 16F628 e 16F628A
Opo
_BODEN_ON
_BODEN_OFF
_CP_ALL
_CP_OFF
_CPD_ON
_CPD_OFF
_PWRTE_OFF
_PWRTE_ON
_WDT_ON
_WDT_OFF
_LVP_ON
_LVP_OFF
_DEBUG_ON
_DEBUG_OFF
_RC_OSC
_LP_OSC
_XT_OSC
_HS_OSC
_WRT_OFF
_WRT_256
_WRT_1FOURTH
_WRT_HALF
Descrio
Brown-out Reset habilitado
Brown-out Reset desabilitado
Proteo de cdigo total
Proteo de cdigo desativada
Proteo da memria EEPROM habilitada
Proteo da memria EEPROM desabilitada
Power-up Timer habilitado
Power-up Timer desabilitado
Watch-dog ligado
Watch-dog desligado
Programao em baixa tenso habilitada
Programao em baixa tenso desabilitada
Depurador ativo
Depurador inativo
Oscilador externo (Modo EC)
Oscilador a cristal/ressonador modo LP
Oscilador a cristal/ressonador modo XT
Oscilador a cristal/ressonador modo HS
Proteo de escrita na FLASH desabilitada
Proteo de escrita nos primeiros 256 bytes
Proteo de escrita no primeiro quarto
Proteo de escrita em metade da memria
Tabela 4.1 Parmetros da diretiva CONFIG
Padro
x
x
x
x
x
x
x
x
3.2 Variveis
Os dados a serem manipulados pelo microcontrolador so armazenados na memria RAM de uso
geral. nessa regio da memria onde so declaradas as variveis do programa. Quando se trabalha
em Assembly no PIC somente dois tipos de varivel existem diretamente. O primeiro o byte, que
pode ser encarado como o tipo caracter (8 bits). Byte aceita valores de 0 a 255 se considerarmos
valores no sinalizados ou de 128 a 127 se considerarmos valores sinalizados (notao
complemento 2).
A outra possibilidade o tipo lgico. Nesse caso, como a varivel pode assumir somente dois valores,
verdadeiro (1 ou true) ou falso (0 ou false), so utilizados individualmente bits de bytes
pertencentes a RAM. comum se referir a esses bits como flags (bandeiras).
As variveis a serem usadas em um programa devem ser declaradas, isto , deve-se informar ao
sistema que elas existem antes de us-las, para que lhes seja destinado um espao de memria.
Exsto Tecnologia
61
Microcontroladores PIC16F877A
<nome_do_flag>
<Nome_do_byte_flags> , <bit>
Sendo que o campo <bit> pode conter valores de 0 a 7, sendo 0 o bit menos significativo do byte e 7
o mais significativo. Abaixo pode ser observado um exemplo de declarao de variveis lgicas.
FLAGS1
#define
#define
;
#define
EQU
F_RECEBEU
F_ACABOU
. . .
F_ALARME
20h
; o byte de flags ocupa o endereo 20h
FLAGS1, 0
FLAGS1, 1
FLAGS1, 7
Uma boa dica de programao usar sempre nomes de variveis e flags que deixem clara sua
funo, facilitando a compreenso do cdigo. Pode-se ainda obedecer a regra de sempre iniciar o
nome de variveis lgicas com F_, para indicar que se trata de um flag e no de um byte.
3.3 Sub-rotinas
Para a implementao de programas modulares de fundamental importncia o conceito de subrotinas. Uma sub-rotina definida como um trecho de cdigo que realiza uma ao especfica, assim
como uma funo matemtica. Ela pode ou no ter parmetros de entrada (operandos de uma
funo matemtica) e parmetros de sada (resultados). O conceito de sub-rotina admite ainda que
ela ser chamada pelo programa, isto , ela ser executada e depois retornar ao ponto onde foi
chamada.
Em Assembly, uma sub-rotina inicia-se no Label (ou rtulo) que d lhe o nome pelo qual ela ser
chamada pelo programa e termina sempre com uma instruo RETURN. A instruo RETURN
necessria para que o programa retorne ao ponto onde a sub-rotina foi chamada. As sub-rotinas
seguiro a forma geral abaixo.
<nome da subrotina>:
; Descrio da funo da sub-rotina
; Entrada: < parmetros de entrada>
; Sada:
< parmetros de sada >
;
(1)
(2)
(3)
Exemplo 4.1
Por exemplo, o cdigo abaixo soma o valor de duas variveis e salva esse valor em W.
ADD_FUNCTION:
; soma dois nmeros
;
entrada:
;
NUMERO_1
NUMERO_2
(1)
(2)
(2)
Exsto Tecnologia
62
Microcontroladores PIC16F877A
sada:
MOVFW
ADDWF
(3)
; W NUMERO_1
; W W + NUMERO_2
NUMERO_1
NUMERO_2,W
RETURN
0000H
32h
NUMERO_1
04h
NUMERO_2
ADD_FUNCTION
SOMA
GOTO
ADD_FUNCTION:
;
entrada:
;
;
sada:
MOVFW
ADDWF
(1)
(2)
(2)
(3)
; W <- NUMERO_1
; W <- W + NUMERO_2
Exsto Tecnologia
63
Microcontroladores PIC16F877A
RETURN
; retorna o resultado em W
END
Pode-se notar que abaixo do nome da sub-rotina foram introduzidas algumas linhas de comentrios
que especificam (1) o que faz a sub-rotina, (2) quais so os parmetros de entrada e (3) quais so os
parmetros de sada. extremamente recomendado que se siga esse procedimento para garantir
maior facilidade de compreenso e melhor documentao do software.
64
Microcontroladores PIC16F877A
A pilha do PIC possui somente oito nveis, isto , pode armazenar somente oito endereos de
retorno. Ela trabalha de forma circular, assim, j tendo 8 endereos armazenados, o nono substitui o
primeiro e assim por diante. Em uma analogia com uma pilha de pratos, o nono prato tomar o lugar
do primeiro que est em baixo. Portanto deve-se tomar cuidado para no se fazer mais de 8
chamadas consecutivas (incluindo a interrupo!), seno perde-se os endereos de retorno das
primeiras chamadas, fazendo com que o programa perca completamente sua seqncia lgica.
A figura 4.1 ilustra o a seqncia do programa dentro da memria, quando temos uma chamada, um
0000h
CALL A
GOTO B
RETURN
CALL C
RETURN
desvio, depois mais uma chamada, o retorno da segunda chamada e o retorno da primeira.
Figura 4.1 CALL X GOTO
No programa existiro labels com duas finalidades: indicar o incio de sub-rotinas e indicar pontos de
desvio. Para desvios curtos (poucas instrues acima ou abaixo do ponto atual) possvel utilizar a
construo:
GOTO
$ +/- k
Onde k um valor constante e $ indica o endereo atual. Sendo assim, para realizar um salto
a 3 instruo abaixo soma-se 3 ao endereo atual. Para saltar para a instruo anterior, subtrai-se 1
do endereo atual. Esses procedimentos so apresentados abaixo.
Exsto Tecnologia
65
Microcontroladores PIC16F877A
GOTO
...
GOTO
$+3
$-1
3.4 Atribuio
A estrutura mais simples existente em algoritmo ou fluxograma a atribuio, que nada mais que o
modo pelo qual se atribui valor a uma varivel. Em outras palavras, trata-se de mover o valor de uma
origem, sendo essa uma constante ou uma varivel, para uma varivel de destino. Tanto nos
fluxogramas como no portugus estruturado essa operao ser caracterizada pelo smbolo ,
sendo que o destino encontra-se na ponta da seta e a origem na extremidade oposta a ponta. Abaixo
so apresentados alguns exemplos.
Portugus Estruturado
Fluxograma
X Soma;
X Soma;
F_ALARME Falso;
F_ALARME Falso;
W k
MOVF
f, 1
f f
MOVF
f, 0
W f
MOVWF
f W
CLRF
f 0
W 0
W k e realiza o retorno
CLRW
RETLW
Orientadas a bit:
BSF
f, b
f[b] Verdadeiro
BCF
f, b
f[b] Falso
Devido ao reduzido nmero de instruo no Assembly do PIC no existem instrues que permitam
mover o contedo de uma varivel diretamente para outra ou uma constante diretamente para uma
varivel (exceto quando a constante for zero). Para mover uma constante para uma varivel utiliza-se
a seqncia abaixo.
Exsto Tecnologia
66
Microcontroladores PIC16F877A
MOVLW
; W k
MOVWF
; f W
<origem>
; W <origem>
MOVWF
<destino>
; f <destino>
PORTA
RX_DTMF
; W <-- PORTA
; RX_DTMF <-- W
Entrada
0AFh
PORTB
; W <-- 0Afh
; PORTB <-- W
Sada
Para sada de dados possvel ainda trabalhar alterando somente um bit de um portal, sendo essa
alterao refletida em um nico terminal de sada. Para isso utilizam-se as instrues de atribuio
orientadas a bit (BCF e BSF), como pode ser visto abaixo. Tambm possvel realizar entradas em
nvel de bit, procedimento esse que ser tratado mais adiante.
BCF
BSF
PORTA,3
PORTB,0
Na figura 4.2 so apresentados os smbolos de entrada (a) e sada (b) para fluxogramas.
(a)
(b)
67
Microcontroladores PIC16F877A
Se
Se-Seno
Se-Seno-Se
Caso
CONTADOR,F
LOOP
Os procedimentos acima descritos podem ser utilizados para o teste de bits em portais, realizando
assim deciso e entrada de dados ao mesmo tempo. Dessa forma consegue-se maior agilidade no
software. O exemplo abaixo realiza uma deciso a partir de um bit de entrada; neste caso o bit em
questo foi definido com o nome SENSOR_1.
BTFSC
GOTO
SENSOR_1
DISPARA_ALARME
; Se (SENSOR_1 = Verdadeiro)ento
;
dispara o alarme
Exsto Tecnologia
68
Microcontroladores PIC16F877A
3.7 Condies
As decises que devem ser tomadas em um programa muitas vezes so baseadas na comparao
numrica entre dois valores, isso , se esses valores so iguais ou no, qual o maior, etc. No set de
instrues da linha PIC 16Xxxx no existe nenhuma instruo de comparao. Ento para realizar
comparao se faz necessrio utilizar instrues de teste associada a manipulaes matemticas.
Assim, antes de tratar propriamente das estruturas de decises, deve-se saber como reconhecer
essas condies.
Condies A = B e A != B
Uma forma simples de saber se dois valores so iguais subtraindo um do outro: se o resultado for
zero os dois valores so iguais; qualquer outro resultado significa que os valores so diferentes. Em
Assembly realiza-se a subtrao e estuda-se o bit Z do registro STATUS, conforme pode ser
observado no exemplo abaixo.
Simule esse exemplo, alterando o valor da varivel MEDIDA para 25h e outros valores e observado o
que ocorre.
#INCLUDE<P16F877A.INC>
CBLOCK
20H
MEDIDA
ENDC
ORG
MOVLW
SUBWF
BTFSC
GOTO
GOTO
IGUAIS:
GOTO
DIFERENTES:
GOTO
0000H
25h
MEDIDA,W
STATUS,Z
IGUAIS
DIFERENTES
;
;
;
;
;
W <-- 25h
W <-- MEDIDA - W
Se (Medida = 25h) ento
desvia para IGUAIS
seno, desvia para diferentes
END
E ainda, para testar se uma varivel igual a zero, pode-se utilizar a instruo MOVF, tendo como
destino o prprio registro. Nesse caso o valor da varivel movido para ela mesma, no sofrendo
qualquer alterao. Porm, se a varivel for igual a zero o bit Z de STATUS ser afetado, assumindo
valor igual a 1.
Condies A > B, A >= B, A < B, A <= B
Pode haver a necessidade de saber qual de dois valores o maior, sendo eles diferentes entre si.
Para tanto, novamente subtrai-se um valor pelo outro e ento analisa-se o bit de Carry (Transporte)
que o bit C do registro STATUS.
Supondo dois valores , A e B, diferentes e tais que A > B, temos que:
A B : resultado normal (valor positivo)
Exsto Tecnologia
69
Microcontroladores PIC16F877A
0000H
MAX
MEDIDA,W
STATUS,C
AJUSTE
REPETE
;
;
;
;
;
W <-- MAX
W <-- MEDIDA - W
Se (MEDIDA >= MAX) ento
AJUSTE chamado
seno desvia para REPETE
; \
; > corpo da sub-rotina
; /
;retorna para o endereo de chamada
END
Finalmente, para testar se um valor somente menor ou maior que outro, e no igual, testa-se na
mesma operao o bit Z de STATUS. O cdigo abaixo exemplifica essa operao:
#INCLUDE<P16F877A.INC>
CBLOCK
20H
MEDIDA
ENDC
ORG
MOVLW
SUBWF
BTFSC
GOTO
BTFSC
GOTO
GOTO
0000H
05h
;
MEDIDA,W
;
STATUS,Z
;
IGUAL
;
STATUS,C
MAIOR ; se MEDIDA >
MENOR ; se MEDIDA <
W <-- 05h
W <-- MEDIDA - W
Se (Medida = 05h) ento
desvia para IGUAIS
05h
05h
: C = 1
: C = 0
Exsto Tecnologia
70
Microcontroladores PIC16F877A
IGUAL:
GOTO
MENOR:
GOTO
MAIOR:
GOTO
END
C
0
1
0
1
Condio
A<B
A>B
impossvel
A=B
3.8 Se
A estrutura de deciso Se funciona da seguinte forma: se a condio for verdadeira, o
Bloco_verdadeiro executado; seno, programa continua o fluxo normalmente a partir de Fim_Se.
Em outras palavras, o cdigo contido no Bloco_verdadeiro executado somente se a condio for
verdadeira.
Se (<condio>) ento
[Bloco_verdadeiro]
<Condio>
Bloco
Fim_Se
A implementao dessa estrutura pode ser feita com uma instruo de teste e salto seguida por uma
chamada de funo. Essa chamada contem o Bloco_verdadeiro. conveniente a utilizao de uma
chamada de funo, pois o programa retorna ao ponto onde foi chamado e continua o programa da
prxima linha, isto , do mesmo ponto de onde continuaria se a condio fosse falsa. Esse
procedimento exemplificado abaixo.
BTFSS
PORTB,2
CALL
BL_VERDADE
BCF
PORTC,0
. . .
BL_VERDADE:
MOVLW 0Fh
MOVWF PORTB
RETURN
Exsto Tecnologia
71
Microcontroladores PIC16F877A
Se por algum motivo no for interessante a utilizao de uma chamada, devemos fazer o teste
inverso, de forma a desviar quando a condio for falsa. Esse desvio deve ser para o ponto que
tambm ser o destino do termino do bloco verdade. O trecho de cdigo abaixo realiza o mesmo
que o cdigo anterior, porm sem a utilizao de chamada.
BTFSC
GOTO
MOVLW
MOVWF
FIM_SE:
BCF
. . .
PORTB,2
FIM_SE
0Fh
PORTB
; se (PORTB[2] != Vedadeiro)ento
;
segue para END_IF
; se (PORTB[2] = Vedadeiro) ento
;
executa o bloco verdadeiro
PORTC,0
3.9 Se seno
A estrutura Se-Seno uma derivao da estrutura Se onde, alm de um bloco a ser executado
somente quando a condio for verdadeira (o Bloco_verdadeiro), existe um bloco a ser executado
somente quando a condio for falsa (o Bloco_falso). Sua representao ilustrada abaixo.
Se (<condio>) ento
<Condio>
[Bloco_verdadeiro]
Bloco
Falso
Seno
Bloco
Verdadeiro
[Bloco_falso]
Fim_Se
Essa estrutura implementada em Assembly por uma instruo de teste e salto seguida de dois
desvios, conforme o trecho abaixo.
CBLOCK
20H
CANAL
TST1
ENDC
ORG
MOVFW
SUBLW
SKPNZ
GOTO
GOTO
BL_VERDADE:
MOVLW
MOVWF
GOTO
BL_FALSO:
MOVLW
MOVWF
0000H
CANAL
35h
BL_VERDADE
BL_FALSO
03h
TST1
FIM_SE
;
;
;
;
STATUS,Z
08h
TST1
; vai para o Fim_Se
Exsto Tecnologia
72
Microcontroladores PIC16F877A
FIM_SE:
$
; os dois
; para aqui.
END
0000H
MOVFW
SUBLW
SKPNZ
GOTO
CANAL
35h
MOVLW
MOVWF
GOTO
08h
TST1
FIM_SE
BL_VERDADE
STATUS,Z
BL_VERDADE:
MOVLW
MOVWF
03h
TST1
; Bloco Verdadeiro
FIM_SE:
$
END
A diferena entre esses dois cdigos que no segundo, as instrues do bloco falso vm logo em
seguida ao desvio BL_VERDADE sem que seja necessrio colocar outro desvio para a as instrues a
serem executadas em caso de a condio da estrutura de deciso ser falsa.
3.10 Se seno se
Uma outra possibilidade de construo utilizando-se a estrutura Se-Seno a chamada estrutura SeSeno-Se, que simplesmente a implementao onde o bloco falso de uma estrutura Se-Seno
composto por outra estrutura Se-Seno. Esta forma pode ser utilizada em cascata, possibilitando a
verificao de quantas possibilidades forem necessrias no programa. Abaixo apresentada a forma
geral dessa estrutura. Deve-se notar que todos os FIM_SE da estrutura levam na verdade a um
mesmo ponto. E ainda, pode haver ou no um Bloco Falso, que ser executado caso nenhuma das
condies seja satisfeitas.
Exsto Tecnologia
73
Microcontroladores PIC16F877A
V
Bloco
Verdadeiro
Condio 1
V
Bloco
Verdadeiro
Condio 2
V
Bloco
Verdadeiro
Condio 3
F
Bloco
Falso
Exsto Tecnologia
74
Microcontroladores PIC16F877A
CBLOCK
20h
TEMP
UMIDADE
ENDC
ORG
0000H
TEST_TEMP:
MOVLW
SUBWF
SKPC
GOTO
CALL
GOTO
TEST_2:
MOVLW
SUBWF
SKPC
GOTO
CALL
GOTO
TEST_3:
MOVLW
SUBLW
SKPNC
GOTO
CALL
GOTO
DEFAULT:
CALL
FIM_SE:
GOTO
ESFRIA:
NOP
RETURN
.30
TEMP,W
TEST_2
ESFRIA
FIM_SE
.80
UMIDADE,W
TEST_3
ALARME
FIM_SE
.20
UMIDADE
DEFAULT
MOLHA
FIM_SE
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
1o. teste
W <-- 30
W <-- TEMP - W
Se (TEMP < 30) ento
vai para o prximo teste
Se (TEMP > 30) ento
executa a sub-rotina
vai para Fim_Se
2o. teste
W <-- 80
W <-- UMIDADE - W
Se (UMIDADE < 80) ento
vai para o prximo teste
Se (UMIDADE > 80) ento
executa a sub-rotina
vai para Fim_Se
3o. teste
w <-- 20
W <-- UMIDADE - W
Se (UMIDADE > 20) ento
vai para a exceo
Se (UMIDADE < 20) ento
executa a sub-rotina
vai para Fim_Se
tratamento de exceo
VENTILAR
TESTE_TEMP
ALARME:
NOP
RETURN
MOLHA:
NOP
RETURN
VENTILAR:
NOP
RETURN
END
3.11 Caso
A estrutura Caso (Case ou Switch) uma estrutura de admite mltiplas condies de igualdade, com
um bloco verdade para cada condio. Existe tambm a possibilidade de um bloco de exceo para
tratar os casos que no se enquadram em nenhuma condio. Dessa forma temos:
Exsto Tecnologia
75
Microcontroladores PIC16F877A
Caso <Varivel> de
<Opo 1>:
[Bloco_1]
<Opo 2>:
[Bloco_2]
<Opo 3>:
[Bloco_3]
...
<Opo n>:
[Bloco_n]
Seno: [Bloco_exceo]
Fim_caso
A estrutura Caso apresentada em fluxograma similar a estrutura Se-Seno-Se, porm as condies
devem ser somente igualdades de uma mesma varivel.
Usando essa estrutura em Assembly pode-se construir tabelas, que so de grande utilidade em
muitos casos. Elas so de grande ajuda no trabalho com displays de segmentos e na linearizao de
medidas analgicas provenientes de sensores no lineares. Uma tabela de software comporta-se
como uma tabela no papel, onde a partir de um valor de entrada obtemos um valor de sada
associado a ele. Como exemplo podemos implementar uma tabela que retorne uma letra do alfabeto
a partir do valor de sua posio ou uma tabela que retorne o quadrado do valor de entrada.
Para construo de tabelas utilizada a instruo RETLW (Retorna com uma constante em W).
Primeiramente feito um desvio por software, somando-se o valor de uma varivel ao Registro PCL
(bits menos significativos do PC (Program Counter)). Dessa forma a prxima instruo a ser
executada a n-sima instruo aps a soma, sendo n o valor contido na varivel.
Algumas regras devem ser observadas na construo de tabelas. Primeiramente deve-se estar atento
ao banco onde se encontra a tabela. recomendado que se faa uma tabela no incio de um bloco de
256 endereos (0000h, 0100h, 0200h, etc.), pois caso a operao de soma com o PCL der overflow,
isto , resultar em um valor maior que 256 o PCLATH no ser incrementado automaticamente, o
que limita o tamanho da tabela em 256 valores. Alm disso, um overflow em PCL causado por uma
instruo de soma no ocasiona automaticamente o incremento de PCH (bits mais significativos do
PC). Dessa forma no se pode fazer tabelas com comprimento maior que 256 itens sem um
tratamento especial, supondo que nesse caso a tabela comece no primeiro endereo de cada bloco
de 256 endereos.
A linha
ADDWF PCL,F
soma um valor n com o PC, o que resulta em a prxima instruo executada ser n-sima aps a
soma. Ou seja, a instruo a ser executada est no n-simo endereo a partir do endereo seguinte a
instruo ADDWF. Esse processo chamado desvio por software.
Exsto Tecnologia
76
Microcontroladores PIC16F877A
A rotina abaixo, que converte valores em BCD para a palavra de ativao dos respectivos caracteres e
um display de LEDs ligado a um portal. A sub-rotina chamada SEGMENTOS; dentro dela feito um
desvio para o label TABLE e o retorno realizado por uma das instrues RETLW. O endereo de
TABLE tal que o primeiro valor da tabela ocupa a posio 700h. Admite-se que a varivel NUMERO
no contm valores maiores que 9. O registro PCLATH carregado com 07h porque esse o valor da
parte mais significativa das linhas tabela (como pode ser observado a direita) e o endereo para onde
se desvia dado pelo par PCLATH e PCL
SEGMENTOS:
MOVFW
GOTO
;
. . .
ORG
TABELA:
MOVLW
MOVWF
ADDWF PCL,F
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
NUMERO
TABELA
06FDH
07H
PCLATH
01110111B
00000110B
10110011B
10010111B
11000110B
11010101B
11110101B
00000111B
11110111B
11010111B
11100111B
11110100B
01110001B
10110110B
11110001B
11100001B
;
;0
;1
;2
;3
;4
;5
;6
;7
;8
;9
;A
;B
;C
;D
;E
;F
ABCDEFG
1111110
0110000
1101101
1111001
0110011
1011011
1011111
1110000
1111111
1111011
1110111
0011111
1001110
0111101
1001111
1000111
(0700h)
(0701h)
(0702h)
(0703h)
(0704h)
(0705h)
(0706h)
(0707h)
(0708h)
(0709h)
(070Ah)
(070Bh)
(070Ch)
(070Dh)
(070Eh)
(070Fh)
Exsto Tecnologia
77
Microcontroladores PIC16F877A
3.12.1
Faa-Enquanto
Faa
[Bloco]
Bloco
Enquanto (<Condio>)
Cond?
F
CONTROL,W
PORTB
MEDIDA
;
; \
; > Bloco
; /
MOVFW
SUBLW
BTFSC
GOTO
MED
40h
STATUS,C
LOOP
...
3.12.2
Enquanto
Enquanto (<Condio>)
[Bloco]
V
Cond?
Bloco
Fim_Enquanto
Exsto Tecnologia
78
Microcontroladores PIC16F877A
LOOP:
CALL
SUBLW
BTFSS
GOTO
MEDIDA
40h
STATUS,C
CONTINUA
;
;
;
;
;
INCF
MOVWF
MOVFW
GOTO
CONTINUA:
. . .
3.12.3
CONTROL,W
PORTB
MED
LOOP
; \
; > Bloco
; /
Para
Para (For): estrutura de repetio que tem uma caracterstica que a torna diferente da estruturas de
repetio at agora estudadas: nas estruturas Enquanto e Faa-Enquanto a condio da estrutura
uma condio aleatria, isto , ela no depende da estrutura de repetio; isso significa que o
nmero de vezes que o bloco repetido no conhecido a priori. Na estrutura Para a condio est
intimamente ligada a estrutura e seu estado alterado por esta. De fato, a estrutura Para serve para
que blocos de cdigo sejam repetidos um nmero de vezes conhecido, o que implica na existncia de
uma varivel contadora associada estrutura.
Deve-se notar ento que para essa estrutura a varivel contadora no deve ter seu valor alterado
pelo bloco de instrues, somente pela estrutura de repetio em si.
Para <contador> = <valor_inicial> at <valor_final> faa
[Bloco]
Fim_Para
<contador> <valor inicial>
Bloco
Passo
A estrutura funciona da seguinte maneira: (1) primeiramente a varivel contadora recebe o valor
inicial. (2) O programa entra no loop propriamente dito, o bloco executado e (3) a instruo que
dar o passo contagem das vezes que o loop executada. (4) Em seguida testado se a varivel
Exsto Tecnologia
79
Microcontroladores PIC16F877A
contadora atingiu o valor final. Se o atingiu, o programa sai do loop e segue; seno o processo
repetido novamente a partir do ponto (2).
O passo como a varivel contadora varia a cada execuo do loop. Apesar de poder assumir
qualquer forma (por exemplo, a cada execuo do loop o contador pode ser elevado ao quadrado)
normalmente o passo ou um incremento (contador contador + 1) ou um decremento (contador
contador - 1).
Pelo exposto acima, o bloco contido na estrutura ser repetido N vezes, N dado por:
N = <valor final> - <valor inicial>
Ou
CONT,F
; CONT CONT 1
; se (CONT = 0) salta a prxima instruo
CONT,F
; CONT CONT + 1
; se (CONT = 0) salta a prxima instruo
; obs: saltar a prxima instruo signifi
; ca no executar a instruo seguinte a
; a DECFSZ ou INCFSZ
Para o caso de INCFSZ, o valor do contador ser igual a zero quando for somado 1 ao valor 255.
Se INCFSZ for usado, o valor final obrigatoriamente ser 256, ento o valor inicial deve ser calculado
subtraindo a quantidade de vezes que o loop deve ser executado de 256. Por exemplo, para N = 12, o
valor inicial deve ser 256 - 12 = 244. Quando usada a instruo DECFSZ o valor final
obrigatoriamente ser 0. Dessa forma, o valor inicial ser o nmero de vezes que o bloco deve se
repetir. A contagem nesse caso regressiva, isto , o passo de decremento. O cdigo abaixo
apresenta um loop que ser repetido 123 vezes.
. . .
MOVLW
MOVWF
.123
CONT
LOOP:
CALL
DECFSZ
GOTO
. . .
TX_SERIAL
CONT,F
LOOP
Exsto Tecnologia
80
Microcontroladores PIC16F877A
Porm muitas vezes no se deseja que uma instruo seja executada imediatamente aps outra. Em
muitas situaes necessitamos de gerar atrasos na execuo normal do programa. Por exemplo, em
muitos casos onde um usurio interage com o microcontrolador, necessrio esperar o usurio; em
muitas situaes tambm preciso respeitar a temporizao de outros componentes, no to
rpidos quanto o microcontrolador. Esses atrasos so conseguidos com as chamadas sub-rotinas de
atraso, ou de delay (atraso, em ingls), como mais comum cham-las.
Existem basicamente dois modos de se conseguir delay. Um seria utilizando o Timer incorporado
ao microcontrolador, trabalhando ento com temporizao por interrupo, a qual ser tratada
mais adiante. Outra forma criando estruturas de repetio nas quais possamos perder o tempo
necessrio, que a temporizao por software.
Ainda considerando o PIC trabalhando a 1 MIPS (1 Milho de Instrues Por Segundo) quando
necessrio um atraso de 10s basta executarmos 10 vezes uma instruo qualquer. Porm, aplicando
o mesmo raciocnio para um atraso de 3s necessrio repetir a mesma instruo 3.000.000 vezes, o
que ocupa 3.000.000 endereos da memria de programa! Como pode ser notada, na maior parte
das vezes no podemos criar delays com a simples seqncia do nmero de instrues necessrio. O
que se faz a criar estruturas de repetio que executem um ou algumas instrues o nmero de
vezes necessrio para nos dar o atraso desejado. Repetir um bloco de 4 instrues 50 vezes equivale
(do ponto de vista do tempo gasto) a executar 200 instrues. Deve-se tomar cuidado, porm, com o
fato de que a estrutura de repetio tambm demora um tempo para ser executada. Para atrasos
precisos devemos considerar o tempo de execuo das estruturas, principalmente quando temos
laos de repetio dentro de outros laos de repetio.
O ncleo de uma rotina de delay estrutura de repetio Para responsvel por repetir um bloco de
instrues um determinado nmero de vezes. Observemos o trecho de cdigo abaixo. Os
comentrios em cada linha indicam quantos ciclos de mquina so executados em cada instruo
(Devemos lembrar que instrues de desvio e instrues de teste, quanto a condio testada
verdadeira, gastam 2 ciclos de mquina).
MOVLW
MOVWF
n
CONT1
; 1
; 1
LOOP1:
NOP
DECFSZ
GOTO
CONT1,F
LOOP1
; 1
; 1 normalmente, 2 quando CONT1 == 0 | Bloco
; 2
No cdigo acima, n ser substitudo por uma constante que, como veremos mais a seguir, dar o
tempo de execuo do cdigo. O bloco ser repetido at que CONT1, que decrementado a cada
execuo, resulte em 0. Ou seja, o bloco ser repetido n vezes. Como a execuo do bloco leva 4
ciclos de mquina, o tempo total gasto na repetio do bloco 4 x n. J o tempo total de execuo
da rotina do trecho de cdigo deve levar em considerao o tempo gasto para carregar a varivel
CONT1, que de 2 ciclos de mquina. Portanto, podemos concluir que o tempo total de execuo
desse trecho de cdigo dado pela equao (1) , sendo TCY o tempo do ciclo de mquina do
microcontrolador (que estamos considerando como sendo de 1s):
Exsto Tecnologia
81
Microcontroladores PIC16F877A
T = ( 4 n + 2) TCY
(1)
; 1
; 1
; 1
\
CONT1,F
; 1 normalmente, 2 quando CONT1 == 0 | Bloco
LOOP1
; 2
RETURN
T = ( 4 n + 6) TCY
(2)
Para determinar o valor da constante n basta isol-la na equao (2) e obtemos a equao (3),
lembrando sempre que n um valor inteiro entre 1 e 255.
n = 0,25 T
6
TCY
(3)
Devemos atentar para duas limitaes dessa sub-rotina. A primeira que no possvel obter um
valor de n inteiro para qualquer valor de T. Por exemplo, para T = 31s temos n = 6,25. Nesse caso,
se adotarmos n = 6 obtemos um tempo de 30s. Nessa situaes, porm, a diferena entre o valor
desejado e o valor obtido ser sempre pequena, e podemos completar o tempo necessrio com a
simples adio de um instruo NOP
Outra limitao que o valor mximo de n 255, o que nos leva a um tempo mximo de 1,026 ms.
Para obter tempos maiores que esse o procedimento considerar todo o cdigo da rotina como
sendo um bloco, e inseri-lo dentro de outro loop. Observe como isso feito na sub-rotina baixo.
DELAY_MAIOR:
; rotina de atraso para tempos maiores que 1 ms
; entrada:
nulo
; sada:
nulo
MOVLW
m
; 1
MOVWF
CONT2
; 1
LOOP2:
; --- --- --- --- --- --- --- --- --- --- --MOVLW
n
; 1
MOVWF
CONT1
; 1
LOOP1:
Exsto Tecnologia
82
Microcontroladores PIC16F877A
NOP
; 1
\
DECFSZ
CONT1,F
; 1 normalmente, 2 quando CONT1 == 0 | Bloco
GOTO
LOOP1
; 2
; --- --- --- --- --- --- --- --- --- --- --DECFSZ
CONT2,F
; 1 normalmente, 2 quando CONT2 == 0
GOTO
LOOP2
; 2
83
RETURN
O tempo total gasto para essa rotina determinado pela equao (4). A equao (5) permite calcular
o valor de m arbitrando-se o valor de n.
T = [(4 n + 5) m + 6]TCY
(4)
6
TCY
m=
4n + 5
T
(5)
Com essa rotina possvel se obter tempos de at 261,381 ms. Para tempos ainda maiores, basta
usar o mesmo raciocnio: considerar a sub-rotina um bloco e coloc-la dentro de outro loop.
Exsto Tecnologia
Microcontroladores PIC16F877A
4 RECURSOS AVANADOS
4.1 Display de cristal Lquido
Grande parte das aplicaes com microcontroladores necessitam de uma interface homem-mquina,
para que os usurios possam passar informaes ao sistema e/ou receber informaes dele. Para
que informaes do sistema sejam passadas ao usurio pode-se utilizar uma serie de recursos,
porm muitos deles no so nada maleveis e alguns pouco amigveis. Por exemplo, um modo
bastante simples de se ter informaes do sistema atravs de um painel com LEDs, cada um
indicando uma determinada situao. Embora em muitas aplicaes s isso seja suficiente, em
muitas outras, principalmente quando a quantidade e variedade de informaes so grande, esse
mtodo se torna insuficiente. Outro mtodo tambm muito utilizado e que, porm, aceita uma
grande variedade e quantidade de informaes o Display de Cristal Lquido (LCD Liquid Cristal
Display).
Existe uma grande variedade de LCDs no mercado. Existem displays grficos e displays que aceitam
somente caracteres, esses ltimos chamados displays alfanumricos. Esses podem ter diferentes
quantidades de linha e colunas. LCDs alfanumricos tem uma determinada inteligncia, isto ,
possuem circuitos que controlam o display propriamente dito, e fazer com que algo seja escrito no
LCD somente o trabalho de comunica-se com esses circuitos.
Para a comunicao com o display so necessrios 8 bits como via de dados (podendo tambm ser
configurado para trabalhar com 4 bits), um bit EN (Enable - Habilitao) e um bit RS (seleo entre
dados e comandos). O display reconhece dois tipos de informao na via de dados: comandos e
dados. Os comandos, que so reconhecidos quando RS = 0, so instrues para o display (limpar a
tela, ir para a segunda linha, ir para a dcima coluna, etc... ); os dados so caracteres a serem escritos
no display, e so indicados por RS = 1. A 4 bits da via de dados so ligados aos bits 4 a 7 do LCD.
Abaixo apresentada uma tabela resumida de cdigos hexadecimais de comandos do LCD.
Exsto Tecnologia
84
Microcontroladores PIC16F877A
Descrio do Comando
Modo
RS
R/W
Controle do display
0
0
0
0
0
0
Cdigo do Comando
(Hexadecimal)
0C
0A, 08
01
02
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0E
0C
0F
10
14
02
0D
04
Para direita
06
Deslocamento da
Para esquerda
mensagem com a entrada
Para direita
de um novo caracter
07
05
Deslocamento da
mensagem sem entrada
de novos caracteres
Endereo da primeira
posio ( esquerda)
Para esquerda
18
Para direita
1C
1a Linha
80
2a Linha
C0
Sentido de deslocamento
do cursor na entrada de
um novo caracter
Exsto Tecnologia
85
Microcontroladores PIC16F877A
Smbolo
Funo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Vss
Vdd
Vo
RS
R/W
EN
D0
D1
D2
D3
D4
D5
D6
D7
GND
+5V
Controle de contraste
Seleo de modo
Leitura/Escrita
Habilitao
PORTE, 0
0
PORTE, 1
PORTD, 0
PORTD, 1
PORTD, 2
PORTD, 3
PORTD, 4
PORTD, 5
PORTD, 6
PORTD, 7
Via de
Dados
// seleciona comando
// bits mais significativos primeiro
// espera 50 us
// espera 50 us
// espera 50 us
Exsto Tecnologia
86
Microcontroladores PIC16F877A
Dados:
LCD_DADO (byte Dado)
{
RS Verdadeiro;
// seleciona dado
PORTD Comando;
// bits mais significativos primeiro
Atraso de 50 us;
// espera 50 us
EN Verdadeiro;
Atraso de 50 us;
// espera 50 us
EN Falso;
Atraso de 50 us;
// espera 50 us
}
Dever ser criada uma funo que gere um atraso de aproximadamente 50 s.
Enquanto EN estiver em 0 (Falso) qualquer mudana em RS ou na via de dados ignorada pelo
display.
Alm dessas duas sub-rotinas bsicas, deve-se criar tambm uma sub-rotina de inicializao do
display, pois esse tambm necessita ser configurado. Essa sub-rotina ser chamada logo aps a
inicializao do microcontrolador. Somente para a inicializao deve-se utilizar um atraso de 5ms na
rotina de envio de comando. Uma seqncia de inicializao bsica apresentada abaixo.
4.2 Teclado
Uma forma muito comum de usurio de um sistema microcontrolado passar informaes ao sistema
atravs de teclas. Em muitas aplicaes o nmero teclas existentes pode ser bastante grande.
Nesses casos, a leitura dessas teclas simplesmente conectando-as aos terminais do microcontrolador
incorre na utilizao de muitos terminais. Nessa aplicao apresentado um sistema de varredura
que permite fazer um uso otimizado dos terminais do microcontrolador de foram a reduzir o nmero
de terminais utilizados.
Para essa experincia ser feito uso do teclado do kit. Esse mdulo funciona implementando um
sistema de varredura que nos permite realizar a leitura de um nmero de teclas N utilizando menos
de N entradas. Isso importante quando existe uma grande quantidade de teclas a serem lidas e no
se dispe tanta entrada.
Para o caso da placa de teclado existem 16 teclas e seus estados so lidos com apenas 4 sadas e 4
entrada, num total de 8 terminais. A varredura funciona da seguinte maneira: o teclado organizado
de forma a ter 4 colunas e 4 linhas, conforme a figura abaixo. Cada linha ligada a uma entrada, e
cada coluna a uma sada. Existem resistores de pull-up nas entradas de forma que enquanto uma
tecla no for pressionada, a entrada ficando em aberto tem nvel lgico alto. Comeando a
varredura, forado 0 na coluna 0 (C0), 1 nas coluna 1 (C1), 2 (C2) e 3 (C3) e so lidas as quatro
linhas (L0, L1, L2 e L3). Em seguida coloca-se 1 em C0 e C2 e 0 em C1 e lem-se as linhas, e assim
Exsto Tecnologia
87
Microcontroladores PIC16F877A
sucessivamente.. Nos momentos em que feita a leitura das linhas podemos determinar se uma
tecla est pressionada e qual essa tecla da seguinte maneira: admitindo que a tecla est ligada a
coluna que est em zero no momento a linha ligada a ela estar em tambm. As linhas que contm
teclas que no esto pressionadas estaro em 1, devido aos resistores de pull-up. Seguindo esse
raciocnio podemos gerar a seguinte tabela:
C3
C2
C1
C0
L3
L2
L1
L0
Tecla
1
1
1
0
1
1
1
0
1
1
1
0
1
1
1
0
1
1
0
1
1
1
0
1
1
1
0
1
1
1
0
1
1
0
1
1
1
0
1
1
1
0
1
1
1
0
1
1
0
1
1
1
0
1
1
1
0
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0
1
1
1
1
1
1
1
1
1
1
1
1
1
2
3
A
4
5
6
B
7
8
9
C
*/F
0
#/E
D
Exsto Tecnologia
88
Microcontroladores PIC16F877A
No programa que utilizar leitura de teclado deve-se ativar os resistores de pull-up do portal B. Caso
contrrio, o teclado no funcionar corretamente. Isso feito zerando o bit NOT_RBPU do registro
OPTION_REG, assim
BCF OPTION_REG, NOT_RBPU
PIC
I/O
PORTB,0
Sada
PORTB,1
Sada
PORTB,2
Sada
PORTB,3
Sada
PORTB,4
Entrada
PORTB,5
Entrada
PORTB,6
Entrada
PORTB,7
Entrada
Tabela 7.4 Conexes do teclado
4.3 Interrupes
Interrupes so poderosos recursos presentes nos sistemas computacionais, que permitem
desenvolver cdigos mais elaborados e profissionais, garantindo tratamento imediato a eventos de
maior prioridade.
Suponhamos uma situao em que o microcontrolador realize medidas para mostr-las em um
display. Entre cada processo de leitura de medidas, o microcontrolador aciona uma rotina para ler o
estado de um boto, que quando acionado, seleciona a medida. Se o processo de leitura levar alguns
segundos, corre-se o risco de pressionar o boto durante esse processo de forma que o
microcontrolador no tome conhecimento deste pressionamento. O ideal que o processo de leitura
fosse contnuo e que pudesse ser interrompido para executar a rotina referente ao acionamento do
boto quando o mesmo fosse pressionado.
Uma interrupo faz exatamente isso: interrompe a execuo normal do programa para executar
tarefas de maior prioridade no momento. Ela pode ser chamada por determinados eventos, parando
a execuo normal no momento em que ocorre o evento, executando o cdigo armazenado em uma
posio de memria vinculada a interrupo e depois retornam a execuo normal do programa. As
interrupes podem ser vistas como chamadas de sub-rotinas realizadas pelo hardware.
Observe que a distncia entre o vetor de inicializao (0000h) e o vetor de reset (0004h) de apenas
4 endereos. Dessa forma quando as interrupes esto desabilitadas o PC passa por 0004h
normalmente durante a execuo de um programa. Quando se faz necessrio o uso de interrupes,
as rotinas de tratamento de interrupo so colocadas a partir do vetor de reset 0004h. No intervalo
entre o vetor de inicializao e o vetor de reset colocado um desvio para um endereo aps as
rotinas de interrupo a partir do qual o programa realmente comea.
Quando ocorre um pedido de interrupo para a CPU do PIC16F877A, o programa desviado para
um endereo pr-estabelecido, o vetor de reset (0004h). Desse endereo em diante feito o
tratamento de interrupo, isto , so executadas as rotinas que se deseja associar ao evento
causador da interrupo.
Exsto Tecnologia
89
Microcontroladores PIC16F877A
Interrupo do timer 0;
Interrupo do timer 1;
Interrupo do timer 2;
Interrupo externa (RB0/INT);
Interrupo por mudana de estado (bits 4 a 7 do portal B);
Interrupo de transmisso serial;
Interrupo de recepo serial;
Interrupo do mdulo comparador analgico;
Interrupo do mdulo CCP1;
Interrupo do mdulo CCP2;
Interrupo da memria EEPROM;
Interrupo do conversor analgico para digital;
Interrupo da porta paralela escrava;
Interrupo da comunicao SPI;
Interrupo por coliso no barramento I2C.
A cada interrupo so associados dois bits, para seu controle, sendo que um o bit de habilitao,
alterado somente pelo programa, e o outro o flag indicador de interrupo, que setado quando
ocorre a interrupo em questo. Esse ltimo bit pode, porm, ser alterado tambm pelo programa.
A Figura 2.9 mostra a lgica como se relacionam as interrupes. Existem mais dois bits envolvidos
no trabalho com interrupo, PEIE e GIE. PEIE habilita as interrupes dos perifricos. GIE, por sua
vez, realiza a habilitao global. Como pode ser notado, se GIE estiver em 0 todas interrupes
esto desabilitadas; se GIE estiver em 1 as interrupes que estiverem habilitadas geraro pedidos
de interrupo CPU.
90
Microcontroladores PIC16F877A
Ateno: Os flags das interrupes so setados quando ocorre um evento que geraria a interrupo,
mesmo que essa interrupo no esteja habilitada.
As interrupes externas, isto , que so causadas diretamente por eventos externos ao
microcontrolador, so a interrupo INT em RB0 e a interrupo por mudana de estado do portal B.
As demais interrupes so internas, ou seja, causadas pelos perifricos para indicar determinados
eventos (chegada de dado pelo portal serial, "estouro" de timer, etc).
Quando ocorre uma interrupo o endereo chamado (sempre) o vetor de interrupo (0004h).
Conseqentemente, a rotina de tratamento de interrupo deve obrigatoriamente comear nesse
endereo.
Para a determinar qual interrupo ocorreu testa-se os bits de flags de todas as interrupes ativas.
Pela ordem em que esses bits so testados pode-se atribuir a prioridade interrupo, sendo que as
interrupes testadas em primeiro lugar tm prioridade maior.
Ao contrrio de alguns microcontroladores, quando ocorre uma interrupo nenhum registro
automaticamente salvo. Assim importante salvar os registros W e STATUS antes que seja realizado
qualquer tratamento de interrupo, bem como qualquer outro SFR que for usado dentro e fora das
rotinas de interrupo. Esse processo chamado salvamento de contexto. Tambm recomendvel
que o registro STATUS seja zerado. necessrio ento que existam variveis criadas para salvar esses
registros. Outra prtica recomendada de nunca usar dentro de uma rotina de tratamento de
interrupo registros que so utilizados em outras partes do programa. Todo esse cuidado
necessrio por que uma interrupo pode ocorrer a qualquer momento. Portanto, se durante a
execuo de um trecho do programa um determinado endereo de memria (varivel do programa
ou SFR) usado, e exatamente quando esse trecho execuatdo ocorre o pedido de interrupo que
altera o valor do registro em questo, quando retornar a execuo do programa normal o valor do
registro ter sido alterado.
Um outro cuidado que deve ser tomado quando se trabalha com interrupes no executar
rotinas muito grandes. Isso porque o tratamento de interrupo deve tomar medidas emergenciais.
Nada que no seja estritamente necessrio deve ser trabalhado na interrupo, e isso principalmente
porque podem ocorrer vrias interrupes em seguida, e s se pode tratar uma por vez. Quando
uma interrupo chamada, a habilitao das demais fica desativada, e s reativada aps a
execuo do RETFIE. Se outra interrupo ocorrer nesse intervalo de tempo, ela tratada aps
RETFIE. Deve-se notar que o que ativa a chamada de interrupo a existncia de um flag setado de
uma interrupo habilitada. Assim, depois de tratar uma determinada interrupo deve-se zerar o
flag associado a ela. Caso contrrio, o programa fica travado, pois cada vez que h o retorno de
interrupo (instruo RETFIE), a interrupo chamada novamente.
Finalmente, necessrio considerar que na realidade o tratamento de interrupo no ocorre no
exato momento em que a interrupo acontece. Primeiramente, a checagem dos eventos que
causam a interrupo obedece a uma varredura interna. E depois de detectado o evento, algumas
aes devem ser realizadas, como o desvio para o endereo 0004h, por exemplo. O tempo decorrido
entre a ocorrncia real do evento que causa interrupo e incio de seu tratamento efetivo
chamado de latncia da interrupo. Assim, aps a real ocorrncia de uma interrupo ela s vai
comear a ser tratada 3 ciclos de mquina aps sua ocorrncia, se for uma interrupo interna, e de
Exsto Tecnologia
91
Microcontroladores PIC16F877A
3 a 3,75 ciclos de mquina se for uma interrupo externa. Esses tempos devem ser considerados
em aplicaes onde a preciso de tempo importante.
R/W 0
PEIE
R/W 0
T0IE
R/W 0
R/W 0
R/W 0
R/W 0
INTE
RBIE
T0IF
INTF
R/W x
RBIF
Bit 0
INTCON
GIE: Habilitao global das interrupes
o 1 = interrupes habilitadas
Exsto Tecnologia
92
Microcontroladores PIC16F877A
o 0 = interrupes desabilitadas
PEIE: Habilitao das interrupes de perifricos
o 1 = interrupes de perifricos habilitadas
o 0 = interrupes de perifricos desabilitadas
T0IE: Interrupo do timer 0 (por overflow)
o 1 = interrupo habilitada
o 0 = interrupo desabilitada
INTE: Interrupo RB0/INT
o 1 = interrupo habilitada
o 0 = interrupo desabilitada
RBIE: Interrupo por mudana de estado no portal B
o 1 = interrupo habilitada
o 0 = interrupo desabilitada
T0IF: flag da interrupo do timer 0
o 1 = ocorreu overflow de timer 0
o 0 = no ocorreu overflow de timer 0
INTF: flag da interrupo INT
o 1 = ocorreu interrupo externa
o 0 = no ocorreu interrupo externa
RBIF: flag da interrupo por mudana de estado no portal B
o 1 = pelo menos um dos bits RB4~RB7 mudou
o 0 = nenhum dos bits RB4~RB7 mudou
PIE1 (Banco 1)
Contm bits de habilitao de interrupes de perifricos. Essas interrupes s ocasionam chamada
se PEIE estiver em 1.
R/W 0
PSPIE
Bit 7
R/W 0
ADIE
R/W 0
RCIE
R/W 0
R/W 0
R/W 0
R/W 0
R/W 0
TXIE
SSPIE
CCP1IE
TMR2IE
TMR1IE
Bit 0
PIE1
EEIE: Interrupo de operao de escrita na EEPROM
o 1 = interrupo habilitada
o 0 = interrupo desabilitada
CMIE: Interrupo do mdulo comparador analgico
o 1 = interrupo habilitada
o 0 = interrupo desabilitada
RCIE: Interrupo de recepo da USART
o 1 = interrupo habilitada
o 0 = interrupo desabilitada
TXIE: Interrupo de transmisso da USART
o 1 = interrupo habilitada
o 0 = interrupo desabilitada
CCP1IE: Interrupo do CCP1
o 1 = interrupo habilitada
o 0 = interrupo desabilitada
TMR2IE: Interrupo do Timer 2
o 1 = interrupo habilitada
o 0 = interrupo desabilitada
TMR1IE: Interrupo do Timer 1
Exsto Tecnologia
93
Microcontroladores PIC16F877A
o
o
1 = interrupo habilitada
0 = interrupo desabilitada
PIR1 (Banco 0)
Contm flags das interrupes de perifricos.
R/W 0
EEIF
Bit 7
R/W 0
CMIF
R/W 0
RCIF
R/W 0
U0
R/W 0
R/W 0
R/W 0
TXIF
CCP1IF
TMR2IF
TMR1IF
Bit 0
PIR1
EEIE: Flag de operao de escrita na EEPROM
o 1 = operao de escrita completa
o 0 = operao de escrita incompleta ou no iniciada
CMIF: Flag do mdulo comparador analgico
o 1 = houve mudana no estado das sada dos comparadores
o 0 = no houve mudana no estado das sada dos comparadores
RCIF: Interrupo de recepo da USART
o 1 = o buffer de recepo est cheio
o 0 = o buffer de recepo est vazio
TXIF: Interrupo de transmisso da USART
o 1 = o buffer de recepo est vazio
o 0 = o buffer de recepo est cheio
CCPIF Flag do CCP1
o Modo Captura
1 = ocorreu a captura do registro TMR1
0 = no ocorreu a captura do registro TMR1
o Modo Comparador
1 = ocorreu uma comparao de igualdade com TMR1
0 = no ocorreu uma comparao de igualdade com TMR1
o Modo PWM
No utilizado
TMR2IF: Flag de igualdade entre PR2 e TMR 2
o 1 = ocorreu igualdade entre PR2 e TMR2
o 0 = interrupo desabilitada
TMR1IF : Flag de overflow de Timer 1
o 1 = ocorreu overflow de TMR1
o 0 = no ocorreu overflow de TMR1
PIE2 (Banco 1)
Contm bits de habilitao de interrupes de perifricos. Essas interrupes s ocasionam chamada
se PEIE estiver em 1.
R/W 0
Bit 7
R/W 0
CMIE
R/W 0
-
R/W 0
R/W 0
R/W 0
R/W 0
R/W 0
EEIE
BCLIE
CCP2IE
Bit 0
PIE1
Exsto Tecnologia
94
Microcontroladores PIC16F877A
R/W 0
Bit 7
R/W 0
CMIF
R/W 0
-
R/W 0
U0
R/W 0
R/W 0
R/W 0
EEIF
BCLIF
CCP2IF
Bit 0
PIR1
CMIF: Flag do mdulo comparador analgico
o 1 = houve mudana no estado das sada dos comparadores
o 0 = no houve mudana no estado das sada dos comparadores
EEIF: Flag de operao de escrita na EEPROM
o 1 = operao de escrita completa
o 0 = operao de escrita incompleta ou no iniciada
BCLIE: Flag de coliso no barramento I2C
o 1 = ocorreu uma coliso no barramento I2C (estando o mdulo SSP configurado
no modo I2C Master)
o 0 = no ocorreu uma coliso no barramento I2C
CCPIF Flag do CCP1
o Modo Captura
1 = ocorreu a captura do registro TMR1
0 = no ocorreu a captura do registro TMR1
o Modo Comparador
1 = ocorreu uma comparao de igualdade com TMR1
0 = no ocorreu uma comparao de igualdade com TMR1
o Modo PWM
No utilizado
O trecho de cdigo abaixo trata salvamento de contextos e pode ser utilizado como base para rotinas
de tratamento de interrupo.
; Definio das variveis para salvamento
CBLOCK
20h
INT_W
INT_STATUS
INT_FSR
ENDC
...
; Tratamento de interrupo
org
0004H
; Vetor de interrupo
Exsto Tecnologia
95
Microcontroladores PIC16F877A
MOVWF
MOVFW
MOVWF
CLRF
MOVFW
MOVWF
INT_W
STATUS
INT_STATUS
STATUS
FSR
INT_FSR
;
;
;
;
;
;
salva W em INT_W
\
> salva STATUS em INT_STATUS
zera STATUS
\
> salva FSR em INT_FSR
; \
; > tratamento das interrupes
; /
MOVFW
MOVWF
MOVFW
MOVWF
MOVFW
INT_STATUS
STATUS
INT_FSR
FSR
INT_W
RETFIE
; \
; > recupera STATUS
; \
; > recupera FSR
; recupera W
; retorno de interrupo
Exsto Tecnologia
96
Microcontroladores PIC16F877A
se executar a rotina de leitura do teclado, identificando a tecla lida e retornando as colunas a nvel
lgico baixo.
Esse funcionamento bastante til em sistema que ficam muito tempo ociosos. Nesses casos
possvel colocar o microcontrolador em modo de baixo consumo e acorda-lo somente quando uma
tecla for pressionada, num processo parecido ao utilizado em celulares.
Exsto Tecnologia
97
Microcontroladores PIC16F877A
5 PERIFRICOS DO PIC16F877A
5.1 Timers
Um dos perifricos mais comuns em qualquer linha de microcontroladores Timer/Couter
Temporizador/ Contador.
Trata-se de nada mais, nada a menos, que um componente contador dentro do microcontrolador. Se
atuar fazendo contagem de eventos externos, aleatrios, dito no modo contador (Counter). Se o
evento que causa a contagem for um sinal peridico de freqncia conhecida, gerado dentro ou fora
do microcontrolador, dito no modo temporizador (timer).
O PIC16F877A possui trs timers: timer 0, Timer 1 e Timer 2. A operao dos trs bastante
semelhante, bastando estudar apenas um (no caso o Timer 1) para se estar habilitado a trabalhar
com os outros dois.
5.1.1 Timer 1
O Timer 1 um temporizador/contador (timer/counter) de 16 bits. O sinal de clock pode ser
selecionado como interno ou externo. Caso seja usada a fonte de clock interna, o sinal ser o do
clock de perifricos, que corresponde freqncia do oscilador dividida por 4. No caso kit, que utiliza
um cristal de 4MHz, trata-se de um sinal com perodo de 1 microssegundo. J no caso de sinal de
clock externo, o sinal deve ser aplicado ao terminal RC0. Quando se utiliza fonte de clock externo
possvel selecionar em qual transio (subida ou descida) o timer incrementa. Existem ainda uma
interrupo no overflow do timer e uma pr-escala programvel que permite dividir a freqncia do
sinal de clock at por 8.
A figura 9.1 apresenta o diagrama eltrico simplificado do timer 1. O contador propriamente dito
composto pelo par de registros TMR1H e TMR1L. Quando ocorre o overflow desse timer o flag
TMR1IF setado, podendo ocasionar uma interrupo. Para economia de energia o timer pode ser
desabilitado atravs do bit TMR1ON, que inibe os pulsos de clock para o timer. O sinal de clock, caso
seja externo, pode ser sincronizado ou no com o clock interno; essa escolha feita atravs do bit
T1SYNC. A pr-escala permite dividir a freqncia do sinal de clock por 1, 2, 4 ou 8. Atravs do bit
TMR1CS seleciona-se se a fonte de clock interna ou externa. Sendo externo, o clock pode ser
gerado por qualquer circuito conectado a RC0 ou por um oscilador prprio do timer, que ativado
por T1OSCEN. Esse oscilador permite colocar um cristal (tipicamente de 32.768 Hz) entre RC0 e RC1,
e que pode operar quando o microcontrolador estiver em SLEEP, ou seja, com o oscilador principal
desligado.
Exsto Tecnologia
98
Microcontroladores PIC16F877A
U0
-
R/W 0
T1CKPS1
R/W 0
R/W 0
R/W 0
R/W 0
R/W 0
T1CKPS0
T1OSCEN
T1SYNC
TMR1CS
TMR1ON
Bit 0
T1CON
A pr-escala do timer 1 permite a seleo de 4 fatores de diviso, atravs do bits T1CKPS1 e T1CKPS0,
conforme mostrado na tabela 9.1.
Valor
Taxa de diviso
T1CKPS1
T1CKPS0
0
0
1:1
0
1
1:2
1
0
1:4
1
1
1:8
Tabela 9.1 Pr-escala do timer 1
Exsto Tecnologia
99
Microcontroladores PIC16F877A
H tambm o bit TMR1ON, que permite desligar todo o timer 1 quando este no for usado,
reduzindo assim o consumo de energia. Ele tambm pode ser utilizado para parar o timer em
algumas situaes que trataremos mais adiante.
O timer 1 tem trs modos de operao:
temporizador
contador
o sncrono
o assncrono
No modo temporizador, o sinal de clock utilizado o clock de perifrico (TMR1CS = 0). Nesse caso,
seu funcionamento bem semelhante ao do timer 0, porm realizando contagens de 0000h FFFFh
(16 bits), alm da pr-escala.
O modo contador, por sua vez, utiliza como fonte de clock o sinal aplicado ao terminal RB6. O timer
incrementado a cada transio de subida nesse pino. Podemos trabalhar no modo sncrono ou
assncrono. A seleo de modo feita pelo bit T1SYNC, sendo que 0 indica modo sncrono e 1
modo assncrono.
No modo sncrono o sinal de clock amostrado duas vezes a cada ciclo de instruo. Se a taxa de
diviso do pr-escala for 1, significa que o sinal de entrada aplicado diretamente ao circuito de
sincronismo. Nestas condies, o sinal aplicado deve ter tempos em alto e em baixo de no mnimo 2
ciclos de instruo mais 20 ns. Por outro lado, se o valor da pr-escala for diferente de 1, os tempos
mnimo de alto e baixo so de 10 ns e o perodo mnimo depende do fator de diviso, conforme
mostrado na tabela 9.4. Como o modo sncrono depende do sinal de clock, se o microcontrolador for
colocado em modo SLEEP (baixo consumo) o timer para de funcionar.
No modo assncrono, o contador trabalha de forma completamente independente do clock do
microcontrolador. Essa configurao pode ser utilizada no modo SLEEP, inclusive podendo acionar a
interrupo, fazendo o microcontrolador sair do modo de baixo consumo. Nesse modo, os tempos
mnimos em alto e em baixo so de 30ns e o perodo mnimo de 60ns, com ou sem pr escala.
A tabela 9.2 resume os limites de operao do timer 1 nos vrios modos.
Parmetro
Largura de pulso
(alto e baixo)
Perodo
Condio
Valor mnimo
0,5TCY + 20
15
30
TCY + 40
N
Assncrono
60
Tabela 9.2 Requisitos mnimos para o timer 1
Unidade
ns
ns
ns
ns
ns
Novamente devemos tomar cuidados contra bouncing quando a fonte do sinal de contagem for
mecnica.
Exsto Tecnologia
100
Microcontroladores PIC16F877A
5.1.3 Interrupo
O bit de habilitao da interrupo do timer o TMR1IE do registro PIE1. O bit indicador de overflow
do timer TMR1IF de PIR1.
U0
-
R/W 0
CCP1X
R/W 0
R/W 0
R/W 0
R/W 0
R/W 0
CCP1Y
CCP1M3
CCP1M2
CCP1M1
CCP1M0
Bit 0
CCP1CON
Os bits CCP1X e CCP1Y so utilizados somente no modo PWM. Os demais bits implementados servem
para seleo de modos de operao, conforme apresentado na tabela 10.1. Deve-se observar que
aps o reset, o mdulo CCP fica desativado.
Valor
Modo
Exsto Tecnologia
101
Microcontroladores PIC16F877A
CCP1M3
0
0
0
0
0
1
1
1
1
1
CCP1M2
0
1
1
1
1
0
0
0
0
1
CCP1M1 CCP1M0
0
0
Mdulo CCP desligado
Transio de descida
0
0
Captura
Transio de subida
0
1
4 transies de subida
1
0
16 transies de subida
1
1
0
0
Comparao Pino de sada em 1 na coincidncia
Pino de sada em 0 na coincidncia
0
1
Somente seta flag de interrupo
1
0
Reset timer (Special trigger)
1
1
x
x
PWM
Tabela 10.1 Modos de operao do mdulo CCP
Para operao nesse modo, o terminal RB3/CCP1 deve estar configurado como entrada e o timer
deve estar no modo temporizador ou no modo contador sncrono.
O modo captura pode ser utilizado para determinar a diferena de tempo entre dois eventos. Isso
pode ser feito de duas formas. No primeiro evento, o timer resetado e no segundo, o valor
capturado do timer 1 multiplicado pelo perodo do seu clock corresponde ao tempo transcorrido
entre os dois eventos. Outra forma deixar o timer 1 incrementado livremente e capturar seu valor
nos dois eventos. Fazendo uma subtrao entre os dois valores capturados, temos o tempo entre os
eventos. Esse procedimento pode ser utilizado para medir velocidade e freqncias (nesse caso
temos o perodo e sabemos que f = 1/T).
Os modos onde o evento de captura a ocorrncia de 4 ou 16 transies podem ser vistos como
tendo uma pr-escala na entrada. Essa pr-escala pode ser til para trabalhar com sinais de
freqncias altas, como ser mostrado. Sua contagem s pode ser zerada com a mudana de modo
do CCP.
A figura 10.1 apresenta o diagrama em blocos para o modo de captura.
Exsto Tecnologia
102
Microcontroladores PIC16F877A
103
Microcontroladores PIC16F877A
pulsos de freqncia fixa. Por exemplo, admitindo que estamos trabalhando com o PWM do PIC, sua
resoluo mxima de 10 bits, ou seja, 1023 corresponde a 100% de duty-cicle. Usando uma regra
de trs simples, podemos determinar a quanto que corresponde 30%, 25%, 99%, etc. chamada de
modulao porque permite carregar uma informao (expressa no duty-cicle) em uma portadora
(trem de pulsos).
A maior parte das aplicaes de PWM para microcontroladores se aproveita da propriedade da
energia de um sinal retangular ser proporcional ao seu duty-cicle (a energia de um sinal est
relacionada com a rea entre o sinal e o eixo do tempo). Vamos imaginar que um sinal PWM
aplicado a uma lmpada DC. Um duty-cicle de 100% (sinal sempre em 1) far a lmpada acender em
sua potncia mxima; j um sinal com 70% de tempo em alto entrega a lmpada 70% da potncia
mxima, e assim por diante. Essa propriedade utilizada no acionamento de cargas DC, controle de
motores, etc.
Outra caracterstica importante do PWM que, se o sinal for filtrado, podemos obter nveis
analgicos, tambm proporcionais ao duty-cicle. Isso permite que geremos desde nveis analgicos
fixos at sinais mais complexos, como tons DTMF (de telefonia).
O PWM precisa de uma base de tempo que dar a freqncia do sinal. O mdulo CCP utiliza o Timer
2 para conseguir essa base. Isso pode ser observado no diagrame em blocos do PWM, na figura 10.3.
Tambm necessrio que o pino RB3/CCP1 seja configurado como sada.
104
Microcontroladores PIC16F877A
(10.1)
Onde:
TPWM : perodo do PWM
TOSC: perodo do oscilador
TMR2PS: fator de pr-escala do timer 2
Para encontrar o valor de PR2 a partir de um dado valor de perodo pode ser usada a equao 10.2.
Valor de PR2 deve ser inteiro e menor que 256. Logo, em alguns casos ser necessrio arredondar
esse valor, o que gerar um pequeno erro entre a freqncia desejada e a real. Com valores
diferentes de pr-escala podemos chegar a valores menores que 256 e a aproximaes que levem a
um erro menor.
PR 2 =
TPWM
1
4 TOSC TMR2 PS
(10.2)
O duty-cicle por sua vez configurado atravs de CCPR1L e dos bits 4 e 5 de CCP1CON. Geralmente
se especifica o duty-cicle em porcentagem do tempo total. Assim, dado um duty-cicle em
porcentagem (DC%), o tempo correspondente a ele encontrado pela equao 10.3
TDC = TPWM DC %
100
(10.3)
(10.4)
Onde:
Exsto Tecnologia
105
Microcontroladores PIC16F877A
DC[9 : 0] =
T DC
TOSC TMR 2 PS
(10.5)
O perodo (e conseqentemente a freqncia) dado pelo registro PR2. Para freqncias altas
(perodos pequenos) existe uma perda da resoluo, isto , na verdade trabalhamos com menos de
10 bits. Por exemplo, se o valor usado para PR2 for 63, os dois bits mais significativos so perdidos
e 100% de duty-cicle corresponder 255. Teremos um PWM de 8 bits. A resoluo, dada em bits,
para uma dada freqncia de PWM dada pela equao 10.6.
FOSC
)
FPWM
log( 2)
log(
RESOLUO =
(10.6)
5.2.4 Interrupo
O bit de habilitao de interrupo CCP1IE em PIE1. O flag de interrupo CCP1IF em PIR1.
O evento que dispara a interrupo depende do modo de trabalho. Assim a interrupo significa:
Modo Captura: a ocorrncia de uma captura
Modo Comparao: coincidncia entre TMR1H:TMR1L e CCPR1H:CCP1L
Modo PWM: no h interrupo associada a esse modo.
Exsto Tecnologia
106
Microcontroladores PIC16F877A
As limitaes dessa tcnica surgem quando as distncias entre os pontos que se deseja comunicar
aumentam. Em primeiro lugar para interconexo de equipamentos em distncias grandes o uso de
comunicao paralela exige conectores de muitos pinos e cabos de vrias vias.Como pode ser
intudo, o custo dos cabos e conectores proporcional ao nmero de vias do cabo.
Alm do custo dos cabos outro impedimento para a comunicao paralela so os efeitos reativos
(capacitivos e indutivos) dos meios de comunicao paralela (sejam eles cabos ou trilhas numa
placa). Em altas taxas de transmisso devemos considerar os condutores a luz da teoria de guias de
ondas, que de forma resumida nos diz que em altas freqncias um fio ou uma trilha no devem ser
encarados como um curto-circuito, mas como uma associao de resistncias, capacitncias e
indutncias. Em virtude disso os sinais podem se degradas por interferncia mtua e tambm, pelas
prprias caractersticas do meio. Outro ponto importante o rudo (interferncia) inserido nos
condutores e proveniente do onde eles esto. Novamente o maior nmero de condutores agrava a
situao. Esses fatos so inerentes a qualquer linha de transmisso de sinais eltricos, mas o agrava
os problemas na comunicao paralela que cada linha de transmisso um meio diferente das
demais, ou seja, cada bit degradado de forma diferente. Isso pode acarretar problemas na
comunicao de dados a distncias longas (o critrio para dizer se uma distncia grande sua
comparao com o comprimento de onda do sinal que se transmite), limitando assim a comunicao
a pequenas distncias em alta velocidade (por exemplo, barramentos do PC) ou a distncias maiores
com baixa taxa de transmisso (por exemplo, comunicao entre PC e impressora).
107
Microcontroladores PIC16F877A
Como o prprio nome diz, na comunicao serial sncrona existe um sincronismo, nesse caso entre o
sinal transmitido e um clock enviado juntamente. O clock permite determinar o exato momento em
que o bit do sinal deve ser lido, evitando assim erros na recepo e a correta montagem do dado na
forma paralela. Entres as formas de comunicao serial sncrona podemos citar o I2C e o SPI, que no
sero tratados aqui.
J na comunicao assncrona nenhuma referencia de onde o bit deve ser lido enviado com o sinal.
A soluo nesse caso adivinhar o momento certo de ler o bit. Para isso necessrio que o
receptor saiba a taxa e transmisso, e portanto a durao de cada bit, e que o transmissor indique de
alguma forma onde comea e onde termina a transmisso. Dessa maneira, o receptor aguarda a
chegada da indicao de incio, chamado start bit ou bit de incio e quando esse lido ele sabe que a
cada intervalo de tempo, chamado tempo de bit (tB) um bit novo est presente na via de
comunicao. Para minimizar o risco de erro a leitura feita na metade da durao do bit ou so
feitas algumas amostras durante esse intervalo de tempo.
Aparentemente, se procedermos dessa forma, bastaria enviar um start bit e para sincronizar
receptor e transmissor e depois poderia vir uma seqncia infinita de bits. Na verdade, porm, isso
no ocorre, pois sempre existira uma pequena diferena entre as bases de tempo de TX e RX. Como
uma amostra ocorre tB aps a anterior, se esse tempo estiver errado, o erro vais se acumulando at
que se perca o sincronismo. Por exemplo, se o relgio de RX for 5% mais lento ou mais rpido que o
de TX a cada 20 bits recebido o sincronismo ser perdido. Na prtica os dados so enviados em
pacotes de alguns bits, iniciados por um start bit e terminados por um stop bit. O stop bit tem a
funo de marcar o fim do pacote, para que um bit de informao no seja confundido com um novo
start bit.
O formato genrico de um pacote de comunicao serial apresentado na figura abaixo.
Tempo ocioso
(opcional)
1, 1 ou 2 stop bits
Bit de paridade (opcional)
5 a 9 bits de dados
1 start bit
Exsto Tecnologia
108
Microcontroladores PIC16F877A
5.3.3 EIA-232C
Popularmente conhecido como RS-232, esse protocolo foi inicialmente desenvolvido para permitir a
comunicao entre computadores e modens, para transmisso de dados a longa distncia. A norma
que rege o protocolo a TIA/EIA-232, cuja reviso C a mais recente (1969).
Devido a sua aplicao inicial como protocolo de comunicao entre um terminal de computador e
um equipamento de comunicao, o protocolo estabelece os conceitos de DTE (Data Terminal
Equipament Equipamento Terminal de Dados) e DCE (Data Communication Equipament
Equipamento de comunicao de dados). O sentido dos pinos de comunicao dado do ponto de
vista do DTE. Como tipicamente o EIA-232 utilizado para comunicao entre um computador e o
microcontrolador vamos sempre admitir aqui que computador o DTE e o microcontrolador DTE.
A norma especifica vrios pinos mas na prtica os mais utilizados so os apresentados na tabela
abaixo. As funes e direes dos pinos so dadas em funo do DTE
Pino
TxD
RxD
RTS
CTS
DSR
DTR
Funo
Transmisso do DTE para o DCE
Transmisso do DCE para o DTE
Sinaliza que o DTE est pronto para receber dados do DCE
Sinaliza que o DCE est pronto para receber dados do DTE
DCE pronto para operao
DTE pronto para operao
Tabela 11.1 - Pinos de comunicao serial
Direo
Sada
Entrada
Sada
Entrada
Entrada
Sada
Os pinos DSR e DTR servem para indicar que os equipamentos esto conectados e prontos para
comunicao. DTS e CTS servem para fazer controle de fluxo: Quando o DTE tem dados para
transmitir ele informa o DCE atravs de RTS; se o DCE pode receber esses dados CTS ativado.
As sinalizao so ativadas em 0 e desativadas em 1.
Em uma grande maioria dos casos so utilizados apenas os terminais de transmisso e recepo de
dados, podendo ser usado um cabo com apenas 3 fios (TxD, RxD e Terra).
Segundo a norma, a comunicao serial pode suportar taxas de bit (geralmente chamadas baud rate)
de at 20 kbps. possvel realizar comunicao full-duplex, ou seja, nos dois sentidos ao mesmo
tempo.
A distncia mxima do cabo de comunicao deve ser inferior a 15 metros (50 ps).
Umas das principais causas da limitao de taxa e distncia do EIA-232C limitao nos tempos de
subida e descida do sinal, que deve ser menor que 4% do tempo de bits.
As especificaes eltricas do EIA-232C podem ser observadas na figura abaixo.
Exsto Tecnologia
109
Microcontroladores PIC16F877A
TX
Cabo
RX
+15V
+15V
0
+5V
+3V
?
-3V
-5V
-15V
-15V
A diferena entre os mdos Sncrono Mestre e Escravo que o Mestre gera o clock para os escravos.
Abordaremos somente o modo assncrono, que nos permitir implementar uma comunicao sob o
protocolo RS-232 com o PC.
Os pinos do microcontrolador associados USART so RB6 para transmisso (TxD) e RB7 para
recepo (RxD). Quando a USART est habilitada esses pinos deixam de operar como entradas e
sadas digitais.
Exsto Tecnologia
110
Microcontroladores PIC16F877A
111
R/W 0
R/W 0
CSRC
Bit 7
R/W 0
TX9
TXEN
R/W 0
U0
R/W 0
R1
SYNC
BRGH
TRMT
R/W 0
TX9D
Bit 0
TXSTA
R/W 0
RX9
R/W 0
SREN
R/W 0
R/W 0
R0
R0
R x
CREN
ADDEN
FERR
OERR
RX9D
Bit 0
RCSTA
Microcontroladores PIC16F877A
112
Alm das configuraes feitas pelos registros acima importante configurar a taxa de transmisso da
comunicao serial. Isso feito carregando o valor adequado no registro SPBRG, que configura o
gerador de taxa de transmisso do PIC. Para determinar esse valor usada a equao 11.1, se o bit
BRGH est 0, e a equao 11.2 se BRGH est em 1.
Taxa =
Fosc
64 ( SPBRG + 1)
(11.1)
Taxa =
Fosc
4 ( SPBRG + 1)
(11.2)
5.3.5 Transmisso
Durante o processo de transmisso serial assncrona entra em operao o circuito apresentado na
figura 11.3.
Microcontroladores PIC16F877A
5.3.6 Recepo
Para receber dados de forma serial o circuito interno a USART comporta-se como apresentado na
figura 11.4
Exsto Tecnologia
113
Microcontroladores PIC16F877A
Feito isso, basta monitorar o bit RCIF, que ser setado toda vez que existir um dado vlido no registro
RCREG.
Exsto Tecnologia
114
Microcontroladores PIC16F877A
O mdulo ADC realiza todo o processo de Sample and Hold (Amostragem e reteno). Esse
processo realizado quando uma determinada entrada selecionada e inicia-se a carga de um
capacitor interno CHOLD . Aps o tempo de carga do capacitor (THOLD) a entrada desconectada e
inicia-se o processo de converso da tenso armazenada no capacitor, que feito pelo mtodo de
aproximaes sucessivas. A figura abaixo apresenta o circuito equivalente da entrada da do ADC.
115
Microcontroladores PIC16F877A
116
Microcontroladores PIC16F877A
ADCON1
Esses bits permitem configurar a quais dos terminais que so multiplexados com entradas do ADC
sero entradas analgicas e quais sero I/O digitais. As configuraes possveis so apresentadas pela
tabela abaixo.
117
Microcontroladores PIC16F877A
2.
3.
4.
5.
6.
U0
Bit 7
U0
U0
U0
R/W x
R/W 0
R/W 1
WRERR
WREN
WR
R/W 1
RD
Bit 0
EECON1
Exsto Tecnologia
118
Microcontroladores PIC16F877A
O bit WRERR permite que em aplicaes de maior segurana sejam tomadas providncias caso
ocorra uma falha na gravao de algum dado. O bit WREN impede a escrita acidental da EEPROM.
O processo de leitura se d da seguinte maneira: o endereo a ser lido carregado no registro
EEADR; em seguida o bit RD setado, dando incio ao processo de leitura. Quando a leitura foi
finalizada, o bit RD zerado pelo hardware, indicando que o dado j foi lido e se encontra no registro
EEDATA. O bit RD s pode ser zerado pelo hardware.
Para a escrita da memria, inicialmente os registros EEDATA e EEADR so carregados com o dado a
ser escrito e o endereo, respectivamente. Em seguida deve ser habilitada a escrita, fazendo WREN
igual 1. Em seguida, uma seqncia obrigatria, que consiste em carregar os valor 55h e AAh no
registro EECON2, deve ser realizada para permitir a gravao da memria. Esse mais um dispositivo
de segurana contra escritas acidentais da EEPROM. Por fim, o bit WR setado, dando incio ao
processo de escrita, e quando ele se torna 0, o processo de gravao foi concludo. WR tambm s
pode ser setado pelo software.
EEADR
E2ADR
EEADR
EECON1,RD
EEDATA
E2DATA
PORTA
de
->
->
->
dados
endereo a ser lido
dado lido
dado lido
;
;
;
;
;
;
;
RETURN
WRITE_EEPROM:
; realiza a escrita da EEPROM de dados
;
entrada:
E2DATA
-> Dado a ser escrito
;
E2ADR
-> Endereo a ser escrito
;
sada:
nulo
BANKSEL
MOVFW
MOVWF
MOVFW
MOVWF
BSF
BCF
EEADR
E2ADR
EEADR
E2DATA
EEDATA
EECON1,WREN
INTCON,GIE
;
;
;
;
;
;
;
MOVLW
55H
Exsto Tecnologia
119
Microcontroladores PIC16F877A
MOVWF
MOVLW
MOVWF
BSF
EECON2
0AAH
EECON2
EECON1,WR
; sequencia
;
obrigatria
;
; inicia processo de gravao
CLRWDT
BTFSC
GOTO
EECON1,WR
$-2
BSF
BCF
INTCON,GIE
EECON1,WREN
; reabilita as interrupes
; desabilita gravao
BANKSEL
PORTA
; retorna ao banco 0
RETURN
STATUS,RP0
; Banco 3
BSF
EECON1,EEPGD
BSF
NOP
NOP
EECON1,RD
; Leitura da FLASH
; A memria lida nesses dois ciclos
;
Exsto Tecnologia
120
Microcontroladores PIC16F877A
BCF
MOVFW
MOVWF
MOVFW
MOVWF
BCF
STATUS,RP0
EEDATA
E2DATA
EEDATH
E2DATH
STATUS,RP1
;
;
;
;
;
;
Banco 2
parte menos significativa do
dado lido
parte mais significativa do
dado lido
Banco 0
RETURN
WRITE_FLASH:
; realiza a escrita da memria FLASH de programa
; entrada: EEADR
-> LSByte do endereo a ser gravado(Banco 2)
;
EEADRH
-> MSByte do endereo a ser gravado(Banco 2)
;
EEDATA
-> LSByte do dado a ser gravado (Banco 2)
;
EEDATH
-> MSByte do dado a ser gravado (Banco 2)
; sada:
nulo
BCF
STATUS,RP0
;
BSF
STATUS,RP1
; Banco 2
MOVFW E2ADR
; parte menos significativa
MOVFW EEADR
;
do endereo a ser escrito
MOVFW E2ADRH
; parte mais significativa
MOVFW EEADRH
;
do endereo a ser escrito
MOVFW EEDATA
; parte menos significativa do
MOVWF E2DATA
;
dado a ser escrito
MOVFW EEDATH
; parte mais significativa do
MOVWF E2DATH
;
dado a ser escrito
BCF
STATUS,RP0
;
BSF
EECON1,EEPGD
; Acesso a memria FLASH
BSF
EECON1,WREN
; Habilita gravao
BCF
INTCON,GIE
; Desabilta interrupes
MOVLW
MOVWF
MOVLW
MOVWF
BSF
55h
EECON2
0AAh
EECON2
EECON1, WR
;
; EECON1 <- 55h
;
; EECON1 <- AAh
; Inicia gravao
BSF
BCF
INTCON,GIE
EECON1,WREN
;
;
;
;
;
;
;
BCF
BCF
STATUS,RP0
STATUS,RP1
;
; Banco 0
NOP
NOP
RETURN
Exsto Tecnologia
121
Microcontroladores PIC16F877A
Apndices
Apndice A Conjunto de Instrues do PIC16
Exsto Tecnologia
122
Microcontroladores PIC16F877A
Exsto Tecnologia
123