Você está na página 1de 123

Exsto Tecnologia

Kit de Microcontroladores PIC

Apostila de microcontroladores PIC16

Exsto Tecnologia Ltda Ltda.


R. Vereador Jos Eduardo da Costa, 169 Santa Rita do Sapuca MG CEP: 37540-000 +55 35 3471 6898 www.exsto.com.br

Microcontroladores PIC16F877A

Reviso 1

Principais Autores Jos Domingos Adriano

Descrio da Verso Reviso inicial para a nova verso do kit

Data de Trmino

Copyright 2008 por Exsto Tecnologia Ltda. Todos os direitos reservados

Desenvolvido e produzido com orgulho no Brasil

Exsto Tecnologia Ltda R. Vereador Jos Eduardo da Costa, 169 Santa Rita do Sapuca MG CEP: 37540-000 +55 35 3471 6898 www.exsto.com.br

Exsto Tecnologia

Microcontroladores PIC16F877A

NDICE

PGINA

Introduo .............................................................................................................................................. 6 1 CONCEITOS BSICOS ................................................................................................................ 7 1.1 Sistema Computacional .......................................................................................................... 7 1.1.1 Memrias........................................................................................................................... 8 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 Memria de programa ...................................................................................................... 8 Memria de Dados ............................................................................................................ 9 Barramentos ...................................................................................................................... 9 Dispositivos de entrada e sada ....................................................................................... 10 Perifricos ........................................................................................................................ 13 CPU .................................................................................................................................. 14

1.2 Arquitetura Computacional................................................................................................... 17 1.2.1 Arquitetura von-Neumann .............................................................................................. 17 1.2.2 2 Arquitetura Harvard ........................................................................................................ 18

O MICROCONTROLADOR PIC16F877A ................................................................................. 20 2.1 2.2 2.3 A Microchip .......................................................................................................................... 20 Microcontroladores PIC ........................................................................................................ 20 A Arquitetura do PIC16F877A ............................................................................................. 21

2.4 Gerao de clock................................................................................................................... 22 2.4.1 Modos LP,XT e HS ............................................................................................................ 23 2.4.2 2.4.3 2.4.4 2.4.5 Modos RC......................................................................................................................... 25 Modo INTOSC .................................................................................................................. 26 Comparao entre os modos de oscilador ...................................................................... 26 Clock e execuo das instrues ..................................................................................... 26

2.5 Memrias .............................................................................................................................. 27 2.5.1 Memria de programa .................................................................................................... 27 2.5.2 Memria de dados .......................................................................................................... 28

2.6 RESET .................................................................................................................................. 31 2.6.1 POR Power-On Reset .................................................................................................... 31 2.6.2 2.6.3 2.6.4 2.6.5 2.6.6 2.7 2.8 2.9 PWRT Power-up Timer ................................................................................................. 31 OST Oscillator Start-up Timer ....................................................................................... 31 BOR Brown-out Reset ................................................................................................... 31 Seqncia de inicializao ............................................................................................... 32 Identificao de Reset pelo Software .............................................................................. 32 Watch-Dog Timer ................................................................................................................. 33 Modo de baixo consumo Modo SLEEP............................................................................. 33 Caractersticas especiais ....................................................................................................... 34 Exsto Tecnologia

Microcontroladores PIC16F877A

2.9.1 2.9.2 2.9.3 2.10

Proteo de Cdigo (Code Protect) ................................................................................. 34 Locais de Identificao (ID Locations) ............................................................................. 34 Pinagem e Hardware Bsico ............................................................................................ 34 Gravao ............................................................................................................................... 36

2.11 O conjunto de instrues do PIC16F877A ........................................................................... 37 2.11.1 Manipulao de Byte .................................................................................................. 39 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.12 2.13 2.14 3 3.1 3.2 Manipulao de bit ..................................................................................................... 40 Matemticas ............................................................................................................... 41 Lgicas ......................................................................................................................... 44 Testes .......................................................................................................................... 48 Chamadas e desvio...................................................................................................... 49 Controle....................................................................................................................... 51

Programando em assembly ................................................................................................... 52 Estrutura do Programa .......................................................................................................... 53 Programao estruturada....................................................................................................... 56 Diretivas ................................................................................................................................ 58 Variveis ............................................................................................................................... 61

PROGRAMANDO O PIC16F877A ............................................................................................. 58

3.3 Sub-rotinas ............................................................................................................................ 62 3.3.1 Passagem de Parmetros ................................................................................................ 63 3.3.2 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 Chamada X Desvio (CALL X GOTO) .................................................................................. 64 Atribuio ............................................................................................................................. 66 Entrada e Sada ..................................................................................................................... 67 Estruturas de Deciso............................................................................................................ 68 Condies ............................................................................................................................. 69 Se .......................................................................................................................................... 71 Se seno ................................................................................................................................ 72 Se seno se ............................................................................................................................ 73 Caso ...................................................................................................................................... 75

3.12 Estruturas de repetio .......................................................................................................... 77 3.12.1 Faa-Enquanto ............................................................................................................ 78 3.12.2 3.12.3 3.13 4 4.1 4.2 Enquanto ..................................................................................................................... 78 Para ............................................................................................................................. 79

Temporizao por software Rotinas de atraso ................................................................... 80 Display de cristal Lquido ..................................................................................................... 84 Teclado ................................................................................................................................. 87 Exsto Tecnologia

RECURSOS AVANADOS ......................................................................................................... 84

Microcontroladores PIC16F877A

4.3 Interrupes .......................................................................................................................... 89 4.3.1 Utilizao das Interrupes ............................................................................................. 92 4.3.2 4.3.3 5 Interrupo externa em RB0 ........................................................................................... 96 Interrupo por mudana no portal B ............................................................................. 96

PERIFRICOS DO PIC16F877A .............................................................................................. 98 5.1 Timers ................................................................................................................................... 98 5.1.1 Timer 1............................................................................................................................. 98 5.1.2 5.1.3 Oscilador do timer 1 ...................................................................................................... 101 Interrupo .................................................................................................................... 101

5.2 Mdulo CCP ....................................................................................................................... 101 5.2.1 Modo captura ................................................................................................................ 102 5.2.2 5.2.3 5.2.4 Modo comparao ........................................................................................................ 103 Modo PWM ................................................................................................................... 103 Interrupo .................................................................................................................... 106

5.3 Comunicao Serial ............................................................................................................ 106 5.3.1 Comunicao Paralela ................................................................................................... 106 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 Comunicao serial........................................................................................................ 107 EIA-232C ........................................................................................................................ 109 A USART do PIC16F877A................................................................................................ 110 Transmisso ................................................................................................................... 112 Recepo ....................................................................................................................... 113

5.4 Conversor Analgico para digital ADC........................................................................... 114 5.4.1 Configurao e uso ........................................................................................................ 116 5.5 Memrias EEPROM e Flash............................................................................................... 118 5.5.1 Memria EEPROM ......................................................................................................... 118 5.5.2 5.5.3 5.5.4 Rotinas de acesso a EEPROM ........................................................................................ 119 Memria FLASH de programa ....................................................................................... 120 Rotinas de acesso a FLASH. ........................................................................................... 120

Apndices ............................................................................................................................................ 122 Apndice A Conjunto de Instrues do PIC16 ............................................................................. 122 Apndice B Mapeamento de memria de dados........................................................................... 123

Exsto Tecnologia

Microcontroladores PIC16F877A

Introduo
Est apostila tem o objetivo de servir como livro texto para um curso de microcontroladores PIC16. Esse contedo foi preparado para ser usado em disciplinas de microcontrolador/microprocessadores em cursos tcnicos ou superiores na rea de tecnologia. Os pr-requisitos para o bom aproveitamento do curso so conhecimentos bsicos de informtica, eletrnica bsica, eletrnica digital bsica (principalmente memrias, contadores, portas lgicas e flip-flops ). Tambm recomendvel para o bom andamento do curso que os alunos j tenham freqentada alguma matria de programao (seja qual for a linguagem estudada). O curso estruturado em 5 captulos que abordam o funcionamento do PIC16F877A, partindo de conceitos mais gerais e especializando a cada passo, at tratar vrios dos perifricos. O captulo inicial com os conceitos bsicos sobre microcontroladores e sistemas computacionais, e tem o objetivo de equalizar os pr-requisitos sobre o assunto. Este captulo pode ser omitido, sem qualquer prejuzo no andamento do curso, caso esses conceitos j tenham sido estudados em outras disciplinas. O captulo 2 apresenta os microcontroladores PIC16 , tratando tanto de hardware como de software, alm de trazer os fundamentos de programao em linguagem assembly. So discutidos organizao de memria e funcionamento da CPU, alm das principais caractersticas destes microcontroladores. De posse dos conhecimentos do Captulo 2 feito um estudo mais aprofundado de tcnicas de programao segundo os preceitos da programao estruturada e engenharia de software. Vale ressaltar a importncia dessa unidade, visto que ela visa formar as bases da lgica de programao e que o desenvolvimento com microcontroladores basicamente um desenvolvimento de software. O captulo 4 apresenta algumas aplicaes avanadas de programao, com displays LCD, teclados matriciais e, principalmente, interrupes. No ltimo captulo so apresentados alguns dos principais perifricos do PIC16F877A, tambm encontrados em outros microcontroladores da famlia PIC16. Destes, so fundamentais os timers e comunicao serial. Os demais podero ser sacrificadas ou resumidas, caso a carga horria no suporte a totalidade do contedo, apesar de ser recomendado dar uma maior ateno ao conversor analgico para digital.

Exsto Tecnologia

Microcontroladores PIC16F877A

1 CONCEITOS BSICOS
Inicialmente ser apresentado o conceito de microcontroladores de forma genrica, que posteriormente ser estendido ao PIC16F877A e pode ser aplicado a qualquer outro microcontrolador. importante este embasamento terico no somente para garantir um melhor aproveitamento no estudo do PIC 16F877A como tambm para tornar o leitor apto a entender o funcionamento de outros microcontroladores, tanto da linha PIC como de outros fabricantes. Esses conhecimentos tambm so importantes na escolha do microcontrolador a ser utilizado em um projeto, pois permite estabelecer as bases conceituais para a comparao de suas caractersticas.

1.1 Sistema Computacional


Inicialmente devemos conceituar o que vem a ser um sistema computacional. Os sistemas computacionais so compostos por sistemas combinacionais e seqenciais. O que caracteriza um sistema computacional a possibilidade de ser programado. Um sistema computacional composto por hardware (parte fsica) e software (programa). O hardware dos sistemas computacionais, ao contrrio do que ocorre com sistema combinacionais e seqenciais, no possui uma aplicao especfica. necessrio que exista um software para ser executado. Em contrapartida, um mesmo hardware pode executar uma infinidade de funes diferentes, simplesmente alterando o seu software. Uma boa analogia imaginar o hardware como um instrumento musical e o software como uma partitura. Um piano por si s no faz nada, necessria uma msica que possa ser executada a fim de se obter algum resultado. Da mesma forma que a msica contida na partitura, um programa ser composto por um conjunto limitado de smbolos (no caso da partitura so as notas musicais e no caso do programa so as instrues) que podem ser organizados de diversas formas diferentes, obtendo-se diferentes resultados. Como exemplo de sistema computacional, o primeiro que nos vem em mente o computador pessoal (PC), hoje to difundido. Contudo, existem vrios equipamentos, to ou mais comuns que os PCs, que so sistemas computacionais. Por exemplo, os vdeo-games, os mini-games, as calculadoras, palm-tops, etc. Alm disso, temos os microcontroladores, que so o objetivo desse nosso estudo, que esto presentes nas mais diversas aplicaes. A estrutura de um sistema computacional como a apresentada no diagrama em blocos abaixo (Figura 1.1).

Exsto Tecnologia

Microcontroladores PIC16F877A

Memria Dados Controle (CPU) Programa

Barramento de Dados

Dispositivos de Entrada e sada e perifricos

Mundo Externo

Figura 1.1 Diagrama em blocos genrico de um sistema computacional

1.1.1 Memrias
Memrias so dispositivos que armazenam informaes. No caso de um sistema computacional, essa informao, assim como a memria, pode ser dividida em dois tipos: de programa e de dados. Existem tambm Registros (bytes de memria) com funes especiais que trabalham junto ao processador (CPU).

1.1.2 Memria de programa


Sua funo armazenar o software (programa) a ser executado no sistema. Tambm utilizada para guardar tabelas de constantes Existem endereos de memria de programa existem alguns com finalidade especfica, chamados vetores, que so endereos para onde o programa desvia quando ocorrem determinados eventos. Temos o vetor de reset, que o endereo pelo qual o programa comea a ser executado e o vetor de interrupes, que para onde o programa desvia quando ocorreu um pedido de interrupo (trataremos desse conceito mais adiante). De uma forma geral, a memria de programa uma memria no voltil. O tipo dessa memria pode ser: ROM (Read Only Memory): somente de leitura. Geralmente chamada de masked-ROM (masked = mascarado), gravada pelo fabricante do componente, o que em quantidades muito grandes reduz custos. OTP (Only Time programming): programvel somente uma vez, utilizada em produo. EPROM (Erasable Progrmable Read Only Memory) : apagvel atravs de luz ultravioleta. Utilizada no processo de desenvolvimento e algumas vezes no produto acabado, quando h a necessidade de se poder alterar o software.

Exsto Tecnologia

Microcontroladores PIC16F877A

Flash: uma memria eletricamente apagvel (EEPROM Electricaly Eresable Read Only Memory) com tempos de acesso para leitura rpido. Oferece uma grande flexibilidade, pois geralmente possvel reprogramar um equipamento sem troca de componentes.

Praticamente todos os microcontroladores j possuem internamente algum desses tipos de memria de programa. Atualmente quase todos os microcontroladores possuem verses em memria Flash, pois a mesma apresenta muitas vantagens a um custo dos mais baixos.

1.1.3 Memria de Dados


a memria onde so armazenados os dados a serem processados pelo computador (as variveis dos programas e outras informaes.). Como esses dados so constantemente alterados, a memria utilizada para armazena-los do tipo RAM. Como se trata de uma memria voltil, quando a alimentao cortada esses dados so perdidos. Alguns microcontroladores disponibilizam tambm memrias EEPROM para armazenar dados que no devem ser perdidos com a falta de energia.

1.1.4 Barramentos
As vrias partes de um sistema computacional (CPU, memrias, dispositivos de entrada e sada) so ligadas entre si atravs de barramentos, ou vias, que so ligaes fsicas de comunicao paralela entre os componentes. So eles: Barramento de dados: pelo qual os dispositivos de I/O e memrias trocam dados com o processador Barramento de endereos: permite ao processador enderear qual dispositivo ser acessado Barramento de controle: indica se o acesso de leitura ou escrita, se feito a posio de memria ou a I/O. Barramento de programa: por onde o processador recebe as instrues que compe o programa.

O tamanho do barramento de dados limita o tamanho de dados que trafegam pelo sistema. Por isso comum classificar os sistemas computacionais pelo tamanho de seu barramento; temos ento sistemas de 8 bits, 16 bits, 32bits, etc. Os microcontroladores so em sua maioria de 8 bits, apesar de existirem alguns modelos de 16 bits. J o tamanho do barramento de endereos nos informa qual a quantidade mxima de endereos de memria ou dispositivos de I/O e perifricos podem ser acessados. Por exemplo, um barramento de endereos de 10 bits permite acessar 210 = 1024 endereos. Todos os dispositivos de um sistema computacional fazem uso do barramento de dados para trafegar informaes. Para que o sistema funcione corretamente podemos apresentar o processo de forma simplificada assim: o processador (que coordena o processo) escreve no barramento de endereos o endereo do dispositivo a ser acessado. Atravs do barramento de controle ele informa ao dispositivo se o acesso de leitura ou escrita (a definio de leitura ou escrita de dispositivos sempre feita pelo ponto de vista do processador). No caso de um aceso de leitura o dispositivo escreve no

Exsto Tecnologia

Microcontroladores PIC16F877A

10

barramento de dados e a informao lida pelo processador. No caso de um acesso de escrita, o processador envia dados para o barramento de dados que so lidos pelo dispositivo acessado. Como dispositivos de um sistema computacional usam o mesmo barramento de dados para trafegar informaes preciso que, quando um dispositivo estiver escrevendo no barramento (portanto aplicando nveis de tenso ao barramento) os demais dispositivos no causem conflito de dados. De fato, todos os dispositivos presentes em um sistema computacional so capazes de ficar em estado de alta impedncia enquanto no forem acessados para leitura.

1.1.5 Dispositivos de entrada e sada


So responsveis por realizar a interface do processador com o mundo externo. atravs deles que um sistema computacional adquire dados externos e aciona processos. So comumente chamados de dispositivos de I/O (Input/Output Entrada/Sada), portais de I/O (no ingls, ports) ou simplesmente portais. A funo dos portais de sada transferir ao mundo externo um dado que esteja presente no barramento de dados. Para isso so utilizados latches, pois permitem o carregar dados somente quando so acionados, retendo esses dados independente de haverem alteraes em suas entradas. Os portais de entrada devem permitir a transferncia de dados do mundo externo para o barramento de dados quando acionados e em alta impedncia no restante do tempo. Para tanto, so tradicionalmente utilizados buffers com sada tri-state para essa funo. A seleo dos dispositivos de I/O a partir do barramento de endereos feita por decodificadores ligados ao barramento de endereos e seu acionamento feita atravs do barramento de controle. Exemplo 1.1 A figura 1.2, abaixo, mostra um exemplo de utilizao de buffers e latches como portais de entrada e sada, respectivamente. Ambos os portais esto ligados ao barramento de dados. Cada portal possui um decodificador (DEC), que apresenta nvel alto na sada quando o valor do barramento de endereos o endereo do portal. Os sinais RD (read ler), WR (write escrever) e IORQ (I/O request requisio de I/O) constituem o barramento de controle. Para a operao de leitura, o endereo do portal colocado no barramento de dados.O decodificador decodifica o endereo do portal de leitura e coloca em sua sada nvel lgico 0. Em seguida, os sinais IORQ e RD so acionados. Assim temos 1 no terminal de habilitao de sada do buffer e o valor em sua entrada transferido para o barramento de dados, podendo ser armazenado pela CPU.

Exsto Tecnologia

Microcontroladores PIC16F877A

11

Figura 1.2 Portais de entrada e sada Para realizar uma operao de escrita do portal , o processador inicialmente coloca os dados a serem escritos no barramento de dados e o endereo do portal no barramento de endereo.O decodificador decodifica o endereo do portal de escrita e coloca em sua sada nvel lgico 0. Ento so acionados os sinais WR e IORQ. Nesse instante temos 1 nas trs entradas da porta AND que aciona o terminal E do latch, que faz com ele carregue os dados presentes no barramento na sada.

Figura 1.2 Portais de entrada e sada A funo do microcontrolador, como o prprio nome diz, controlar processos e circuitos. Para otimizar essa funo, seus portais de entrada e sada so tratados como registros de funes especiais, ou seja, so lidos e escritos como se fossem simples bytes de memria. Em sistemas como microprocessadores geralmente o tratamento diferente, havendo instrues especficas para acesso aos portais e outras implicaes, que diminuem a eficincia do cdigo gerado quando se trabalha intensamente com entrada e sada.

Exsto Tecnologia

Microcontroladores PIC16F877A

12

Para maior flexibilidade do sistema, geralmente os microcontroladores utilizam um sistema de portais mais complexo que o apresentado acima, que permite que um mesmo terminal do microcontrolador seja configurado como entrada ou sada. Para que isso seja possvel utilizado um registro de portal (PORT) e um registro de direo de dados (DDR Data Direction Register). Esse ltimo permite selecionar a direo de cada bit de um portal de sada, individualmente. A figura 1.3a e 1.3b abaixo mostram o esquema genrico de um bit de portal do PIC16F877A. Outros microcontroladores utilizam configuraes semelhantes.

Figura 1.3a Esquema tpico de um pino de I/O OPERAO DE ESCRITA OU SADA DE DADOS: ao acionar o controle WR PORT, o latch de sada (Data Latch) armazena a informao complementar do barramento de dados em sua sada complementar Q barra. Vamos admitir que o registro de direo de dados (TRIS Latch) foi carregado inicialmente com o valor 0. O registro de direo de dados habilitado atravs do controle WR TRIS e a informao de direo fica armazenada em sua sada. Para Q=0 e Q barra=1 na sada do registro de direo, o pino I/O estar configurado como sada e tem-se a transferncia da informao Q barra do latch de sada para o driver do pino I/O conforme o arranjo das portas lgicas. Se este ltimo Q barra =0 o transistor N ser cortado e P ser ativado permitindo que a tenso Vdd aparea no pino I/O como nvel lgico 1 que era a informao original do barramento de dados. Se Q barra =1 o transistor P ser cortado e N estar ativo. A tenso no pino I/O cai para o nvel Vss indicando nvel lgico 0.

Exsto Tecnologia

Microcontroladores PIC16F877A

13

Figura 1.3b Esquema tpico de um pino de I/O OPERAO DE LEITURA OU ENTRADA DE DADOS: novamente admitamos que o registro de direo foi carregado inicialmente com o valor 1 em sua sada. Agora, o arranjo das portas lgicas permite o corte simultneo dos dois transistores do driver configurando o pino I/O como entrada de dados. Assim, o controle RD PORT habilita o latch de entrada e o buffer tri-state, o que possibilita que a informao do pino de I/O trafegue pelo barramento de dados. No restante do tempo o buffer fica em alta impedncia. Caso seja feita uma operao de escrita em um terminal configurado como entrada, o dado escrito ser armazenado no latch de dados, mas no ser transferido para o terminal, pois o driver est desativado. Por outro lado, se for realizada uma operao de leitura em um terminal configurado como sada, o valor lido ser o dado presente no terminal, que o mesmo escrito no latch de dados anteriormente.

1.1.6 Perifricos
Alm dos portais de I/O e as memrias, podemos ter muitos outros tipos de dispositivos ligados ao barramento de dados. Esses dispositivos nada mais so do que circuitos destinados a realizar funes especiais. Esses dispositivos perifricos so particularmente importantes nos microcontroladores. Como perifricos mais comuns podemos citar os temporizadores e contadores (Timers), os mdulos de comunicao serial, conversores AD e DA, mdulos de CCP (Captura, comparao e PWM), drivers de LCD, comparadores analgicos, etc.

Exsto Tecnologia

Microcontroladores PIC16F877A

14

O modo de acesso aos perifricos semelhante ao de acesso aos portais de I/O. Eles muitas vezes possuem vrios registros de parmetros que podem ser configurados, e um ou mais registros de entrada e sada de dados. Quando estivermos tratando dos perifricos do PIC16F877A mostraremos como trabalhar com eles e, apesar de cada microcontrolador apresentar um conjunto de perifricos diferentes, seu funcionamento muito semelhante.

1.1.7 CPU
A CPU (Central Processing Unit Unidade Central de Processamento) ou processador parte principal de um sistema computacional. comum se referir CPU dos microcontroladores como core (ncleo). Sua funo executar as instrues do programa e processar dados. Para tanto ela controla todas as demais partes do sistema e envia ou recebe dados dessas partes. Ela tambm capaz de interpretar e colocar em execuo as instrues que compe o programa e realizar operaes lgicas e aritmticas. Genericamente um processador organizado conforme o diagrama em blocos da figura 1.4.

Figura 1.4 Diagrama em blocos de uma CPU Os nomes de cada bloco esto em ingls no diagrama para facilitar a identificao desses blocos nos manuais de microcontroladores e microprocessadores, que comumente so escritos nessa lngua. Os blocos pontilhados podem ou no estar presentes. As vias em amarelo representam o barramento de dados interno do processador, que ligado ao barramento de dados do sistema. As vias em verde so outras vias de dados e sinais de controle. Exsto Tecnologia

Microcontroladores PIC16F877A

15

O principal bloco de um processador o decodificador de instrues (Instructiuon Decoder). Voltando a analogia entre um sistema computacional e um instrumento musical, o decodificador de instrues pode ser comparado ao msico, que age sobre o instrumento (hardware) executando a msica (software). Esse bloco composto por um decodificador e um contador. Tal decodificador pode ser visto como um livro de receitas culinrias. No livro, cada pgina contm uma receita e dentro de cada receita h os passos para sua execuo. De modo anlogo, cada instruo do processador como o endereo de uma pgina onde est a seqncias de acionamento dos sinais de controles (internos e externos ao processador) que permitem a execuo da instruo. O contador existente responsvel por fazer com que os passos para a execuo de uma instruo sejam executados em seqncia. Cada modelo de processador possui um conjunto, ou set, de instrues que pode executar. O barramento de controle interno (Internal Control) permite ao decodificador de instrues controlar os blocos internos do processador, enquanto o barramento de controle externo (External Control) j foi discutido e tem a funo de indicar se o acesso de leitura ou escrita, se em memria ou dispositivos de I/O. O programa armazenado na memria uma seqncia de instrues. Podemos ento supor que para enderear corretamente essas instrues deveria haver um contador. Ele existe e chamado Contador de Programa ou PC (Program Counter). A cada instruo iniciada o PC incrementado. Portanto ele aponta a prxima instruo, isto , contm o endereo da prxima instruo a ser executada. A sada desse contador ligada a um registro (Program Addressing) que carregado ao final de cada instruo com o endereo da prxima instruo. A sada do registro Program Addressing est ligada ao barramento de endereos da memria de programa. Quando a CPU resetada, o PC automaticamente carregado com o valor do vetor de reset. Durante a execuo do programa, um valor pode ser carregado no PC. Isso ocorre para desviar o fluxo do programa. Existem instrues que realizam essa alterao de fluxo, que pode ser de dois tipos: desvio ou chamada. Quando ocorre um desvio o contedo do PC alterado para que ele passe a executar o programa a partir de outro ponto. Na execuo de uma chamada o fluxo do programa tambm desviado para um determinado ponto para executar um trecho do programa, mas nesse caso ele deve retornar ao ponto do programa onde ocorreu o desvio (mais precisamente primeira instruo aps a instruo de chamada). Isso permite executar uma sub-rotina, conceito que ser discutido quando tratarmos do software. Em uma chamada o endereo de retorno deve ser armazenado em algum lugar, caso contrrio no seria possvel retornar ao ponto onde a chamada ocorreu. Esse lugar chamado de pilha (stack). O nome pilha se deve a seu funcionamento, que semelhante a uma pilha de pratos: como pode haver vrias chamadas consecutivas sem que haja retorno, os endereos de retorno so armazenados uns sobre os outros. Quando ocorre uma instruo de retorno (que o que faz o programa retornar da chamada), o programa volta para o ltimo endereo guardado, e assim sucessivamente at que a pilha esteja vazia. A pilha ento uma poro de memria onde podem ser armazenados os endereos de retorno.

Exsto Tecnologia

Microcontroladores PIC16F877A

16

Para indicar a prxima posio livre na pilha existe um registro (na verdade um contador) chamado ponteiro da pilha (Stack Pointer) que aponta o topo. Esse registro incrementado cada vez que um novo endereo de retorno armazenado na pilha e decrementado quando ocorre um retorno. Uma vez determinado o endereo, seu contedo lido e armazenado em um registro chamado registro de instruo (Instruction Register). Desse registro, parte da instruo vai para o decodificador de instrues e parte pode ir para a ALU e/ou parte para o registro de endereamento de dados (Data Addressing). Para entender o porque disso, devemos ter em mente que uma instruo nada mais que uma palavra binria. Parte dela, que efetivamente a instruo, indica ao decodificador de instrues qual a seqncia de aes deve ser executada (qual a pgina do decodificador de instrues). O restante constitui os operandos da instruo, ou seja, os dados a serem processados. Esses dados podem ser constantes ou endereos de dados variveis na memria RAM. Conforme sua natureza e a instruo a ser executada eles tem um destino ou outro. A unidade lgico-aritmtica ou ALU (Aritmetic and Lgic Unit) o circuito responsvel pelos clculos em um processador. Como prprio nome diz, ela responsvel pela realizao de operaes lgicas, (E, OU, OU-exclusivo, deslocamentos, rotaes, complemento), e aritmticas (incremento, decremento, adio, subtrao, multiplicao, e diviso). Os processos de diviso e multiplicao so feitos com a ALU utilizando seqncias somas e subtraes, o que efetivamente o que a ALU capaz de fazer. A ALU trabalha juntamente com dois registros especiais: o Acumulador (Accumulator) e o registro de estado de operaes aritmticas (Status). comum se referir ao acumulador simplesmente como Acc ou, no caso dos PICs, como W (Worker Trabalhador ). O acumulador quase sempre est envolvido nas operaes realizadas pela ALU. Ele pode ser um dos operandos, pode ser onde se armazena o resultado ou pode ser as duas coisas. H tambm microcontroladores onde qualquer transferncia de dados entre dois endereos da RAM passa pelo acumulador. Quanto ao registro de status, sua funo indicar resultados notveis das operaes matemticas. Esses resultados so indicados por flags, que so bits desse registro. Atravs da anlise dos flags possvel saber, dentre outras coisas, se uma operao resultou em zero; se houve estouro da capacidade de armazenamento (overflow), que acontece quando um resultado maior que o mximo valor possvel de ser representado pelo sistema; se o resultado de uma operao aritimtica negativo ou positivo. Existe uma interao do registro status com o decodificador de instrues, pois atravs da anlise de seus flags possvel realizar instrues de testes. Para acessar a memria de dados e os perifricos existe um registro, que em nosso sistema chamado de endereamento de dados (Data Addressing) que pode receber valores de duas formas. A primeira diretamente de parte da instruo. Nesse caso se est fazendo referncia a endereos da RAM conhecidos e fixos, pois so carregados valores constantes existentes no programa. Esse modo chamado endereamento direto. Em muitos casos necessrio fazer referncias a endereos variveis. Isso feito carregando o registro de endereamento com dados provenientes de um outro registro, o registro de endereamento indireto (Indirect Addressig). Como qualquer outro registro, ele pode ser carregado com um valor, constante ou proveniente de uma varivel, pode ser incrementado, decrementado ou participar que qualquer operao lgico-aritmtica. Sua funo semelhante a dos ponteiros em linguagens de alto nvel. Exsto Tecnologia

