Buscar

Considera es b sicas sobre o PIC16F877A (1)

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 24 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 24 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 24 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Coleção TUTPRO
Tutoriais sobre programação de microcontroladores
Solbet Ltda
Expandindo a percepção humana
Neste volume: Considerações básicas sobre o PIC16F877
versão 1.0 Campinas 10/11/2007
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 1
Sumário
Recursos necessários para execução deste tutorial...............................................................................3
Introdução.............................................................................................................................................3
A estrutura desta série de tutoriais...................................................................................................4
O que é um microcontrolador...............................................................................................................4
A Arquitetura do microcontrolador PIC16F877A...........................................................................6
Como se programa um microcontrolador ............................................................................................8
As origens do PIC16F877A .................................................................................................................9
Compreendendo a arquitetura do PIC16F877A ................................................................................10
A estrutura interna do PIC16F877A .............................................................................................12
A descrição dos terminais do PIC16F877A ..................................................................................13
A descrição da estrutura interna do PIC16F877A.........................................................................16
 As diferentes áreas de memória...............................................................................................16
O controle do fluxo de programa...................................................................................................19
O sistema de interrupts..................................................................................................................20
As configurações do oscilador......................................................................................................21
O sistema de reset..........................................................................................................................23
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 2
Recursos necessários para execução deste tutorial
Este tutorial cobre somente partes teóricas. Você só precisará de um computador com leitor 
PDF. 
Você pode copiar este material a vontade, desde que mantida a informação da fonte.
Introdução
ste conjunto de tutoriais se destina a todos aqueles que desejam se tornar bons projetistas e 
programadores com os microcontroladores, especialmente os microcontroladores de 14 bits 
da Microchip, com ênfase no PIC16F877. A escolha deste microcontrolador se deve ao 
fato dos recursos que ele disponibiliza ao programador abrangem um grande número de periféricos, 
e o conhecimento da programação destes periféricos permite a programação de dezenas de outros 
chips desta linha. 
E
 Como pré-requisito para a leitura deste tutorial, você deve ter conhecimentos básicos sobre 
lógica Booleana, da estrutura dos microcontroladores e de seus periféricos em geral, assim como 
fundamentos de programação em qualquer linguagem. O enfoque é eminentemente prático. Você 
estuda a teoria e experimenta na prática os conceitos trabalhados. Ao final do livro você terá 
aprendido a desenvolver um conjunto de projetos que variam desde um simples pisca-pisca a um 
controlador de servo mecanismos para uso em sistemas robóticos. 
Este volume faz parte de uma série de tutoriais de programação de microcontroladores, que 
estão sendo paulatinamente colocados em formato eletrônico e disponibilizados para cópia 
individual. O material pode ser utilizado livremente por indivíduos ou instituições sem fim 
lucrativo, devendo ser mantida sempre a obra integral, com os créditos do autor. 
Para facilitar o aprendizado utilizaremos como plataforma alvo a placa Powerboard2 . A 
Powerboard2 é uma placa para experimentação e desenvolvimento com microcontroladores 
extremamente versátil. Com ela você pode programar o microcontrolador sem necessidade de um 
programador avulso, e toda a sua experimentação pode ser realizada sem necessidade de retirar o 
PIC do soquete. Embora os simuladores sejam uma ferramenta muito adequada no desenvolvimento 
de programas com o PIC16F877, somente a experimentação real lhe garantirá uma capacitação 
efetiva no desenvolvimento de projetos baseados em microcontroladores. O manual completo da 
Powerboard2 você encontra em http://www.solbet.com.br.
Para você implementar os programas exemplo será necessário a utilização de um software 
assembler, um compilador “C” e de um carregador. O assembler sugerido é o MPLAB©, da 
Microchip, disponível em http://www.microchip.com. O compilador “C” que utilizamos é o CCS, de 
baixo custo, que pode ser adquirido em http://www.ccsinfo.com/. E o carregador , o software 
SbMaster, pode ser obtido gratuitamente em http://www.solbet.com.br. O carregador e o compilador 
“C” podem operar em Linux ou Windows, mas o MPLAB opera somente em Windows. Se você 
utilizar os diversos módulos de desenvolvimento já disponíveis na Solbet, certamente irá 
economizar tempo e poderá focalizar seu esforço no domínio da programação de 
microcontroladores.
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 3
A estrutura desta série de tutoriais
este série de tutoriais você encontrará capítulos teóricos e capítulos com sugestões de 
exercícios de laboratório. Cada exercício é acompanhado de propostas de projetos 
baseadas nos pontos explanados. Não deixe de implementar de forma prática os exercícios, 
tanto os já resolvidos como os propostos. Para realizar as práticas de laboratório você deverá ter 
acesso a um computador do tipo IBM-PC, com o sistema operacional Windows ou Linux , e ser 
capaz de ler esquemas eletrônicos, e de uma placa Powerboard2. A maioria dos experimentos pode 
ser realizada com a placa mais custo, a Powerboard2 Light. Instrumentação básica para o 
desenvolvimento de circuitos eletrônicos, tais como multímetro e osciloscópio, irão ajudar muito a 
depuração dos circuitos, porém não são indispensáveis. Um conjunto de exercícios é deixada como 
desafio ao estudante. Se você deseja comparar a sua resposta com a por nós sugerida, basta acessar 
o site http://www.solbet.com.br , e procurar na seção Notas de aplicação. As respostas aos 
problemas e mais informação adicionais sobre programação de microcontroladores estão lá 
disponíveis para você. 
N
A seguinte seqüência será adotada neste tutorial:
Introdução
Considerações Básicas sobre microcontroladores
Compreendendo a arquitetura do PIC16F877
Os experimentos podem ser avaliados utilizando apenas o simulador disponível no 
MPLAB, mas sugerimos fortemente que você efetivamente monte os diversos circuitos 
apresentados. Embora o simulador seja uma ferramenta fantástica para o desenvolvimento, a 
experiência com o dispositivo real irá ampliar de forma significativa o seu aprendizado. 
Você notará aqui vários termos em inglês. Escolhemos não traduzir alguns termos, visto ser 
a nomenclatura inglesa mais utilizada em nosso meio. A tradução de alguns termos como STATUS, 
RESET, CLOCK e outros similares iria apenas dificultar a quem está realizando este curso, a 
compreensãodos conceitos envolvidos e seria de pouco valor para o projetista.
O que é um microcontrolador
m microcontrolador é um dispositivo utilizado para controlar (EPA!- definição recursiva?) 
algum processo ou aspecto do ambiente. Um exemplo típico de um controlador você tem 
no seu forno de microondas. No forno pode-se programar a potência, o tempo de 
cozimento , a velocidade de giro e outros parâmetros. Além disso, o controlador toma conta para 
você de outros itens igualmente importantes e que podem parecer insignificantes à primeira vista. 
Por exemplo, se você abrir a forno com ele em funcionamento, o microcontrolador irá desligar 
imediatamente a geração de microondas, que poderia vir a provocar lesões no usuário.
U
Os microcontroladores estão revolucionando o projeto de equipamentos eletrônicos. Não 
somente os sistemas convencionais estão se tornando mais sofisticados e baratos, como novas 
funcionalidades estão sendo possíveis de serem implementadas a um custo compatível com o 
mercado. A propósito, o seu celular só se tornou possível graças ao uso de microcontroladores cada 
vez mais poderosos.
No início dos tempos os sistemas de controle eram construídos utilizando-se (ugh !), relês e 
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 4
válvulas. Nestes tempos heróicos a construção era cara e os programas difíceis de se desenvolver. O 
programa era implementado pelo hardware do próprio circuito, com enormes dificuldades na hora 
em que se necessitava alterá-lo. Os custos (e dimensões) eram elevados e poucos experimentadores 
poderiam construir um destes para controlar o ambiente de seu aquário (temperatura, iluminação, 
filtros, alimentação, etc...).ou gerenciar sua residência. Os controladores eram basicamente 
utilizados em indústrias, onde o seu custo elevado era amortecido pelo grande aumento da 
produtividade obtida devido à sua utilização.
Com o advento da micro-eletrônica as coisas melhoraram um pouco, porém ainda não o 
suficiente para popularizar os controladores. O tamanho agora era mais reduzido, devido ao uso 
de transistores onde antes eram empregados válvulas, porém o problema da dificuldade de 
reprogramação continuava.
O grande passo ocorreu em 1970, com o advento dos microprocessadores. Embora os 
primeiros microprocessadores fossem destinados ao uso genérico, a possibilidade de reprogramação 
sem alteração do hardware básico não passou despercebido dos projetistas de controladores, que 
passaram a utilizar de forma intensa este componente.
Os microprocessadores destinados ao mercado de computadores pessoais podiam ser 
empregados em controladores, porém o seu custo continuava elevado para o tipo de tarefa que se 
desejava executar no controle dedicado. Imagine quão pouco competitivo (custo/benefício) ficaria 
utilizar um Pentium no controle do número de lâmpadas acesas simultaneamente numa casa, por 
exemplo.
Em virtude deste mercado, os fabricantes de circuitos lançaram então os 
microcontroladores. Estes dispositivos tipicamente possuem integrados em uma única pastilha de 
circuito integrado, a CPU (unidade central de processamento), RAM (memória de acesso 
aleatório), EPROM(ou suas variantes EEPROM,ROM,PROM) , memória somente de leitura, E/S 
(entrada e saída digitais e analógicas), TEMPORIZADORES (contadores e temporizadores) e 
CONTROLADORES DE INTERRUPÇÃO (possibilitando rápida reação às mudanças do 
ambiente). Se você não compreendeu o significado de algumas destas siglas, não se preocupe. Nós 
explicaremos o significado de cada uma nas próximas páginas.
O surgimento destes dispositivos a um baixo custo provocou uma revolução nos métodos de 
projeto de sistemas de controle para uso doméstico ou industrial. Sistemas mecânicos já 
consagrados pelo uso (por exemplo, controladores de máquinas de lavar roupa) estão sendo 
rapidamente substituídos por circuitos eletrônicos mais confiáveis e baratos. Conhecer estes 
dispositivos tão onipresentes em nossas vidas se tornou uma necessidade de todos os profissionais 
envolvidos com a produção , desenvolvimento e manutenção de circuitos eletrônicos de qualquer 
tipo. 
Do ponto de vista do projetista dos circuitos de controle, esta substituição forçou o 
deslocamento dos projetos baseados em hardware, onde cada projeto correspondia a um circuito 
eletrônico, para projetos baseados em software, onde o hardware básico se mantém o mesmo , 
sendo que a alteração funcional se dá através da alteração do software do sistema. Desta forma, 
correções e aumentos na funcionalidade do sistema podem ser feitos muito mais rapidamente e com 
custos reduzidos, se comparados a solução de alteração no hardware.
Microcontroladores estão em torno de nós em quantidades cada vez maiores. A indústria 
automobilística, por exemplo, é uma grande consumidora destes dispositivos. A indústria de 
eletrodomésticos também. Conhecê-los e saber deles extrair o máximo de funcionalidade, é uma 
capacidade que se exige do engenheiro ou técnico, projetistas e pessoal de manutenção de sistemas 
dedicados ou usuários avançados. E além disto, para o experimentador, fica muito mais barato 
utilizar estes pequenos módulos para os seus experimentos que criar um novo hardware para cada 
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 5
 PORTA SAÍDA PORTA ENTRADA
 CPU
