coleção tutpro tutoriais sobre programação de ... · a arquitetura do microcontrolador...

24
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

Upload: doankhanh

Post on 08-Nov-2018

265 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

Coleção TUTPRO

Tutoriais sobre programação de microcontroladores

Solbet LtdaExpandindo 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

Page 2: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

SumárioRecursos necessários para execução deste tutorial...............................................................................3Introdução.............................................................................................................................................3

A estrutura desta série de tutoriais...................................................................................................4O que é um microcontrolador...............................................................................................................4

A Arquitetura do microcontrolador PIC16F877A...........................................................................6Como se programa um microcontrolador ............................................................................................8As origens do PIC16F877A .................................................................................................................9Compreendendo a arquitetura do PIC16F877A ................................................................................10

A estrutura interna do PIC16F877A .............................................................................................12A descrição dos terminais do PIC16F877A ..................................................................................13A descrição da estrutura interna do PIC16F877A.........................................................................16

As diferentes áreas de memória...............................................................................................16O controle do fluxo de programa...................................................................................................19O sistema de interrupts..................................................................................................................20As configurações do oscilador......................................................................................................21O sistema de reset..........................................................................................................................23

http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 2

Page 3: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

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

Page 4: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

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ão dos 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.

UOs 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

Page 5: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

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

Page 6: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

PORTA SAÍDA PORTA ENTRADA

CPUMEMÓ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

Page 7: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

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

Page 8: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

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 uso nã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

Page 9: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

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

Page 10: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

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 acumulador destes 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.

OO 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

Page 11: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

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

Page 12: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

•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

Page 13: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

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

Page 14: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

♦ 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 entrada para 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

Page 15: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

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

Page 16: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

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

Page 17: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

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

Page 18: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

A memória de programas é organizada da 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

Page 19: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

.

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

Page 20: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

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

Page 21: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

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 de freqüê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

Page 22: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

•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 C2XT 455 kHz(ressonador) 47-100pF 47-100pFXT 2.0

MHz(ressonador)15-33pF 15-33pF

XT 4.0 MHz (ressonador)

15-33pF 15-33pF

HS 8.0MHz(ressonador) 15-33pF 15-33pFHS 10 MHz

(ressonador)15-33pF 15-33pF

LP 32 kHz(cristal) 68-100pF 68-100pFLP 200khz(cristal) 15-33pF 15-33pFXT 100khz(cristal) 100-150pF 100-150pFXT 2 MHz (cristal) 15-33pF 15-33pFXT 4 MHz (cristal) 15-33pF 15-33pFHS 4 MHz (cristal) 15-33pF 15-33pFHS 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

Page 23: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

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

Page 24: Coleção TUTPRO Tutoriais sobre programação de ... · A Arquitetura do microcontrolador PIC16F877A odemos pensar num microcontrolador como um dispositivo composto de sete partes,

•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 1xxxMCLR durante

operação normal00H 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