Microcontroladores PIC16F877A

17

Todo o sistema computacional trabalha sincronizado com um mesmo sinal de clock. Devemos lembrar que esse clock o que faz o decodificador de instrues passar de uma instruo para a outra, e tudo o mais deve estar sincronizado com ele, seno haveria o caos. Para gerar esse sinal de clock necessrio um oscilador. Nos microcontroladores esse oscilador j faz parte do componente Independente da forma como o clock gerado, esse sinal aplicado a CPU e aos perifricos. comum que a freqncia do clock dos perifricos seja menor que a da CPU. Para tanto so utilizados divisores de freqncia Outro ponto importante o reset. Alm do reset que ocorre quando o sistema ligado, chamado de Power-on reset, os microcontroladores apresentam vrias outras fontes de reset. Esses resets so protees do sistema. Sntese genrica de operao de uma CPU: 1) O iniciar um programa, o contador de programa aponta para o primeiro endereo na memria de programa. 2) Neste endereo comea o programa. 3) O registrador de instruo armazena o dado guardado neste endereo. Este dado composto da instruo e do operando. O operando pode ser proveniente da memria de programa ou da memria RAM ( memria de dados ). 4) O decodificador de instruo recebe a instruo do registrador de instruo. 5) A instruo corresponde a uma seqncia de passos programados em uma ROM, o chamado microcdigo. 6) Um contador dentro do decodificador de instruo varre essa seqncia de passos. 7) O decodificador de instruo comea ento a acionar os dispositivos dentro ou fora da CPU atravs dos barramentos de dados, controle e endereo. 8) A partir desse ponto os dispositivos podem ser acionados nas mais diversas seqncias de operao dependendo da necesidade de processamento imposta pelo cdigo, por exemplo: O contador de programa aponta para o prximo endereo de memria de programa onde pode estar o valor de uma instruo com operando. A memria de programa habilitada e esse valor passado do para a ALU atravs do registro de instruo. O contador de programa aponta para o prximo endereo na memria de dados. A memria de dados habilitada e o valor armazenado nesse endereo passa para o acumulador. A ALU opera aritmeticamente esses dois dados, sinaliza para o registrador de estados qual foi e estado da operao e disponibiza o resultado em sua sada. Uma memria ou um dispositivo de sada pode ser habilitado e o resultado ser armazenado em um desses dispositivos. Em resumo sempre ocorre um processo de BUSCA e EXECUO da instruo. A busca se refere a localizao das instrues e dos operandos na memria e a execuo se refere ao acionamento de dispositivos em seqncia para conseguir o resultado desejado.

1.2 Arquitetura Computacional


1.2.1 Arquitetura von-Neumann
Na arquitetura von-Neumann, as memrias tanto de dados quanto de programa, so acessadas usando-se o mesmo barramento de dados; os portais de I/O tambm fazem uso do barramento de dados. Ou seja, a memria e os dispositivos de I/O compartilham o mesmo barramento em momentos distintos. Exsto Tecnologia

Microcontroladores PIC16F877A

18

Vale lembrar aqui que uma instruo como uma operao matemtica, isto , composta de operadores, que indicam o que ser feito, e operandos, que so os parmetros envolvidos na operao.Desta forma, o processo de execuo de cada instruo dividido em dois momentos: a leitura da instruo e a leitura dos operandos (fetch) e a execuo da instruo propriamente dita. Nota-se que dessa forma o processador est parte do tempo ocupado com a leitura da memria de programa e, conseqentemente no fica executando o firmware o tempo todo. Outra caracterstica da arquitetura von-Neumann que, visto que os operandos das instrues so geralmente do mesmo tamanho do barramento de dados, quanto mais complexa a instruo maior ser a quantidade de endereos ocupados por ela na memria. Isto quer dizer que por exemplo, para um barramento de 8 vias, uma instruo de 16 bits buscada e executada em duas partes de 8 bits. Por outro lado, como a complexidade da instruo no tem limite a no ser o espao ocupado, podemos ter um set de instrues to complexo quanto se queira. Podemos concluir que arquitetura von-Neumann consome muito tempo de processamento com a leitura da instruo e dos operandos. Conclui-se tambm que instrues diferentes ocupam quantidades diferentes de memria e so executadas em tempos diferentes. Memria

Programa CPU

Dados

Barramento de Dados

I/O

Figura 1.5 Arquitetura von-Neumann Os sistemas de arquitetura von-Neumann geralmente tm conjuntos de instrues complexos, o que equivale a dizer que possuem um grande nmero de instrues e cada instruo realiza uma grande seqncia de aes. Processadores desse tipo so chamados CISC (Complex Instruction Set CPU CPU com Set de Instrues Complexo).

1.2.2 Arquitetura Harvard


J a arquitetura chamada de arquitetura Harvard, que utilizada nos microcontroladores PIC, tem como principal caracterstica acessar a memria de dados separadamente da memria de programa. A principal vantagem dessa arquitetura que a leitura de instrues e de alguns tipos de operandos pode ser feita ao mesmo tempo em que a execuo das instrues (tempo Tcy). Isso significa que o sistema fica todo o tempo executando instrues, o que acarreta um significativo ganho de velocidade. Enquanto uma instruo est sendo executada, a seguinte est sendo lida. Esse processo conhecido como pipelining (canalizao) e ilustrado pela figura 1.6 abaixo.

Exsto Tecnologia

Microcontroladores PIC16F877A

19

Figura 1.6 Pipeline O barramento de programa no necessariamente tem o mesmo tamanho do barramento de dados. Dessa forma, em uma nica palavra da memria de programa pode conter operando e operadores, o que nos permite carregar toda a instruo em um nico ciclo de leitura da memria.

Memria de Programa

CPU

Memria de Dados

Barramento de Programa

I/O

Barramento de Dados Figura 1.7 Arquitetura Harvard

Pode-se notar ento que os tempos de execuo e de leitura esto atrelados e so os menores possveis. Isso acarreta em as instrues no poderem executar uma grande seqncia de aes, ou seja, no existem instrues complexas. Por isso, os PICs so considerados processadores RISC (Reduced Instruction Set CPU CPU com Set de Instrues Reduzido). O nmero de instrues reduzido, o que no significa que no se possa executar programas complexos, mas sim que seqncias complexas de aes devem ser construdas por seqncias de instrues bsicas.

Exsto Tecnologia

Microcontroladores PIC16F877A

20

2 O MICROCONTROLADOR PIC16F877A
2.1 A Microchip
O fabricante dos microcontroladores PIC a empresa americana Microchip. Atualmente ela um dos maiores fabricante mundiais de microcontroladores de 8, 16 e 32 bits, alm de possuir uma ampla linha de memrias e componentes analgicos. A Microchip trabalha com uma poltica de suporte ao cliente muito eficiente, que provavelmente uma das causas de seu sucesso. Em seu site (www.microchip.com) existe uma grande quantidade de informao disponvel. Alm dos manuais dos componentes, existem muitas notas de aplicao (Application Notes) e projetos de referncia, que so de grande ajuda para a formao da base de conhecimentos do estudante de microcontroladores PIC.

2.2 Microcontroladores PIC


Os PICs so divididos em famlias. Cada famlia, ou plaforma, tem vrios componentes, com tamanhos e recursos diferentes; no entanto o cdigo desenvolvido para um componente de uma determinada famlia compatvel com os demais componentes da mesma famlia, exceto por umas poucas alteraes, que ser referem principalmente aos perifricos. Cada famlia tem seu prprio set (conjunto) de instrues. Essas instrues so comandos em linguagem de programao assembly que compe os softwares gravados nos microcontroladores, com as quais o aluno entrar em contato mais adiante. Dessa forma, ao se estudar um componente especfico de uma famlia, se est adquirindo conhecimento para trabalhar com microcontroladores de toda a famlia. As famlias so se dividem ainda conforme o tamanho do barramento de bits, havendo microcontroladores de 8, 16 e 32 bits. As famlias de microcontroladores PIC so: 8 bits o Famlia PIC10 o Famlia PIC12 o Famlia PIC14 e PIC17 o Famlia PIC16 o Famlia PIC18 16 bits: o Famlias PIC24F e PIC24H o Familias dsPIC30F e dsPIC33F 32 bits o PIC32 o Exsto Tecnologia

Microcontroladores PIC16F877A

21

Os componentes diferem entre si basicamente em: Quantidade de memria RAM Quantidade de memria EEPROM de dados (alguns no tm nada) Quantidade de memria Flash de programa Nmero de pinos (8,14,18,28,40, ...) Freqncia mxima de clock Perifricos Nesse curso abordaremos o PIC16F877A, que um dos componentes mais completos da famlia PIC16. Conforme foi dito anteriormente, ao se estudar um membro de uma famlia o estudante torna-se apto a trabalhar com toda a famlia.

2.3 A Arquitetura do PIC16F877A


A figura 1.1 apresenta o diagrama em blocos do PIC16F877A. Trata-se de um microcontrolador de 8 bits de arquitetura Harvard. Seu barramento de programa de 14 bits. A estrutura do PIC16F877A semelhante ao sistema genrico estudado na aula 1. Seu funcionamento e anlise tambm so semelhantes aquele sistema genrico consistindo nas etapas de busca de instruo com habilitao e leitura de memria de programa e, execuo da instruo com decodificao da instruo e acionamento de dispositivos em seqncia para o processamento da atividade programada. Podem ser observados os barramentos de dados e de programa. Alm disso, nota-se como operandos da ALU e de endereamento da memria de dados vem diretamente da memria de programa. Tambm so dignos de nota os perifricos, localizados na parte inferior do diagrama, que esto ligados ao barramento de dados.

Exsto Tecnologia

Microcontroladores PIC16F877A

22

Figura 2.1 Diagrama em blocos do PIC16F877A

2.4 Gerao de clock


Os microcontroladores PIC possuem um circuito de oscilao interna, isto , so capazes de gerar seu prprio clock (ou sinal de relgio) com acrscimo de poucos (ou nenhum) componentes externos. Existem sete modos diferentes de clock, e cada componente da famlia utiliza alguns deles. O modo de clock para cada aplicao selecionado no momento da gravao do microcontrolador e no pode ser alterado pelo programa. So eles: LP: Cristal/Ressonador de baixa freqncia e baixo consumo (Low Frequency (Power) Crystal) XT: Cristal/Ressonador (Crystal/Resonator); HS: Cristal/Ressonador de Alta Freqncia (High Speed Crystal/Resonator); RC: Oscilador RC Externo (External Resistor/Capacitor); o Com sada de clock o Sem sada de clock INTOSC (INTRC): Oscilador RC Interno de 4MHz (Internal Resistor/Capacitor) Esse modo no est presente no PIC16F877A, mas existe em outros componentes da famlia PIC16; Exsto Tecnologia

Microcontroladores PIC16F877A

23

o o

Com sada de clock Sem sada de clock

Obs.: resistores, indutores, capacitores e cristais podem ser combinados formando circuitos osciladores em freqncias determinadas. Mais detalhes sobre os conceitos, funcionamento e projeto desse tipo de circuito podem ser encontrados em livros de eletrnica com captulos sobre osciladores.

2.4.1 Modos LP,XT e HS


Os modos LP, XT e HS utilizam um cristal ou ressonador cermico para estabilizar o clock. A diferena est na faixa de freqncia de cada modo e no consumo de energia associado a cada freqncia. O consumo de energia em sistemas computacionais est diretamente relacionado com o a freqncia de operao do sistema porque a dissipao de potncia (transformao de energia eltrica em energia trmica) nos transistores que compem os circuitos integrador digitais se d nos momentos de transio de baixo para auto e de auto para baixo. Assim, quanto mais transies por unidade de tempo (ou seja, quanto maior a freqncia) maior a dissipao de energia e, portanto, maior o consumo. O modo LP refere-se a cristal/ressonador cermico de baixa freqncia. Esse modo trabalha com freqncias de oscilao de at 200 kHz e nele conseguimos o menor consumo dos trs modos em questo. O modo XT abrange as freqncias de 200 kHz at 4 MHz e apresenta um consumo mdio. O modo HS para freqncias de 4 a 20 MHz e tem o mais alto consumo. Cada faixa de freqncia possui um ganho do circuito oscilador, que ajustado de forma diferente para cada modo. recomendado que se use o modo adequado para cada freqncia, caso contrrio pode ocorrer mau funcionamento do oscilador. Alm do cristal ou do ressonador, nos modos LP, XT e HS, devem existir capacitores ligados dos terminais do cristal terra, conforme mostra a figura 2.2. Os valores desses capacitores C1 e C2 so os indicados nas tabelas Capacitor Selection for Crystal Oscillator que se encontra nos manuais de cada PIC na seo que trata de configuraes do oscilador. Para o PIC16F877A os valores so os apresentados na tabela 2.2. O valor de RF representa o ajuste interno do oscilador para cada modo (XT, LP e HS). O resistor RS pode ser necessrio para alguns tipos de corte de cristal, mas geralmente no usado. O Comando SLEEP desativa o oscilador no modo de baixo consumo, do qual trataremos mais adiante.

Exsto Tecnologia

Microcontroladores PIC16F877A

24

Figura 2.2 Circuito do Oscilador a Cristal/Ressonador Modo de Oscilador LP Freqncia do Cristal Capacitores C1 e C2

32 kHz 33 pF 200 kHz 15 pF 100 kHz 47 a 68 pF XT 1 MHz 15 pF 4 MHz 15 pF 4 MHz 15 pF HS 8 MHz 15 a 33 pF 20 MHz 15 a 33 pF Tabela 2.1 Seleo de capacitores para oscilador a cristal Capacitores maiores aumentam a estabilidade do oscilador, mas tambm aumenta o tempo de partida.O tempo de partida do oscilador o tempo necessrio para que o oscilador se estabilize, pois a oscilao no ocorre de forma imediata assim que o circuito alimentado,conforme mostra a figura2.3. Esse tempo depende de uma srie de fatores, alm dos capacitores, com temperatura, tenso de alimentao e at capacitncias parasitas do lay-out da placa. Esse tempo deve ser considerado pois o programa s ser iniciado (ou reiniciado, no caso do modo de baixo consumo) quando o oscilador se estabilizar.

Exsto Tecnologia

Microcontroladores PIC16F877A

25

Figura 2.3 Partida do oscilador Tambm possvel aplicar sinais de clock gerados externamente, bastando para isso selecionar o modo relativo a faixa de sinal utilizado. Nesse caso o sinal deve ser aplicado ao pino OSC1/CLKIN e o pino OSC2/CLKOUT deve permanecer em aberto.

2.4.2 Modos RC
Tambm possvel trabalhar com osciladores RC (Resistor/Capacitor). Para isso utilizada a montagem da figura 2.4 e selecionado o modo de oscilador como RC.

Figura 2.4 Circuito do oscilador no modo RC. O modo RC apresenta algumas limitaes: a freqncia de trabalho dependente de vrios fatores (valores de resistor e de capacitor, tenso de alimentao, temperatura) e apresenta pouca estabilidade (tolerncia dos resistores e capacitores, variao na tenso de alimentao, variaes de temperatura). Por exemplo, em uma produo em quantidade de produtos utilizando PICs no modo RC, a freqncia de cada produto pode variar em funo da tolerncia dos resistores utilizados. No possvel garantir preciso em nada que se baseie em tempo no programa. Assim esse modo s recomendado para aplicaes nas quais a freqncia no um fator crtico. Essa situao que justifica a utilizao do modo, pois um oscilador RC tem custo menor que um a cristal. O resistor REXT deve estar entre 3k e 100k e o capacitor CEXT deve ser superior a 20pF. O circuito pode funcionar sem capacitor CEXT, mas nessa situao ele se torna muito suscetvel a variaes drsticas de freqncia devido a capacitncias externas (do prprio lay-out, por exemplo). Alm disso, a variao da freqncia maior para resistores maiores e capacitores menores.

Exsto Tecnologia

Microcontroladores PIC16F877A

26

No modo RC com sada de clock o terminal OSC2/CLKOUT apresenta a freqncia do oscilador divida por quatro, que pode ser utilizado como fonte de clock para outros pontos do circuito. J no modo sem sada de clock, esse terminal pode ser utilizado como I/O.

2.4.3 Modo INTOSC


Esse modo de oscilador no est disponvel no PIC16F877A, mas pode ser encontrado em outros modelos de microcontroladores. No modo INTOSC (ou INTRC) no se necessita de nenhum outro componente externo. Portanto, alm da reduo de custos, ele libera terminais do microcontrolador para serem utilizados como I/O. Nesse modo, o sinal de clock obtido de forma semelhante ao funcionamento do modo RC, porm o resistor e capacitor so implementados na prpria pastilha do componente. Devido a isso temos geralmente uma ou duas freqncias de clock fixas. Tipicamente o oscilador interno menos preciso que o oscilador a cristal mais preciso que o oscilador RC, com tolerncias entre +/- 1 e 10 %.

2.4.4 Comparao entre os modos de oscilador


Na tabela 2.2 feita uma comparao entre os diferentes modos de oscilador. Quesito Tipo de Oscilador Cristal (HS, XT e HS) RC Externo Preciso Preciso Impreciso Estabilidade Estvel Instvel Variedade de freqncias Pequena Grande Custo Alto Baixo Tabela 2.2 Seleo de capacitores para oscilador a cristal

RC Interno Pouco preciso Pouco Estvel Nenhuma Nenhum

2.4.5 Clock e execuo das instrues


Cada instruo executado pelos microcontroladores PIC16 gasta 4 ciclos de clock, chamados ciclos Q. Esses 4 ciclos compem um ciclo de instruo (TCY) que dura 4 vezes mais que um ciclo Q , portanto um ciclo de instruo tem da freqncia do oscilador e o sinal desse ciclo maior chamado de clock de instruo ou clock de perifricos. Ou seja, o tempo de execuo de cada instruo e de 4 perodos de clock. Em cada um dos ciclos Q realizada uma etapa da instruo, conforme mostrado na tabela 2.2. Graficamente esse processo apresentado na figura 2.5. Ciclo Ao Q1 Ciclo de decodificao da instruo Q2 Ciclo de leitura de dados Q3 Ciclo de processamento Q4 Ciclo de escrita de dados Tabela 1.2 Ciclos de execuo das instrues

Exsto Tecnologia

Microcontroladores PIC16F877A

27

Figura 2.5 Ciclos de instruo Alguns perifricos e algumas funes do PIC no so sincronizados nem com o clock do oscilador nem com o clock de perifricos, mas com os ciclos Q.

2.5 Memrias
2.5.1 Memria de programa
O PIC16F877A possui 8K-palavras de memria de programa. J que se trata de um processador RISC, o tamanho das palavras da memria de programa maior que o barramento de dados. Assim, apesar de ser um microcontrolador de 8 bits, a memria de programa composta por palavras de 14 bits. Cada palavra, isto , cada endereo de memria de programa guarda uma instruo. Dessa forma, um programa de 500 instrues ocupar 500 bytes. O vetor de reset o endereo 0000h. Como vimos, isso significa que o programa deve ser escrito a partir desse endereo. O vetor de interrupo, para todas as interrupes o 0004h. A memria do tipo FLASH, suportando um grande nmero de reescritas. possvel, atravs de rotinas que trataremos em outro ponto do curso, realizar escrita na memria e programa. Na estrutura das instrues de chamada e desvio da famlia 16F o espao reservado para endereo de 11 bits. Portanto possvel enderear diretamente 2048 endereos de memria. Sendo que o PIC16F877A tem 8k endereos de memria de programa, essa memria dividida em unidades que chamaremos de pginas. Dentro de uma mesma pgina possvel realizar saltos e desvios para qualquer ponto. Mas se um salto ou desvio vai de uma pgina para outra necessrio fazer um ajuste prvio dos dois bits mais significativos do SFR PCLATH, conforme mostrado na tabela abaixo. PCLATH Bit 4 Bit 3 0 0 0 1 0 1 2 1 0 3 1 1 Tabela 2.3 Pginas de memria de programa Pgina A figura 2.6 apresenta o mapemamento de memria de programa.

Exsto Tecnologia

Microcontroladores PIC16F877A

28

0000h Vetor de reset 0001h 0002h Uso geral 0003h 0004h Vetor de interrupo 0005h Pgina 0 . . Uso geral . 07FFh 0800h . . Uso geral Pgina 1 . 0FFFh 1000h . . Uso geral Pgina 2 . 17FFh 1800h . . Uso geral Pgina 3 . 1FFFh Figura 1.6 Mapeamento de memria do PIC16F877A Os demais microcontroladores da famlia PIC16F seguem esse mesmo mapeamento de memria, contudo nem todos os modelos tm 8k-words, isto , alguns no tem todas as pginas implementadas. Por exemplo, o PIC16F874A tem as pginas 0 e 1 mas no as 2 e 3, portanto tem 4kwords; j o 16F628A tem 2k-words, ou seja, somente a pgina 0.

2.5.2 Memria de dados


O core (ncleo ou processador do microcontrolador) da famlia PIC16 existem 9 vias de endereamento o que permite um acesso a 512 endereos diferentes (29 = 512). Contudo, nem sempre temos memria RAM implementada para todos os endereos. A quantidade e a disposio da RAM de dados varia de microcontrolador para microcontrolador. No PIC16F877A existem 368 bytes de memria RAM de dados. Ela composta por registros de funes especiais (SFR Special Function Registers) e a RAM de uso geral (GPR General Purpose RAM). Os SFR so responsveis pelo controle da CPU e dos perifricos, alm de conterem os registros dos portais. Na RAM de uso geral onde o programa armazenar suas variveis. A memria RAM pode ser acessada de duas formas: por acesso direto e por acesso indireto. Acesso direto ocorre quando o endereo acessado faz parte da prpria instruo ( um dos operandos). J o acesso indireto feito atravs de duas variveis, uma contendo o endereo a ser acessado e a outra se comportando como o byte acessado. Este ltimo modo de endereamento pode ser muito til em algumas situaes e ser estudado mais adiante. Exsto Tecnologia

Microcontroladores PIC16F877A

29

Para acesso direto, a RAM dividida em 4 bancos. Isso ocorre porque a capacidade de mxima de acesso de memria dos microcontroladores PIC de 512 bytes. Portanto, so necessrios 9 bits para compor os endereos. Como cada instruo tem apenas 14 bits, e esses bits devem ser divididos entre operadores e operandos, no h espao para um endereo de 9 bits. Na verdade, as instrues armazenam apenas 7 bits do endereo a ser acessado. Os dois bits restantes fazem parte do registro de funo especial STATUS e so chamados RP1 e RP0. J que dois bits podem gerar 4 combinaes, existe essa diviso em 4 bancos. Para acessar um registro em um banco diferente do banco atual, necessrio ajustar previamente RP1 e RP0. Na prtica utilizamos o mximo possvel endereos do banco 0, e mudamos para os demais bancos quando necessrio, retornando novamente ao banco 0. A diviso de bancos feita conforme a tabela 1.3. Banco 0 1 2
3

RP1 0 0 1
1

RP0 0 1 0
1

Endereos 00h ~ 7Fh 80h ~ FFh 100h ~ 17Fh


180h ~ 1FFh

Tabela 1.4 - Seleo de bancos de RAM No caso do endereamento indireto, o endereo armazenado em um registro de funo especial chamado FSR. Como trata-se de um registro de 8 bits, falta 1 bit, que se chama IRP e faz parte do STATUS. Quando IRP 0 so acessados os bancos 0 e 1, quando 1, so acessados os bancos 2 e 3. Os registros de funes especiais tm seus nomes e os nomes de seus bits j definidos em um arquivo. Existe um arquivo desses para cada PIC e a forma de inclu-lo no programa ser mostrado mais adiante. Podemos ento tratar os SFR pelo seus nomes, no havendo a preocupao com o endereo que eles ocupam. Tambm no necessrio saber qual bit de um registro tem determinada funo, apenas o nome do mesmo. Na apresentao desses registros ser seguida a conveno abaixo, que a mesma utilizada no manual dos componentes.

R/W 0 IRP Bit 7

R/W 0 RP1

R/W 0
RP0

R1 NOT_TO

R 1 NOT_PD

R/W x Z

R/W x DC

R/W x C Bit 0

STATUS Os bits so numerados de 0 a 7, da direita para a esquerda. O nome do registro aparece em baixo. Sobre cada bit temos algumas informaes: se ele pode ser lido (R) escrito (W), se no implementado. Tambm contm sua situao aps o reset, podendo ser 0, 1 ou desconhecida (x). Por exemplo, sobre o bit RP0 est escrito R/W-0, que significa que pode ser lido ou escrito e seu valor no reset 0. No anexo B encontra-se o mapa de memria do PIC16F628A. Pode-se observar os nomes dos SFR e as regies de uso geral. Note que apesar de ser possvel acessar 512 bytes, foram implementados apenas 224 bytes. As posies no implementadas esto em cinza na figura. Note ainda que os ltimos 16 endereos de todos os bancos acessam os mesmos bytes no banco 0. A figura 1.7 trs o mapeamento de memria RAM do PIC16F877A com os nomes dos registros de funo especial e as reas de uso geral (GPR). As regies em cinza correspondem a endereos para os

Exsto Tecnologia

Microcontroladores PIC16F877A

30

quais no h memria implementada. No manual do PIC16F877A existe um detalhamento maior dos bits que compe os SPRs. A funo de vrios desses registros ser explicada no decorrer do curso.

Tabela 1.7 - Mapeamento de memria RAM de dados

Exsto Tecnologia

Microcontroladores PIC16F877A

31

2.6 RESET
O PIC possui vrias fontes de reset (reinicializao), que so: Reset ao ligar (POR Power-on Reset); Reset por MCLR durante operao normal; Reset por MCLR no modo SLEEP (que ser tratado adiante); Reset por Watch-Dog durante operao normal; Reset por Watch-Dog no modo SLEEP; Reset por queda de alimentao (BOR Brown-Out Reset).

O reset por MCLR acionado quando ao terminal MCLR (pino 4) aplicado nvel lgico baixo. MCLR o terminal de Reset do componente, sendo um terminal baixo ativo, isto , o reset ocorre em 0. Alm disso, o terminal de MCLR possui internamente um filtro para evitar que rudos possam causar reset acidental. O modo como os registros se comportam em cada reset variado. Para saber quais so os valores iniciais de cada registro, deve ser consultada a tabela de situaes iniciais dos registros, presente no manual de cada PIC. A seguir so detalhadas algumas fontes e funcionalidades associadas ao reset.

2.6.1 POR Power-On Reset


Essa funcionalidade detecta quando o circuito ligado, percebendo a subida da tenso de alimentao, e realiza o reset do microcontrolador. Dessa forma podemos dispensar o resistor e capacitor tradicionalmente ligados ao terminal de reset para gerar um nvel lgico baixo quando o sistema ligado, garantido assim o reset inicial. O terminal MCLR pode ser ligado diretamente ao nvel lgico alto sendo recomendado utilizar um resistor de 10 k ligando-o VDD.

2.6.2 PWRT Power-up Timer


Trata-se de um timer de aproximadamente 72ms que mantm o microcontrolador em condio de reset durante esse tempo. til, pois permite ao sistema ter tempo de se estabilizar (tenso, reset dos demais componentes, etc.) antes do programa comear a ser executado.

2.6.3 OST Oscillator Start-up Timer


Este timer conta 1024 ciclos vlidos de clock antes de sair da condio de reset, permitindo assim que o oscilador se estabilize, conforme trato no tpico Modos LP, XT e HS. Essa funcionalidade habilitada somente nos modos LP, XT e HS.

2.6.4 BOR Brown-out Reset


Essa funcionalidade visa reiniciar o sistema se houver uma queda na tenso de alimentao. O BOR ocorre quando a alimentao atinge aproximadamente 4V por mais de 100s (quedas por tempo intervalos menores que esse so ignorados pois podem se tratar de rudos na alimentao), em situaes como as mostradas na figura2.8.