MEMÓRIA DE PROGRAMAS MEMÓRIA DE DADOS
projeto.
O projetista de circuitos que utilizar microcontroladores deve ser eficiente em pelo menos 
três diferentes áreas. Em primeiro lugar ele deve ter uma compreensão exata da capacidade do 
microcontrolador que pretende utilizar, em termos de memória, dispositivos de entrada e saída, 
velocidade de processamento, etc. Em segundo lugar, o projetista deve ser capaz de especificar 
formalmente os requisitos do seu projeto. Isto significa compreender o ambiente no qual o sistema 
será utilizado e qual a interação do sistema sendo desenvolvido com o este ambiente. Por último, é 
papel fundamental de um bom projetista ser capaz de dividir o problema com que se depara em 
partes menores e mais gerenciáveis, que devem trabalhar harmoniosamente de forma a se obter o 
resultado desejado.
A Arquitetura do microcontrolador PIC16F877A
odemos pensar num microcontrolador como um dispositivo composto de sete partes, como 
mostrado na figura 2-1. Os dados dentro de um microcontrolador são manipulados em 
unidades chamadas palavras. O PIC16F877A possui palavras de dados de oito bits de 
tamanho, e palavras de instrução de 14 bits. Este comprimento da palavra de instrução do 
PIC16F877A permite que a maioria das instruções possa ser executada dentro de um único ciclo de 
máquina, um dos motivos da grande velocidade que se consegue nestes microcontroladores.
P
Figura 2-1. Microcontrolador básico
O clock é o responsável pelo sincronismo entre todas as operações de um microcontrolador. 
Todos os eventos que ocorrem dentro de um microcontrolador obedecem a uma lógica 
preestabelecida pelo fabricante, e são processados em tempos determinados pela freqüência do 
clock. Normalmente, quanto maior a freqüência de clock de um microcontrolador, mais rápida é a 
execução das instruções. No caso dos microcontroladores, o clock é também utilizado como 
referência de tempo para execução de tarefas que devem ser repetidas a determinado intervalo de 
tempo, como por exemplo a leitura de sinais em interfaces RS232C.
A CPU, ou unidade central de processamento, coordena todas as atividades dentro do 
microcontrolador.Ela organiza a execução das instruções. É a CPU que realiza as operações lógicas 
ou matemáticas sobre os dados, e envia os resultados para os diversos registros ou portas de entrada 
e saída.
As portas de entrada e de saída são os pontos através dos quais o microcontrolador 
interage com o meio ambiente. As portas digitais assumem valores discretos, normalmente 
referenciados como 0 ou 1, correspondentes a 0 volts ou 5 volts de saída respectivamente. O valor 
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 6
de tensão correspondente ao nível lógico 1 normalmente corresponde a tensão de alimentação do 
microcontrolador.
 Além das portas convencionais, nas quais a CPU deve ler sempre que deseja saber sobre o 
seu estado (0 ou 1), alguns microcontroladores possuem uma ou mais portas de entrada especiais 
chamadas de Interrupts. Estas portas não exigem que a CPU fique “vigiando” a ocorrência de um 
evento, porque interrompem o programa sendo executado toda vez que ocorre um dado evento. 
Desta forma a CPU pode atender o evento externo assim que o mesmo ocorre, e não gasta tempo 
vigiando inutilmente pela ocorrência do evento na porta. Interrupts são uma das características mais 
utilizadas nos projetos em se necessite de uma rapidez de resposta a eventos assíncronos, que 
podem ocorrer a qualquer instante.
O PIC16F877A possui portas de entradas analógicas, ou seja, portas que podem receber 
sinais continuadamente variáveis entre 0 e 5 volts. Internamente estes sinais analógicos são 
convertidos em valores digitais entre 0 e 0x3FF (se utilizamos conversores de 10 bits) , ou 0xFF, se 
utilizamos conversores de oito bits.
A memória de dados é normalmente implementada na forma de RAM (memória de acesso 
aleatório) em que podemos ler e gravar com facilidade. A leitura é não destrutiva, ou seja, podemos 
ler repetidas vezes o valor de uma posição de memória que o valor não se altera. A gravação de um 
dado na RAM é feita pela CPU, em resposta a instruções colocadas pelo programador. 
Microcontroladores normalmente se utilizam de pequenas quantidades de memória de dados, 
principalmente se compararmos com as quantidades de memória RAM utilizadas por computadores 
pessoais de hoje, algo como 100 bytes para os microcontroladores, versus 512 milhões de bytes de 
um típico computador pessoal.
A memória de programa é onde residem as instruções que devem ser executadas pela 
CPU. Num computador pessoal os programas tipicamente residem em disquetes ou discos rígidos. 
Já nos microcontroladores o programa deve residir numa memória somente de leitura. O programa é 
normalmente gravado uma só vez e a partir daí o microcontrolador executa apenas este programa.
A maioria dos microcontroladores se utiliza de memória EPROM, que para ser apagada 
necessita de ser exposta a luz ultravioleta, ou PROM. No caso da PROM o programa só pode ser 
gravado uma vez. Portanto só é interessante para os fabricantes de produtos baseados em 
microcontroladores, porque a PROM é uma memória de baixo custo. Já a gravação de uma 
EPROM deve ser realizada através de equipamento adequado. O ciclo de desenvolvimento 
normalmente exige inúmeras operações de gravação e apagamento, para correções do programa. 
Alguns microcontroladores, tais como o PIC16F877A, substituíram a EPROM pela EEPROM, 
memória que pode ser apagada por meios elétricos, sem necessidade de apagamento por luz 
ultravioleta. Esta forma de trabalho encurta significativamente o ciclo de desenvolvimento do 
programa, e também não exige equipamento sofisticado para gravação e apagamento da memória de 
programas.
A memória de programas e a memória de dados podem ou não compartilhar de um único 
espaço de endereçamento. A arquitetura Von Neuman possui um único barramento de memória 
para endereçar as instruções e os dados. Dados e instruções, portanto, compartilham do mesmo 
espaço de memória. Quando este tipo de microcontrolador executa uma instrução, ele primeiro pega 
a instrução e depois pega os dados referentes a esta instrução. Esta necessidade de dois acessos à 
memória torna a operação mais lenta.
Os microcontroladores baseados na arquitetura Harward possuem um espaço de memória 
separado para os dados e para as instruções. Isto permite que a leitura das instruções e dos dados 
ocorra em paralelo. Também, enquanto uma instrução está sendo executada a outra já pode estar 
sendo transferida para a CPU. A execução utilizando esta arquitetura pode ser muito mais rápida 
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 7
que a possível com a arquitetura Von Neuman, porém isto aumenta a complexidade dos circuitos. O 
microcontrolador PIC16F877A, objeto de análise neste tutorial, se utiliza da arquitetura Harward, o 
que permite uma alta velocidade de operação.
Qualquer que seja a arquitetura empregada, um microcontrolador necessita manter um 
controle rigoroso sobre a seqüência de instruções a serem executadas. Este controle da seqüência é 
conseguido pelo uso de um contador de programa. O contador de programa é um registro que 
mantém a informação de qual é o endereço da instrução de programa que deve ser executada.
Embora as instruções sejam realizadas na sua maior parte de forma seqüencial, alguns 
fatores podem provocar a alteração deste comportamento. Por exemplo, um determinado ponto do 
programa chama por uma subrotina. Uma subrotina é um trecho de programa, que após ser 
executado, deve retornar para a posição onde foi inicialmente chamado. Outro exemplo de desvio é 
o durante o processamento de interrupts. 
Além das portas de entrada e saída, o PIC16F877A possui inúmeros outros periféricos, tais 
como gerador de PWM, UART (interface serial) , contadores , e outros que veremos em detalhes ao 
decorrer do tutorial. A vantagem de dispormos destes blocos de hardware é que a velocidade 
possível de se obter utilizando módulos em hardware é muito maior do que a velocidade possível de 
ser obtida com o uso de software. Além disto, com o hardware podemos facilmente implementar 
uma concorrência, ou sejam, execução de várias tarefas simultaneamente.
Como se programa um microcontrolador 
rogramar um microcontrolador significa transferir para sua memória de programas um 
conjunto de instruções que será executado pela CPU. As instruções devem ser carregadas já 
no formato binário, capaz de ser compreendido pela CPU. No entanto, este formato é de 
difícil interpretação por seres humanos. Daí surge a necessidade de um sistema de desenvolvimento.
P
Um sistema de desenvolvimento para projetos que empreguem microcontroladores, 
tipicamente se utiliza de computadores pessoais para executar os softwares de desenvolvimento, tais 
como montadores (assemblers) , compiladores, simuladores e gravadores. Através do uso de 
montadores e dos compiladores, o programador pode implementar o seu programa com instruções 
em formato facilmente compreensível, em oposição à linguagem de máquina. Os comandos da 
linguagem assembler normalmente são mnemônicos que lembram a operação a ser realizada pela 
instrução. Com o simulador o programa pode ser executado de uma estação de trabalho (um micro 
do tipo IBM-PC) , sem necessidade de gravação do programa na EEPROM do microcontrolador. Os 
simuladores têm como principal vantagem, o fato de permitirem ao programador analisar 
cuidadosamente o que está ocorrendo dentro do microcontrolador, situação praticamente impossível 
de se obter quando estamos executando o programa no circuito final, a não que nos utilizemos de 
emuladores, geralmente muito caros para usonão comercial. Finalmente o gravador permite que 
seja transferido o programa executável para a memória de programas do microcontrolador. A 
solução adotada no Powerboard2, utilizado neste tutorial, é dotar a CPU de um pequeno programa 
residente, que fica na parte superior de memória, e que é capaz de receber um programa em formato 
hexa através da interface serial e armazená-lo na memória de programa da CPU. Assim que o 
programa é transferido, o comando passa para o codigo carregado. Esta solução elimina a 
necessidade de um programador externo. 
Conhecer bem o conjunto de instruções do microcontrolador com o qual se deseja 
implementar um dado projeto é condição essencial para obter a maior eficiência do programa. 
Embora existam compiladores para linguagens de alto e médio nível para uso em 
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 8
microcontroladores, o conhecimento da linguagem assembler é geralmente o único recurso quando 
se necessita otimizar o uso de memória ou aumentar a velocidade de processamento. É importante 
também observar que o conhecimento da linguagem assembler deve ser complementado com um 
perfeito domínio da estrutura de hardware do microcontrolador, de forma a se obter a maior 
harmonia possível entre os recursos de hardware e o software. 
 A maioria dos microprocessadores hoje se utiliza de um conjunto de instruções 