Exsto Tecnologia

Microcontroladores PIC16F877A

32

Figura 2.7 Situaes de Brown-out

2.6.5 Seqncia de inicializao


1. 2. 3. 4. 5. O circuito ligado: a tenso de alimentao comea a subir; detectada a subida da tenso: ocorre POR; O sistema aguarda o tempo de PWRT (aprox. 72 ms); O oscilador comea a funcionar: 1024 ciclos so contados (OST); O programa comea a ser efetivamente executado.

2.6.6 Identificao de Reset pelo Software


Apesar de existirem vrias fontes de Reset, possvel determinar qual reset ocorreu. Para isso existem 4 bits: NOT_TD e NOT_PD do registro STATUS e NOT_BOR e NOT_POR do registro PCON (Banco 1). As condies desses bits para cada reset podem ser vistas na tabela 2.4. Condio NOT_POR NOT_BOR Reset por Power-on 0 X Impossvel 0 X Impossvel 0 X Reset por Brown-out 1 0 Reset pelo Watchdog 1 1 Dispertar pelo Watchdog 1 1 Reset pelo MCLR em operao normal 1 1 Reset pelo MCLR no modo SLEEP 1 1 Tabela 2.4 Bits de status e seus significados NOT_TO 1 0 x 1 0 0 U 1 NOT_PD 1 X 0 1 1 0 U 0

Essa informao pode ser til, permitindo que providncias sejam tomadas em situaes especficas de problema. O esquema da figura 1.8 mostra como a lgica de reset.

Exsto Tecnologia

Microcontroladores PIC16F877A

33

Figura 2.8 Lgica de reset

2.7 Watch-Dog Timer


Esse timer de 8 bits, que baseado em um oscilador RC interno prprio, independente de qualquer outra coisa, gera um reset quando estoura. Ele importante em situaes em que, por qualquer motivo, o microcontrolador trava. Quando habilitado ele deve ser zerado a intervalos regulares menores que seu tempo mximo pela instruo CLRWDT. Se o programa para e o Watch-Dog no zerado, tendo sido habilitada essa funo na gravao, ocorre o reset. Ao timer de 8 bits pode ser atribudo um pr-escala, como ser visto mais adiante. Essa funcionalidade muito til, pois, na grande maioria das situaes prticas, melhor que o sistema reinicie do que fique inoperante. Desenvolvendo o cdigo adequadamente possvel fazer com que o reset sequer tenha efeitos perceptveis para o sistema. O perodo do watchdog de 18 ms (tpico). Com pr-escala mxima pode chegar a 2,3s.

2.8 Modo de baixo consumo Modo SLEEP


O modo de baixo consumo (Power-dowm Mode), tambm chamado de modo SLEEP (sono, em ingls), a situao de menor consumo do microcontrolador. Ele ativado pela execuo da instruo SLEEP. Nesse modo o oscilador desligado, fazendo com que o microcontrolador pare completamente a execuo do programa. Dessa forma conseguimos reduzir drasticamente o consumo do sistema, o que importante sobretudo em sistemas alimentados por bateria. O microcontrolador pode ser acordado por qualquer um dos eventos abaixo: Qualquer reset; Estouro do Watch-Dog (se este estiver habilitado); Qualquer perifrico que estiver com sua respectiva interrupo habilitada (incluso INT e interrupo por mudana no Portal B). Exsto Tecnologia

Microcontroladores PIC16F877A

34

Quando da ocorrncia de algum reset, o programa recomea sua execuo no vetor de reset (0000h). Se, porm, ocorrer um estouro do Watch-Dog ou a chamada de alguma interrupo o programa continua sua execuo a partir do endereo imediatamente posterior a instruo SLEEP que ativou o modo de baixo consumo. E ainda, se o controle geral de interrupes estiver habilitado, o programa recomea pelo vetor de interrupes (0004h) se desperto por interrupo. Assim, se desejamos que uma interrupo simplesmente acorde o microcontrolador, devemos desabilitar globalmente as interrupes. Deve-se ter ateno ao fato de que no modo SLEEP o oscilador est desligado. Dessa forma no podem ser utilizadas interrupes dos timers para a sada do modo, se estes timers utilizarem como fonte de clock o oscilador interno, nem demais perifricos cujo funcionamento se baseie no oscilador principal do sistema.

2.9 Caractersticas especiais


2.9.1 Proteo de Cdigo (Code Protect)
O programa gravado em um PIC pode ser protegido, isto , pode ser impedida a sua leitura. Essa funcionalidade muito importante, sobretudo quando se trata de produo industrial, visto que assim se podem preservar os direitos autorais do autor do firmware e dificultar a cpia de produtos.

2.9.2 Locais de Identificao (ID Locations)


Existem 4 endereos no acessveis pelo microcontrolador que podem ser utilizados para identificao do componente (por exemplo, o nmero de srie do produto ou a verso do firmware).

2.9.3 Pinagem e Hardware Bsico


Como j foi comentado anteriormente, o PIC16F877A um componente de 40 pinos, em seu encapsulamento PDIP (Plastic Dual In-line Package Encapsulamento plstico em linha dupla). Esses pinos podem ser divididos em terminais de alimentao, de reset, de conexo com o oscilador e os terminais de portais e perifricos. Como se trata de um componente com diversas caractersticas e um pequeno nmero de terminais, muitos terminais possuem mais de uma funo. Dessa forma, temos terminais de entrada e sada dos portais multiplexados com terminais dos perifricos, com terminais do oscilador e terminais de reset. De uma forma geral, quando usamos um determinado perifrico, o terminal associado a ele serve ao perifrico e sua funo de entrada e sada fica desativada. Quando o perifrico no utilizado, o terminal trabalha como I/O. A figura abaixo apresenta a pinagem do PIC 16F877A. Para facilitar a escrita, toda documentao da Microchip quando se refere a um terminal no utiliza a notao bit N do portal X, e sim RX N. Por exemplo, o bit 2 do portal A representado por RA2, o bit 7 do portal C por RC7, e assim por diante.

Exsto Tecnologia

Microcontroladores PIC16F877A

35

Figura 2.1 Pinagem do PIC 16F877A As principais caractersticas do PIC so apresentadas na tabela abaixo. Caracterstica Valor Unidade Frequncia de Operao 0 ~ 20 MHz MHz Resets POR, BOR Memria de Programa (FLASH) 8k palavras de 14 bits Memria de Dados (RAM) 368 bytes Memria de Dados No Voltil (EEPROM) 256 bytes Interrupes 15 Timers 3 Mdulo CCP 2 Mdulo SSP (SPI e I2C) 1 Comparador analgico 2 Comunicao Paralela PSP Mdulo ADC de 10-bits 8 canais Set de Instrues 35 instrues

A tabela seguinte contm as caractersticas eltricas do PIC 16F877A. Caracterstica Temperatura de Trabalho Vdd ( em relao Vss) Mxima Corrente de sada em Vss Mxima Corrente de entrada em Vdd Mxima Corrente drenada por I/O Mxima Corrente de sada po I/O Mxima Corrente drenada por PORTA + PORTB + PORTE Mxima Corrente fornecida por PORTA + PORTB + PORTE Mxima Corrente drenada por PORTC + PORTD Mxima Corrente fornecida por PORTC + PORTD Min -55 4 Max Unidade 125 C 5,5 V 300 mA 250 mA 25 mA 25 mA 200 mA 200 mA 200 mA 200 mA

Exsto Tecnologia

Microcontroladores PIC16F877A

36

Os nveis de tenso de entrada e sada para o PIC so apresentados na tabela abaixo. Os valores so considerndo que a alimentao de 5,0 V. O buffer de entrada de cada pino pode ser do tipo TTL simples ou Schmitt Trigger. Para saber qual o tipo de buffer deve-se consultar a parte do manual de cada componente relativo aos portais de I/O. Parmetro VIH VIH VOL VOH Tipo de buffer TTL Schmitt Trigger TTL Schmitt Trigger Min Vss Vss 2,0 4,0 4,3 Max 0,8 1,0 VDD VDD 0,6 Unid V V V V V V

Como j foi discutido, um microcontrolador possui todos os componentes bsicos de um sistema computacional em um nico chip. Assim o circuito bsico necessrio para um PIC funcionar bastante reduzido. necessrio somente : A alimentao de +5V, bem regulada; Como em todo circuito digital, um capacitor de desacoplamento de 100nF bem prximo aos terminais de Vdd e Vss; O terminal /MCLR o terminal de reset do PIC e baixo ativo. Por isso ele deve ser mantido em nvel lgico alto. Recomenda-se a liga-lo a Vdd por um resistor (10k). No necessrio o circuito RC de reset. Definir-se um esquema de clock conforme j tratado. Um cuidado que deve ser tomado, independente do tipo de oscilador escolhido, fazer com que os componentes externos do circuito oscilador fiquem bem prximo uns dos outros e todos bem prximos ao microcontrolador. Alm disso, quando for confeccionada uma placa de circuito impresso deve-se minimizar as indutncias e capacitncias parasitas. Isso feito aumentando a espessura das trilhas, diminuindo seu comprimento e posicionando trilhas excessivamente prximas umas das outras. Esses cuidados so fundamentais quando se trabalha com freqncias altas.

2.10 Gravao
A gravao do microcontrolador PIC pode ser realizada sem que o componente seja retirado da placa (gravao in-circuit). Essa gravao feita de forma serial utilizando somente dois pinos: PB7/PGD para envio de dados e RB6/PGC para clock. Alm dos pinos RB7 e RB6 necessrio que o pino MCLR/VPP receba uma tenso de 13VDC +/- 0,5V durante o processo de gravao. Tambm necessrio que o microcontrolador esteja devidamente alimentado, portanto VDD e VSS devem estar devidamente conectados.

Exsto Tecnologia

Microcontroladores PIC16F877A

37

2.11 O conjunto de instrues do PIC16F877A


O set de instrues de um microcontrolador o conjunto de todas as instrues que o processador pode interpretar e executar. Voltando a analogia com um instrumento musical, so como as notas musicais que o compositor usa para escrever uma partitura. Cada processador (ou core) possui seu prprio conjunto de instrues (ou set de instrues). Isso significa que todos os microcontroladores da linha PIC16 so capazes de executar o mesmo cdigo, ou seja, falam a mesma lngua. Significa tambm que microcontroladores de outras famlias ou fabricantes no so compatveis com o cdigo gerado para PIC16 ou para outro conjunto de instrues (no falam a mesma lingua). Cada instruo na verdade um cdigo numrico (chamado Opcode) que o decodificador de instrues capaz de interpretar e disparar uma seqncia de aes pr-definida. Por exemplo, uma instruo de soma inicia um processo interno do microcontrolador que realiza movimento de bytes, ajusta e realiza operaes na unidade lgico-aritmtica, carrega resultados em endereos de memria. Fazendo uma analogia com um livro de culinria, o opcode indica a pgina onde esto os passos para a realizao de uma receita. Como criar uma lgica complexa de programao usando apenas cdigos numricos seria um trabalho muito desgastante e o resultado muito confuso foi criada uma linguagem simblica que associa nomes, denominados mnemnicos, aos opcodes; por convenincia esses nomes fazem referncia a ao realiza, como poder ser observado brevemente. Para assembler o programa responsvel por traduzir o cdigo mnemnico (entendido pelo ser humano) para um cdigo numrico composto de opcodes (entendido pelo core do microcontrolador). Antes de estudar as instrues deve-se definir alguns termos que sero utilizados na descrio das instrues e na apresentao de sua sintaxe:
f W b k x d PC NOT_TO NOT_PD TOS Registro da RAM (0x00~0x7F) Acumulador (Working register) Bit em um byte Constante de 8 bits Irrelevante destino: 0 => Acumulador (W) 1=> registro Program Counter Bit de time-out Bit de Power Down Topo da pilha (Top Of Stack)

O acumulador, chamado no PIC de Working Register ou simplesmente W, um registro interno do microcontrolador, no mapeado em RAM, que est envolvido na maioria das instrues. Como ser visto, ele participa das instrues de movimentao e um dos operandos ou o destino do resultado nas operaes lgico e matemticas.

Para maior compreenso do funcionamento das instrues se faz necessrio comentar o funcionamento do registro de STATUS. Os bits desse registro nos apresentam a situao do Exsto Tecnologia

Microcontroladores PIC16F877A

38

microcontrolador a cada instruo. Esses bits so tipicamente chamados de flags (Bandeiras). Atravs deles podemos saber de resultados de operaes da ALU (se uma subtrao resultou em zero, se uma soma causou overflow, etc), a situao do RESET, alm do controle bancos de memria.
R/W 0 IRP Bit 7 R/W 0 RP1

R/W 0
RP0

R1 NOT_TO

R/ 1 NOT_PD

R/W x Z

R/W x DC

R/W x C Bit 0

STATUS IRP :bit de seleo de banco, usado para endereamento indireto. o 1 = Bancos 2 e 3 (100h - 1FFh) o 0 = Bancos 0 e 1 (00h - FFh) RP1~RP0 : bit de seleo de banco, usado para endereamento direto. o 11 = Banco 3 (180h - 1FFh ) o 10 = Banco 2 (100h - 17Fh ) o 01 = Banco 1 (80h - FFh ) o 00 = Banco 0 (00h - 7Fh ) NOT_TO: Bit indicador de Time-out o 1 = aps todos os Resets, exceto time-out do WDT o 0 = ocorreu um time-out do WDT NOT_PD: Bit indicador de Power-down o 1 = quando ligado ou aps a instruo CLRWDT o 0 = pela execuo de uma instruo SLEEP Z: Bit indicador de zero o 1 = se o resultado de uma operao da ALU zero o 0 = se o resultado de uma operao da ALU diferente de zero DC: Carry/Borrow de dgito. Para borrow o sinal inverso o 1 = houve transporte do 4o. para o 5o. bit o 0 = no houve transporte do 4o. para o 5o. bit C: Carry/Borrow . Para borrow o sinal inverso o 1 = houve transporte do 8o. bit o 0 = no houve transporte do 8o. bit

O conjunto de instrues do core PIC16 composto de 35 instrues, apresentadas a seguir. O campo Sintaxe mostra a forma de se escrever a instruo. O campo Operadores indica quais os operadores envolvidos e quais seus domnios. Operao apresenta a operao realizada pela instruo. O campo Flags Afetados mostra quais flags de STATUS so afetados pela execuo da operao; essas alteraes so comentadas abaixo dos quadros. No campo Ciclos est o nmero de ciclos de mquina gastos para a execuo da instruo. Finalmente, o campo Exemplo apresenta um exemplo simples de utilizao da instruo. As instrues so divididas, conforme sua funo, nos seguintes tipos: Manipulao de byte Manipulao e bit Matemticas Lgicas Exsto Tecnologia

Microcontroladores PIC16F877A

39

Testes e desvios condicionais Chamadas e desvio (controle de fluxo) Controle (da CPU)

No anexo A existe uma tabela resumo de todas as instrues. Recomenda-se tirar uma cpia desta pagina e tela sempre mo para consulta rpida.

2.11.1

Manipulao de Byte

As instrues de manipulao de byte permitem atribuir valores a endereos da RAM e ao registro W. importante ressaltar que apesar de normalmente o mnemnico dessas instrues trazer a palavra move (mover) o valor do registro na verdade copiado, isto , o registro de destino recebe o valor do registro de origem, mas o valor da origem no alterado. CLRW "Zera" o registro W. O bit Z do registro STATUS setado. Sintaxe CLRW Operadores Nenhum Operao (W) 00h Flags Afetados Z Ciclos 1 Exemplo CLRW Alteraes nas Flags: Como a instruo resultou em um registro se tornar 0, o bit Z setado indicando esse evento. CLRF "Zera" o registro indicado por f. O bit Z do registro STATUS setado. Sintaxe CLRF f Operadores 0 f 127 Operao (f) 00h Flags Afetados Z Ciclos 1 Exemplo CLRF TEST Alteraes nas Flags: Como a instruo resultou em um registro se tornar 0, o bit Z setado indicando esse evento. MOVLW Move a constante k para W. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo MOVLW k 0 k 255 (W) k Nenhum 1 MOVLW 35h

Exsto Tecnologia

Microcontroladores PIC16F877A

40

MOVF Move o valor do registro (f) para o destino. Se d 0 destino W; se d 1 o destino o prprio registro (f). Mover o valor do registro para ele mesmo til para testarmos se o valor 0, uma vez que essa instruo afeta o bit Z do registro STATUS. Sintaxe Operadores MOVF f, d 0 f 127 d=0:W d = 1 : registro f (d) (f) Z 1 MOVF TEST,0

Operao Flags Afetados Ciclos Exemplo Alteraes nas Flags: Z = 0: o valor movido, diferente de zero. Z = 1: o valor movido, 0. MOVWF Move o contedo de W para o registro f. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo

MOVWF f 0 f 127 (f) W Nenhum 1 MOVWF TEST

2.11.2

Manipulao de bit

As operaes de manipulao de bit so uma particularidade dos microcontroladores e dificilmente so encontradas em outros sistema computacionais. Sua funo permitir alterar o valor de um nico bit de um determinado registro, sem qualquer influncia nos demais bits. BCF "Zera" o bit b do registro f. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo BCF f, b 0 f 127 0b7 f[b] 0 Nenhum 1 BCF CONTROLE,5

Exsto Tecnologia

Microcontroladores PIC16F877A

41

BSF "Seta" o bit b do registro f. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo BSF f, b 0 f 127 0b7 f[b] 1 Nenhum 1 BSF CONTROLE,7

2.11.3

Matemticas

As instrues matemticas so capazes de realizar operaes matemticas bsicas atravs da operao da ALU do microcontrolador. Como trata-se de um microcontrolador de 8 bits essas operaes tem operadores e resultados de 8 bits. Para clculos com valores maiores de 8 bits devese desenvolver rotinas fazendo uso das instrues bsicas. Da mesma forma, operaes mais complexas podem ser construdas a partir das rotinas bsicas. Essa raciocnio se aplica para operaes de multiplicao e diviso, que no suportadas pela ALU do PIC16.

ADDLW Realiza a adio do valor contido em W com a constante k. O resultado armazenado em W. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo Alteraes nas Flags: ADDLW k 0 k 255 (W) (W) + k C, DC, Z 1 ADDLW 35h

C = 1: o resultado da adio maior que 255. C = 0: o resultado da adio menor ou igual a que 255. DC = 1: o resultado da adio causou o transporte de 4o para o 5o bit DC = 0: o resultado da adio no causou o transporte de 4o para o 5o bit Z = 0: o resultado da adio diferente de zero. Z = 1: o resultado da adio 0. Pode ocorrer com 128 + 128 = 256: C=1 e o resultado da adio igual a 0.

ADDWF Realiza a adio do valor contido em W com o valor do registro f. O resultado armazenado no destino: d=0 para W ou d=1 para o registro f. Exsto Tecnologia

Microcontroladores PIC16F877A

42

Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo Alteraes nas Flags:

ADDWF f, d 0 f 127 d=0:W d = 1 : registro f (d) (W) + (f) C, DC,Z 1 ADDWF TEST,0

C = 1: o resultado da adio maior que 255. C = 0: o resultado da adio menor ou igual a que 255. DC = 1: o resultado da adio causou o transporte de 4o para o 5o bit DC = 0: o resultado da adio no causou o transporte de 4o para o 5o bit Z = 0: o resultado da adio diferente de 0. Z = 1: o resultado da adio 0. Pode ocorre com 128 + 128 = 256: C=1 e o resultado da adio igual a 0. DECF Decrementa o valor contido no registro f. O resultado armazenado no destino: d=0 para W ou d=1 para o registro designado por f. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo Alteraes nas Flags: DECF f,d 0 f 127 d=0:W d = 1 : registro f (d) (f) 1 Z 1 DECF COUNT,0

Z = 0: o resultado do decremento diferente de zero. Z = 1: o resultado do decremento 0 (quando o valor original for igual a 1). INCF Incrementa o valor contido no registro f. O resultado armazenado no destino: d=0 para W ou d=1 para o registro designado por f. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo INCF f,d 0 f 127 d=0:W d = 1 : registro f (d) (f) + 1 Z 1 INCF COUNT,0

Exsto Tecnologia

Microcontroladores PIC16F877A

43

Alteraes nos Flags: Z = 0: o resultado do incremento diferente de zero. Z = 1: o resultado do incremento igual a 0 (quando o valor original for igual a 255). SUBLW O valor contido em W subtrado, pelo mtodo do complemento 2, da constante de oito bits k. O Resultado armazenado em W. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo Alteraes nas Flags: SUBLW k 0 k 255 (W) k - (W) C, DC, Z 1 SUBLW 23h

ATENO: nessa operao os bits C e DC tem significado inverso ao que seria esperado, isto , quando ocorre um borrow ("estouro para menos"), os bits C e DC ficam em zero, ao contrrio que quando ocorre um Carry ("estouro para mais"), quando C e DC ficam em 1. C = 1: o resultado da subtrao maior ou igual a 0. C = 0: o resultado da subtrao menor a 0. DC = 1: o resultado da subtrao no causou o transporte de 5o para o 4o bit DC = 0: o resultado da subtrao causou o transporte de 4o para o 5o bit Z = 0: o resultado da subtrao diferente de zero. Z = 1: o resultado da subtrao igual a 0. SUBWF O valor contido em W subtrado, pelo mtodo do complemento 2, do valor contido no registro f. O resultado armazenado no destino: d=0 para W ou d=1 para o registro designado por f. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo Alteraes nas Flags: SUBWF f,d 0 f 127 d=0:W d = 1 : registro f (W) (f) - (W) C, DC, Z 1 SUBWF TEST,0

ATENO: nessa operao os bits C e DC tm significado inverso ao que seria esperado, isto , quando ocorre um borrow ("estouro para menos"), os bits C e DC ficam em zero, ao contrrio que quando ocorre um Carry ("estouro para mais"), quando C e DC ficam em 1. Exsto Tecnologia

Microcontroladores PIC16F877A

44

C = 1: o resultado da subtrao maior ou igual a 0. C = 0: o resultado da subtrao menor a 0. DC = 1: o resultado da subtrao no causou o transporte de 5o para o 4o bit. DC = 0: o resultado da subtrao causou o transporte de 4o para o 5o bit. Z = 0: o resultado da subtrao diferente de zero. Z = 1: o resultado da subtrao igual a 0.

2.11.4

Lgicas

Assim como as instrues matemticas, as instrues lgicas realizam operaes lgicas bsicas fazendo uso da ALU.

ANDLW Realiza uma operao lgica "E" entre o valor contido em W e a constante k. O resultado armazenado em W. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo Alteraes nas Flags: Z = 0: Z = 1: ANDWF Realiza a operao "E" entre o valor contido em W o valor contido no registro f. O resultado armazenado no destino: 0 para W ou 1 para o registro designado por f. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo Alteraes nas Flags: ANDWF f, d 0 f 127 d=0:W d = 1 : registro f (d) (W) E (f) Z 1 ANDWF TEST,1 ANDLW k 0 k 255 (W) (W) E k Z 1 ANDLW 0Fh

o resultado da operao "E" diferente de zero. o resultado da operao "E" igual a 0.

Z = 0: o resultado da operao "E" diferente de zero. Z = 1: o resultado da operao "E" igual a 0.

Exsto Tecnologia

Microcontroladores PIC16F877A

45

COMF Complementa o valor contido no registro f. O resultado armazenado no destino: d=0 para W ou d=1 para o registro designado por f. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo Alteraes nas Flags: COMF f,d 0 f 127 d=0:W d = 1 :registro f (d) complemento de (f) Z 1 COMF TESTE,1

Z = 0: o resultado do complemento diferente de zero. Z = 1: o resultado do complemento 0. O complemento de 255 (11111111b) 0 (00000000b). IORLW Realiza uma operao "OU" bit a bit entre o valor contido em W e a constante k. O resultado armazenado em W. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo Alteraes nas Flags: IORLW k 0 k 255 (W) (W) OU (f) Z 1 IORLW TEST

Z = 0 o resultado da operao "OU" diferente de zero. Z = 1 o resultado da operao "OU" igual a 0 (0 OU 0 igual a zero) IORWF Realiza a operao "OU" bit a bit entre o valor contido em W com o valor do registro indicado por f. O resultado armazenado no destino: d=0 para W ou d=1 para o registro designado por f. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo Alteraes nas Flags: [label] IORWF 0 f 127 d=0:W d = 1 : registro f (d) (W) OU (f) Z 1 IORWF TEST,1 f, d

Z = 0 o resultado da operao "OU" diferente de zero. Z = 1 o resultado da operao "OU" igual a 0 (0 OU 0 igual a zero). Exsto Tecnologia

Microcontroladores PIC16F877A

46

RLF O valor contido em f rotacionado para a esquerda atravs do bit de Carry (bit C do registro STATUS). O resultado armazenado no destino: d=0 para W ou d=1 para o registro designado por f. A operao de rotao a esquerda consiste no deslocamento sucessivo de bits de sua posio inicial para a posio consecutiva de modo que o ltimo bit do registro f v para C e o bit que estava em C v para o primeiro bit do registro f. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo RLF f,d 0 f 127 d=0:W d = 1 : registro f veja a figura abaixo C 1 RLF TEST,1

Registro f

Alteraes nas Flags: C passa conter o valor (0 ou 1) do 8 bit do registro f.

RRF O valor contido em f rotacionado para a direita atravs do bit de Carry (bit C do registro STATUS). O resultado armazenado no destino: 0 para W ou 1 para o registro designado por f. A operao de rotao a direita consiste no deslocamento sucessivo de bits de sua posio inicial para a posio consecutiva de modo que o primeiro bit do registro f v para C e o bit que estava em C v para o ltimo bit do registro f. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo RRF f,d 0 f 127 d=0:W d = 1 : registro f veja a figura abaixo C 1 RRF TEST,1

Registro f

Alteraes nas Flags: C passa a conter o valor (0 ou 1) do registro f. Exsto Tecnologia

Microcontroladores PIC16F877A

47

SWAPF O nibble (conjuntos de 4 bits) mais significativo e o menos significativo do registro f so trocados. Ou seja, os bits de 7 a 4 vo para as posies de 3 a 0 e os bits de 3 a 0 vo para as posies de 7 a 4. A figura abaixo ilustra esse processo. O resultado armazenado no destino: d=0 para W ou d=1 para o registro designado por f.

Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo

SWAPF f,d 0 f 127 d=0:W d = 1 : registro f Destino [7:4] f [3:0] Destino [3:0] f [7:4] Nenhum 1 SWAPF TEST,1

XORLW Realiza uma operao "OU exclusivo" entre o valor contido em W e a constante de oito bits k. O resultado armazenado em W. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo Alteraes nas Flags: XORLW k 0 k 255 (W) (W) XOU (f) Z 1 XORLW OFh

Z = 0: o resultado da operao "OU exclusivo" diferente de zero. Z = 1: o resultado da operao "OU exclusivo" 0 (um valor "OU-exclusivo" consigo mesmo igual a zero). XORWF Realiza a operao "OU exclusivo" entre o valor contido em W com o valor do registro indicado por f. O resultado armazenado no destino: d=0 para W ou d=1 para o registro designado por f. Sintaxe Operadores XORWF 0 f 127 d= 0 W f, d

Exsto Tecnologia

Microcontroladores PIC16F877A

48

Operao Flags Afetados Ciclos Exemplo Alteraes nas Flags:

d=1 registro f (d) (W) XOU (f) Z 1 XORWF TEST,0

Z = 0: o resultado da operao "OU exclusivo" diferente de zero. Z = 1: o resultado da operao "OU exclusivo" 0 (um valor "OU-exclusivo" consigo mesmo igual a zero).

2.11.5
BTFSC

Testes

Testa o bit b do registro f : se o bit for '1' a prxima instruo executada; se o bit for '0' a prxima instruo no executada, em seu lugar executada uma instruo NOP, seguindo o programa na segunda instruo aps a BTFSC. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo BTFSS Testa o bit b do registro f : se o bit for '0' a prxima instruo executada; se o bit for '1' a prxima instruo no executada, em seu lugar executada uma instruo NOP, seguindo o programa na segunda instruo aps a BTFSS. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo DECFSZ Decrementa o valor contido no registro f. O resultado armazenado no destino: d=0 para W ou d=1 para o registro designado por f. Se o resultado for diferente de 0 a prxima instruo executada; se o resultado for 0 a prxima instruo no executada, em seu lugar executada uma instruo NOP, seguindo o programa na segunda instruo aps a DECFSZ. BTFSS f, b 0 f 127 0 b7 se f[b]=1 salta a prxima instruo Nenhum se o bit no estiver em 1; se o bit estiver em 1. BTFSS STATUS,Z GOTO NO_ZERO BTFSC f, b 0 f 127 0 b7 se f[b]=0 salta a prxima instruo nenhum se o bit no estiver em 1; se o bit estiver em 1. BTFSC STATUS,Z GOTO ZERO