relativamente grande (mais de 80 instruções). Conjunto de instruções deste tipo são denominadas 
CISC ( Complex Instruction Set Computer). Muitas dessas instruções são bastante poderosas e 
especializadas. A grande vantagem do modelo CISC é que muitas das instruções são como macros, 
permitindo que o programador use uma única instrução em lugar de muitas instruções mais simples.
Já na indústria dos microcontroladores, a tendência é o uso do conceito RISC ( Reduced 
Instruction Set Computer). Devido ao fato de implementar poucas instruções, o circuito pode ser 
implementado em uma área menor, com um conseqüente menor consumo de energia e normalmente 
mais rápido. O PIC16F877A é um microcontrolador RISC que se utiliza da arquitetura Harward, 
permite o pipeline das instruções (as instruções são enfileiradas de forma que num dado instante 
várias instruções podem estar em estágios diferentes de execução), e o conjunto de instruções é 
simétrico, ou seja, uma instrução pode operar em todos os registradores ou usar qualquer modo de 
endereçamento. Não existem combinações especiais de instruções, exceções, restrições ou efeitos 
colaterais. A programação é ainda facilitada porque o programador tem que se lembrar de um 
conjunto reduzido de instruções. 
Ao contrário de um microcomputador de uso genérico, em que você mantém o programa em 
disquete ou no disco rígido, no microcontrolador o programa deve ser armazenado em alguma 
forma de memória não volátil, tal como ROM, EPROM ou EEPROM, normalmente disponível 
dentro do próprio chip do microcontrolador. Algumas versões permitem o uso de memória externa. 
Quando se deseja programar grandes quantidades de chips, pode-se solicitar ao fabricante para que 
o mesmo envie os chips já programados. Isto é feito através do uso de uma memória ROM. Devido 
a necessidade de altos volumes de produção esta solução só interessa aos fabricantes de produtos 
em série. Uma solução alternativa também indicada para fabricantes, porém sem a necessidade de 
alto volume é a forma OTP (One Time Programable), onde o chip pode ser programado uma única 
vez. Se o seu programa não necessitar de alterações, esta é uma solução de baixo custo, pois se 
utiliza dos mesmos gravadores de EPROM convencionais. (na realidade, a OTP é uma EPROM 
sem a janela de quartzo para apagamento). A EPROM é uma solução para o desenvolvimento, mas 
exige um ciclo do tipo grava eprom, testa, apaga eprom,....grava eprom,.. etc... , e também exige 
equipamentos adequados para o apagamento e gravação da memória EPROM.
Para projetos específicos ou mesmo pequenas séries, a solução EEPROM (electrical erasable 
PROM) é a de mais baixo custo operacional. Com esta memória pode-se gravar e apagar os dados 
eletricamente, muito mais rápido do que o possível de ser feito com a EPROM convencional. A 
EEPROM suporta ciclos de leitura/escrita por um número limitado de vezes, mas normalmente este 
número é bem superior às necessidades típicas durante o desenvolvimento de um projeto. O 
PIC16F877 possui uma memória EEPROM para programas e também uma memória EEPROM 
para dados. 
As origens do PIC16F877A 
 PIC16F877 é um microcontrolador que teve suas origens no ano de 1965, quando a 
companhia GI (General Instruments), formou a Divisão de Microeletrônica. Esta divisão 
foi uma das primeiras a produzir arquiteturas de EPROM e EEPROM viáveis, além das O
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 9
famílias de circuitos análogos/digitais AY3-xxxx e AY5-xxxx.
Na década de 70, a GI criou um dos primeiros processadores de 16 bits, chamado CP16000. 
Como este microprocessador tinha uma certa deficiência no processamento de entradas/saídas, a GI 
projetou e construiu um Controlador de Interface Periférica (em inglês, Peripheral Interface 
Controller, ou PIC). Este controlador foi projetado tendo em vista a rapidez, pois devia processar a 
E/S de uma máquina de 16 bits, e tinha um conjunto de instruções muito pequeno. O CP16000 não 
teve muito sucesso, porém o PIC evoluiu para a arquitetura PIC16C5x. Como era disponível 
somente nas versões em ROM, permaneceu como uma boa solução para grandes usuários, que 
podiam encomendar diretamente da fábrica um grande volume de circuitos já pré-programados.
Na década de 80, a divisão de microeletrônica da GI foi reestruturada e se transformou na 
GI Microeletrônica, uma empresa subsidiária. Esta empresa foi vendida para investidores e 
transformada na Arizona Microchip Technology, dedicada especificamente ao desenvolvimento de 
produtos utilizados em sistemas dedicados.
Como parte desta estratégia, grande esforço da companhia foi direcionado ao 
desenvolvimento de várias versões do PIC, sendo que a versão com EEPROM (eprom apagável 
eletricamente) é a mais indicada para o desenvolvimento rápido de aplicações, devido ao baixo 
custo do sistema de desenvolvimento necessário e do hardware de processamento.
O dispositivo mais flexivel disponível hoje da série PIC de 14 bits e que ao mesmo tempo 
reúne um conjunto de características adequadas ao uso em pequenas séries de produtos e estudo de 
microcontroladores, é o PIC16F877A. Como o microcontrolador PIC16F877A se utiliza da 
arquitetura Harvard, isto possibilita que as palavras de instruções tenham um número de bits (14 
bits de comprimento) diferente do tamanho da palavra de dados (8 bits para este microcontrolador). 
Com este tamanho de palavra de instrução é possível codificar todas instruções, com exceção dos 
desvios para outras posições de programas, como instruções de uma única palavra, resultando em 
grande velocidade de execução, 400 ns para a versão de 10Mhz.
Estes dispositivos podem endereçar direta e indiretamente seus arquivos de registros ou 
memória de dados. O conjunto de instruções foi projetado de tal forma que se pode realizar 
qualquer operação em qualquer registro utilizando qualquer modo de endereçamento.
A unidade lógica aritmética do PIC16F877 pode realizar operações de adição, subtração, 
deslocamento e operações lógicas. Tipicamente, para o caso em que são utilizados dois operandos, 
um deles é o registrador W (para aqueles que já programaram os microprocessadores 80XX e Z80, 
este registrador corresponde ao acumuladordestes processadores) e o outro corresponde a um literal 
(constante) ou a um registro de arquivo. Em operações com um único operando, este é o registrador 
W ou um arquivo de registro. 
Compreendendo a arquitetura do PIC16F877A 
s microcontroladores da série PIC16F877 são dispositivos computacionais extremamente 
adequados para experimentação e pequenos projetos. Devido ao seu baixo custo e 
facilidade de programação, podem ser empregados em aplicações onde até recentemente se 
utilizavam componentes discretos, como por exemplo, os temporizadores e controladores de 
temperatura, adicionando novas funções até então não implementadas devido a complexidade do 
circuito necessário.
O
O projeto com microcontroladores traz uma diferença fundamental de paradigma para o 
projetista de circuitos. Ao invés de um bem sortido estoque de componentes discretos que realizam 
várias funções diferentes cada um, e de um conceito de projeto que consiste em interligar estas 
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 10
diferentes funções de forma que o sistema como um todo tenha o comportamento adequado, 
utilizamos agora praticamente um mesmo tipo de hardware para todas as aplicações. A diferença de 
funcionalidade fica por conta do software. Alterações de funcionalidade podem ser feitas, em 
grande parte das vezes, através da modificação apenas do software, sem ser necessária alteração do 
hardware.
Neste curso utilizaremos um circuito que estende este conceito até os seus limites. Você 
poderá modificar o programa do microcontrolador sem a necessidade sequer de retirá-lo do circuito 
onde está sendo aplicado. Com um micro do tipo IBM-PC e o com as versões dos software de 
desenvolvimento disponíveis gratuitamente na Internet, você poderá compreender todo o ciclo de 
desenvolvimento de um programa . 
Os microcontroladores da série PIC16F87X são máquinas RISC. Isto significa que são 
máquinas com um reduzido conjunto de instruções. Para ser exato, são apenas 35 instruções para 
serem compreendidas, cada uma ocupando uma palavra (14 bits ). Compare este número com a 
quantidade de instruções da linguagem BASIC, e veja como é bem mais fácil programar em 
linguagem de máquina do PIC16F87X do que em BASIC.
O PIC16F87X possui as seguintes características básicas:
•Instruções de 14 bits
•Dados em 8 bits
•Pilha (stack) com oito níveis
•Endereçamento nos modos direto, indireto e relativo
•Catorze tipos de interrupts
1.Sinal externo no terminal 6 (RB0/INT)
2.Estouro do temporizador externo TMR0
3.Mudança no nível dos terminais 13 a 10 (RB7:RB4)
4.Fim de gravação na EEPROM
5.Interrupt ligado a porta paralela
6.Interrupt do conversor AD
7.Interrupt do PWM
8.Interrupt leitura interface serial
9.Interrupt escrita interface serial
10.Interrupt timer 1
11.Interrupt timer 2
• Programa gravado em EEPROM, com até 1000000 de ciclos de apagamento e escrita, com 
retenção garantida por mais de 40 anos.
• Trinta e três terminais de Entrada e Saída, com controle individual por terminal. Capacidade de 
manipulação de corrente de 25 mA atuando como dreno e 20mA atuando como fonte.
•Dois temporizadores de oito bits programável, com pré-divisor também programável de oito bits.
•Um temporizador de 16 bits
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 11
•Sistema de proteção de código na EEPROM. Impossibilita que outras pessoas leiam o seu código. 
•Operação em tensões desde 2 a 6 Volts, com consumo de corrente típico em torno de 2 mA.
•Memória RAM interna de 368 bytes, juntamente com uma área de EEPROM para dados de 256 
bytes
 Não deixe que a pequena capacidade de memória (quando comparada com os megabytes a que 
estamos acostumados nos computadores pessoais) faça-o acreditar que estes pequenos 
computadores são apenas brinquedos. A alta velocidade de processamento e o tipo das tarefas 
tipicamente encontradas nos sistemas dedicados fazem destes circuitos integradas uma solução 
extremamente adequada para uma grande quantidade de sistemas. . 
A melhor forma de compreender o funcionamento do PIC16F877A e suas variantes é 
começar pela sua estrutura de dados interna. Todo o funcionamento do microcontrolador é 
controlado ou monitorado através dos registradores internos da CPU. Um registrador é uma área de 
memória onde são escritos e lidos parâmetros que atuam sobre o comportamento do 
microcontrolador. Uma perfeita compreensão da organização da memória e da estrutura interna é 
indispensável para o desenvolvimento de aplicações em código assembler.
A estrutura interna do PIC16F877A 
PIC16F877 é encapsulado de diferentes formas, mas o formato PDIP, de 40 pinos é o mais 
indicado para o experimentador O
Cada terminal do integrado tem uma ou mais funções bem definidas, e a cada um é 
associado um nome que nos lembra a função correspondente. Manteremos neste tutorial o os 
nomes dos terminais correspondentes à nomenclatura inglesa, visto ser esta a forma com que mais 
freqüentemente nos deparamos na literatura técnica.
Para manter o número de terminais pequeno e ao mesmo permitir ao PIC16F877 comportar 
um número maior o possível de periféricos, vários pinos tiveram que ser multiplexados, ou seja, 
estes pinos possuem mais de uma função. A seleção da função depende o modo de operação do PIC.
A definição dos terminais do PIC16F877A é apresentada na figura 3.1:
Figura 3.1: Pinagem do PIC16F877
Os terminais são a interface do circuito interno do PIC com o mundo exterior. O circuito 
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 12
interno, em forma de diagrama de blocos, pode ser visto na figura 3.2.
Figura 3.2. Diagrama em blocos do circuito interno do PIC16F877
A descrição dos terminais do PIC16F877A 
Vamos inicialmente olhar para o PIC como uma “caixa preta”, aprendendo qual a função de 
cada terminal do circuito integrado. Na tabela 3.1 temos o nome e a função de cada um dos 
terminais: 
Funcionalmente, podemos agrupar os terminais nos seguintes grupos:
♦
♦ Alimentação
♦ Entrada/Saída
♦ Clock
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 13
♦ Controle
A alimentação deve estar entre 2 e 6 volts, preferencialmente 5 volts para facilitar o interfaceamento 
com integrados da família lógica TTL. Os terminais 32 e 11 devem receber a tensão de 
alimentação e o terminais 31 e 12 devem ser ligado à terra do circuito. É sempre interessante, com 
qualquer tipo de circuito que gere ou receba pulso, desacoplar a alimentação com um pequeno 
capacitor de 0.01 microfarads, ligado o mais próximo possível do pino de alimentação.
OSC1/CLKIN 13 I Entrada para cristal externo (fonte de 
clock) 
OSC2/CLKOU 14 O Saída para cristal externo 
MCLR/VPP 1 I/P Master Clear (reset) externo. Lógica 
baixa para reset 
 RA0/AN0 2 I/O I/O digital bidirecional ou entrada 
analógica 0 
 RA1/AN1 3 I/O I/O digital bidirecional ou entrada 
analógica 1 
RA2/AN2/VREF 4 I/O digital bidirecional ou entrada 
analógica 2 ou tensão de referência 
analógica negativa 
RA3/AN3/VREF+ 5 I/O I/O digital bidirecional ou entrada 
analógica 3 ou tensão de referência 
analógica positiva 
 RA4/T0CKI 6 I/O I/O digital bidirecional ou entrada de 