Exsto Tecnologia

Microcontroladores PIC16F877A

49

Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo INCFSZ

DECFSZ f,d 0 f 127 d=0W d = 1 registro f (d) (f) - 1 se f[b] = 1 salta a prxima instruo Nenhum 1 DECFSZ COUNT,1

Incrementa o valor contido no registro f. O resultado armazenado no destino: d=0 para W ou d=1 para o registro designado por f. Se o resultado for diferente de 0 a prxima instruo executada; se o resultado for 0 a prxima no executada, em seu lugar executada uma instruo NOP e o seguindo o programa na segunda instruo aps a INCFSZ. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo INCFSZ f,d 0 f 127 d= 0 W d=1 registro f (d) (f)+1 se f[b]=1 salta a prxima instruo Nenhum 1 INCFSZ COUNT,1

2.11.6
CALL

Chamadas e desvio

Chamada de sub-rotina. O endereo de retorno (prxima instruo) guardado no topo da pilha (TOS) e um valor de 11 bits carregado nos bits menos significativos do PC (PC[10:0]), fazendo a seqncia do programa ser transferida para o endereo indicado por k. Os bits superiores do PC (PC[12:11]) so carregados a partir de PCLATH. Ver tpico "Desvio X Chamada" para maiores informaes. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo CALL k 0 k 2047 TOS PC+1 PC[10:0] k PC[12:11] (PCLATCH[4:3]) Nenhum 2 CALL TX_SERIAL

Exsto Tecnologia

Microcontroladores PIC16F877A

50

GOTO Realiza um desvio incondicional para endereo k. O endereo de 11 bits carregado no PC, fazendo a seqncia do programa ser transferida para o endereo indicado por k. Os bits superiores do PC so carregados de PCLATH. Ver tpico "Desvio X Chamada" para mais informaes. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo GOTO k 0 k 2047 PC[10:0] k PC[12:11] (PCLATCH[4:3]) Nenhum 2 GOTO INICIO

RETURN Retorno de sub-rotina. O endereo de retorno salvo na pilha quando da ocorrncia da interrupo carregado no PC. Ver tpico "Desvio X Chamada" para mais informaes. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo RETURN Nenhum PC TOS Nenhum 2 RETURN

RETLW Realiza o retorno de uma sub-rotina com o W contendo a constante de oito bits k . W passa a conter k e o endereo de retorno salvo na pilha quando da ocorrncia da interrupo carregado no PC. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo RETLW k 0 k 255 PC TOS (W) k nenhum 2 RETLW 69h

Exsto Tecnologia

Microcontroladores PIC16F877A

51

RETFIE Retorno de interrupo. O endereo de retorno salvo na pilha quando da ocorrncia da interrupo carregado no PC. O bit GIE do registro INTCON setado (as interrupes so reativadas).\ Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo RETFIE nenhum PC TOS GIE 1 nenhum 2 RETFIE

2.11.7
NOP

Controle

Um ciclo de instruo ocorre sem que nenhuma ao seja realizada. Sintaxe Operadores Operao Flags Afetados Ciclos Exemplo CLRWDT Reseta o timer do Watchdog. O prescaler do Watchdog tambm resetado. O bits NOT_TO e NOT_PD so setados. Sintaxe Operadores Operao CLRWDT nenhum WDT 00h WDT prescaler 0 NOT_TO 1 NOT_PD 1 NOT_TO, NOT_PD 1 CLRWDT NOP Nenhum Nenhuma Nenhum 1 NOP

Flags Afetados Ciclos Exemplo Alteraes nos Flags: NOT_PD = 1: indica que no houve queda de energia. NOT_TO = 1: indica que no houve time-out.

Exsto Tecnologia

Microcontroladores PIC16F877A

52

SLEEP O Processador entra no modo SLEEP, desativando oscilador. O bit NOT_PD zerado; O bit NOT_TO setado. O timer do Watchdog e seu prescaler so zerados. Sintaxe Operadores Operao SLEEP nenhum WDT 00h WDT prescaler 0 NOT_TO 1 NOT_PD 0 NOT_TO, NOT_PD 1 SLEEP

Flags Afetados Ciclos Exemplo Alteraes nos Flags: NOT_PD=0 e NOT_TO=1 indicam que o microcontrolador est em modo SLEEP.

2.12 Programando em assembly


Como j foi visto, a principal caracterstica de um sistema computacional permitir que um mesmo hardware execute diferentes funes pela mudana de seu software. Ento, para programar um sistema computacional deve-se criar uma seqncia lgica de comandos que possam ser traduzidos em uma determinada linguagem de programao, para que o sistema possa entender o que deve ser feito. Linguagem de programao uma forma de escrever um programa. Cada linguagem possui sua sintaxe, suas regras de escritas, suas instrues. Exemplos de linguagem de programao so Assembly, C/C++, Pascal, Basic, Cobol. A seqncia lgica de aes o que chamamos de algoritmo. Dessa forma, importante notar que o algoritmo independente da linguagem de programao. Um mesmo algoritmo pode ser implementado por qualquer linguagem de programao: o que muda como podemos escrever-lo numa linguagem. E ainda, um algoritmo no necessariamente precisa ser implementado em um computador. Na execuo de um projeto, antes de se comear a programar importante se ter bem claro os objetivos a serem alcanados e o modo de alcan-los, pois em fazer o algoritmo que est a verdadeira arte da programao, e no saber essa ou aquela linguagem. De fato, simplesmente conhecer as instrues de uma linguagem est to distante de se saber programar quanto saber vrias palavras est longe de se saber escrever. A apresentao de um algoritmo pode ser feita de forma escrita, o que chamado portugus estruturado ou portugol, ou de forma grfica, utilizando fluxogramas. O fluxograma, por se tratar de uma ferramenta grfica, deixa bem clara a seqncia de aes realizadas pelo programa. Contudo no apresenta muitos detalhes de implementao. O fluxograma consiste em um diagrama em blocos (cada tipo de bloco representa um tipo de estrutura) ligados por setas que indicam qual o fluxo seguido pelo programa. Como no existe uma interpretao universal de fluxograma, foi desenvolvido um conjunto especfico para trabalho com programao de microcontroladores para esse curso. Suas principais caractersticas so possuir Exsto Tecnologia

Microcontroladores PIC16F877A

53

smbolos diferentes para entrada e sada de dados e possuir um smbolo de Atraso, devido importncia desse conceito para sistemas microcontrolados. Quanto s linguagens de programao, elas so classificadas em nveis, sendo as de nvel mais alto as prximas da linguagem humana e as de baixo nvel as prximas linguagem de mquina, que o que o microcontrolador/processador efetivamente entende. O Assembly do PIC uma linguagem de baixo nvel.

2.13 Estrutura do Programa


Abaixo temos a estrutura bsica de um programa em assembly. O smbolo ; (ponto e vrgula) indica comentrio e os textos que vm a direita eles so ignorados pelo montador.

Exsto Tecnologia

Microcontroladores PIC16F877A

54

<variveis> ENDC ; *** Definies de Hardware ; *** Software org 0000H GOTO INICIO

; inicio do programa principal

; *** Tratamento de interrupo org 0004H ; vetor de interrupo ; ; ; ; <aqui deve estar o salvamento de contexto> <aqui devem ser inseridas as rotinas de tratamento de interrupes, quando houverem > <aqui deve estar o retorno de contexto>

< a rotina principal fica aqui >

GOTO PRINCIPAL ; loop principal ; *** Sub-Rotinas ; < as sub-rotinas podem ser inseridas aqui >

(1) (2) (3)

<aqui vem o cdigo da sub-rotina> RETURN END

; FIM DO CDIGO

Exsto Tecnologia

Sub-rotinas

<nome da subrotina>: ; Descrio da funo da sub-rotina ; Entrada: < parmetros de entrada> ; Sada: < parmetros de sada >

Rotina Principal

RETFIE ; *** Rotina principal INICIO: < aqui fica a inicializao> PRINCIPAL:

Tratamento de Interrupo

Incio do Programa

; vetor de reset

Definies de hardware e Software

; *** Variveis CBLOCK

20h

Configurae

;============================================================= ; <Nome da empresa> ; <Nome do projeto/programa> ;============================================================= ; Verso: ; <numero> <descrio da verso> ; <descrio da finalidade e operao do programa> ; Cristal <freqncia> - Ti = <tempo de instruo> ; ; <autor> ; <e-mail do autor> ;============================================================= #include<P16F877A.INC> ; microcontrolador a ser utilizado __CONFIG <opes> ; configuraes do programa

Cabealho

Microcontroladores PIC16F877A

55

Como pude ser observado, vrias partes da estrutura do programa no constituem cdigo executvel propriamente dito, mas comentrios e outras informaes. Isso feito visando documentar adequadamente o projeto, permitindo realizar melhor o entendimento e a manuteno do software, alm de seu desenvolvimento. Cabealho O cabealho contm informaes sobre o programa, como objetivo, autor, revises e seus motivos, dentre outras. Sua finalidade e documentar um resumo do programa, quem o responsvel pela sua implementao e outras observaes que permitam estabelecer a finalidade e o contexto para os quais aquele cdigo foi desenvolvido. Assim como no cabealho, em muitas outras partes do texto so feitos comentrio e explicaes sobre o que est sendo realizado. Esse procedimento extremamente recomendado, pois, como logo ser percebido, o cdigo em Assembly muitas vezes no deixa claro o que est sendo feito. comum que um programador, ao retomar um programa com o qual no trabalhou por algumas semanas, no se lembre mais do motivo de ter feito certas partes do cdigo. Quando necessria alguma manuteno em um programa, por pessoas que no o desenvolveram, e no h comentrios, o trabalho se torna virtualmente impossvel. Configuraes Nesse ponto do programa includo o arquivo de definies do microcontrolador a ser utilizado e so realizadas as configuraes dos bits de configurao. Definies de Hardware e Software Aqui so realizadas as declaraes de variveis, as definies de constantes e as definies de hardware. Podemos fazer definies de hardware utilizando a diretiva #DEFINE para tornar o programa mais claro. A idia atribuir nomes aos pinos e/ou aos portais, segundo sua funo. Dessa forma, na escrita do programa, no necessrio lembrar qual funo est associada a cada pino, apenas a funo. Por exemplo, suponhamos que existe um LED no pino RB2, isto , no bit 2 do PORTB. mais cmodo nos referirmos a ele simplesmente por LED, no sendo preciso lembrar onde realmente est o LED. Alm disso, se por algum motivo for preciso mudar o LED para o pino RB6, basta alterar somente a definio, e no todo local onde se faa referncias ao LED. O trecho de cdigo abaixo exemplificar o que discutimos acima.
... CBLOCK 20h ENTRADA ; ARMAZENA OS VALORES DE ENTRADA CONT ; CONTADOR PARA TEMPORIZAO ... ENDC ... #DEFINE LED PORTB,2 ; o LED est em RB2 ... BSF LED ; o mesmo que BSF PORTB,2 -> acende o LED ...

Exsto Tecnologia

Microcontroladores PIC16F877A

56

Incio do programa aqui que o programa que vai ser gravado no microcontrolador realmente comea. A diretiva ORG indica que o programa vai ser escrito a partir do vetor de reset (0000h). Como logo em seguida temos o vetor de interrupo, caso esta esteja sendo utilizada, necessrio fazer um desvio para a rotina principal do programa. Tratamento de interrupo A partir do vetor de interrupo (0004h) colocado o cdigo para tratar das interrupes, quando estas forem utilizadas, conforme ser discutido no futuro. Rotina principal o corpo principal do programa. Na quase totalidade de programas para microcontroladores essa rotina constituda por uma seqncia de inicializao e um loop, que ser repetido indefinidamente. No existe uma ordem obrigatria da posio onde deve estar essa rotina, mas comum que ele seja a primeira, ou a ltima, rotina do programa, para facilitar sua localizao. Na inicializao do microcontrolador sero realizadas todas as configuraes do componente para que o programa opere conforme o desejado. Sub-rotinas As sub-rotinas devem ser devidamente identificadas com seus cabealhos, informando sua funo e seus parmetros de entrada e sada. Ao utilizar sub-rotinas bem feitas e documentadas reduzimos o tempo de desenvolvimento, pois passamos a simplesmente organizar a rotinas j desenvolvidas, cujo funcionamento totalmente descrito pelo cabealho, no sendo necessrio refazer a rotina nem mesmo perder tempo estudando-a. 2.14 Programao estruturada Programar de forma estruturada seguir uma srie de regras que fazem com que o software final tenha uma estrutura que facilite seu desenvolvimento, compreenso e manuteno. O problema a ser resolvido, que geralmente um problema complexo, deve ser dividido em blocos de problemas mais simples, e assim sucessivamente at que os sub-problemas atinjam uma simplicidade tal que possam ser resolvidos com o uso de estruturas bsicas. Para resolver qualquer tipo de problema, independente de sua complexidade, existe apenas trs tipos de estruturas: a atribuio de valores, as estrutura de deciso e as estruturas de repetio. importante que um programa estruturado seja modular. Isto quer dizer que deve ser composto por partes independentes do todo, que resolvam problemas especficos. Essas partes so chamadas subrotinas. Harmoniosamente organizadas, as sub-rotinas nos permitem solucionar o problema, que o objetivo do software. A diviso do programa em mdulos acarreta uma srie de vantagens. Como cada funo trata de um problema especfico, fica fcil identificar onde est ocorrendo algum problema e tambm solucionalo. Alm disso, uma funo pode facilmente ser levada para outro programa onde a mesma Exsto Tecnologia

Microcontroladores PIC16F877A

57

soluo se faa necessria, reduzindo assim o tempo de desenvolvimento. E ainda, um programa modular mais facilmente compreendido quando lido.

Exsto Tecnologia

Microcontroladores PIC16F877A

58

3 PROGRAMANDO O PIC16F877A
3.1 Diretivas
Diretivas podem ser vistas como instrues dadas ao montador, e no ao microcontrolador. Elas so reconhecidas ou interpretadas pelo processador e realizam vrias funes na criao do programa. Trataremos aqui de algumas diretivas principais, que sero utilizadas na grande maioria dos programas. ORG e END Sintaxe Exemplo
ORG <endereo> 0000h INIT PRINCIPAL ; inicio do programa

org INICIO: CALL GOTO

A diretiva ORG indica ao compilador que o cdigo que se segue ser alojado a partir da posio de memria indicada por <endereo>. Sempre necessria uma diretiva ORG para indicar o comeo do programa, conforme mostrado no exemplo. Sintaxe Exemplo
END org INICIO: ... end 0000h ; inicio do programa ; corpo do programa ; fim do programa

A diretiva END indica o fim do programa. Todo cdigo escrito deve ser finalizado com END. Qualquer cdigo escrito aps END ser ignorado pelo compilador. #INCLUDE Sintaxe Exemplo
#include #include #include <nome_do_arquivo> <PIC16F628A.inc> ;definies do 16F628A <MINHAS_MACROS.inc>; biblioteca de macros

A diretiva #INCLUDE permite incluir arquivos no cdigo fonte principal. Esses arquivos podem ser arquivos de definies dos microcontroladores (cada microcontrolador tem seu arquivo de Exsto Tecnologia

Microcontroladores PIC16F877A

59

definies, que deve ser includo no incio do programa) ou bibliotecas, que so conjuntos de funes e/ou macros j prontas. No exemplo dado, temos esses dois casos #DEFINE e EQU Sintaxe Exemplo
#define #define #define #define <nome> SETPOINT ENTRADA LED <texto> 32h PORTA PORTB,5

Sintaxe Exemplo

<nome> MEDIDA TESTE SETPOINT

EQU EQU EQU EQU

<texto> 20h 21h 32h ; varivel ; varivel ; constante

Essas duas diretivas tm funo semelhante, que estabelecer uma substituio de texto. Em ambos os casos, elas informam ao compilador que <nome> deve ser substitudo por <texto> quando o programa for compilado. A diferena fundamental entre elas que #DEFINE aceita textos compostos por virgulas, pontos, espaos, etc, enquanto EQU aceita apenas uma seqncia simples de caracteres. Ambas as diretivas pode ser utilizadas para declarar variveis. Como veremos, declarar uma varivel nada mais que dar um nome a um endereo de memria, que a mesma coisa que declarar uma constante. A diferena entre constante e varivel est somente no tratamento dado no programa. Apesar disso, vamos estabelecer o critrio de utilizar EQU para definio de variveis e #DEFINE para definio de constantes. Veremos na prxima diretiva que existe um jeito mais eficiente de declarar variveis. CBLOCK e ENDC
CBLOCK <valor_inicial> <nome_1> <nome_2> ... <nome_N> ENDC CBLOCK 20h ;endereo inicial da RAM geral TESTE MEDIDAS VALOR ... ENDC

Sintaxe

Exemplo

A diretiva CBLOCK permite criar um bloco de constantes consecutivas. especificado um valor inicial, que ser o valor atribudo ao primeiro nome do bloco de constantes, a partir dele, cada nome recebe um valor em ordem crescente a partir do valor inicial. No exemplo dado, o valor inicial 20h, o que resulta em TESTE = 20h, MEDIDAS = 21h e VALOR = 22h.

Exsto Tecnologia

Microcontroladores PIC16F877A

60

O bloco sempre terminado pela diretiva ENDC. Essa diretiva muito til para a definio de variveis, pois nos permite estabelecer o endereo onde comea a RAM de uso geral e simplesmente dar o nomes as variveis, sem preocupao com o endereo individual de cada varivel. Contudo, deve-se estar atento para que o nmero de variveis no seja to grande que extrapole os endereos do banco. BANKSEL Sintaxe
BANKSEL MEDIDA TESTE ... MOVFW BANKSEL MOVWF BANKSEL <endereo_de_memria> EQU EQU MEDIDA TESTE TESTE MEDIDA 20h A0h ; ; ; ; ; varivel no banco 0 ; varivel no banco 1 banco 0 muda para o banco 1 banco 1 retorna ao banco 0

Exemplo

Essas duas diretivas so utilizadas quando necessrio realizar mudanas de bancos de RAM de dados. BANKSEL realiza automaticamente a alterao dos valores de RP0 e RP1 para acessar <endereo_de_memria> diretamente. BANKISEL realiza a alterao de IRP para realizar acesso indireto. A vantagem de se utilizar essas diretivas que no preciso saber em qual banco est o registro acessado, apenas que ele no est no banco corrente. Como elas geram cdigo para alterar os bits em questo, sua utilizao deve ser cuidadosa. No exemplo acima da diretiva BANKSEL so declaradas duas variveis, MEDIDA e TESTE, nos endereos 20h (banco 0) e A0h (banco 1), respectivamente. Considerando a formao de endereos por 7 bits essas duas variveis correspondem ao mesmo valor de operando na instruo, no entanto se encontram em bancos diferentes. Para a manipulao de dados entre elas necessrio o ajuste de banco, que feito atribudo os valores corretos a RP0 e RP1. A diretiva BANKSEL realiza essa ao. No exemplo, o valor contido em MEDIDA carregado em W, a diretiva BANKSEL realiza o ajuste de banco para acessar a varivel TESTE, ou seja, realiza a mudana de banco para o banco 1, o valor contido em W transferido para TESTE e a diretiva BANKSEL novamente utilizada, agora para fazer o ajuste para o banco de MEDIDA, isto , para o banco 0. __CONFIG Sintaxe Exemplo
__CONFIG <opes>

__CONFIG INTRC_OSC_NOCLKOUT & _WDT_OFF

A diretiva __CONFIG (existem dois _ (dois caracteres underline) antes de CONFIG) permite estabelecer a configurao dos fusveis utilizada pelo programa. Fusveis ou fuses so como so chamados os bits de configurao das diversas caractersticas especiais, das quais trataremos mais adiante. As vrias opes, que na verdade so constantes, so associadas pelo smbolo &, que realiza uma operao E entre os valores dessas constantes. Exsto Tecnologia

Microcontroladores PIC16F877A

61

Para cada PIC existem vrias opes, que podem ser encontradas no arquivo de definies. A tabela 4.1 contm as opes de configurao para os PIC 16F628 e 16F628A

Opo _BODEN_ON _BODEN_OFF _CP_ALL _CP_OFF _CPD_ON _CPD_OFF _PWRTE_OFF _PWRTE_ON _WDT_ON _WDT_OFF _LVP_ON _LVP_OFF _DEBUG_ON _DEBUG_OFF _RC_OSC _LP_OSC _XT_OSC _HS_OSC _WRT_OFF _WRT_256 _WRT_1FOURTH _WRT_HALF

Descrio Brown-out Reset habilitado Brown-out Reset desabilitado Proteo de cdigo total Proteo de cdigo desativada Proteo da memria EEPROM habilitada Proteo da memria EEPROM desabilitada Power-up Timer habilitado Power-up Timer desabilitado Watch-dog ligado Watch-dog desligado Programao em baixa tenso habilitada Programao em baixa tenso desabilitada Depurador ativo Depurador inativo Oscilador externo (Modo EC) Oscilador a cristal/ressonador modo LP Oscilador a cristal/ressonador modo XT Oscilador a cristal/ressonador modo HS Proteo de escrita na FLASH desabilitada Proteo de escrita nos primeiros 256 bytes Proteo de escrita no primeiro quarto Proteo de escrita em metade da memria Tabela 4.1 Parmetros da diretiva CONFIG

Padro x

x x x x x

x x

3.2 Variveis
Os dados a serem manipulados pelo microcontrolador so armazenados na memria RAM de uso geral. nessa regio da memria onde so declaradas as variveis do programa. Quando se trabalha em Assembly no PIC somente dois tipos de varivel existem diretamente. O primeiro o byte, que pode ser encarado como o tipo caracter (8 bits). Byte aceita valores de 0 a 255 se considerarmos valores no sinalizados ou de 128 a 127 se considerarmos valores sinalizados (notao complemento 2). A outra possibilidade o tipo lgico. Nesse caso, como a varivel pode assumir somente dois valores, verdadeiro (1 ou true) ou falso (0 ou false), so utilizados individualmente bits de bytes pertencentes a RAM. comum se referir a esses bits como flags (bandeiras). As variveis a serem usadas em um programa devem ser declaradas, isto , deve-se informar ao sistema que elas existem antes de us-las, para que lhes seja destinado um espao de memria. Declarar bytes simplesmente atribuir um nome a um determinado endereo de memria. Para a declarao de bytes utiliza-se a diretiva CBLOCK, conforme j tratado.

Exsto Tecnologia

Microcontroladores PIC16F877A

62

Para declarar variveis de tipo lgico, ou flags, primeiramente declara-se um endereo que ir conter os flags. Em seguida utiliza-se a diretiva #DEFINE para declarar o flag dentro do byte de flags, conforme a sintaxe abaixo.
#define <nome_do_flag> <Nome_do_byte_flags> , <bit>

Sendo que o campo <bit> pode conter valores de 0 a 7, sendo 0 o bit menos significativo do byte e 7 o mais significativo. Abaixo pode ser observado um exemplo de declarao de variveis lgicas.
FLAGS1 #define #define ; #define EQU F_RECEBEU F_ACABOU . . . F_ALARME 20h ; o byte de flags ocupa o endereo 20h FLAGS1, 0 FLAGS1, 1 FLAGS1, 7

Uma boa dica de programao usar sempre nomes de variveis e flags que deixem clara sua funo, facilitando a compreenso do cdigo. Pode-se ainda obedecer a regra de sempre iniciar o nome de variveis lgicas com F_, para indicar que se trata de um flag e no de um byte.

3.3 Sub-rotinas
Para a implementao de programas modulares de fundamental importncia o conceito de subrotinas. Uma sub-rotina definida como um trecho de cdigo que realiza uma ao especfica, assim como uma funo matemtica. Ela pode ou no ter parmetros de entrada (operandos de uma funo matemtica) e parmetros de sada (resultados). O conceito de sub-rotina admite ainda que ela ser chamada pelo programa, isto , ela ser executada e depois retornar ao ponto onde foi chamada. Em Assembly, uma sub-rotina inicia-se no Label (ou rtulo) que d lhe o nome pelo qual ela ser chamada pelo programa e termina sempre com uma instruo RETURN. A instruo RETURN necessria para que o programa retorne ao ponto onde a sub-rotina foi chamada. As sub-rotinas seguiro a forma geral abaixo.
<nome da subrotina>: ; Descrio da funo da sub-rotina ; Entrada: < parmetros de entrada> ; Sada: < parmetros de sada > ; <aqui vem o cdigo da sub-rotina> RETURN

(1) (2) (3)

Exemplo 4.1 Por exemplo, o cdigo abaixo soma o valor de duas variveis e salva esse valor em W.
ADD_FUNCTION: ; soma dois nmeros ; entrada: ; ; sada: MOVFW ADDWF

NUMERO_1 NUMERO_2 W

(1) (2) (2) (3) ; W ; W NUMERO_1 W + NUMERO_2

NUMERO_1 NUMERO_2,W

Exsto Tecnologia

Microcontroladores PIC16F877A

63

RETURN

3.3.1 Passagem de Parmetros


A passagem de parmetros nos algoritmos feita na prpria forma de escrita da sub-rotina. A forma geral de referncia sub-rotina no portugus estruturado e em fluxograma ser a apresentada abaixo, sendo que o campo [destino] opcional, pois a sub-rotina pode no retornar nenhum valor, e os parmetros podem ser de qualquer quantidade, inclusive nenhum. [destino] <Nome da funo> ( [Parmetro1], ..., [ParmetroN] );

[destino]

<Nome da funo> ( [Parmetro1], ..., [Parmetro N] )

Em um programa em Assembly, porm, esse tipo de construo impossvel. A passagem de parmetros feita ento simplesmente atribuindo os valores a serem processados nas variveis que sero utilizadas na funo. Uma boa tcnica , sempre que existir apenas um valor de entrada e/ou de sada da funo, utilizar o registro W para o transporte de parmetros. Isso facilita as operaes e reduz o tamanho do cdigo. Outra boa prtica de programao nunca manter valores importantes em W, pois, como destino de grande parte das operaes da ALU, ele pode ser alterado a qualquer momento. Exemplo 4.2 Para a implementao da sub-rotina de soma suposta no exemplo anterior podemos utilizar o cdigo abaixo. Simule-o para observar seu funcionamento.
CBLOCK 20h NUMERO_1 NUMERO_2 SOMA ENDC ORG MOVLW MOVWF MOVLW MOVWF CALL MOVWF GOTO ADD_FUNCTION: ; entrada: ; ; sada: MOVFW ADDWF RETURN END 0000H 32h NUMERO_1 04h NUMERO_2 ADD_FUNCTION SOMA $ ; soma dois nmeros NUMERO_1 NUMERO_2 W NUMERO_1 NUMERO_2,W (1) (2) (2) (3)

; NUMERO_1 <- 32h ; NUMERO_2 <- AUX ; chama a funo ; SUM <- resultado contido em W

; W <- NUMERO_1 ; W <- W + NUMERO_2 ; retorna o resultado em W

Exsto Tecnologia

Microcontroladores PIC16F877A

64

Pode-se notar que abaixo do nome da sub-rotina foram introduzidas algumas linhas de comentrios que especificam (1) o que faz a sub-rotina, (2) quais so os parmetros de entrada e (3) quais so os parmetros de sada. extremamente recomendado que se siga esse procedimento para garantir maior facilidade de compreenso e melhor documentao do software.

3.3.2 Chamada X Desvio (CALL X GOTO)


Um problema que atinge praticamente a todos quando comeam o estudo de uma linguagem de programao de baixo nvel no ter claro em mente a diferena entre desvio e chamada no fluxo do programa. O fluxo do programa em um microcontrolador se d da seguinte maneira: partindo de um endereo inicial as instrues so executadas seqencialmente. a que entra a conceito do PC (Program Counter Contador de programa). O programa seguindo normalmente, a cada instruo o PC incrementado, fazendo com que no prximo ciclo de leitura de instruo o endereo lido seja o imediatamente seguinte ao atual. Porm para a grande maioria das aplicaes no de grande utilidade um programa que seja executado sempre na mesma seqncia. Por isso o programa deve ser capaz de mudar seu prprio fluxo. Nas chamadas de sub-rotinas e tratamento de interrupes ele deve ser capaz de interromper sua seqncia normal, executar um cdigo armazenado em outra regio da memria e retornar ao ponto onde a seqncia foi interrompida. Numa estrutura de deciso ele deve ser capaz de executar o bloco verdadeiro ou o bloco falso. E ainda, numa estrutura de repetio ele deve ser capaz de realizar a mesma seqncia N vezes, dependendo das condies da estrutura. Para realizar tudo isso existem dois meios: o desvio e a chamada. O desvio, que no PIC realizado pela execuo da instruo GOTO, consiste em alterar o valor do PC, fazendo com ele contenha o endereo onde est o cdigo que se deseja executar. Dessa maneira a seqncia do cdigo desviada para aquele endereo e de l segue seqencialmente, at encontrar uma outro desvio ou uma chamada. A chamada, que no PIC realizada pela execuo da instruo CALL, semelhante ao desvio, porm fundamentalmente diferente. A chamada tambm altera o valor do PC, causando um desvio na seqncia do programa para um determinado endereo, porm antes de realizar essa alterao ela salva o valor do PC (prximo endereo depois do CALL), que ser seu endereo de retorno, numa regio de memria chamada pilha. Isso feito porque o conceito de chamada de que uma parte do cdigo, gravada em uma diferente regio da memria, deve ser executada e depois o fluxo retorna o ponto em que a chamada foi originada. Portanto uma instruo de chamada sempre exigir uma instruo de retorno, que no PIC a instruo RETURN. A chamada em Assembly funciona ento como a chamada de funes numa linguagem de mdio ou alto nvel, porm temos que nos preocupar com o retorno dessa funo. Uma funo em Assembly sempre terminar com uma instruo de retorno (RETURN ou RETLW). O que o RETURN faz recuperar o valor salvo na pilha pela ltima instruo CALL executada e carrega-lo no PC, fazendo com que o fluxo do programa volte ao ponto onde foi executada a chamada. A pilha do PIC possui somente oito nveis, isto , pode armazenar somente oito endereos de retorno. Ela trabalha de forma circular, assim, j tendo 8 endereos armazenados, o nono substitui o Exsto Tecnologia

Microcontroladores PIC16F877A

65

primeiro e assim por diante. Em uma analogia com uma pilha de pratos, o nono prato tomar o lugar do primeiro que est em baixo. Portanto deve-se tomar cuidado para no se fazer mais de 8 chamadas consecutivas (incluindo a interrupo!), seno perde-se os endereos de retorno das primeiras chamadas, fazendo com que o programa perca completamente sua seqncia lgica. A figura 4.1 ilustra o a seqncia do programa dentro da memria, quando temos uma chamada, um

0000h

CALL A

GOTO B

RETURN

CALL C

RETURN

desvio, depois mais uma chamada, o retorno da segunda chamada e o retorno da primeira. Figura 4.1 CALL X GOTO No programa existiro labels com duas finalidades: indicar o incio de sub-rotinas e indicar pontos de desvio. Para desvios curtos (poucas instrues acima ou abaixo do ponto atual) possvel utilizar a construo:
GOTO $ +/- k

Onde k um valor constante e $ indica o endereo atual. Sendo assim, para realizar um salto a 3 instruo abaixo soma-se 3 ao endereo atual. Para saltar para a instruo anterior, subtrai-se 1 do endereo atual. Esses procedimentos so apresentados abaixo.
GOTO ... GOTO $+3 $-1 ; salta para a 3 instruo abaixo ; volta para a instruo anterior

Exsto Tecnologia

Microcontroladores PIC16F877A

66

3.4 Atribuio
A estrutura mais simples existente em algoritmo ou fluxograma a atribuio, que nada mais que o modo pelo qual se atribui valor a uma varivel. Em outras palavras, trata-se de mover o valor de uma origem, sendo essa uma constante ou uma varivel, para uma varivel de destino. Tanto nos fluxogramas como no portugus estruturado essa operao ser caracterizada pelo smbolo , sendo que o destino encontra-se na ponta da seta e a origem na extremidade oposta a ponta. Abaixo so apresentados alguns exemplos. Portugus Estruturado X Soma;
X Soma; Falso;

Fluxograma

F_ALARME

Falso;

F_ALARME

No Assembly do PIC a atribuio feita pelas seguintes instrues: Orientadas a bytes:


MOVLW MOVF MOVF MOVWF CLRF CLRW RETLW k k f, 1 f, 0 f f : : : : : : : W f W f f W W k f f W 0 0 k e realiza o retorno (instruo especial MOVFW)

Orientadas a bit:
BSF BCF f, b f, b : : f[b] f[b] Verdadeiro Falso

Obs.: f[b] significa bit b do registrador f

Devido ao reduzido nmero de instruo no Assembly do PIC no existem instrues que permitam mover o contedo de uma varivel diretamente para outra ou uma constante diretamente para uma varivel (exceto quando a constante for zero). Para mover uma constante para uma varivel utiliza-se a seqncia abaixo.
MOVLW MOVWF k f ; W ; f k W

Exsto Tecnologia

Microcontroladores PIC16F877A

67

Para atribuir o valor de uma constante a outra procede-se da seguinte forma.


MOVLW MOVWF <origem> <destino> ; W ; f <origem> <destino>

3.5 Entrada e Sada


Nos modelos bsicos de algoritmos e fluxogramas utilizados existem funes de entrada e sada. Elas permitem a comunicao do software com o mundo exterior. O PIC tem a particularidade de no possuir instrues de entrada e sada de dados, sendo estas funes realizadas pela escrita e leitura dos registros de cada portal (instrues de atribuio). Esses registros so nomeados como PORTA, PORTB, PORTC, etc. No caso especfico do PIC16F628A existem o PORTA e o PORTB. Assim, comandos de entrada e sada resumem-se a simples atribuies envolvendo os registros de portais (PORTA, PORTB). Esta caracterstica ocorre de forma a simplificar o set de instrues, facilitando o desenvolvimento de software e reduzindo o nmero de instrues. Uma instruo de sada uma atribuio que tem como destino o registro de um portal. Do mesmo modo, uma instruo de entrada uma atribuio que tem como origem o registro de um portal. Exemplos so apresentados abaixo.
MOVFW MOVWF ... MOVLW MOVWF PORTA RX_DTMF 0AFh PORTB ; W <-- PORTA ; RX_DTMF <-- W ; W <-- 0Afh ; PORTB <-- W

Entrada

Sada

Para sada de dados possvel ainda trabalhar alterando somente um bit de um portal, sendo essa alterao refletida em um nico terminal de sada. Para isso utilizam-se as instrues de atribuio orientadas a bit (BCF e BSF), como pode ser visto abaixo. Tambm possvel realizar entradas em nvel de bit, procedimento esse que ser tratado mais adiante.

BCF BSF

PORTA,3 PORTB,0

; bit 3 do portal A <-- Falso ; PORTB[0] <-- Verdadeiro

Na figura 4.2 so apresentados os smbolos de entrada (a) e sada (b) para fluxogramas.

(a)

(b)

Figura 4.2 Smbolos de (a) entrada e (b) sada em fluxogramas

As representaes em portugus estruturadas so as palavras Escreva para sada de dados e Leia para a entrada de dados.

Exsto Tecnologia

Microcontroladores PIC16F877A

68

3.6 Estruturas de Deciso


Um programa composto apenas por atribuies teria aplicaes bastante limitadas. Alm disso, uma das vantagens do software que ele pode tomar decises a partir de informaes de entrada. Estruturas permitem que isso seja feito so chamadas estruturas de deciso. As estruturas de deciso existentes so: Se Se-Seno Se-Seno-Se Caso

No Assembly do PIC, as estruturas de deciso so implementadas atravs de instrues que realizam teste e desvios, que so: BTFSS <registro>, <bit> Salta a prxima instruo se <bit> de <registro> estiver em 1. BTFSC <registro>, <bit> Salta a prxima instruo se <bit> de <registro> estiver em 0. DECFSZ <registro>, <destino> Decrementa <registro> e salta a prxima instruo se o resultado for 0. INCFSZ <registro>, <destino> Incrementa <registro> e salta a prxima instruo se o resultado for 0 (255 + 1 = 0 e vai um para STATUS,C). Juntamente com as instrues citadas acima, geralmente se utilizam instrues de desvio para os endereos do cdigo que tratam de cada situao. O exemplo abaixo mostra como isso acontece:
LOOP: ... DECFSZ GOTO

CONTADOR,F LOOP

; desvia para LOOP se o contador ; no vale 0

Os procedimentos acima descritos podem ser utilizados para o teste de bits em portais, realizando assim deciso e entrada de dados ao mesmo tempo. Dessa forma consegue-se maior agilidade no software. O exemplo abaixo realiza uma deciso a partir de um bit de entrada; neste caso o bit em questo foi definido com o nome SENSOR_1.
BTFSC GOTO SENSOR_1 DISPARA_ALARME ; Se (SENSOR_1 = Verdadeiro)ento ; dispara o alarme

Exsto Tecnologia

Microcontroladores PIC16F877A

69

3.7 Condies
As decises que devem ser tomadas em um programa muitas vezes so baseadas na comparao numrica entre dois valores, isso , se esses valores so iguais ou no, qual o maior, etc. No set de instrues da linha PIC 16Xxxx no existe nenhuma instruo de comparao. Ento para realizar comparao se faz necessrio utilizar instrues de teste associada a manipulaes matemticas. Assim, antes de tratar propriamente das estruturas de decises, deve-se saber como reconhecer essas condies. Condies A = B e A != B Uma forma simples de saber se dois valores so iguais subtraindo um do outro: se o resultado for zero os dois valores so iguais; qualquer outro resultado significa que os valores so diferentes. Em Assembly realiza-se a subtrao e estuda-se o bit Z do registro STATUS, conforme pode ser observado no exemplo abaixo. Simule esse exemplo, alterando o valor da varivel MEDIDA para 25h e outros valores e observado o que ocorre.
#INCLUDE<P16F877A.INC> CBLOCK 20H MEDIDA ENDC ORG MOVLW SUBWF BTFSC GOTO GOTO IGUAIS: GOTO DIFERENTES: GOTO END 0000H 25h MEDIDA,W STATUS,Z IGUAIS DIFERENTES $ $ ; ; ; ; ; W <-- 25h W <-- MEDIDA - W Se (Medida = 25h) ento desvia para IGUAIS seno, desvia para diferentes ; definies dos registros do PIC

; se forem iguais, para aqui ; se forem diferentes, para aqui

E ainda, para testar se uma varivel igual a zero, pode-se utilizar a instruo MOVF, tendo como destino o prprio registro. Nesse caso o valor da varivel movido para ela mesma, no sofrendo qualquer alterao. Porm, se a varivel for igual a zero o bit Z de STATUS ser afetado, assumindo valor igual a 1. Condies A > B, A >= B, A < B, A <= B Pode haver a necessidade de saber qual de dois valores o maior, sendo eles diferentes entre si. Para tanto, novamente subtrai-se um valor pelo outro e ento analisa-se o bit de Carry (Transporte) que o bit C do registro STATUS. Supondo dois valores , A e B, diferentes e tais que A > B, temos que: A B : resultado normal (valor positivo)

Exsto Tecnologia

Microcontroladores PIC16F877A

70

B A : ocorrncia de estouro do acumulador na subtrao, chamado de Borrow. (valor negativo) O Borrow pode ser percebido pela anlise do bit C do STATUS. importante notar que na subtrao esse bit trabalha com lgica inversa adio. Assim: C = 1 : resultado normal C = 0 : ocorrncia de borrow Resultado normal inclui 0. Dessa forma, se fazendo A B resulta em C = 1 conclui-se que A >= B (ou que B <= A). O trecho de cdigo abaixo chama a sub-rotina AJUSTE se MEDIDA for maior que MAX. Simule seu funcionamento para diferentes valores de MEDIDA e MAX.
#INCLUDE<P16F877A.INC> CBLOCK 20H MAX MEDIDA ENDC ORG REPETE: MOVFW SUBWF BTFSC CALL GOTO ; ... AJUSTE: NOP NOP NOP RETURN END 0000H MAX MEDIDA,W STATUS,C AJUSTE REPETE ; ; ; ; ; W <-- MAX W <-- MEDIDA - W Se (MEDIDA >= MAX) ento AJUSTE chamado seno desvia para REPETE

; \ ; > corpo da sub-rotina ; / ;retorna para o endereo de chamada

Finalmente, para testar se um valor somente menor ou maior que outro, e no igual, testa-se na mesma operao o bit Z de STATUS. O cdigo abaixo exemplifica essa operao:
#INCLUDE<P16F877A.INC> CBLOCK 20H MEDIDA ENDC ORG MOVLW SUBWF BTFSC GOTO BTFSC GOTO GOTO 0000H 05h ; MEDIDA,W ; STATUS,Z ; IGUAL ; STATUS,C MAIOR ; se MEDIDA > MENOR ; se MEDIDA < W <-- 05h W <-- MEDIDA - W Se (Medida = 05h) ento desvia para IGUAIS 05h 05h : C = 1 : C = 0 ; definies dos registros do PIC

Exsto Tecnologia

Microcontroladores PIC16F877A

71

IGUAL: GOTO MENOR: GOTO MAIOR: GOTO END

$ $ $

; se MEDIDA == 05h, para aqui ; se MEDIDA < 05h, para aqui ; se MEDIDA > 05h, para aqui

Resumo das condies Em resumo, havendo dois valores, A e B, e sendo realizada a subtrao A B, temos que: Z 0 0 1 1 C 0 1 0 1 Condio A<B A>B impossvel A=B

3.8 Se
A estrutura de deciso Se funciona da seguinte forma: se a condio for verdadeira, o Bloco_verdadeiro executado; seno, programa continua o fluxo normalmente a partir de Fim_Se. Em outras palavras, o cdigo contido no Bloco_verdadeiro executado somente se a condio for verdadeira. Se (<condio>) ento
<Condio> V

[Bloco_verdadeiro]

Bloco

Fim_Se

A implementao dessa estrutura pode ser feita com uma instruo de teste e salto seguida por uma chamada de funo. Essa chamada contem o Bloco_verdadeiro. conveniente a utilizao de uma chamada de funo, pois o programa retorna ao ponto onde foi chamado e continua o programa da prxima linha, isto , do mesmo ponto de onde continuaria se a condio fosse falsa. Esse procedimento exemplificado abaixo.
BTFSS PORTB,2 CALL BL_VERDADE BCF PORTC,0 . . . BL_VERDADE: MOVLW 0Fh MOVWF PORTB RETURN ; se (PORTB[2] = Verdadeiro) ento ; executa o bloco verdadeiro e retorna ; seno, segue o programa ; Bloco verdadeiro

Exsto Tecnologia

Microcontroladores PIC16F877A

72

Se por algum motivo no for interessante a utilizao de uma chamada, devemos fazer o teste inverso, de forma a desviar quando a condio for falsa. Esse desvio deve ser para o ponto que tambm ser o destino do termino do bloco verdade. O trecho de cdigo abaixo realiza o mesmo que o cdigo anterior, porm sem a utilizao de chamada.
BTFSC GOTO MOVLW MOVWF FIM_SE: BCF . . . PORTB,2 FIM_SE 0Fh PORTB PORTC,0 ; se (PORTB[2] != Vedadeiro)ento ; segue para END_IF ; se (PORTB[2] = Vedadeiro) ento ; executa o bloco verdadeiro ; em qualquer caso, o programa segue

3.9 Se seno
A estrutura Se-Seno uma derivao da estrutura Se onde, alm de um bloco a ser executado somente quando a condio for verdadeira (o Bloco_verdadeiro), existe um bloco a ser executado somente quando a condio for falsa (o Bloco_falso). Sua representao ilustrada abaixo.

Se (<condio>) ento [Bloco_verdadeiro] Seno [Bloco_falso] Fim_Se


Bloco Falso

<Condio>

V
Bloco Verdadeiro

Essa estrutura implementada em Assembly por uma instruo de teste e salto seguida de dois desvios, conforme o trecho abaixo.
CBLOCK 20H CANAL TST1 ENDC ORG MOVFW SUBLW SKPNZ GOTO GOTO BL_VERDADE: MOVLW MOVWF GOTO BL_FALSO: MOVLW MOVWF 0000H CANAL 35h BL_VERDADE BL_FALSO 03h TST1 FIM_SE 08h TST1 ; vai para o Fim_Se ; ; ; ; instruo especial = BTFSC se (CHANNEL) = 35h seno Bloco Verdadeiro STATUS,Z

; vai para o Fim_Se ; Bloco Falso

Exsto Tecnologia

Microcontroladores PIC16F877A

73

FIM_SE: $ END

; os dois ; para aqui.

blocos convergem para c GOTO

Um modo mais compacto de se implementar um se-seno fazendo todos os blocos de forma seguida no cdigo, dessa forma so economizadas instrues de desvio. Esse modo apresentado abaixo.
CBLOCK 20H CANAL TST1 ENDC ORG MOVFW SUBLW SKPNZ GOTO MOVLW MOVWF GOTO BL_VERDADE: MOVLW MOVWF FIM_SE: $ END 0000H CANAL 35h BL_VERDADE 08h TST1 FIM_SE ; instruo especial = BTFSC ; se (CHANNEL) = 35h ; Bloco Falso vem aqui STATUS,Z

; vai para o Fim_Se ; Bloco Verdadeiro

03h TST1 ; vai para Fim_se ; os dois blocos convergem para c GOTO ; para aqui.

A diferena entre esses dois cdigos que no segundo, as instrues do bloco falso vm logo em seguida ao desvio BL_VERDADE sem que seja necessrio colocar outro desvio para a as instrues a serem executadas em caso de a condio da estrutura de deciso ser falsa.

3.10 Se seno se
Uma outra possibilidade de construo utilizando-se a estrutura Se-Seno a chamada estrutura SeSeno-Se, que simplesmente a implementao onde o bloco falso de uma estrutura Se-Seno composto por outra estrutura Se-Seno. Esta forma pode ser utilizada em cascata, possibilitando a verificao de quantas possibilidades forem necessrias no programa. Abaixo apresentada a forma geral dessa estrutura. Deve-se notar que todos os FIM_SE da estrutura levam na verdade a um mesmo ponto. E ainda, pode haver ou no um Bloco Falso, que ser executado caso nenhuma das condies seja satisfeitas.

Exsto Tecnologia

Microcontroladores PIC16F877A

74

Se (<condio 1>) ento [Bloco_verdadeiro 1] Seno Se (<condio 2>) ento [Bloco_verdadeiro 2] Seno Se (<condio 3>) ento [Bloco_verdadeiro 3] Seno ... Se (<condio n>) ento [Bloco_verdadeiro n] Seno [Bloco Falso] Fim_Se ... Fim_Se Fim_Se Fim_se

V
Bloco Verdadeiro

Condio 1

V
Bloco Verdadeiro

Condio 2

V
Bloco Verdadeiro

Condio 3

F
Bloco Falso

Uma estrutura Se-Seno-Se em Assembly implementada facilmente utilizando-se as tcnicas j apresentas para a estrutura Se-Seno. Contudo, deve-se dar especial ateno para o fato de o destino final de todos os blocos o mesmo, para que no se perca a estruturao do cdigo. Abaixo apresentado um exemplo da utilizao da estrutura Se-Seno-Se para controle de temperatura e umidade.

Exsto Tecnologia

Microcontroladores PIC16F877A

75

CBLOCK 20h TEMP UMIDADE ENDC ORG TEST_TEMP: MOVLW SUBWF SKPC GOTO CALL GOTO TEST_2: MOVLW SUBWF SKPC GOTO CALL GOTO TEST_3: MOVLW SUBLW SKPNC GOTO CALL GOTO DEFAULT: CALL FIM_SE: GOTO ESFRIA: NOP RETURN ALARME: NOP RETURN MOLHA: NOP RETURN VENTILAR: NOP RETURN END 0000H ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 1o. teste W <-- 30 W <-- TEMP - W Se (TEMP < 30) ento vai para o prximo teste Se (TEMP > 30) ento executa a sub-rotina vai para Fim_Se 2o. teste W <-- 80 W <-- UMIDADE - W Se (UMIDADE < 80) ento vai para o prximo teste Se (UMIDADE > 80) ento executa a sub-rotina vai para Fim_Se 3o. teste w <-- 20 W <-- UMIDADE - W Se (UMIDADE > 20) ento vai para a exceo Se (UMIDADE < 20) ento executa a sub-rotina vai para Fim_Se tratamento de exceo

.30 TEMP,W TEST_2 ESFRIA FIM_SE .80 UMIDADE,W TEST_3 ALARME FIM_SE .20 UMIDADE DEFAULT MOLHA FIM_SE VENTILAR TESTE_TEMP

; todos os blocos convergem para c ; repete todos os testes ; Rotina para esfriar alguma coisa

; Rotina que dispara o alarme

; Rotina que molha alguma coisa

; Rotina que ventila alguma coisa

3.11 Caso
A estrutura Caso (Case ou Switch) uma estrutura de admite mltiplas condies de igualdade, com um bloco verdade para cada condio. Existe tambm a possibilidade de um bloco de exceo para tratar os casos que no se enquadram em nenhuma condio. Dessa forma temos:

Exsto Tecnologia

Microcontroladores PIC16F877A

76

Caso <Varivel> de <Opo 1>: <Opo 2>: <Opo 3>: ... <Opo n>: [Bloco_n] [Bloco_1] [Bloco_2] [Bloco_3]

Seno: [Bloco_exceo] Fim_caso A estrutura Caso apresentada em fluxograma similar a estrutura Se-Seno-Se, porm as condies devem ser somente igualdades de uma mesma varivel. Usando essa estrutura em Assembly pode-se construir tabelas, que so de grande utilidade em muitos casos. Elas so de grande ajuda no trabalho com displays de segmentos e na linearizao de medidas analgicas provenientes de sensores no lineares. Uma tabela de software comporta-se como uma tabela no papel, onde a partir de um valor de entrada obtemos um valor de sada associado a ele. Como exemplo podemos implementar uma tabela que retorne uma letra do alfabeto a partir do valor de sua posio ou uma tabela que retorne o quadrado do valor de entrada. Para construo de tabelas utilizada a instruo RETLW (Retorna com uma constante em W). Primeiramente feito um desvio por software, somando-se o valor de uma varivel ao Registro PCL (bits menos significativos do PC (Program Counter)). Dessa forma a prxima instruo a ser executada a n-sima instruo aps a soma, sendo n o valor contido na varivel. Algumas regras devem ser observadas na construo de tabelas. Primeiramente deve-se estar atento ao banco onde se encontra a tabela. recomendado que se faa uma tabela no incio de um bloco de 256 endereos (0000h, 0100h, 0200h, etc.), pois caso a operao de soma com o PCL der overflow, isto , resultar em um valor maior que 256 o PCLATH no ser incrementado automaticamente, o que limita o tamanho da tabela em 256 valores. Alm disso, um overflow em PCL causado por uma instruo de soma no ocasiona automaticamente o incremento de PCH (bits mais significativos do PC). Dessa forma no se pode fazer tabelas com comprimento maior que 256 itens sem um tratamento especial, supondo que nesse caso a tabela comece no primeiro endereo de cada bloco de 256 endereos. A linha
ADDWF PCL,F ; (PCL) (PCL) + (W)

soma um valor n com o PC, o que resulta em a prxima instruo executada ser n-sima aps a soma. Ou seja, a instruo a ser executada est no n-simo endereo a partir do endereo seguinte a instruo ADDWF. Esse processo chamado desvio por software.

Exsto Tecnologia

Microcontroladores PIC16F877A

77

A rotina abaixo, que converte valores em BCD para a palavra de ativao dos respectivos caracteres e um display de LEDs ligado a um portal. A sub-rotina chamada SEGMENTOS; dentro dela feito um desvio para o label TABLE e o retorno realizado por uma das instrues RETLW. O endereo de TABLE tal que o primeiro valor da tabela ocupa a posio 700h. Admite-se que a varivel NUMERO no contm valores maiores que 9. O registro PCLATH carregado com 07h porque esse o valor da parte mais significativa das linhas tabela (como pode ser observado a direita) e o endereo para onde se desvia dado pelo par PCLATH e PCL
SEGMENTOS: MOVFW GOTO ; . . . ORG TABELA: MOVLW MOVWF ADDWF PCL,F

NUMERO TABELA 06FDH 07H PCLATH

; move o nmero a ser convertido para W ; desvia para a tabela ; o cdigo abaixo comea no endereo 6FDh ; ajusta os bits mais significativos (06FDh) ; de PCH (06FEh) ; (PCL) (PCL) + (W) (06FFh) ; ;0 ;1 ;2 ;3 ;4 ;5 ;6 ;7 ;8 ;9 ;A ;B ;C ;D ;E ;F ABCDEFG 1111110 0110000 1101101 1111001 0110011 1011011 1011111 1110000 1111111 1111011 1110111 0011111 1001110 0111101 1001111 1000111

RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW

01110111B 00000110B 10110011B 10010111B 11000110B 11010101B 11110101B 00000111B 11110111B 11010111B 11100111B 11110100B 01110001B 10110110B 11110001B 11100001B

(0700h) (0701h) (0702h) (0703h) (0704h) (0705h) (0706h) (0707h) (0708h) (0709h) (070Ah) (070Bh) (070Ch) (070Dh) (070Eh) (070Fh)

3.12 Estruturas de repetio


Estruturas de repetio so estruturas que permitem que trechos do programa sejam repetidos vrias vezes. Elas so implementadas com instrues de deciso associadas a desvios, desvios esses que levam a execuo de blocos e depois retornam ao teste que as originou. Na grande maioria dos casos, os programas para microcontroladores ficam repetindo a mesma seqncia de instrues indefinidamente ou, pelo menos, checando entradas indefinidamente. Como pode ser observado nos programas desenvolvidos at o momento, todo programa tem como ncleo uma estrutura de repetio infinita, chamado normalmente de lao principal, loop principal ou main loop. Existem trs tipos de estruturas de desciso: Faa-Enquanto, Enquanto e Para. Essa estruturas de repetio so implementadas em linguagens de mdio e alto nvel por comando como While, DoWhile e For, respectivamente.

Exsto Tecnologia

Microcontroladores PIC16F877A

78

3.12.1

Faa-Enquanto

Faa-Enquanto (Do-While): estrutura de repetio que executa um bloco enquanto uma determinada condio verdadeira. A apresentao dessa estrutura em portugus estruturado e fluxograma segue abaixo.

Faa

[Bloco]

Bloco

Enquanto (<Condio>)

Cond? F

Abaixo apresentado um trecho de cdigo implementando uma estrutura Faa-enquanto.


LOOP: INCF MOVWF CALL MOVFW SUBLW BTFSC GOTO ... CONTROL,W PORTB MEDIDA MED 40h STATUS,C LOOP ; ; \ ; > Bloco ; /

; (W) 40h (W) ; se((MED) < 40h) ento sai do loop ; seno retorna ao inicio loop ; Quando sai do loop segue a partir daqui

3.12.2

Enquanto

Enquanto (While): estrutura de repetio semelhante a condio Faa-Enquanto, porm difere em um ponto muito importante: enquanto um Faa-Enquanto executa o bloco primeiro e testa a condio depois a estrutura Enquanto testa a condio primeiro e executa o bloco depois. Essa diferena pode mudar totalmente a lgica do programa. A apresentao da estrutura abaixo deixa clara essa diferena.

Enquanto (<Condio>) F Cond? Fim_Enquanto V


Bloco

[Bloco]

Exsto Tecnologia

Microcontroladores PIC16F877A

79

O trecho de cdigo abaixo exemplifica a utilizao de uma estrutura Enquanto.

LOOP: CALL SUBLW BTFSS GOTO INCF MOVWF MOVFW GOTO CONTINUA: . . . MEDIDA 40h STATUS,C CONTINUA ; CONTROL,W PORTB MED LOOP ; \ ; > Bloco ; / ; ; ; ; realiza uma medida (W) 40h (W) s saiquando (MED) < 40h sai do loop

3.12.3

Para

Para (For): estrutura de repetio que tem uma caracterstica que a torna diferente da estruturas de repetio at agora estudadas: nas estruturas Enquanto e Faa-Enquanto a condio da estrutura uma condio aleatria, isto , ela no depende da estrutura de repetio; isso significa que o nmero de vezes que o bloco repetido no conhecido a priori. Na estrutura Para a condio est intimamente ligada a estrutura e seu estado alterado por esta. De fato, a estrutura Para serve para que blocos de cdigo sejam repetidos um nmero de vezes conhecido, o que implica na existncia de uma varivel contadora associada estrutura. Deve-se notar ento que para essa estrutura a varivel contadora no deve ter seu valor alterado pelo bloco de instrues, somente pela estrutura de repetio em si. Para <contador> = <valor_inicial> at <valor_final> faa

[Bloco]

Fim_Para
<contador> <valor inicial>

Bloco

Passo V F

<contador> = <valor final> ?

A estrutura funciona da seguinte maneira: (1) primeiramente a varivel contadora recebe o valor inicial. (2) O programa entra no loop propriamente dito, o bloco executado e (3) a instruo que dar o passo contagem das vezes que o loop executada. (4) Em seguida testado se a varivel

Exsto Tecnologia

Microcontroladores PIC16F877A

80

contadora atingiu o valor final. Se o atingiu, o programa sai do loop e segue; seno o processo repetido novamente a partir do ponto (2). O passo como a varivel contadora varia a cada execuo do loop. Apesar de poder assumir qualquer forma (por exemplo, a cada execuo do loop o contador pode ser elevado ao quadrado) normalmente o passo ou um incremento (contador contador + 1) ou um decremento (contador contador - 1). Pelo exposto acima, o bloco contido na estrutura ser repetido N vezes, N dado por: N = <valor final> - <valor inicial> Ou N = <valor inicial> - <valor final> , quando for usado decremento. , quando for usado incremento