clock para contador TMR0 
 RA5/SS/AN4 7 I/O I/O digital bidirecional ou entrada 
analógica 4 ou slave select para a 
porta de comunicação serial síncrona 
 RB0/INT 33 I/O I/O digital bidirecional ou entradapara interrupção externa 
 RB1 34 I/O I/O digital bidirecional 
RB2 35 I/O I/O digital bidirecional 
RB3/PGM 36 I/O I/O digital bidirecional ou entrada 
para programação em baixa tensão 
RB4 37 I/O I/O digital bidirecional 
RB5 38 I/O I/O digital 
bidirecional 
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 14
RB6/PGC 39 I/O I/O digital bidirecional ou clock da 
programação serial (ICSP) 
RB7/PGD 40 I/O I/O digital bidirecional ou dados da 
programação serial (ICSP) 
 C0/T1OSO/ 15 I/O I/O digital bidirecional ou saída para 
cristal esxterno para TMR1 ou entrada 
de T1CK1 clock para contador 
TMR1 
RC1/T1OSI/ 16 I/O I/O digital bidirecional ou entrada 
para cristal esxterno para TMR1 ou 
I/O para CCP2 Capture 
,Compare,PWM 2 
RC2/CCP1 17 I/O I/O digital bidirecional ou I/O para 
Capture,Compare,PWM 1 
RC3/SCK/SCL 18 I/O I/O digital bidirecional ou entrada de 
clock serial síncrono ou saida para os 
modos SPI e I2C 
RC4/SDI/SDA 23 I/O I/O digital bidirecional ou entrada de 
dados SPI ou I/O de dados I2C 
RC5/SDO 24 I/O I/O digital bidirecional ou saída de 
dados SPI 
RC6/TX//CK 25 I/O I/O digital bidirecional ou 
Transmissão para comunicação 
USART assíncrona ou via de clock 
para para comunicação USART 
síncrona 
RC7/RX/DT 26 I/O I/O digital bidirecional ou Recepção 
para comunicação USART assíncrona 
ou via de dados para para 
comunicação USART síncrona 
RD0/PSP0 19 I/O I/O digital bidirecional ou Porta 
paralela escrava 
RD1/PSP1 20 I/O I/O digital bidirecional ou Porta 
paralela escrava 
RD2/PSP2 21 I/O I/O digital bidirecional ou Porta 
paralela escrava 
RD3/PSP3 22 I/O I/O digital bidirecional ou Porta 
paralela escrava 
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 15
RD4/PSP4 27 I/O I/O digital bidirecional ou Porta 
paralela escrava 
RD5/PSP5 28 I/O I/O digital bidirecional ou Porta 
paralela escrava 
RD6/PSP6 29 I/O I/O digital bidirecional ou Porta 
paralela escrava 
RD7/PSP7 30 I/O I/O digital bidirecional ou Porta 
paralela escrava 
RE0/RD/AN5 8 I/O I/O digital bidirecional ou Controle 
de Leitura para a Porta paralela 
escrava ou entrada analógica 5 
RE1/WR/AN6 9 I/O I/O digital bidirecional ou Controle de 
Escrita para a Porta paralela escrava 
ou entrada analógica 6 
 RE2/CS/AN7 10 I/O I/O digital bidirecional ou Select 
Control para a Porta paralela escrava 
ou entrada analógica 7 
 VSS 12 31 P Referência TERRA 
 VDD 11 32 P Alimentação Positiva (+5V) 
Tabela 3.1 Descrição sucinta dos terminais do CI PIC16F877
O clock se utiliza dos terminais 13 e 14. São possíveis várias configurações de clock, todas 
elas descritas em detalhes mais adiante.
O terminal MCLR é uma entrada de controle com duas funções. Em primeiro lugar ele atua 
como reset do microcontrolador. Esta função é ativada quando o nível lógico deste terminal for feito 
igual a zero. A outra função é atuar como indicador de gravação da memória de programas. Para 
isto a tensão neste terminal deve ser feita igual a 13.5 volts. Para a operação normal este terminal 
deve ser mantido em cinco volts, ou na tensão de alimentação utilizada. 
A descrição da estrutura interna do PIC16F877A
As diferentes áreas de memória
O PIC possui três áreas de memória, a área de programas, a área de registros de arquivos e a 
EEPROM de dados. 
O bloco com o nome “memória de programa”, é onde ficam residentes as instruções de 
programa do PIC16F877. Esta memória pode ser programada e alterada com pulsos elétricos, 
facilitando a experimentação com diversos programas. Se você já tem experiência com outros 
microcontroladores deve estar lembrado do ciclo grava_eprom-->coloca na placa do micro-->testa--
>apaga com ultravioleta , e assim sucessivamente. No caso das memórias EEPROM utilizadas no 
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 16
PIC16F877 este ciclo foi cortado substancialmente, pois tanto a gravação como modificação de 
programas podem ser feitos eletricamente, inclusive podendo-se efetuar estas operações sem 
necessidade de se retirar o microcontrolador do circuito. O espaço de memória de programas do 
PIC16F877 é de 1024 posições (1Kbyte), sendo que cada instrução possui 14 bits de comprimento. 
Os endereços de programa válidos no PIC16F877 variam de 0H a 3FFH. 
É importante salientar que o único modo de se escrever na memória de programas é através 
de um dispositivo especialmente projetado para este fim. Não há possibilidade do próprio PIC 
escrever na sua área de memória de programas.
O segundo bloco de memória é o bloco correspondente aos registros de arquivos, “Register 
File” Nesta área de memória ficam as informações que definem a forma de funcionamento do 
microcontrolador e também os dados do programa do usuário. O microcontrolador tem total acesso 
para escrever e ler nesta área. 
Existem quatro bancos de memória para armazenar os registros. A tabela 3.1 apresenta uma 
descrição básica do espaço de memória de registros do PIC16F877. Observe que alguns 
registradores são duplicados em mais de banco de memória. Isto facilita a programação, visto que o 
acesso aos mesmos independe de conhecermos o banco atual em que estamos operando.
Você não precisa memorizar o endereço dos registradores. Para facilitar a vida do 
programador, normalmente todos os programas incluem um arquivo de definições, geralmente 
chamado de PIC16F877.INC , onde estão associados os nomes dos registros e os endereços 
correspondentes. Você só precisa se lembrar do nome do registro que deseja ler ou alterar.
 A seleção de um determinado banco é feita através do registrador de status. Por exemplo: 
Digamos que você precise alterar o valor de um bit do registrador TRISA. O endereço deste 
registrador é 05H no banco dois. Para alterá-lo você precisa primeiro selecionar o banco dois 
(veremos como se faz isto mais tarde), e então escrever no bit desejado do endereço cinco. O 
controle dos bancos é feito totalmente pelo seu programa, e você deve sempre tomar cuidado em 
qual banco está, principalmente no atendimento das rotinas de interrupt. Se você estiver 
programando em “C”esta preocupação normalmente é deixada para o compilador.
A memória de dados EEPROM é uma memória de dados implementada em EEPROM. Os 
dados gravados neste trecho de memória não são perdidos quando o microcontrolador é desligado. 
Este é um espaço muito conveniente para se armazenar informações de configuração ou calibração 
de um sistema.
Uma maneira de informar ao assembler da Microchip que estamos querendo acessar um 
registro no banco dois é utilizar o endereço = endereço base + 0x80. Mas lembre-se de que de 
qualquer maneira você deve chavear o banco primeiro, não adianta apenas acessar o endereço com 
o bit 7 igual a um (0x80 + endereço).
Observe que alguns registros mais importantes são duplicados, isto é, você pode ter acesso a 
eles independente do banco onde está. Isto facilita o programador e aumenta a rapidez de execução 
de um programa. 
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 17
 A memória de programas 