Para a implementao de uma estrutura Para em Assembly so usadas as instrues DECFSZ e INCFSZ:
DECFSZ INCFSZ CONT,F ; CONT CONT 1 ; se (CONT = 0) salta a prxima instruo CONT,F ; CONT CONT + 1 ; se (CONT = 0) salta a prxima instruo ; obs: saltar a prxima instruo signifi ; ca no executar a instruo seguinte a ; a DECFSZ ou INCFSZ

Para o caso de INCFSZ, o valor do contador ser igual a zero quando for somado 1 ao valor 255. Se INCFSZ for usado, o valor final obrigatoriamente ser 256, ento o valor inicial deve ser calculado subtraindo a quantidade de vezes que o loop deve ser executado de 256. Por exemplo, para N = 12, o valor inicial deve ser 256 - 12 = 244. Quando usada a instruo DECFSZ o valor final obrigatoriamente ser 0. Dessa forma, o valor inicial ser o nmero de vezes que o bloco deve se repetir. A contagem nesse caso regressiva, isto , o passo de decremento. O cdigo abaixo apresenta um loop que ser repetido 123 vezes.
. . . MOVLW MOVWF LOOP: CALL DECFSZ GOTO . . . TX_SERIAL CONT,F LOOP

.123 CONT

; o . (ponto) indica que o valor decimal ; (1) (CONT) 123 ; (2) o bloco ser executado 123 vezes ; bloco a ser repetido ;(3)e(4) CONT <-CONT-1, se (CONT=0) salta ; seno volta para LOOP

3.13 Temporizao por software Rotinas de atraso


O microcontrolador executa cada instruo em um determinado tempo. No caso do PIC esse tempo quatro vezes o perodo do clock (existem instrues de 2 ciclos, que demoram o dobro das instrues normais). Por exemplo, com cristal de 4MHz tem-se um perodo de 250ns e logo cada instruo demora 1s para ser executada.

Exsto Tecnologia

Microcontroladores PIC16F877A

81

Porm muitas vezes no se deseja que uma instruo seja executada imediatamente aps outra. Em muitas situaes necessitamos de gerar atrasos na execuo normal do programa. Por exemplo, em muitos casos onde um usurio interage com o microcontrolador, necessrio esperar o usurio; em muitas situaes tambm preciso respeitar a temporizao de outros componentes, no to rpidos quanto o microcontrolador. Esses atrasos so conseguidos com as chamadas sub-rotinas de atraso, ou de delay (atraso, em ingls), como mais comum cham-las. Existem basicamente dois modos de se conseguir delay. Um seria utilizando o Timer incorporado ao microcontrolador, trabalhando ento com temporizao por interrupo, a qual ser tratada mais adiante. Outra forma criando estruturas de repetio nas quais possamos perder o tempo necessrio, que a temporizao por software. Ainda considerando o PIC trabalhando a 1 MIPS (1 Milho de Instrues Por Segundo) quando necessrio um atraso de 10s basta executarmos 10 vezes uma instruo qualquer. Porm, aplicando o mesmo raciocnio para um atraso de 3s necessrio repetir a mesma instruo 3.000.000 vezes, o que ocupa 3.000.000 endereos da memria de programa! Como pode ser notada, na maior parte das vezes no podemos criar delays com a simples seqncia do nmero de instrues necessrio. O que se faz a criar estruturas de repetio que executem um ou algumas instrues o nmero de vezes necessrio para nos dar o atraso desejado. Repetir um bloco de 4 instrues 50 vezes equivale (do ponto de vista do tempo gasto) a executar 200 instrues. Deve-se tomar cuidado, porm, com o fato de que a estrutura de repetio tambm demora um tempo para ser executada. Para atrasos precisos devemos considerar o tempo de execuo das estruturas, principalmente quando temos laos de repetio dentro de outros laos de repetio. O ncleo de uma rotina de delay estrutura de repetio Para responsvel por repetir um bloco de instrues um determinado nmero de vezes. Observemos o trecho de cdigo abaixo. Os comentrios em cada linha indicam quantos ciclos de mquina so executados em cada instruo (Devemos lembrar que instrues de desvio e instrues de teste, quanto a condio testada verdadeira, gastam 2 ciclos de mquina).
MOVLW MOVWF LOOP1: NOP DECFSZ GOTO n CONT1 ; 1 ; 1

CONT1,F LOOP1

; 1 ; 1 normalmente, 2 quando CONT1 == 0 | Bloco ; 2

No cdigo acima, n ser substitudo por uma constante que, como veremos mais a seguir, dar o tempo de execuo do cdigo. O bloco ser repetido at que CONT1, que decrementado a cada execuo, resulte em 0. Ou seja, o bloco ser repetido n vezes. Como a execuo do bloco leva 4 ciclos de mquina, o tempo total gasto na repetio do bloco 4 x n. J o tempo total de execuo da rotina do trecho de cdigo deve levar em considerao o tempo gasto para carregar a varivel CONT1, que de 2 ciclos de mquina. Portanto, podemos concluir que o tempo total de execuo desse trecho de cdigo dado pela equao (1) , sendo TCY o tempo do ciclo de mquina do microcontrolador (que estamos considerando como sendo de 1s):

Exsto Tecnologia

Microcontroladores PIC16F877A

82

T = ( 4 n + 2) TCY

(1)

Supondo que necessitamos desse atraso em mais de um ponto de um ponto do programa, poderamos transformar o trecho de cdigo acima em uma sub-rotina. Fazendo isso devemos considerar o tempo gasto pela instruo CALL que chama a sub-rotina (2 ciclos de mquina) e o tempo da instruo RETURN que retorna da sub-rotina (2 ciclos de mquina). Assim, temos a subrotina abaixo, cujo tempo de execuo dado pela equao (2).
DELAY: ; rotina de atraso ; entrada: nulo ; sada: nulo MOVLW n MOVWF CONT1 LOOP1: NOP DECFSZ GOTO

; 1 ; 1

; 1 \ CONT1,F ; 1 normalmente, 2 quando CONT1 == 0 | Bloco LOOP1 ; 2

RETURN

T = ( 4 n + 6) TCY

(2)

Para determinar o valor da constante n basta isol-la na equao (2) e obtemos a equao (3), lembrando sempre que n um valor inteiro entre 1 e 255.

n = 0,25 T T 6 CY

(3)

Devemos atentar para duas limitaes dessa sub-rotina. A primeira que no possvel obter um valor de n inteiro para qualquer valor de T. Por exemplo, para T = 31s temos n = 6,25. Nesse caso, se adotarmos n = 6 obtemos um tempo de 30s. Nessa situaes, porm, a diferena entre o valor desejado e o valor obtido ser sempre pequena, e podemos completar o tempo necessrio com a simples adio de um instruo NOP Outra limitao que o valor mximo de n 255, o que nos leva a um tempo mximo de 1,026 ms. Para obter tempos maiores que esse o procedimento considerar todo o cdigo da rotina como sendo um bloco, e inseri-lo dentro de outro loop. Observe como isso feito na sub-rotina baixo.
DELAY_MAIOR: ; rotina de atraso para tempos maiores que 1 ms ; entrada: nulo ; sada: nulo MOVLW m ; 1 MOVWF CONT2 ; 1 LOOP2: ; --- --- --- --- --- --- --- --- --- --- --MOVLW n ; 1 MOVWF CONT1 ; 1 LOOP1:

Exsto Tecnologia

Microcontroladores PIC16F877A

83

NOP ; 1 \ DECFSZ CONT1,F ; 1 normalmente, 2 quando CONT1 == 0 | Bloco GOTO LOOP1 ; 2 ; --- --- --- --- --- --- --- --- --- --- --DECFSZ CONT2,F ; 1 normalmente, 2 quando CONT2 == 0 GOTO LOOP2 ; 2 RETURN

O tempo total gasto para essa rotina determinado pela equao (4). A equao (5) permite calcular o valor de m arbitrando-se o valor de n.

T = [(4 n + 5) m + 6]TCY
6 TCY m= 4n + 5 T
Com essa rotina possvel se obter tempos de at 261,381 ms. Para tempos ainda maiores, basta usar o mesmo raciocnio: considerar a sub-rotina um bloco e coloc-la dentro de outro loop.

(4)

(5)

Exsto Tecnologia

Microcontroladores PIC16F877A

84

4 RECURSOS AVANADOS
4.1 Display de cristal Lquido
Grande parte das aplicaes com microcontroladores necessitam de uma interface homem-mquina, para que os usurios possam passar informaes ao sistema e/ou receber informaes dele. Para que informaes do sistema sejam passadas ao usurio pode-se utilizar uma serie de recursos, porm muitos deles no so nada maleveis e alguns pouco amigveis. Por exemplo, um modo bastante simples de se ter informaes do sistema atravs de um painel com LEDs, cada um indicando uma determinada situao. Embora em muitas aplicaes s isso seja suficiente, em muitas outras, principalmente quando a quantidade e variedade de informaes so grande, esse mtodo se torna insuficiente. Outro mtodo tambm muito utilizado e que, porm, aceita uma grande variedade e quantidade de informaes o Display de Cristal Lquido (LCD Liquid Cristal Display). Existe uma grande variedade de LCDs no mercado. Existem displays grficos e displays que aceitam somente caracteres, esses ltimos chamados displays alfanumricos. Esses podem ter diferentes quantidades de linha e colunas. LCDs alfanumricos tem uma determinada inteligncia, isto , possuem circuitos que controlam o display propriamente dito, e fazer com que algo seja escrito no LCD somente o trabalho de comunica-se com esses circuitos. Para a comunicao com o display so necessrios 8 bits como via de dados (podendo tambm ser configurado para trabalhar com 4 bits), um bit EN (Enable - Habilitao) e um bit RS (seleo entre dados e comandos). O display reconhece dois tipos de informao na via de dados: comandos e dados. Os comandos, que so reconhecidos quando RS = 0, so instrues para o display (limpar a tela, ir para a segunda linha, ir para a dcima coluna, etc... ); os dados so caracteres a serem escritos no display, e so indicados por RS = 1. A 4 bits da via de dados so ligados aos bits 4 a 7 do LCD. Abaixo apresentada uma tabela resumida de cdigos hexadecimais de comandos do LCD.

Exsto Tecnologia

Microcontroladores PIC16F877A

85

Descrio do Comando Controle do display Limpeza do Display com retorno do cursor Retorno do cursor 1a linha e da mensagem sua posio inicial Controle do Cursor

Modo Ativo (sem cusor) Inativo

RS 0 0 0 0

R/W 0 0 0 0

Cdigo do Comando (Hexadecimal) 0C 0A, 08 01 02

Sentido de deslocamento do cursor na entrada de um novo caracter

Ativo (ligado, fixo) Inativo Alternado Desloc. esquerda Desloc. direita Retorno Piscante Para esquerda Para direita

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0E 0C 0F 10 14 02 0D 04 06 07 05 18 1C 80 C0

Deslocamento da Para esquerda mensagem com a entrada Para direita de um novo caracter Deslocamento da mensagem sem entrada de novos caracteres Endereo da primeira posio ( esquerda) Para esquerda Para direita 1a Linha 2 Linha
a

Tabela 7.1 Comandos do LCD Os endereos de cada posio no display so dados pela tabela abaixo. Para que um caracter seja escrito em uma determinada posio, envia-se o valor dessa posio como comando e em seguida envia-se o caracter a ser escrito. 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF A figura 7.1 apresenta o circuito bsico LCD.

Exsto Tecnologia

Microcontroladores PIC16F877A

86

Figura 7.1 Esquema Bsico do Display A tabela seguinte apresenta a funo de cada um dos pinos do display e em como eles esto ligados ao PIC. Pino
1 2 3 4 5 6 7 8 9 10 11 12 13 14

Smbolo
Vss Vdd Vo RS R/W EN D0 D1 D2 D3 D4 D5 D6 D7

Funo
GND +5V Controle de contraste Seleo de modo Leitura/Escrita Habilitao

Ligao com o PIC


PORTE, 0 0 PORTE, 1 PORTD, 0 PORTD, 1 PORTD, 2 PORTD, 3 PORTD, 4 PORTD, 5 PORTD, 6 PORTD, 7

Via de Dados

Tabela 7.2 Conexo do LCD A comunicao com o display feita conforme os algoritmos descritos baixo,apresentados em forma de portugus estruturado: Comando: LCD_COMANDO (byte Comando) { RS Falso; PORTD Comando; Atraso de 50 us; EN Verdadeiro; Atraso de 50 us; EN Falso; Atraso de 50 us; }

// seleciona comando // bits mais significativos primeiro // espera 50 us // espera 50 us // espera 50 us

Exsto Tecnologia

Microcontroladores PIC16F877A

87

Dados: LCD_DADO (byte Dado) { RS Verdadeiro; // seleciona dado PORTD Comando; // bits mais significativos primeiro Atraso de 50 us; // espera 50 us EN Verdadeiro; Atraso de 50 us; // espera 50 us EN Falso; Atraso de 50 us; // espera 50 us } Dever ser criada uma funo que gere um atraso de aproximadamente 50 s. Enquanto EN estiver em 0 (Falso) qualquer mudana em RS ou na via de dados ignorada pelo display. Alm dessas duas sub-rotinas bsicas, deve-se criar tambm uma sub-rotina de inicializao do display, pois esse tambm necessita ser configurado. Essa sub-rotina ser chamada logo aps a inicializao do microcontrolador. Somente para a inicializao deve-se utilizar um atraso de 5ms na rotina de envio de comando. Uma seqncia de inicializao bsica apresentada abaixo. Comando 0x33: Configura o LCD para trabalha no modo 8 bits Comando 0x32: Configura o LCD para trabalha no modo 8 bits Comando 0x38: Configura o LCD para trabalha no modo 8 bits Comando 0x06: Deslocamento de cursor na entrada de novos caracteres ser para a direita; Comando 0x0C: O display est ativo Comando 0x01: Limpa a tela.

4.2 Teclado
Uma forma muito comum de usurio de um sistema microcontrolado passar informaes ao sistema atravs de teclas. Em muitas aplicaes o nmero teclas existentes pode ser bastante grande. Nesses casos, a leitura dessas teclas simplesmente conectando-as aos terminais do microcontrolador incorre na utilizao de muitos terminais. Nessa aplicao apresentado um sistema de varredura que permite fazer um uso otimizado dos terminais do microcontrolador de foram a reduzir o nmero de terminais utilizados. Para essa experincia ser feito uso do teclado do kit. Esse mdulo funciona implementando um sistema de varredura que nos permite realizar a leitura de um nmero de teclas N utilizando menos de N entradas. Isso importante quando existe uma grande quantidade de teclas a serem lidas e no se dispe tanta entrada. Para o caso da placa de teclado existem 16 teclas e seus estados so lidos com apenas 4 sadas e 4 entrada, num total de 8 terminais. A varredura funciona da seguinte maneira: o teclado organizado de forma a ter 4 colunas e 4 linhas, conforme a figura abaixo. Cada linha ligada a uma entrada, e cada coluna a uma sada. Existem resistores de pull-up nas entradas de forma que enquanto uma tecla no for pressionada, a entrada ficando em aberto tem nvel lgico alto. Comeando a varredura, forado 0 na coluna 0 (C0), 1 nas coluna 1 (C1), 2 (C2) e 3 (C3) e so lidas as quatro linhas (L0, L1, L2 e L3). Em seguida coloca-se 1 em C0 e C2 e 0 em C1 e lem-se as linhas, e assim Exsto Tecnologia

Microcontroladores PIC16F877A

88

sucessivamente.. Nos momentos em que feita a leitura das linhas podemos determinar se uma tecla est pressionada e qual essa tecla da seguinte maneira: admitindo que a tecla est ligada a coluna que est em zero no momento a linha ligada a ela estar em tambm. As linhas que contm teclas que no esto pressionadas estaro em 1, devido aos resistores de pull-up. Seguindo esse raciocnio podemos gerar a seguinte tabela: C3
1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0

C2
1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1

C1
1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1

C0
0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1

L3
1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0

L2
1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1

L1
1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1

L0
0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1

Tecla
1 2 3 A 4 5 6 B 7 8 9 C */F 0 #/E D

Tabela 7.3 Funcionamento do LCD O circuito do teclado apresentado na figura abaixo.

Figura 7.2 - Esquema Simplificado do Teclado

Exsto Tecnologia

Microcontroladores PIC16F877A

89

No programa que utilizar leitura de teclado deve-se ativar os resistores de pull-up do portal B. Caso contrrio, o teclado no funcionar corretamente. Isso feito zerando o bit NOT_RBPU do registro OPTION_REG, assim
BCF OPTION_REG, NOT_RBPU

O teclado est ligado ao PIC seguindo a tabela 7.4: Teclado C3 C2 C1 C0 L0 L1 L2 L3

PIC

I/O

PORTB,0 Sada PORTB,1 Sada PORTB,2 Sada PORTB,3 Sada PORTB,4 Entrada PORTB,5 Entrada PORTB,6 Entrada PORTB,7 Entrada Tabela 7.4 Conexes do teclado

4.3 Interrupes
Interrupes so poderosos recursos presentes nos sistemas computacionais, que permitem desenvolver cdigos mais elaborados e profissionais, garantindo tratamento imediato a eventos de maior prioridade. Suponhamos uma situao em que o microcontrolador realize medidas para mostr-las em um display. Entre cada processo de leitura de medidas, o microcontrolador aciona uma rotina para ler o estado de um boto, que quando acionado, seleciona a medida. Se o processo de leitura levar alguns segundos, corre-se o risco de pressionar o boto durante esse processo de forma que o microcontrolador no tome conhecimento deste pressionamento. O ideal que o processo de leitura fosse contnuo e que pudesse ser interrompido para executar a rotina referente ao acionamento do boto quando o mesmo fosse pressionado. Uma interrupo faz exatamente isso: interrompe a execuo normal do programa para executar tarefas de maior prioridade no momento. Ela pode ser chamada por determinados eventos, parando a execuo normal no momento em que ocorre o evento, executando o cdigo armazenado em uma posio de memria vinculada a interrupo e depois retornam a execuo normal do programa. As interrupes podem ser vistas como chamadas de sub-rotinas realizadas pelo hardware. Observe que a distncia entre o vetor de inicializao (0000h) e o vetor de reset (0004h) de apenas 4 endereos. Dessa forma quando as interrupes esto desabilitadas o PC passa por 0004h normalmente durante a execuo de um programa. Quando se faz necessrio o uso de interrupes, as rotinas de tratamento de interrupo so colocadas a partir do vetor de reset 0004h. No intervalo entre o vetor de inicializao e o vetor de reset colocado um desvio para um endereo aps as rotinas de interrupo a partir do qual o programa realmente comea. Quando ocorre um pedido de interrupo para a CPU do PIC16F877A, o programa desviado para um endereo pr-estabelecido, o vetor de reset (0004h). Desse endereo em diante feito o tratamento de interrupo, isto , so executadas as rotinas que se deseja associar ao evento causador da interrupo. Exsto Tecnologia

Microcontroladores PIC16F877A

90

O PIC 16F877A possui 15 fontes de interrupes: Interrupo do timer 0; Interrupo do timer 1; Interrupo do timer 2; Interrupo externa (RB0/INT); Interrupo por mudana de estado (bits 4 a 7 do portal B); Interrupo de transmisso serial; Interrupo de recepo serial; Interrupo do mdulo comparador analgico; Interrupo do mdulo CCP1; Interrupo do mdulo CCP2; Interrupo da memria EEPROM; Interrupo do conversor analgico para digital; Interrupo da porta paralela escrava; Interrupo da comunicao SPI; Interrupo por coliso no barramento I2C.

A cada interrupo so associados dois bits, para seu controle, sendo que um o bit de habilitao, alterado somente pelo programa, e o outro o flag indicador de interrupo, que setado quando ocorre a interrupo em questo. Esse ltimo bit pode, porm, ser alterado tambm pelo programa. A Figura 2.9 mostra a lgica como se relacionam as interrupes. Existem mais dois bits envolvidos no trabalho com interrupo, PEIE e GIE. PEIE habilita as interrupes dos perifricos. GIE, por sua vez, realiza a habilitao global. Como pode ser notado, se GIE estiver em 0 todas interrupes esto desabilitadas; se GIE estiver em 1 as interrupes que estiverem habilitadas geraro pedidos de interrupo CPU.

Figura 8.1 Lgica de Interrupes Exsto Tecnologia

Microcontroladores PIC16F877A

91

Ateno: Os flags das interrupes so setados quando ocorre um evento que geraria a interrupo, mesmo que essa interrupo no esteja habilitada. As interrupes externas, isto , que so causadas diretamente por eventos externos ao microcontrolador, so a interrupo INT em RB0 e a interrupo por mudana de estado do portal B. As demais interrupes so internas, ou seja, causadas pelos perifricos para indicar determinados eventos (chegada de dado pelo portal serial, "estouro" de timer, etc). Quando ocorre uma interrupo o endereo chamado (sempre) o vetor de interrupo (0004h). Conseqentemente, a rotina de tratamento de interrupo deve obrigatoriamente comear nesse endereo. Para a determinar qual interrupo ocorreu testa-se os bits de flags de todas as interrupes ativas. Pela ordem em que esses bits so testados pode-se atribuir a prioridade interrupo, sendo que as interrupes testadas em primeiro lugar tm prioridade maior. Ao contrrio de alguns microcontroladores, quando ocorre uma interrupo nenhum registro automaticamente salvo. Assim importante salvar os registros W e STATUS antes que seja realizado qualquer tratamento de interrupo, bem como qualquer outro SFR que for usado dentro e fora das rotinas de interrupo. Esse processo chamado salvamento de contexto. Tambm recomendvel que o registro STATUS seja zerado. necessrio ento que existam variveis criadas para salvar esses registros. Outra prtica recomendada de nunca usar dentro de uma rotina de tratamento de interrupo registros que so utilizados em outras partes do programa. Todo esse cuidado necessrio por que uma interrupo pode ocorrer a qualquer momento. Portanto, se durante a execuo de um trecho do programa um determinado endereo de memria (varivel do programa ou SFR) usado, e exatamente quando esse trecho execuatdo ocorre o pedido de interrupo que altera o valor do registro em questo, quando retornar a execuo do programa normal o valor do registro ter sido alterado. Um outro cuidado que deve ser tomado quando se trabalha com interrupes no executar rotinas muito grandes. Isso porque o tratamento de interrupo deve tomar medidas emergenciais. Nada que no seja estritamente necessrio deve ser trabalhado na interrupo, e isso principalmente porque podem ocorrer vrias interrupes em seguida, e s se pode tratar uma por vez. Quando uma interrupo chamada, a habilitao das demais fica desativada, e s reativada aps a execuo do RETFIE. Se outra interrupo ocorrer nesse intervalo de tempo, ela tratada aps RETFIE. Deve-se notar que o que ativa a chamada de interrupo a existncia de um flag setado de uma interrupo habilitada. Assim, depois de tratar uma determinada interrupo deve-se zerar o flag associado a ela. Caso contrrio, o programa fica travado, pois cada vez que h o retorno de interrupo (instruo RETFIE), a interrupo chamada novamente. Finalmente, necessrio considerar que na realidade o tratamento de interrupo no ocorre no exato momento em que a interrupo acontece. Primeiramente, a checagem dos eventos que causam a interrupo obedece a uma varredura interna. E depois de detectado o evento, algumas aes devem ser realizadas, como o desvio para o endereo 0004h, por exemplo. O tempo decorrido entre a ocorrncia real do evento que causa interrupo e incio de seu tratamento efetivo chamado de latncia da interrupo. Assim, aps a real ocorrncia de uma interrupo ela s vai comear a ser tratada 3 ciclos de mquina aps sua ocorrncia, se for uma interrupo interna, e de

Exsto Tecnologia

Microcontroladores PIC16F877A

92

3 a 3,75 ciclos de mquina se for uma interrupo externa. Esses tempos devem ser considerados em aplicaes onde a preciso de tempo importante.

4.3.1 Utilizao das Interrupes


Para trabalhar com uma interrupo deve-se primeiramente configurar o perifrico associado a ela, o que feito normalmente uma nica vez, na inicializao programa. Nada impede, porm que um perifrico seja configurado, ou re-configurado, em qualquer ponto programa. O prximo passo habilitar as interrupes a serem utilizadas, e isso pode ser feito em dois momentos. Pode-se determinar que uma interrupo esteja ativa durante toda a execuo do programa, e nesse caso sua habilitao deve ser feita na inicializao. Por outro lado, em algumas situaes deseja-se que a interrupo seja ativada somente a partir de um dado momento ou ainda que seja ativada e posteriormente desativada. Nessa situao basta habilitar, ou desabilitar, a interrupo no momento oportuno. importante lembrar que as interrupes habilitadas somente causam chamadas de interrupo se o bit de habilitao global (GIE) estiver habilitado. Finalmente, deve-se fazer o tratamento de interrupo, isto , construir as Rotinas de Tratamento de Interrupo (RTI) que sero chamadas quando ocorrerem as interrupes habilitadas. Essas rotinas devero seguir as recomendaes dadas acima e deve-se salvar os registros de interesse conforme exposto. Como para cada interrupo existe um flag que indica sua ocorrncia, para se determinar qual interrupo basta testar os flags das interrupes habilitadas e tratar a que ocorreu. Somente uma interrupo pode ser tratada por vez e enquanto uma interrupo tratada (intervalo que vai desde sua chamada at o retorno realizado pela interrupo RETFIE) no ocorre outra chamada. Isso porque quando uma interrupo chamada, automaticamente GIE zerado, s sendo setado novamente pela instruo RETFIE. Os pedidos de interrupo que porventura ocorram nesse intervalo no so descartados, visto que quando GIE volta a 1 e existe algum flag de interrupo habilitada tambm em 1 imediatamente o processo de tratamento de interrupo recomea e ser repetido at que todas as interrupes pendentes sejam tratadas. Os bits de habilitao das interrupes e respectivos flags, alm de GIE e PEIE encontram-se em quatro registros, apresentados abaixo. INTCON (presente em todos os bancos) Contm o controle das interrupes do timer 0, mudana de estado do portal B e a interrupo externa INT, o controle de interrupo de perifricos e o controle geral de interrupes. Os flags indicadores de interrupo devem ser zerados por software. Pode ser lido ou escrito.
R/W 0 GIE Bit 7 R/W 0 PEIE

R/W 0
T0IE

R/W 0 INTE

R/W 0 RBIE

R/W 0 T0IF

R/W 0 INTF

R/W x RBIF Bit 0

INTCON GIE: Habilitao global das interrupes o 1 = interrupes habilitadas Exsto Tecnologia

Microcontroladores PIC16F877A

93

o 0 = interrupes desabilitadas PEIE: Habilitao das interrupes de perifricos o 1 = interrupes de perifricos habilitadas o 0 = interrupes de perifricos desabilitadas T0IE: Interrupo do timer 0 (por overflow) o 1 = interrupo habilitada o 0 = interrupo desabilitada INTE: Interrupo RB0/INT o 1 = interrupo habilitada o 0 = interrupo desabilitada RBIE: Interrupo por mudana de estado no portal B o 1 = interrupo habilitada o 0 = interrupo desabilitada T0IF: flag da interrupo do timer 0 o 1 = ocorreu overflow de timer 0 o 0 = no ocorreu overflow de timer 0 INTF: flag da interrupo INT o 1 = ocorreu interrupo externa o 0 = no ocorreu interrupo externa RBIF: flag da interrupo por mudana de estado no portal B o 1 = pelo menos um dos bits RB4~RB7 mudou o 0 = nenhum dos bits RB4~RB7 mudou PIE1 (Banco 1) Contm bits de habilitao de interrupes de perifricos. Essas interrupes s ocasionam chamada se PEIE estiver em 1.
R/W 0 PSPIE Bit 7 R/W 0 ADIE

R/W 0
RCIE

R/W 0 TXIE

R/W 0 SSPIE

R/W 0 CCP1IE

R/W 0 TMR2IE

R/W 0 TMR1IE Bit 0

PIE1 EEIE: Interrupo de operao de escrita na EEPROM o 1 = interrupo habilitada o 0 = interrupo desabilitada CMIE: Interrupo do mdulo comparador analgico o 1 = interrupo habilitada o 0 = interrupo desabilitada RCIE: Interrupo de recepo da USART o 1 = interrupo habilitada o 0 = interrupo desabilitada TXIE: Interrupo de transmisso da USART o 1 = interrupo habilitada o 0 = interrupo desabilitada CCP1IE: Interrupo do CCP1 o 1 = interrupo habilitada o 0 = interrupo desabilitada TMR2IE: Interrupo do Timer 2 o 1 = interrupo habilitada o 0 = interrupo desabilitada TMR1IE: Interrupo do Timer 1 Exsto Tecnologia

Microcontroladores PIC16F877A

94

o o PIR1 (Banco 0)

1 = interrupo habilitada 0 = interrupo desabilitada

Contm flags das interrupes de perifricos.

R/W 0 EEIF Bit 7

R/W 0 CMIF

R/W 0
RCIF

R/W 0 TXIF

U0 -

R/W 0 CCP1IF

R/W 0 TMR2IF

R/W 0 TMR1IF Bit 0

PIR1 EEIE: Flag de operao de escrita na EEPROM o 1 = operao de escrita completa o 0 = operao de escrita incompleta ou no iniciada CMIF: Flag do mdulo comparador analgico o 1 = houve mudana no estado das sada dos comparadores o 0 = no houve mudana no estado das sada dos comparadores RCIF: Interrupo de recepo da USART o 1 = o buffer de recepo est cheio o 0 = o buffer de recepo est vazio TXIF: Interrupo de transmisso da USART o 1 = o buffer de recepo est vazio o 0 = o buffer de recepo est cheio CCPIF Flag do CCP1 o Modo Captura 1 = ocorreu a captura do registro TMR1 0 = no ocorreu a captura do registro TMR1 o Modo Comparador 1 = ocorreu uma comparao de igualdade com TMR1 0 = no ocorreu uma comparao de igualdade com TMR1 o Modo PWM No utilizado TMR2IF: Flag de igualdade entre PR2 e TMR 2 o 1 = ocorreu igualdade entre PR2 e TMR2 o 0 = interrupo desabilitada TMR1IF : Flag de overflow de Timer 1 o 1 = ocorreu overflow de TMR1 o 0 = no ocorreu overflow de TMR1 PIE2 (Banco 1) Contm bits de habilitao de interrupes de perifricos. Essas interrupes s ocasionam chamada se PEIE estiver em 1.

R/W 0 Bit 7

R/W 0 CMIE

R/W 0
-

R/W 0 EEIE

R/W 0 BCLIE

R/W 0 -

R/W 0 -

R/W 0 CCP2IE Bit 0

PIE1 Exsto Tecnologia

Microcontroladores PIC16F877A

95

CMIE: Interrupo do mdulo comparador analgico o 1 = interrupo habilitada o 0 = interrupo desabilitada EEIE: Interrupo de escrita na EEPROM o 1 = interrupo habilitada o 0 = interrupo desabilitada BCLIE: Interrupo de coliso no barramento I2C o 1 = interrupo habilitada o 0 = interrupo desabilitada CCP2IE: Interrupo do CCP2 o 1 = interrupo habilitada o 0 = interrupo desabilitada PIR2 (Banco 0) Contm flags das interrupes de perifricos.

R/W 0 Bit 7

R/W 0 CMIF

R/W 0
-

R/W 0 EEIF

U0 BCLIF

R/W 0 -

R/W 0 -

R/W 0 CCP2IF Bit 0

PIR1 CMIF: Flag do mdulo comparador analgico o 1 = houve mudana no estado das sada dos comparadores o 0 = no houve mudana no estado das sada dos comparadores EEIF: Flag de operao de escrita na EEPROM o 1 = operao de escrita completa o 0 = operao de escrita incompleta ou no iniciada BCLIE: Flag de coliso no barramento I2C o 1 = ocorreu uma coliso no barramento I2C (estando o mdulo SSP configurado no modo I2C Master) o 0 = no ocorreu uma coliso no barramento I2C CCPIF Flag do CCP1 o Modo Captura 1 = ocorreu a captura do registro TMR1 0 = no ocorreu a captura do registro TMR1 o Modo Comparador 1 = ocorreu uma comparao de igualdade com TMR1 0 = no ocorreu uma comparao de igualdade com TMR1 o Modo PWM No utilizado O trecho de cdigo abaixo trata salvamento de contextos e pode ser utilizado como base para rotinas de tratamento de interrupo.
; Definio das variveis para salvamento CBLOCK 20h INT_W INT_STATUS INT_FSR ENDC ... ; Tratamento de interrupo org 0004H ; Vetor de interrupo

Exsto Tecnologia

Microcontroladores PIC16F877A

96

MOVWF MOVFW MOVWF CLRF MOVFW MOVWF

INT_W STATUS INT_STATUS STATUS FSR INT_FSR

; ; ; ; ; ;

salva W em INT_W \ > salva STATUS em INT_STATUS zera STATUS \ > salva FSR em INT_FSR

; \ ; > tratamento das interrupes ; / MOVFW MOVWF MOVFW MOVWF MOVFW INT_STATUS STATUS INT_FSR FSR INT_W ; \ ; > recupera STATUS ; \ ; > recupera FSR ; recupera W ; retorno de interrupo

RETFIE

4.3.2 Interrupo externa em RB0


Das duas interrupes que so acionadas diretamente por elementos externos ao microcontrolador, a primeira que ser estudada chamada simplesmente de INT e multiplexada com o bit 0 do portal B. Essa interrupo destina-se a ser usada para a chamadas de interrupes provenientes das diversas partes do circuito. Quando existem vrias fontes de interrupo deve-se montar uma lgica externa, de forma a fazer uma operao OU entre todas as fontes de interrupo com uma nica sada ligada a INT. A interrupo ocorre na mudana de estado lgico no terminal PORTB,0. Isto significa que no um determinado estado lgico (0 ou 1) que causa a chamada da interrupo; o flag que indica a interrupo INT (o bit INTF do registro INTCON) no uma cpia do estado de RB0. A interrupo pode ser configurada para disparar na transio de subida (0 para 1) ou decida (1 para 0). Isso feito configurando o bit INTEDG de OPTION_REG conforme mostrado abaixo. INTEDG = 0 : transio de descida INTEDG = 1 : transio de subida A habilitao da interrupo INT feita setando o bit INTE de INTCON. O bit de habilitao global das interrupes, GIE de INTCON, tambm deve ser setado. Da mesma forma que a interrupo por mudana de estado, INT pode tirar o processador do modo SLEEP.

4.3.3 Interrupo por mudana no portal B


Outra interrupo externa existente no microcontrolador a interrupo por mudana na porta B. Essa interrupo chamada toda vez que ocorre uma mudana (seja ela qual for) nos bits 4, 5, 6 e 7 do portal B. Essa interrupo pode ser utilizada da mesma maneira que a interrupo INT, com a limitao de que a interrupo ir ocorrer toda vez que acontecer uma transio de alto para baixo ou de baixo para alto em algum pino. Outra possibilidade de uso da interrupo por mudana de estado no portal B em conjunto com teclados matriciais. O teclado do kit, conforme estudado, tem suas linhas conectadas aos pinos do portal B associados interrupo. Dessa forma, quando uma tecla pressionada ocorre uma chamada de interrupo, bastando para isso apenas que as colunas do teclado estejam todas em nvel lgico baixo. Dentro da rotina de tratamento de interrupo pode-

Exsto Tecnologia

Microcontroladores PIC16F877A

97

se executar a rotina de leitura do teclado, identificando a tecla lida e retornando as colunas a nvel lgico baixo. Esse funcionamento bastante til em sistema que ficam muito tempo ociosos. Nesses casos possvel colocar o microcontrolador em modo de baixo consumo e acorda-lo somente quando uma tecla for pressionada, num processo parecido ao utilizado em celulares.

Exsto Tecnologia

Microcontroladores PIC16F877A

98

5 PERIFRICOS DO PIC16F877A
5.1 Timers
Um dos perifricos mais comuns em qualquer linha de microcontroladores Timer/Couter Temporizador/ Contador. Trata-se de nada mais, nada a menos, que um componente contador dentro do microcontrolador. Se atuar fazendo contagem de eventos externos, aleatrios, dito no modo contador (Counter). Se o evento que causa a contagem for um sinal peridico de freqncia conhecida, gerado dentro ou fora do microcontrolador, dito no modo temporizador (timer). O PIC16F877A possui trs timers: timer 0, Timer 1 e Timer 2. A operao dos trs bastante semelhante, bastando estudar apenas um (no caso o Timer 1) para se estar habilitado a trabalhar com os outros dois.

5.1.1 Timer 1
O Timer 1 um temporizador/contador (timer/counter) de 16 bits. O sinal de clock pode ser selecionado como interno ou externo. Caso seja usada a fonte de clock interna, o sinal ser o do clock de perifricos, que corresponde freqncia do oscilador dividida por 4. No caso kit, que utiliza um cristal de 4MHz, trata-se de um sinal com perodo de 1 microssegundo. J no caso de sinal de clock externo, o sinal deve ser aplicado ao terminal RC0. Quando se utiliza fonte de clock externo possvel selecionar em qual transio (subida ou descida) o timer incrementa. Existem ainda uma interrupo no overflow do timer e uma pr-escala programvel que permite dividir a freqncia do sinal de clock at por 8. A figura 9.1 apresenta o diagrama eltrico simplificado do timer 1. O contador propriamente dito composto pelo par de registros TMR1H e TMR1L. Quando ocorre o overflow desse timer o flag TMR1IF setado, podendo ocasionar uma interrupo. Para economia de energia o timer pode ser desabilitado atravs do bit TMR1ON, que inibe os pulsos de clock para o timer. O sinal de clock, caso seja externo, pode ser sincronizado ou no com o clock interno; essa escolha feita atravs do bit T1SYNC. A pr-escala permite dividir a freqncia do sinal de clock por 1, 2, 4 ou 8. Atravs do bit TMR1CS seleciona-se se a fonte de clock interna ou externa. Sendo externo, o clock pode ser gerado por qualquer circuito conectado a RC0 ou por um oscilador prprio do timer, que ativado por T1OSCEN. Esse oscilador permite colocar um cristal (tipicamente de 32.768 Hz) entre RC0 e RC1, e que pode operar quando o microcontrolador estiver em SLEEP, ou seja, com o oscilador principal desligado.

Exsto Tecnologia

Microcontroladores PIC16F877A

99

Figura 9.1 Diagrama em blocos do Timer 1 O registro para controle do timer chamado T1CON, detalhado abaixo.
U0 Bit 7 U0 -

R/W 0
T1CKPS1

R/W 0 T1CKPS0

R/W 0 T1OSCEN

R/W 0 T1SYNC

R/W 0 TMR1CS

R/W 0 TMR1ON Bit 0

T1CON T1CKPS1: T1CKPS0: seleo da taxa de diviso da pr-escala (tabela 18.4). T1OSCEN: Controle do oscilador do Timer 1 o 1 = oscilador ligado o 0 = oscilador desligado T1SYNC: Controle de sincronismo de sinal de clock externo o Se TMR1CS = 1 1 = modo assncrono 0 = modo sncrono o Se TMR1CS = 0 Esse bit irrelevante TMR1CS: seleo de fonte de clock o 1 = Clock externo no terminal RB6/T1CKI (transio de subida) o 0 = Clock de perifricos interno (Fosc/4) TMR1ON: habilitao do Timer 1 o 1 = timer ligado o 0 = timer desligado

A pr-escala do timer 1 permite a seleo de 4 fatores de diviso, atravs do bits T1CKPS1 e T1CKPS0, conforme mostrado na tabela 9.1. Valor Taxa de diviso T1CKPS1 T1CKPS0 0 0 1:1 0 1 1:2 1 0 1:4 1 1 1:8 Tabela 9.1 Pr-escala do timer 1 Exsto Tecnologia

Microcontroladores PIC16F877A

100

H tambm o bit TMR1ON, que permite desligar todo o timer 1 quando este no for usado, reduzindo assim o consumo de energia. Ele tambm pode ser utilizado para parar o timer em algumas situaes que trataremos mais adiante. O timer 1 tem trs modos de operao: temporizador contador o sncrono o assncrono No modo temporizador, o sinal de clock utilizado o clock de perifrico (TMR1CS = 0). Nesse caso, seu funcionamento bem semelhante ao do timer 0, porm realizando contagens de 0000h FFFFh (16 bits), alm da pr-escala. O modo contador, por sua vez, utiliza como fonte de clock o sinal aplicado ao terminal RB6. O timer incrementado a cada transio de subida nesse pino. Podemos trabalhar no modo sncrono ou assncrono. A seleo de modo feita pelo bit T1SYNC, sendo que 0 indica modo sncrono e 1 modo assncrono. No modo sncrono o sinal de clock amostrado duas vezes a cada ciclo de instruo. Se a taxa de diviso do pr-escala for 1, significa que o sinal de entrada aplicado diretamente ao circuito de sincronismo. Nestas condies, o sinal aplicado deve ter tempos em alto e em baixo de no mnimo 2 ciclos de instruo mais 20 ns. Por outro lado, se o valor da pr-escala for diferente de 1, os tempos mnimo de alto e baixo so de 10 ns e o perodo mnimo depende do fator de diviso, conforme mostrado na tabela 9.4. Como o modo sncrono depende do sinal de clock, se o microcontrolador for colocado em modo SLEEP (baixo consumo) o timer para de funcionar. No modo assncrono, o contador trabalha de forma completamente independente do clock do microcontrolador. Essa configurao pode ser utilizada no modo SLEEP, inclusive podendo acionar a interrupo, fazendo o microcontrolador sair do modo de baixo consumo. Nesse modo, os tempos mnimos em alto e em baixo so de 30ns e o perodo mnimo de 60ns, com ou sem pr escala. A tabela 9.2 resume os limites de operao do timer 1 nos vrios modos. Parmetro Largura de pulso (alto e baixo) Condio Sncrono Sem pr-escala Sncrono Com pr-escala Assncrono Sncrono. N o fator da pr-escala. Sem pr-escala, N 1. Valor mnimo Unidade ns ns ns ns ns

0,5TCY + 20
15 30

Perodo

TCY + 40 N

Assncrono 60 Tabela 9.2 Requisitos mnimos para o timer 1

Novamente devemos tomar cuidados contra bouncing quando a fonte do sinal de contagem for mecnica.

Exsto Tecnologia

Microcontroladores PIC16F877A

101

5.1.2 Oscilador do timer 1


O timer 1 foi equipado com um circuito oscilador prprio, que nos permite ligar um cristal entre pinos RC0 e RC1, para gerar uma base de tempo independente do clock do microcontrolador. A principal funo dessa caracterstica implementar um relgio de tempo real. Tanto que esse oscilador foi desenvolvido para trabalhar com um cristal de 32.768 Hz. Esse valor exatamente 215. Dessa forma podemos gerar uma interrupo a cada segundo, carregando o valor inicial de 32768 (8000h) nos registros do timer ou utilizando o mdulo CCP do modo de comparao. Esse oscilador pode operar durante o modo SLEEP, podendo ser usado para despertar o microcontrolador periodicamente. Alm do cristal 32.768 Hz so necessrios dois capacitores de 15pF dos terminais do cristal a terra. Para ativar o oscilador, o bit T1OSCEN deve ser setado. Quando isso ocorre, os pinos RC0 E RC1 deixam de trabalhar como I/O e seus estados no PORTB ficam irrelevantes.

5.1.3 Interrupo
O bit de habilitao da interrupo do timer o TMR1IE do registro PIE1. O bit indicador de overflow do timer TMR1IF de PIR1.

5.2 Mdulo CCP


No PIC16F877A existem dois mdulos CCP, chamados CCP1 e CCP2. Aqui ser tratado o CCP1, mas todo o raciocnio vlido para CCP2. O mdulo CCP (Captura, Comparao e PWM) permite realizar uma srie de funes por hardware. Para exemplificar a versatilidade desse perifrico, podemos citar como exemplos de sua utilizao: gerao de sinais de PWM, gerao de sinais analgicos, medida de freqncia, medida de largura de pulso, dentre vrias. Existem trs modos de operao: Captura Comparao PWM (Modulao por largura de pulso) Esse perifrico controlado por dois registros que operam conjuntamente como um parmetro de 16 bits (CCP1H e CCP1L) e um registro de controle (CCP1CON). Alm disso, nos modos de captura e comparao usado e no modo PWM o timer 2 fornece a base de tempo. Por fim, existe uma interrupo associada ao mdulo CCP, que disparada em situaes diferentes para cada modo.
U0 Bit 7 U0 R/W 0 CCP1Y R/W 0 CCP1M3 R/W 0 CCP1M2 R/W 0 CCP1M1 R/W 0 CCP1M0 Bit 0

R/W 0
CCP1X

CCP1CON Os bits CCP1X e CCP1Y so utilizados somente no modo PWM. Os demais bits implementados servem para seleo de modos de operao, conforme apresentado na tabela 10.1. Deve-se observar que aps o reset, o mdulo CCP fica desativado. Valor Modo Exsto Tecnologia

Microcontroladores PIC16F877A

102

CCP1M3 0 0 0 0 0 1 1 1 1 1

CCP1M2 0 1 1 1 1 0 0 0 0 1

CCP1M1 CCP1M0 0 0 Mdulo CCP desligado Transio de descida 0 0 Captura Transio de subida 0 1 4 transies de subida 1 0 16 transies de subida 1 1 0 0 Comparao Pino de sada em 1 na coincidncia Pino de sada em 0 na coincidncia 0 1 Somente seta flag de interrupo 1 0 Reset timer (Special trigger) 1 1 x x PWM Tabela 10.1 Modos de operao do mdulo CCP

5.2.1 Modo captura


No modo captura, o valor do timer 1(TMR1H:TMR1L) armazenado nos registros CCP1H:CCP1L quando ocorre um evento. Alm disso, o flag CCP1IF setado, permitindo acionar a interrupo. Esse evento, que configurado conforme a tabela 10.1 pode ser a ocorrncia de : 1 transio de descida no terminal RB3/CCP1 1 transio de subida no terminal RB3/CCP1 4 transies de subida no terminal RB3/CCP1 16 transies de subida no terminal RB3/CCP1

Para operao nesse modo, o terminal RB3/CCP1 deve estar configurado como entrada e o timer deve estar no modo temporizador ou no modo contador sncrono. O modo captura pode ser utilizado para determinar a diferena de tempo entre dois eventos. Isso pode ser feito de duas formas. No primeiro evento, o timer resetado e no segundo, o valor capturado do timer 1 multiplicado pelo perodo do seu clock corresponde ao tempo transcorrido entre os dois eventos. Outra forma deixar o timer 1 incrementado livremente e capturar seu valor nos dois eventos. Fazendo uma subtrao entre os dois valores capturados, temos o tempo entre os eventos. Esse procedimento pode ser utilizado para medir velocidade e freqncias (nesse caso temos o perodo e sabemos que f = 1/T). Os modos onde o evento de captura a ocorrncia de 4 ou 16 transies podem ser vistos como tendo uma pr-escala na entrada. Essa pr-escala pode ser til para trabalhar com sinais de freqncias altas, como ser mostrado. Sua contagem s pode ser zerada com a mudana de modo do CCP. A figura 10.1 apresenta o diagrama em blocos para o modo de captura.

Exsto Tecnologia

Microcontroladores PIC16F877A

103

Figura 10.1 Diagrama do modo captura Durante o modo SLEEP, se ocorrer um evento, o flag setado, mas o valor de Timer 1 no capturado, pois o timer 1 (como temporizador ou contador sncrono) no opera durante o SLEEP. No reset, zera a pr-escala.

5.2.2 Modo comparao


Nesse modo, o par de registros do mdulo CCP (CCP1H:CCP1L) constantemente comparado com o par de registros do timer 1 (TMR1h:TMR1L). Quando eles coincidem, setado o flag CCP1IF. Alm disso, podemos zerar o timer 1 ou forar um estado no pino RB3/CCP1. Quando optamos por zerar o timer 1, o funcionamento muito parecido com o do timer 2 em relao ao registro PR2. Quando se seleciona os modos que foram estados (1 ou 0) no pino RB3/CCP1, o pino fica no estado oposto ao desejado at que ocorra a coincidncia. Nesse caso, o pino deve ser configurado como sada. A figura 10.2 apresenta o diagrama do modo comparao.

Figura 10.2 Diagrama do modo comparao

5.2.3 Modo PWM


O mdulo PWM permite utilizar sinais modulados em largura de pulso (PWM Pulse Width Modulation), que consiste em representar um valor pelo duty-cicle (tempo em alto) de um trem de Exsto Tecnologia

Microcontroladores PIC16F877A

104

pulsos de freqncia fixa. Por exemplo, admitindo que estamos trabalhando com o PWM do PIC, sua resoluo mxima de 10 bits, ou seja, 1023 corresponde a 100% de duty-cicle. Usando uma regra de trs simples, podemos determinar a quanto que corresponde 30%, 25%, 99%, etc. chamada de modulao porque permite carregar uma informao (expressa no duty-cicle) em uma portadora (trem de pulsos). A maior parte das aplicaes de PWM para microcontroladores se aproveita da propriedade da energia de um sinal retangular ser proporcional ao seu duty-cicle (a energia de um sinal est relacionada com a rea entre o sinal e o eixo do tempo). Vamos imaginar que um sinal PWM aplicado a uma lmpada DC. Um duty-cicle de 100% (sinal sempre em 1) far a lmpada acender em sua potncia mxima; j um sinal com 70% de tempo em alto entrega a lmpada 70% da potncia mxima, e assim por diante. Essa propriedade utilizada no acionamento de cargas DC, controle de motores, etc. Outra caracterstica importante do PWM que, se o sinal for filtrado, podemos obter nveis analgicos, tambm proporcionais ao duty-cicle. Isso permite que geremos desde nveis analgicos fixos at sinais mais complexos, como tons DTMF (de telefonia). O PWM precisa de uma base de tempo que dar a freqncia do sinal. O mdulo CCP utiliza o Timer 2 para conseguir essa base. Isso pode ser observado no diagrame em blocos do PWM, na figura 10.3. Tambm necessrio que o pino RB3/CCP1 seja configurado como sada.

Figura 10.3 Diagrama em blocos no modo PWM A gerao do sinal PWM se d da seguinte maneira. Cada vez que TMR2 coincide com PR2, o pino RB3/CCP1 setado e TMR2 resetado. Isso nos d a freqncia do sinal. O duty-cicle conseguido comparando o CCPR1H concatenado com dois bits de latch com TMR2 concatenado com mais dois bits, da pr-escala ou gerados pelos ciclos Q; Quando h a coincidncia, o pino RB3/CCP1 zerado. As concatenaes nos do 10 bits de resoluo. Esse processo pode ser observado na figura 10.4. O registro CCPR1H no acessvel para leitura no modo PWM. O duty-cicle configurado atravs de CCP1L e dos bits 4 e 5 de CCP1CON. Esse valor atualizado em CCPR1H e nos bits de latch a cada perodo. Exsto Tecnologia

Microcontroladores PIC16F877A

105

Figura 10.4 Sinal PWM Configurar o PWM estabelecer sua freqncia e seu duty-cicle. De posse desses dois parmetros, podemos calcular os valores em cada registro. O perodo o inverso da freqncia e configurado atravs de PR2 e da pr-escala do TMR2 e pode ser calculado atravs da equao 10.1.

TPWM = ( PR 2 + 1) 4 TOSC (TMR 2 PS )


Onde: TPWM : perodo do PWM TOSC: perodo do oscilador TMR2PS: fator de pr-escala do timer 2

(10.1)

Para encontrar o valor de PR2 a partir de um dado valor de perodo pode ser usada a equao 10.2. Valor de PR2 deve ser inteiro e menor que 256. Logo, em alguns casos ser necessrio arredondar esse valor, o que gerar um pequeno erro entre a freqncia desejada e a real. Com valores diferentes de pr-escala podemos chegar a valores menores que 256 e a aproximaes que levem a um erro menor.

PR 2 =

TPWM 1 4 TOSC TMR2 PS

(10.2)

O duty-cicle por sua vez configurado atravs de CCPR1L e dos bits 4 e 5 de CCP1CON. Geralmente se especifica o duty-cicle em porcentagem do tempo total. Assim, dado um duty-cicle em porcentagem (DC%), o tempo correspondente a ele encontrado pela equao 10.3

TDC = TPWM DC %

100

(10.3)

Esse tempo tambm pode ser calculado pela equao 10.4.

TDC = DC[9 : 0] TOSC TMR2 PS


Onde:

(10.4)

Exsto Tecnologia

Microcontroladores PIC16F877A

106

TPWM : perodo do PWM TOSC: perodo do oscilador TMR2PS: fator de pr-escala do timer 2 DC[9:0] : um valor de 10 bits obtido acrescentando os bit 5 e 4 a esquerda de CCP1RL Dispondo do tempo do duty-cicle, o valor de DC[9:0] dado pela equao 10.5. Esse valor deve ser inteiro e menor que 1023. O valor da pr-escala deve ser o mesmo utilizado para a determinao do perodo.

DC[9 : 0] =

T DC TOSC TMR 2 PS
(10.5)

O perodo (e conseqentemente a freqncia) dado pelo registro PR2. Para freqncias altas (perodos pequenos) existe uma perda da resoluo, isto , na verdade trabalhamos com menos de 10 bits. Por exemplo, se o valor usado para PR2 for 63, os dois bits mais significativos so perdidos e 100% de duty-cicle corresponder 255. Teremos um PWM de 8 bits. A resoluo, dada em bits, para uma dada freqncia de PWM dada pela equao 10.6.

log( RESOLUO =

FOSC ) FPWM log( 2)

(10.6)

5.2.4 Interrupo
O bit de habilitao de interrupo CCP1IE em PIE1. O flag de interrupo CCP1IF em PIR1. O evento que dispara a interrupo depende do modo de trabalho. Assim a interrupo significa: Modo Captura: a ocorrncia de uma captura Modo Comparao: coincidncia entre TMR1H:TMR1L e CCPR1H:CCP1L Modo PWM: no h interrupo associada a esse modo.

5.3 Comunicao Serial


A comunicao entre circuitos eletrnicos digitais pode ser feita basicamente de duas maneiras: de forma paralela ou serial.

5.3.1 Comunicao Paralela


No envio de dados de forma paralela todos os bits que compe uma palavra so transmitidos ao mesmo tempo e por diferentes condutores. O exemplo clssico so os barramentos dos PCs, facilmente reconhecveis pelas diversas trilhas que correm paralelas na placa de circuito impresso. Esse tipo de conduo exige pouco ou nenhum preparo para o envio, visto que os dados so tratados dentro do processador de forma paralela. Outra caracterstica dessa forma de comunicao a velocidade. Como a informao toda enviada de uma s vez, a transferncia de informaes ocorre em tempo mnimo.

Exsto Tecnologia

Microcontroladores PIC16F877A

107

As limitaes dessa tcnica surgem quando as distncias entre os pontos que se deseja comunicar aumentam. Em primeiro lugar para interconexo de equipamentos em distncias grandes o uso de comunicao paralela exige conectores de muitos pinos e cabos de vrias vias.Como pode ser intudo, o custo dos cabos e conectores proporcional ao nmero de vias do cabo. Alm do custo dos cabos outro impedimento para a comunicao paralela so os efeitos reativos (capacitivos e indutivos) dos meios de comunicao paralela (sejam eles cabos ou trilhas numa placa). Em altas taxas de transmisso devemos considerar os condutores a luz da teoria de guias de ondas, que de forma resumida nos diz que em altas freqncias um fio ou uma trilha no devem ser encarados como um curto-circuito, mas como uma associao de resistncias, capacitncias e indutncias. Em virtude disso os sinais podem se degradas por interferncia mtua e tambm, pelas prprias caractersticas do meio. Outro ponto importante o rudo (interferncia) inserido nos condutores e proveniente do onde eles esto. Novamente o maior nmero de condutores agrava a situao. Esses fatos so inerentes a qualquer linha de transmisso de sinais eltricos, mas o agrava os problemas na comunicao paralela que cada linha de transmisso um meio diferente das demais, ou seja, cada bit degradado de forma diferente. Isso pode acarretar problemas na comunicao de dados a distncias longas (o critrio para dizer se uma distncia grande sua comparao com o comprimento de onda do sinal que se transmite), limitando assim a comunicao a pequenas distncias em alta velocidade (por exemplo, barramentos do PC) ou a distncias maiores com baixa taxa de transmisso (por exemplo, comunicao entre PC e impressora).

5.3.2 Comunicao serial


A forma encontrada para solucionar os problemas apresentados pela comunicao paralela a foi transmitir os bits de forma serial, ou seja, um bit de cada vez. Quanto ao quesito custo essa forma de transmisso bastante eficiente, porque em sua forma mais simples pode ser implementada com apenas dois condutores, um para envio de dados e outro de referncia. A comunicao serial tambm traz vantagens no aumento das taxas e das distncias de comunicao. Tcnicas para a reduo de rudo e degradao do sinal podem ser aplicadas mais facilmente quando a informao transita por um nico caminho. Alm disso, no h problemas em os bits serem afetados de forma diferente, pois so tratados separadamente. Em contrapartida, a comunicao serial demanda um circuito mais complexo, uma vez que a informao que tratada de forma paralela pelo processador deve ser convertida para o formato paralelo. Pelo mesmo motivo, a transmisso mais lenta que a paralela (observando apenas o tempo do envio de uma informao). O principal problema a ser resolvido na comunicao serial, porm, saber quando um bit termina e quando comea o prximo. E ainda, os cabos no deixam de ser guias de ondas, apresentando os problemas discutidos acima e mantendo sempre uma relao de compromisso entre o comprimento dos cabos e a taxa transmisso mxima. Por todas essas razes a quase totalidade das conexes entre equipamentos feita por comunicao serial. Entre as formas de comunicao serial mais difundida podemos citar o EIA-232, EIA-485, o USB e mesmo as LANs Ethernet. A comunicao serial pode se dar de duas maneiras principais, a sncrona e assncrona, que diferem na forma de localizar cada bit em uma rajada. Exsto Tecnologia

Microcontroladores PIC16F877A

108

Como o prprio nome diz, na comunicao serial sncrona existe um sincronismo, nesse caso entre o sinal transmitido e um clock enviado juntamente. O clock permite determinar o exato momento em que o bit do sinal deve ser lido, evitando assim erros na recepo e a correta montagem do dado na forma paralela. Entres as formas de comunicao serial sncrona podemos citar o I2C e o SPI, que no sero tratados aqui. J na comunicao assncrona nenhuma referencia de onde o bit deve ser lido enviado com o sinal. A soluo nesse caso adivinhar o momento certo de ler o bit. Para isso necessrio que o receptor saiba a taxa e transmisso, e portanto a durao de cada bit, e que o transmissor indique de alguma forma onde comea e onde termina a transmisso. Dessa maneira, o receptor aguarda a chegada da indicao de incio, chamado start bit ou bit de incio e quando esse lido ele sabe que a cada intervalo de tempo, chamado tempo de bit (tB) um bit novo est presente na via de comunicao. Para minimizar o risco de erro a leitura feita na metade da durao do bit ou so feitas algumas amostras durante esse intervalo de tempo. Aparentemente, se procedermos dessa forma, bastaria enviar um start bit e para sincronizar receptor e transmissor e depois poderia vir uma seqncia infinita de bits. Na verdade, porm, isso no ocorre, pois sempre existira uma pequena diferena entre as bases de tempo de TX e RX. Como uma amostra ocorre tB aps a anterior, se esse tempo estiver errado, o erro vais se acumulando at que se perca o sincronismo. Por exemplo, se o relgio de RX for 5% mais lento ou mais rpido que o de TX a cada 20 bits recebido o sincronismo ser perdido. Na prtica os dados so enviados em pacotes de alguns bits, iniciados por um start bit e terminados por um stop bit. O stop bit tem a funo de marcar o fim do pacote, para que um bit de informao no seja confundido com um novo start bit. O formato genrico de um pacote de comunicao serial apresentado na figura abaixo.

Tempo ocioso (opcional) 1, 1 ou 2 stop bits Bit de paridade (opcional) 5 a 9 bits de dados 1 start bit

Figura 11.1 Transmisso serial genrica Dos diversos padres de comunicao serial assncrona, dois so de especial interesse por sua ampla utilizao nas aplicaes de microcontroladores. So eles o EIA-232C e o EIA-485

Exsto Tecnologia

Microcontroladores PIC16F877A

109

5.3.3 EIA-232C
Popularmente conhecido como RS-232, esse protocolo foi inicialmente desenvolvido para permitir a comunicao entre computadores e modens, para transmisso de dados a longa distncia. A norma que rege o protocolo a TIA/EIA-232, cuja reviso C a mais recente (1969). Devido a sua aplicao inicial como protocolo de comunicao entre um terminal de computador e um equipamento de comunicao, o protocolo estabelece os conceitos de DTE (Data Terminal Equipament Equipamento Terminal de Dados) e DCE (Data Communication Equipament Equipamento de comunicao de dados). O sentido dos pinos de comunicao dado do ponto de vista do DTE. Como tipicamente o EIA-232 utilizado para comunicao entre um computador e o microcontrolador vamos sempre admitir aqui que computador o DTE e o microcontrolador DTE. A norma especifica vrios pinos mas na prtica os mais utilizados so os apresentados na tabela abaixo. As funes e direes dos pinos so dadas em funo do DTE

Pino TxD RxD RTS CTS DSR DTR

Funo Transmisso do DTE para o DCE Transmisso do DCE para o DTE Sinaliza que o DTE est pronto para receber dados do DCE Sinaliza que o DCE est pronto para receber dados do DTE DCE pronto para operao DTE pronto para operao Tabela 11.1 - Pinos de comunicao serial

Direo Sada Entrada Sada Entrada Entrada Sada

Os pinos DSR e DTR servem para indicar que os equipamentos esto conectados e prontos para comunicao. DTS e CTS servem para fazer controle de fluxo: Quando o DTE tem dados para transmitir ele informa o DCE atravs de RTS; se o DCE pode receber esses dados CTS ativado. As sinalizao so ativadas em 0 e desativadas em 1. Em uma grande maioria dos casos so utilizados apenas os terminais de transmisso e recepo de dados, podendo ser usado um cabo com apenas 3 fios (TxD, RxD e Terra). Segundo a norma, a comunicao serial pode suportar taxas de bit (geralmente chamadas baud rate) de at 20 kbps. possvel realizar comunicao full-duplex, ou seja, nos dois sentidos ao mesmo tempo. A distncia mxima do cabo de comunicao deve ser inferior a 15 metros (50 ps). Umas das principais causas da limitao de taxa e distncia do EIA-232C limitao nos tempos de subida e descida do sinal, que deve ser menor que 4% do tempo de bits. As especificaes eltricas do EIA-232C podem ser observadas na figura abaixo.

Exsto Tecnologia

Microcontroladores PIC16F877A

110

TX +15V

Cabo

RX +15V

0 +5V +3V

?
-3V -5V -15V 1 -15V

Figura 11.2 Faixas de tenso do EIA-232C No transmissor o nvel lgico 0 representado por uma tenso entre +5 e +15 Volts e o nvel lgico 1 representado por tenses entre -5 e -15 Volts. No receptor tenses entre +3 e +15 Volts so interpretadas como 0 e entre -3 e -15 Volts interpretadas como 1; tenses entre +3 e -3 Volts levam a estados ideterminados. A diferena entre os limites de tenso no transmissor (-5V e +5V) e os limites do receptor (-3V e +3V) constitui a margem de segurana, dentro da qual rudos e eventuas perdas no cabo no degradam os dados. As tenses mxima mnima que podem ser aplicadas ao receptor sem que haja dano so, respectivamente, +25V e -25V. Alm disso, a norma especifica que qualquer curto circuito entre quaisquer pinos, inclusive o pino de terra, no devem causar dano ao circuito. Como na maioria das aplicaes trabalha com circuitos alimentados com +5V so necessrios conversores de nvel para criar uma interface eltrica com o EIA-232, dentre os quais os mais conhecidos so o MAX232 e seus equivalentes.

5.3.4 A USART do PIC16F877A


O PIC16F877A, assim como diversos outros microcontrolador, possui um mdulo de realiza comunicao serial. Ele conhecido como USART (Universal Synchronous Asynchronous Receiver Transmitter Receptor e Transmissor Sncrono Assncrono Universal) ou SCI (Serial Communications Interface). A USART pode ser configurada para trabalhar nos seguintes modos: Assncrono (Full Duplex) Sncrono Mestre (Half Duplex) Sncrono Escravo (Half Duplex)

A diferena entre os mdos Sncrono Mestre e Escravo que o Mestre gera o clock para os escravos. Abordaremos somente o modo assncrono, que nos permitir implementar uma comunicao sob o protocolo RS-232 com o PC. Os pinos do microcontrolador associados USART so RB6 para transmisso (TxD) e RB7 para recepo (RxD). Quando a USART est habilitada esses pinos deixam de operar como entradas e sadas digitais. Exsto Tecnologia

Microcontroladores PIC16F877A

111

Para configurar transmisso e recepo so utilizados dois registros TXSTA e RCSTA.

R/W 0 CSRC Bit 7

R/W 0 TX9

R/W 0
TXEN

R/W 0 SYNC

U0 -

R/W 0 BRGH

R1 TRMT

R/W 0 TX9D Bit 0

TXSTA CSRC: Seleo de clock. o Modo Assncrono: no tem efeito o Modo sncrono 1 = Modo mestre, clock gerado internamente. 0 = Modo escravo, clock recebido. TX9: Habilitao de transmisso de 9 bits o 1 = Transmisso de 9 bits o 0 = Transmisso de 8 bits TXEN: Habilitao de transmisso o 1 = Transmisso ligada o 0 = Transmisso desligada SYNC: seleo de modo da USART o 1 = Modo sncrono o 0 = Modo assncrono BRGH: Seleo de taxa de transmisso aula o Modo assncrono 1 = Alta velocidade 0 = Baixa velocidade o Modo sncrono: no tem efeito TRMT: Status do buffer de transmisso ] o 1 = buffer vazio o 0 = buffer cheio TX9D: 9 bit de transmisso, quando TXEN for usado
R/W 0 SPEN Bit 7 R/W 0 RX9