é organizadada seguinte maneira:
Observe que 
a memória de 
programa é 
organizada em 
quatro bancos. As 
instruções de call e 
goto operam apenas 
dentro de um banco. 
É preciso 
complementar o 
conteúdo do 
contador de 
programa caso 
desejemos fazer um 
goto ou um call para 
uma página 
diferente da que 
estamos. Cada 
página possui um 
tamanho de 
2Kbytes.
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 18
.
Tabela 3.2:Endereço dos registradores
O controle do fluxo de programa
s próximos blocos a serem descritos são o stack, o PC , o registrador W, a ALU e os vários 
temporizadores e circuitos de reset. Estes blocos são os responsáveis pelo gerenciamento 
do fluxo do programa e pela interpretação das instruções. O
O PC, contador de programa, é onde está armazenado o endereço da instrução que será 
executada. O contador de programas possui 13 bits de comprimento, o que nos permite operar com 
programas de até 8192 posições. Após cada instrução o valor do contador do programa é alterado 
para passar a indicar o endereço da próxima instrução. As instruções de GOTO (ir para), CALL 
(chamada de subrotina) e os interrupts provocam o desvio do fluxo normal do programa, que 
geralmente incrementa o contador de um a cada instrução. No caso da instrução CALL e no 
atendimento de interrupts, o microcontrolador deve manter a informação do endereço de retorno, 
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 19
isto é, o endereço da instrução a ser executada depois de completada a subrotina ou atendido o 
interrupt. Este endereço de retorno é armazenado no STACK. No caso do PIC16F877 é permitido 
o aninhamento de até oito subrotinas ou interrupts.
Você não tem acesso direto ao STACK. E além disso o microcontrolador não lhe avisa de 
estouro (overflow ou underflow) do stack. É responsabilidade do programador se assegurar que o 
stack está válido. Isto pode ser especialmente complicado na caso de rotinas recursivas (que 
chamam a si mesmas) ou no tratamento de interrupção. Não existem as funções PUSH e POP 
comuns a outros microcontroladores.
A ALU (unidade lógica e aritmética) é quem interpreta e executa as instruções armazenadas 
na área de programas. Embora as instruções sejam de 14 bits, os dados são de oito bits. Todas as 
instruções operam sempre sobre oito bits. A ALU trabalha em estreito relacionamento com o 
registro W, onde grande parte das operações são realizadas ou tem neste registro o local de 
armazenamento do resultado da operação. Para aqueles com conhecimento dos microprocessadores 
8080 e Z80, o registro W é funcionalmente equivalente ao acumulador destes processadores.
Os demais blocos selecionados são os responsáveis pela sincronização das operações da 
CPU, assim como garantem que, logo após a energização ou reset, a máquina assuma um estado 
bem conhecido. Isto é muito importante para que o programador possa se assegurar das condições 
que estarão presentes quando o seu programa começar a operar.
Um dos registros de grande importância para o aumento da confiabilidade de um programa 
que deve operar em ambientes robustos a falhas é o temporizador de watchdog. O funcionamento 
deste temporizador é o seguinte. Se o programa estiver executando corretamente, ele reinicializa o 
watchdog dentro de períodos bem determinados. Se por algum motivo qualquer o programa entra 
em loop ou se desvia do fluxo programado (por exemplo, devido a um transiente na alimentação), o 
watchdog não será reinicializado, e quando o mesmo atingir o tempo limite , será gerado um 
interrupt que reinicializará todo o sistema para uma condição segura.
O sistema de interrupts
ara um programa tomar contato com algum evento externo, como por exemplo, um 
interruptor que se fecha ou abre, existem duas maneiras. A primeira é ficar vigiando na porta 
em que está ligado o interruptor, verificando se ocorreu alguma mudança, e a segunda é 
utilizando os interrupts.
P
A primeira opção é muito simples de ser programada, mas tem uma grande desvantagem. A 
CPU gasta muito tempo apenas vigiando a porta de entrada. Além do mais, se uma dada tarefa 
toma muito tempo para ser executada, a chave pode mudar de estado mais de uma vez, fechando e 
abrindo outra vez, sem que a CPU perceba.
Para evitar que a CPU perca a informação de alteração do sinal de entrada, pode-se utilizar 
os interrupts. Programado desta maneira, quando ocorre o sinal na entrada, o programa é desviado 
para uma posição fixa, no caso do PIC16F877 o desvio ocorre na posição 0x04H . Passa a ser 
executado então o trecho do programa responsável pelo atendimento da interrupção. Após 
processado a interrupção o sistema volta a executar o programa que estava sendo executado 
anteriormente. Desta forma não gastamos tempo vigiando inutilmente a porta e não perdemos o 
evento que desejamos processar. 
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 20
 O PIC16F877 pode processar até quinze tipos diferentes de interrupções. Todas as 