R/W 0
SREN

R/W 0 CREN

R/W 0 ADDEN

R0 FERR

R0 OERR

R x RX9D Bit 0

RCSTA SPEN: Habilitao da porta serial o 1 = Habilitada (pinos RC6 e RC7 operam como pinos da USART) o 0 = Desabilitada RX9: Habilitao de recepo de 9 bits o 1 = Recepo de 9 bits o 0 = Recepo de 8 bits SREN: Habilitao de recepo nica o Modo assncrono: no tem efeito o Modo sncrono: 1 = Habilita recepo nica 0 = Habilita transmisso nica CREN: habilitao de recepo contnua o Modo sncrono 1 = habilita recepo contnua 0 = desabilita recepo contnua o Modo assncrono Exsto Tecnologia

Microcontroladores PIC16F877A

112

1 = habilita recepo contnua 0 = desabilita recepo contnua ADDEN: Habilitao de detector de endereo o 1 = habilita deteco de endereo o 0 = desabilita deteco de endereo FERR: Erro de enquadramento o 1 = houve erro de enquadramento (dado recebido com taxa diferente da configurada) o 0 = no houve erro de enquadramento OERR: Erro de sobrescrita no buffer de recepo o 1 = houve sobrescrita no buffer de recepo o 0 = no houve sobrescrita no buffer de recepo RX9D: 9 bit recebido, se RX9 = 1;

Alm das configuraes feitas pelos registros acima importante configurar a taxa de transmisso da comunicao serial. Isso feito carregando o valor adequado no registro SPBRG, que configura o gerador de taxa de transmisso do PIC. Para determinar esse valor usada a equao 11.1, se o bit BRGH est 0, e a equao 11.2 se BRGH est em 1.

Taxa = Taxa =

Fosc 64 ( SPBRG + 1) Fosc 4 ( SPBRG + 1)

(11.1)

(11.2)

5.3.5 Transmisso
Durante o processo de transmisso serial assncrona entra em operao o circuito apresentado na figura 11.3.

Figura 11.3 - Diagrama em blocos do sistema de transmisso O processo de transmisso se inicia quando um dado escrito no registro TXREG. Quando isso ocorre o valor de TXREG transferido para o registro interno TSR (desde que esse esteja vazio) e o flag TXIF setado. O valor contido em TSR enviado de forma serial pelo tino RB6/TxD, conforme a taxa de transmisso selecionada. Exsto Tecnologia

Microcontroladores PIC16F877A

113

Para realizar um processo de transmisso serial basta seguir os seguintes passos: 1. Carregar SPBRG com o valor correto para a taxa de transmisso desejada. 2. Habilitar comunicao serial sncrona: TXSTA, SYNC 0 e RCSTA, SPEN 1; 3. Habilitar a transmisso: TXSTA, TXEN 1

Feito isso, toda vez que um dado movido para TXREG o mesmo automaticamente transmitido de forma serial.

5.3.6 Recepo
Para receber dados de forma serial o circuito interno a USART comporta-se como apresentado na figura 11.4

Figura 11.4 - Diagrama em blocos do sistema de recepo Os dados recebidos pela porta serial so rotacionados e alojados no registro interno RSR. Uma vez verificado a coerncia de start bit e stop bit, os dados so transferidos para o buffer de recepo, isto , o registro RCREG e o flag RCIF setado. Caso haja alguma incoerncia com os bits de start e stop, o indicador de erro de equadramento FERR setado. O flag RCIF zerado toda quando o registro RCREG lido. Podem ser recebidos at dois bytes sem que faa a leitura do registro RCREG, sendo que o primeiro recebido fica armazenado em RCREG e o segundo em RSR, sendo transferido para RCREG assim que este lido. Caso chegue um terceiro byte RSR sobrescrito e o bit de erro OERR setado. Para realizar recepo de dados enviados pela serial necessrio seguir os seguintes passos: 1. Carregar SPBRG com o valor correto para a taxa de transmisso desejada. 2. Habilitar comunicao serial sncrona: TXSTA, SYNC 0 e RCSTA, SPEN 1; 3. Habilitar a transmisso: RCSTA, RXEN 1

Exsto Tecnologia

Microcontroladores PIC16F877A

114

Feito isso, basta monitorar o bit RCIF, que ser setado toda vez que existir um dado vlido no registro RCREG.

5.4 Conversor Analgico para digital ADC


Alguns microcontroladores PIC da famlia 16Fxxx, dentre eles o PIC16F877A possuem mdulos para converso de nveis de tenso DC em valores digitais (ADC). O ADC converte a tenso em palavras de 8 bits ou 10 bits, dependendo do componente. Aqui ser tratado especificamente do mdulo ADC de 10 bits do PIC16F877A, porm o funcionamento desses mdulos o mesmo para demais componentes com ADCs de 10 bits e muito semelhante para os de 8 bits.

Figura 12.1 - Diagrama em blocos do ADC PIC16F877A possui um ADC com oito canais analgicos. Isso significa que a tenso a ser escolhida dentre a de oito entradas diferentes, porm no somente uma entrada pode ser convertida por vez. Alm disso, as tenses de referncia para a converso, tanto superior (Vref+) como inferior (Vref-), podem ser selecionadas por software entre as tenses de alimentao e tenses presentes em determinados terminais do microcontrolador. Esses valores de tenso estipulam a faixa de valore a ser convertida. Por exemplo, sendo Vref+ = Vdd e Vref- = Vss temos uma faixa de 5V, correspondendo o valor 0 a 0V e 1024 a 5V. Para determinar um qual o valor correspondente dentro dessa faixa, basta aplicar uma simples regra de trs. Essas consideraes podem ser observadas na figura 12.1.

Exsto Tecnologia

Microcontroladores PIC16F877A

115

O mdulo ADC realiza todo o processo de Sample and Hold (Amostragem e reteno). Esse processo realizado quando uma determinada entrada selecionada e inicia-se a carga de um capacitor interno CHOLD . Aps o tempo de carga do capacitor (THOLD) a entrada desconectada e inicia-se o processo de converso da tenso armazenada no capacitor, que feito pelo mtodo de aproximaes sucessivas. A figura abaixo apresenta o circuito equivalente da entrada da do ADC.

Figura 12.2 - Circuito Equivalente da entrada do ADC Requisitos de funcionamento A resistncia da fonte da tenso a ser convertida (Rs no circuito acima) no deve ser superior a 10k, caso contrrio o capacitor CHOLD pode no ser completamente carregado quando se iniciar a converso. Alm disso, o processo de converso s poder ser iniciado depois de decorrido o tempo de carga do capacitor (THOLD). A ativao do processo de converso ser explicada mais adiante. O tempo total de amostragem, que vai do instante em que o canal a ser amostrado selecionado ao momento em que o resultado da converso armazenado nos registros de resultado do AD, a soma do tempo de aquisio com o tempo de converso. O tempo de aquisio varia em funo da a temperatura, da tenso de alimentao e da resistncia da fonte do sinal a ser amostrado. Para temperaturas inferiores a 25oC, alimentao de 5V o tempo de aquisio encontra-se no intervalo: 11 s < TAQ < 20s onde o menor tempo conseguido para uma Rs = 0 e o maior para Rs = 10k. J o tempo de converso depende do clock de converso. Esse clock pode ser selecionado como Fosc/2, Fosc/8, Fosc/32 ou baseado em um oscilador RC interno que varia entre 2 e 6 s. A seleo do clock de converso deve ser tal que o perodo seja de 1,6s no mnimo. Quando utilizando a fonte de clock proveniente do oscilador RC o processo de converso pode ocorrer estando o microcontrolador em modo SLEEP. Esse procedimento pode ser utilizado para que o oscilador do microcontrolador no introduza rudos na tenso a ser medida. Finalmente, aps uma converso ser concluda necessrio aguardar 2 perodos do clock de conversa antes de se reiniciar o processo. Exsto Tecnologia

Microcontroladores PIC16F877A

116

5.4.1 Configurao e uso


Para a utilizao do ADC so utilizados 4 registros especiais ADRESH : registro de resultado do A/D (MSbits); ADRESL : registro de resultado do A/D (LSbits); ADCON0 : registro de controle 0; ADCON1 : registro de controle 1. Abaixo so apresentadas as funes desse registros. ADRESH e ADRESL So os registros onde so armazenados os valores resultantes da converso. Como se trata de ADC de 10bits so necessrios 2 registros para esse resultado, ficando 2 bits em um registro e 8 em outro. A disposio desse registro pode ter dois formatos. O formato justificado a esquerda aquele em os 8 bits mais significativos so armazenados em ADRESH e os 2 menos significativos em ADRESL. J no formato justificado a direita, os 2 bits mais significativos so armazenados em ADRESH e os 8 menos significativos em ADRESL. O formato escolhido pelo valor do bit ADFM do registro ADCON1, conforme ilustrado pela figura abaixo.

Figura 12.3 - Formato do resultado do ADC Utilizando a justificao esquerda e desconsiderando os 2 bits menos significativos temos o comportamento de um ADC de 8 bits. ADCON0 Bit 7e 6: ADCS1:ADCS0: Bits de seleo do clock de converso o 00 = Fosc/2 o 01 = Fosc/8 o 10 = Fosc/32 o 11 = FRC (oscilador RC interno) Bit 5 3: CHS2:CHS0: Seleo de canal analgico o 000 = canal 0 (RA0/AN0) Exsto Tecnologia

Microcontroladores PIC16F877A

117

o 001 = canal 1 (RA1/AN1) o 010 = canal 2 (RA2/AN2) o 011 = canal 3 (RA3/AN3) o 100 = canal 4 (RA5/AN4) o 101 = canal 5 (RE0/AN5) o 110 = canal 6 (RE1/AN6) o 111 = canal 7 (RE2/AN7) Bit 2: GO/DONE: Status da converso o 1 = Converso em progresso o 0 = Converso concluda Bit 1: No implementado Bit 0: ADON: habilitao do ADC o 1 = ADC habilitado o 0 = ADC desabilitado (para menor consumo de corrente) ADCON1 Bit 7 ADFM: Seleo de formato de resultado o 1 = justificado direita o 0 = justificado a esquerda Bit 6 4: no implementados Bit 3 0 PCFG3:PCFG0: Configurao das portas do ADC

Esses bits permitem configurar a quais dos terminais que so multiplexados com entradas do ADC sero entradas analgicas e quais sero I/O digitais. As configuraes possveis so apresentadas pela tabela abaixo.

Tabela 12.1 Configuraes de entradas analgicas Para a utilizao do AD so necessrios os seguintes procedimentos: 1. Configurar o AD na inicializao: a. Selecionar clock de converso b. Definir formato do resultado Exsto Tecnologia

Microcontroladores PIC16F877A

118

2. 3. 4. 5. 6.

c. Definir quais terminais sero utilizado como entradas do AD d. Habilitar o modo AD Selecionar qual canal ser lido Aguardar o tempo de aquisio Iniciar o processo de converso (fazendo ADCON0, GO/DONE igual a 1). Aguardar que o processo ser concludo (Verificando se ADCON0, GO/DONE igual a 0.); Aguardar 2 perodos de clock de converso.

5.5 Memrias EEPROM e Flash


5.5.1 Memria EEPROM
A memria EEPROM muitas vezes necessria para armazenar dados que devem ser mantidos na falta de energia do sistema, mas porm podem ser alterados. Por exemplo, as senhas armazenadas em um alarme no podem se perder caso o alarme seja desligado. O banco de memrias EEPROM tratado como perifrico porque seu funcionamento se assemelha mais ao de um perifrico que as demais memrias. Os endereos de EEPROM no podem ser acessados diretamente, como endereos de RAM. Seu acesso feito atravs de endereamento indireto e seguindo certas seqncias obrigatrias de comando. A seguir sero apresentados o funcionamento dessa memria e as rotinas para acessos de leitura e escrita. Existem no PIC16F877A 256 bytes de memria EEPROM. O acesso a esses bytes feito de forma indireta atravs dos registros seguintes registros: EEDATA : contm o dado lido / a ser escrito EEADR: contm o endereo a ser acessado EECON1: registro de controle EECON2: utilizado na seqncia de proteo Existe uma seqncia de proteo para prevenir escritas acidentais da EEPROM que faz uso do EECON2, como ser mostrado mais adiante. O registro EECON1 apresenta a configurao abaixo.

U0 Bit 7

U0 -

U0 -

U0 -

R/W x WRERR

R/W 0 WREN

R/W 1 WR

R/W 1 RD Bit 0

EECON1 WRERR: Flag indicador de erro o 1 = houve um erro no processo de escrita da EEPROM, devido a um reset o 0 = o processo de escrita da EEPROM foi concludo com sucesso WREN: habilitao da escrita da EEPROM o 1 = permite a escrita da EEPROM o 0 = no permite a escrita da EEPROM WR: controle de escrita o 1 = inicia o processo de escrita o 0 = processo de escrita concludo (zerado pelo hardware) RD: controle de leitura o 1 = inicia o processo de leitura o 0 = processo de leitura concludo (zerado pelo hardware)

Exsto Tecnologia

Microcontroladores PIC16F877A

119

O bit WRERR permite que em aplicaes de maior segurana sejam tomadas providncias caso ocorra uma falha na gravao de algum dado. O bit WREN impede a escrita acidental da EEPROM. O processo de leitura se d da seguinte maneira: o endereo a ser lido carregado no registro EEADR; em seguida o bit RD setado, dando incio ao processo de leitura. Quando a leitura foi finalizada, o bit RD zerado pelo hardware, indicando que o dado j foi lido e se encontra no registro EEDATA. O bit RD s pode ser zerado pelo hardware. Para a escrita da memria, inicialmente os registros EEDATA e EEADR so carregados com o dado a ser escrito e o endereo, respectivamente. Em seguida deve ser habilitada a escrita, fazendo WREN igual 1. Em seguida, uma seqncia obrigatria, que consiste em carregar os valor 55h e AAh no registro EECON2, deve ser realizada para permitir a gravao da memria. Esse mais um dispositivo de segurana contra escritas acidentais da EEPROM. Por fim, o bit WR setado, dando incio ao processo de escrita, e quando ele se torna 0, o processo de gravao foi concludo. WR tambm s pode ser setado pelo software.

5.5.2 Rotinas de acesso a EEPROM


Para acesso EEPROM podemos usar as duas rotinas apresentadas abaixo. Elas tm como requisito que duas variveis, E2DATA e E2ADR sejam declaradas no ltimos 16 bytes do banco 0, isto , entre os endereos 70h e 7Fh. Os endereos devem ser estar nessa posio pra minimizar mudana de banco. READ_EEPROM realiza a leitura enquanto WRITE_EEPROM responsvel pela escrita.
READ_EEPROM: ; realiza a leitura da EEPROM ; entrada: E2ADR ; sada: E2DATA ; W BANKSEL MOVFW MOVWF BSF MOVFW MOVWF BANKSEL RETURN WRITE_EEPROM: ; realiza a escrita da EEPROM de dados ; entrada: E2DATA -> Dado a ser escrito ; E2ADR -> Endereo a ser escrito ; sada: nulo BANKSEL MOVFW MOVWF MOVFW MOVWF BSF BCF MOVLW EEADR E2ADR EEADR E2DATA EEDATA EECON1,WREN INTCON,GIE 55H ; ; ; ; ; ; ; ; seleciona o banco de EEADR W <- E2ADR EEADR <- W W <- E2DATA EEDATA <- W habilita gravao desabilita interrupes EEADR E2ADR EEADR EECON1,RD EEDATA E2DATA PORTA

de -> -> ->

dados endereo a ser lido dado lido dado lido ; ; ; ; ; ; ; muda para o banco de EEADR W <- E2ADR EEADR <- W inicia o processo de leitura W <- EEDATA E2DATA <- EEADR retorna ao banco 0

Exsto Tecnologia

Microcontroladores PIC16F877A

120

MOVWF MOVLW MOVWF BSF CLRWDT BTFSC GOTO ; BSF BCF BANKSEL RETURN

EECON2 0AAH EECON2 EECON1,WR

; sequencia ; obrigatria ; ; inicia processo de gravao ; fica em loop at a gravao ser ; completada ; ; reabilita as interrupes ; desabilita gravao ; retorna ao banco 0

EECON1,WR $-2 INTCON,GIE EECON1,WREN PORTA

5.5.3 Memria FLASH de programa


Da mesma forma que a EEPROM, no PIC16F877A possvel ler e escrever dados na memria flash de programa. Isso til no s porque permite utilizar todas as regies de memria FLAHS no ocupadas pelo programa como se fossem EEPROM como tambm permite que o prprio programa altere seu contedo. Isso permite que aplicaes onde exista uma comunicao remota possam ser atualizadas a distncia, desde que exista uma parte do programa responsvel por isso que no seja alterada na atualizao. Alm dos registros usados para EEPROM existem mais dois necessrios ao trabalho com a memria FLASH, uma vez que so maiores tanto o dado (14 bits) como endereo (13 bits): EEDATH : contm a parte mais significativa do dado lido / a ser escrito EEADRH: contm a parte mais significativa do endereo a ser acessado

5.5.4 Rotinas de acesso a FLASH.


As rotinas para acesso a memria FLASH so muito semelhantes as utilizadas para memria EEPROM e so apresentadas a seguir.
READ_FLASH: ; realiza a leitura da memria FLASH de programa ; entrada: E2ADR -> LSByte do endereo a ser gravado(Banco 2) ; E2ADRH -> MSByte do endereo a ser gravado(Banco 2) ; sada: E2DATA -> LSByte do contendo o dado lido (Banco 2) ; E2DATH -> MSByte do contendo o dado lido (Banco 2) BCF STATUS,RP0 ; BSF STATUS,RP1 ; Banco 2 MOVFW E2ADR ; parte menos significativa MOVFW EEADR ; do endereo a ser lido MOVFW E2ADRH ; parte mais significativa MOVFW EEADRH ; do endereo a ser lido BSF BSF BSF NOP NOP STATUS,RP0 EECON1,EEPGD EECON1,RD ; Banco 3 ; Acesso a memria FLASH ; Leitura da FLASH ; A memria lida nesses dois ciclos ;

Exsto Tecnologia

Microcontroladores PIC16F877A

121

BCF MOVFW MOVWF MOVFW MOVWF BCF

STATUS,RP0 EEDATA E2DATA EEDATH E2DATH STATUS,RP1

; ; ; ; ; ;

Banco 2 parte menos significativa do dado lido parte mais significativa do dado lido Banco 0

RETURN

WRITE_FLASH: ; realiza a escrita da memria FLASH de programa ; entrada: EEADR -> LSByte do endereo a ser gravado(Banco 2) ; EEADRH -> MSByte do endereo a ser gravado(Banco 2) ; EEDATA -> LSByte do dado a ser gravado (Banco 2) ; EEDATH -> MSByte do dado a ser gravado (Banco 2) ; sada: nulo BCF STATUS,RP0 ; BSF STATUS,RP1 ; Banco 2 MOVFW E2ADR ; parte menos significativa MOVFW EEADR ; do endereo a ser escrito MOVFW E2ADRH ; parte mais significativa MOVFW EEADRH ; do endereo a ser escrito MOVFW EEDATA ; parte menos significativa do MOVWF E2DATA ; dado a ser escrito MOVFW EEDATH ; parte mais significativa do MOVWF E2DATH ; dado a ser escrito BCF STATUS,RP0 ; BSF EECON1,EEPGD ; Acesso a memria FLASH BSF EECON1,WREN ; Habilita gravao BCF INTCON,GIE ; Desabilta interrupes MOVLW MOVWF MOVLW MOVWF BSF NOP NOP 55h EECON2 0AAh EECON2 EECON1, WR ; ; EECON1 <- 55h ; ; EECON1 <- AAh ; Inicia gravao ; ; ; ; ; ; ; Instrues escritas aqui so ignoradas pois o microcontrolador interrompe a execuo do programa, aguarda a fim do processo de escrita e continua da terceira instruo. Habilita as interrupes Desabilita a escrita

BSF BCF BCF BCF

INTCON,GIE EECON1,WREN STATUS,RP0 STATUS,RP1

; ; Banco 0

RETURN

Exsto Tecnologia

Microcontroladores PIC16F877A

122

Apndices
Apndice A Conjunto de Instrues do PIC16

Exsto Tecnologia

Microcontroladores PIC16F877A

123

Apndice B Mapeamento de memria de dados

Exsto Tecnologia