interrupções provocam o desvio do fluxo do programa para a posição 0x0004h. Para você 
identificar qual foi a fonte de interrupção consulte o registro INTCON. Um ponto importante sobre 
os interrupts é que o contexto não é salvo automaticamente. Você precisa realizar esta operação via 
software. Normalmente os registros que você precisará salvar são os registradores W e de STATUS. 
Salvar o contexto é importante para que o programa que estava sendo executado quando ocorreu a 
interrupção possa continuar sua execução como se nada tivesse acontecido. Se você não salvar o 
contexto, o comportamento do programa certamente será aleatório.
O seguinte trecho de código pode ser utilizado para salvar o contexto em interrupções.
WTEMP EQU 0x0c ;variavel para salvar o registro W 
STEMP EQU 0x0d ;variavel para salvar o registro status
INT_ MOVWF WTEMP ;copia o registrador W para o registro TEMP 
SWAPF STATUS,W ;registrador status Θ colocado em W
MOVWF STEMP ;salva status em TEMP1
; processa aqui o interrupt
FIM SWAPF STEMP,W ;recupera STATUS anterior
MOVWF STATUS
SWAPF WTEMP,F ;inverte nibles de temp
SWAPF WTEMP,W ; recupera W anterior
RETFIE ;retorna do interrupt
Os interrupts podem ser desabilitados individualmente ou de uma forma geral. Para 
desabilitar todos interrupts simultaneamente faça igual a zero o bit GIE (global interrupt enable, no 
registrador INTCON <7>. 
Após o reset todos os interrupts estão desabilitados pelo bit GIE , INTCON<7>. Após 
receber um interrupt o sistema zera o bit GIE, desabilitando todos os interrupts. Você deve 
aproveitar esta situação de interrupts desabilitados para efetuar o reconhecimento do interrupt que 
está sendo atendido. Se não o fizer, o bit correspondente a geração do interrupt continuará ativo, e 
logo após a instrução RETFIE, (retorno de interrupção), a interrupção será ativada novamente, 
independente se o fato gerador existe ainda ou não. Isto provocará um loop infinito no seu 
programa.
Um ponto que torna o PIC16F877 mais flexível no que diz respeito aos interrupts é a 
possibilidade de programação, via registradores, da situação que o interrupt INT/RB0 será 
reconhecido. Podemos programar se o interrupt ocorrerá no bordo de subida ou descida do sinal, 
através do bit INTEDG do registrador OPTION <6>. 
As configurações do oscilador
á vimos anteriormente que o PIC16F877 pode operar com quatro tipos de osciladores. Estas 
configurações são necessárias para que o circuito funcione numa grande faixa defreqüências 
(32Khz a 10MHz), e com diferentes dispositivos osciladores.J
•Osciladores a cristal de baixa potência (LP)
•Osciladores a cristal/ressonadores cerâmicos convencionais (XT)
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 21
•Osciladores a cristal/ressonadores cerâmicos de alta freqüência (HS)
•Osciladores a Resistor/Capacitor (RC)
A escolha do tipo de oscilador adequado depende das necessidade de nossa aplicação. 
Assim, se as temporizações do nosso programa não são críticas, como por exemplo em projetos de 
alarmes, a opção pelo oscilador RC nos dá o menor custo. Se uma baixa freqüência de clock for 
adequada para o seu programa (entre 32Khz e 200KHz) a melhor opção é a do oscilador LP. 
Freqüências entre 2MHz a 4Mhz devem corresponder ao oscilador XT e finalmente, altas 
freqüências de oscilação (8Mhz a 10Mhz) correspondem ao oscilador HS. 
Um modo interessante de se usar o PIC é com um oscilador externo. Embora utilize maior 
número de componentes, esta opção permite um sincronismo entre vários PICS alimentados com o 
mesmo clock.
A seleção do oscilador é feita na palavra de configuração. Os cristais devem operar no modo 
paralelo. Se você tentar utilizar um cristal cortado para modo serial, a freqüência resultante pode ser 
diferente daquela especificada pelo fabricante. 
Para os modos LP, XT e HS o circuito básico é sempre o mesmo, com variações nos 
componentes em função da freqüência de trabalho e uso de cristais ou ressonadores cerâmicos. A 
tabela 3.4 apresenta os valores recomendados para os componentes em várias situações, e a figura 
3.15 mostra o circuito básico externo do oscilador no PIC16F877. Observe que o resistor RS neste 
circuito normalmente não é necessário, exceto no caso de alguns cristais de corte AT.
Modo freq(tipo) C1 C2
XT 455 kHz(ressonador) 47-100pF 47-100pF
XT 2.0 
MHz(ressonador)
15-33pF 15-33pF
XT 4.0 MHz 
(ressonador)
15-33pF 15-33pF
HS 8.0MHz(ressonador) 15-33pF 15-33pF
HS 10 MHz 
(ressonador)
15-33pF 15-33pF
LP 32 kHz(cristal) 68-100pF 68-100pF
LP 200khz(cristal) 15-33pF 15-33pF
XT 100khz(cristal) 100-150pF 100-150pF
XT 2 MHz (cristal) 15-33pF 15-33pF
XT 4 MHz (cristal) 15-33pF 15-33pF
HS 4 MHz (cristal) 15-33pF 15-33pF
HS 10 MHz (cristal) 15-33pF 15-33pF
Tabela 3.4 Valores recomendados para o oscilador
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 22
PIC16F84
Figura 3.15 Circuito do oscilador do PIC16F877 
Para o caso de osciladores RC apresentados na figura 3.16, a freqüência de operação será 
dependente dos valores de R, C, da fonte de alimentação, da temperatura ambiente e do circuito 
integrado utilizado. Esta forma de oscilador não é recomendada a não ser para sistemas onde o 
custo e não a estabilidade da freqüência de oscilação for o mais importante.
Figura 3.16 Circuito para oscilador RC
Os valores do resistor devem estar entre 100 KΩ e 3KΩ e o capacitor deve ter como valor 
mínimo 20 pF e valor máximo 330pF. .
Ressonadores cerâmicos são mais baratos que os cristais de quartzo, e possuem estabilidade 
adequada para a maioria das aplicações. Além disso, não precisam utilizar os capacitores externos. 
No entanto, são mais difíceis de serem encontrados no mercado brasileiro. 
O sistema de reset
O PIC16F877 reconhece cinco diferentes tipos de reset, a dizer:
•Reset no terminal MCLR durante operação normal
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 23
•Reset no terminal MCLR durante a execução de uma instrução de SLEEP.
•Reset através do watchdog (WDT) em operação normal.
•Reset através do WDT durante uma instrução de SLEEP.
•Reset na energização do sistema (POR)
Cada reset atua de modo diferenciado sobre os diversos registros. Com exceção do reset 
devido ao WDT ocorrendo quando o processador está no modo SLEEP, que desvia o programa para 
a próxima instrução após a instrução de SLEEP, todos os outros resets provocam o desvio imediato 
do programa para a posição 0H. O POR é gerado internamente na CPU quando é detectada subida 
no sinal de alimentação. Para utilizar o POR (sempre indicado para garantir o estado do 
microcontrolador logo após a energização) basta ligar o terminal MCLR com o VDD. Este reset só 
opera na subida do sinal de alimentação. Não é detectado a queda da alimentação. Você deve ter um 
circuito externo para o caso de desejar detectar a situação onde a VDD cai para um valor abaixo do 
mínimo permitido pelo fabricante, e, sem chegar a zero, retoma os valores de operação. Esta 
situação pode levar a um comportamento errático do microcontrolador.
A tabela 3.5 mostra o comportamento do contador de programa e do registrador Status nos 
vários tipos de reset. Alguns outros registradores também são afetados pelos resets. No item 
“Descrição dos registradores” você tem a descrição detalhada do efeito de cada reset sobre cada 
registrador específico.
Condição Contador de 
programa
Registrador 
STATUS
POR 00H 0001 1xxx
MCLR durante 
operação normal
00H 000u uuuu
MCLR durante 
SLEEP
00H 0001 0uuu
WDT em operação 
normal
00H 0000 1uuu
WDT durante 
SLEEP
PC+1 uuu0 0uuu
 
Tabela 3.5 Valores dos registros PC e STATUS nos diversos RESETS
http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 24
	Recursos necessários para execução deste tutorial
	Introdução
	A estrutura desta série de tutoriais
	O que é um microcontrolador
	A Arquitetura do microcontrolador PIC16F877A
	Como se programa um microcontrolador 
	As origens do PIC16F877A 
	Compreendendo a arquitetura do PIC16F877A 
	A estrutura interna do PIC16F877A 
	A descrição dos terminais do PIC16F877A 
	A descrição da estrutura interna do PIC16F877A
		As diferentes áreas de memória
	O controle do fluxo de programa
	O sistema de interrupts
	As configurações do oscilador
	O sistema de reset

Outros materiais

Outros materiais