You are on page 1of 470

1

Conectando o PIC 16F877A - Recursos Avanados

Conectando o

PIC16F877A
Recursos Avanados

EDITORA AFILIADA

Conectando o PIC 16F877A - Recursos Avanados

3
Dedicatria
Mais uma vez tenho a chance de dedicar meu trabalho pessoa que mais amo neste mundo: minha querida esposa Eliete; Dedico tambm minha amada sobrinha, Bia, que ainda muito pequena para saber o significado de uma dedicatria, mas que me alegra com fora suficiente para uma vida inteira. David Jos de Souza A paternidade realmente uma experincia incrvel. H algum tempo eu no tinha uma idia muito precisa sobre meu futuro, e hoje me vejo um homem muito mais completo, pois j plantei minha rvore, escrevi meu livro e acabei de ser pai. Por isso, dedico meu trabalho minha querida esposa Andra e minha recm-nascida filha Nicole. Nicols Csar Lavinia

Em paz me deito e logo adormeo, porque s tu, Senhor, me fazes viver em segurana

Conectando o PIC 16F877A - Recursos Avanados

4
Agradecimentos
Uma experincia nunca igual outra. Escrever este livro foi muito mais difcil que o primeiro, pois a quantidade de conhecimento tcnico necessrio estava bem acima do meu potencial inicial. Uma vez mais o desafio prova que as pessoas so capazes de vencer seus prprios limites, principalmente quando temos o apoio das pessoas que se encontram ao nosso lado. Este o motivo mais forte de todos para justificar esses agradecimentos. Mais uma vez tenho a obrigao, sem o pesar da palavra, de agradecer minha famlia e em especial minha esposa. Amo todos vocs. Agradeo a todo o pessoal da Mosaico pela participao de cada um neste livro, cada qual do seu jeito e com suas condies, mas devo um agradecimento muito especial ao meu scio, amigo e co--autor, Nicols, pois sem seu conhecimento tcnico e capacidade de trabalho jamais conseguiria terminar esta obra. Um abrao muito especial tambm aos meus outros scios da Mosaico: meu irmo de sangue, Jos Carlos; meu irmo de vida, Gil; e meu irmo de alma, Vanderlei. Na verdade, conclu esta obra em junho de 2002 e, por isso, gostaria muito de aproveitar, sem demagogias, para agradecer ao meu Pas, cuja seleo tornou-se agora Pentacampe Mundial de Futebol. Sou patriota e apaixonado pelo Brasil, mas gostaria de que nosso povo sentisse orgulho da sua ptria diariamente. Devemos levantar nossas cabeas e trabalhar pelo nosso futuro, recuperar nossa auto-estima e ter a certeza de que a nica soluo do nosso Pas est no prprio povo. Por ltimo, como em meus demais textos, no poderia deixar de agradecer a voc, leitor, que est se preparando para passar horas ao lado deste livro, enfrentando os mesmos desafios que ns enfrentamos quando comeamos a explorar esse vasto universo denominado PIC. David Jos de Souza

Conectando o PIC 16F877A - Recursos Avanados

5
Distribuidores

Mosaico Engenharia Eletrnica S/C Ltda. Projetos eletrnicos com especializao em PIC, consultoria e treinamento. Rua Galeo Carvalhal, 125 - Bairro Jardim Bela Vista - Santo Andr - SP Tel:(11)4992-8775 Tel/Fax:(11)4992-8775 E-mail: comercial@labtools.com.br Home page: www.mosaicohps.com.br Microchip Technology Inc. Fabricante do PIC. 2355, W. handler Blvd. - Chandler - Arizona USA Tel: (480) 768-7200 / Fax: (480) 899-9210 Home page: www.microchip.com Aplicaes Eletrnicas Artimar Ltda. Representante exclusivo Microchip no Brasil. Rua Marqus de It, 70 - 8- andar - Conj. 82 So Paulo - SP Tel: (11) 3231-0277 Fax: (11) 3255-0511 E-mail: artimar@artimar.com.br Home page: www.artimar.com.br Aut-Comp Revendedor autorizado. Rua Lord Cokrane, 616 -139 andar - Sala 1304 So Paulo - SP Tel: (11) 6915-7443 Fax: (11) 6915-7443 Home page: www.autcomp.com.br Farnell do Brasil Revendedor autorizado. Rua Emir Macedo Nogueira, 240 - Diadema - SP Tel: (11) 4066-9400 Fax: (11) 4066-9410 Home page: www.farnell.com Future Eletronics Revendedor autorizado. Rua Luzitana, 740 - 102 andar - Conj. 103/104 Campinas - SP Tel: (19) 3737-4100 E-mail: future@zaz.com.br Home page: www.future-active.com.br

Conectando o PIC 16F877A - Recursos Avanados

6
Hitech Revendedor autorizado. Rua Branco de Moraes, 489 - So Paulo - SP Tel: (11) 5188-4000 Fax: (11) 5188-4191 E-mail: microchip@hitech.com.br Home page: www.hitech.com.br Tec Tecnologia Revendedor autorizado. Rua Flrida, 1737 - 29 andar - So Paulo - SP Tel: (11) 5505-2046 Fax: (11) 5505-0017 Home page: www.tec-arrow.com.br

Conectando o PIC 16F877A - Recursos Avanados

7
Sobre o Material Disponvel na Internet
O material disponvel no site da Editora rica contm: cdigos-fonte dos exemplos apresentados, data sheets dos componentes adicionais (LCD e memria) e o software M2Com for Windows para testes de transmisso e recepo da comunicao serial via RS232, desenvolvido pelos autores. necessrio ter instalado em sua mquina AdobeAcrobat 4,0 e MPLAB 5.7 ou superior. Pic.exe-1.87MB

Procedimentos para Download:


Acesse o site da Editora rica Ltda. (www.editoraerica.com.br). A transferncia do arquivo disponvel pode ser feita de duas formas: Por meio do mdulo de pesquisa - Localize o livro desejado, digitando palavras-chave (ttulo do livro ou nome do autor). Aparecero os dados do livro e o arquivo para download, ento d um clique sobre o arquivo executvel que ser transferido. Por meio do boto "Download" - Na pgina principal do site, clique no item "Download". Ser exibido um campo no qual devem ser digitadas palavras-chave (ttulo do livro ou nome do autor). Sero exibidos o nome do livro e o arquivo para download. D um clique sobre o arquivo executvel que ser transferido.

Procedimentos para Descompactao


Primeiro passo: aps ter transferido o arquivo, verifique o diretrio em que se encontra e d um duplo-clique sobre ele. Ser exibida unia tela do programa WINZ1P SELF-EXTRACTOR que conduzir voc ao processo de descompactao. Abaixo do Unzip To Folder, existe um campo que indica o destino dos arquivos que sero copiados para o disco rgido do seu computador: C:\Conectando o PlC Segundo passo; prossiga com a instalao, clicando no boto Unzip, o qual se encarrega de descompactar os arquivos. Logo abaixo dessa tela, aparece a barra de status a qual monitora o processo para que voc acompanhe. Aps o trmino, outra tela de informao surgir, indicando que os arquivos foram descompactados com sucesso e esto no diretrio criado. Para sair dessa tela, clique no boto OK, Para finalizar o programa WINZIP SELF EXTRACTOR, clique no boto Close.

Conectando o PIC 16F877A - Recursos Avanados

Prefcio
Novamente os autores nos presenteiam com uma obra de excelente qualidade tcnica. Voltada especialmente para a rea de projetos com sistemas microcontrolados, com nfase no microcontrolador PIC16F877A, ela disponibiliza ao pblico uma srie de tcnicas de "software" e "hardware1 que foram desenvolvidas por eles e so utilizadas diariamente em seus laboratrios. Esta a melhor forma de obtermos acesso a mtodos realmente prticos e atualizados com as necessidades do mercado. Totalmente transparente, esta literatura trata de forma clara e direta uma srie de aspectos e problemas prticos em projetos de sistemas microcontrolados, fornecendo solues abertas e de primorosa qualidade. Mais do que fornecer solues prontas, o leitor vai verificar que no "Conectando o PIC 16F877A - Recursos Avanados" os assuntos so detalhadamente comentados e explicados, possibilitando que ele desenvolva projetos de maior complexidade. Com seriedade e responsabilidade, os autores vem mostrando para o pblico brasileiro que o sucesso de um empresa na rea de projetos no reside em deter todo conhecimento para si, mas saber difundi-lo de maneira a possibilitar a um grupo cada vez maior de pessoas o acesso a maravilhosas solues que a eletrnica microcontrolada permite. E em poucas palavras: a competncia no teme a concorrncia. Este livro combina to bem o embasamento terico com a exemplificao prtica, que se torna um excelente material de apoio didtico tanto para as pessoas que desejam aprender por seus prprios meios quanto para ns, professores, que necessitamos tanto de material complementar. Que nesta era do conhecimento possamos, cada vez mais, contar com novas obras deste porte e qualidade. Jos Carlos de Souza Jr.
Professor Universitrio de diversas matrias da cadeira de Engenharia Eletrnica, incluindo a de Microcontroladores, em faculdades e universidades de So Paulo, tais como FE/, Mau e So Judas.

Conectando o PIC 16F877A - Recursos Avanados

9
Sobre os Autores
David Jos de Souza formado em Engenharia Mecnica pela Universidade Santa Ceclia, trabalhando h quatro anos no setor. Trabalhou durante trs anos no segmento de informtica pela Canal 1 Informtica. Atualmente, scio e diretor administrativo do Grupo Mosaico, ao qual tem se dedicado nos ltimos anos. Especializou-se nos microcontroladores da Microchip devido sua grande utilizao nos laboratrios da Mosaico Engenharia. responsvel tambm pelas especificaes de projetos, com as quais adquiriu experincia necessria para poder ministrar palestras e cursos sobre o assunto. Pretende ainda se dedicar a outras obras sobre microcontroladores e desenvolvimento de projetos. Nicols Csar Lavnia engenheiro eletricista com especializao em eletrnica, formado pela Escola de Engenharia Mau. Cursou mestrado no Laboratrio de Automao e Controle da Escola Politcnica da Universidade de So Paulo. Possui treinamento "Master em microcontroladores PIC" promovido pela prpria Microchip em Arizona, nos EUA. Trabalha na rea de desenvolvimento de projetos e consultoria h mais de sete anos. Atualmente, scio e diretor tcnico da Mosaico Engenharia, responsvel pela coordenao do laboratrio de desenvolvimento. Como co-autor deste livro, expe a vasta experincia adquirida no desenvolvimento de projetos eletrnicos.

Conectando o PIC 16F877A - Recursos Avanados

10
Sumrio
Captulo 1 Introduo......................................................................... Nossos objetivos...................................................................................... Pr-requisitos sugeridos.......................................................................... A didtica do sistema............................................................................... Introduo................................................................................................. Prtica....................................................................................................... Projeto final............................................................................................... Apndices................................................................................................. Padres textuais....................................................................................... Captulo 2 - O PIC 16F877A.................................................................... Pinagem.................................................................................................... Nomenclatura dos pinos............................................................................ A estruturao interna............................................................................... Os ciclos de mquina................................................................................ A memria de programa............................................................................ Vetor de reset............................................................................................ Vetor de interrupo.................................................................................. Tamanho da memria e pginas............................................................... Pilha (Stack).............................................................................................. Mapa da memria de programa................................................................ A memria de dados voltil (RAM)............................................................ Registradores especiais............................................................................ Registradores de uso geral....................................................................... Tamanho da memria e bancos............................................................... Mapa da memria de dados..................................................................... 2 Memrias no-volteis (E PROM e FLASH)........................................... 29 As interrupes........................................................................................ Interrupo de Timer 0............................................................................. Interrupo externa.................................................................................. Interrupo por mudana de estado......................................................... Interrupo da porta paralela (PSP)......................................................... Interrupo dos conversores A/D............................................................. Interrupo de recepo da USART......................................................... Interrupo de transmisso da USART.................................................... 2 Interrupo da comunicao serial (SPI e I C)......................................... 31 Interrupo do CCP1 (Capture/Compare/PWM)....................................... Interrupo do Timer 2.............................................................................. Interrupo do Time 1.............................................................................. 2 Interrupo de fim de escrita na E PROM/FLASH.................................... 32 Interrupo de coliso de dados (Bus Collision)....................................... Interrupo do CCP2 {Capture/Compare/PWM)....................................... Interrupo dos comparadores.................................................................. Operando com as interrupes.................................................................. Demais recursos e perifricos.................................................................... Caractersticas eltricas............................................................................. Captulo 3 - Resumo do Set de Instrues................................................ Os termos utilizados................................................................................... A construo dos nomes das instrues.................................................... O resumo das instrues............................................................................ Captulo 4 - As Primeiras Exploraes (I/OS e Timers)......................... Introduo................................................................................................... Teoria e recursos do PIC............................................................................ Estudo das Portas....................................................................................... Estudo dos Timers....................................................................................... Conectando o PIC 16F877A - Recursos Avanados 14 14 14 14 14 15 15 16 16 18 19 19 22 23 24 24 24 24 26 26 26 27 27 27 29 30 30 30 31 31 31 31 31 31 32 32 32 32 32 32 35 36 38 38 39 39 42 42 42 42 47

11
Lgica do exemplo....................................................................................... Esquema eltrico......................................................................................... Fluxograma.................................................................................................. Cdigo.......................................................................................................... Dicas e comentrios..................................................................................... Exerccios propostos.................................................................................... Captulo 5 - Varredura de Display de Quatro Dgitos................................... Introduo..................................................................................................... Teoria e recursos do PIC.............................................................................. Lgica do exemplo........................................................................................ Esquema eltrico.......................................................................................... Fluxograma................................................................................................... Cdigo.......................................................................................................... Dicas e comentrios..................................................................................... Exerccios propostos.................................................................................... Capitulo 6-Operao com Display de Cristal Lquido (LCD)................... Introduo..................................................................................................... Teoria e recursos do PIC.............................................................................. Inicializao do LCD..................................................................................... Comandos do LCD..................................................................................... Lgica do exemplo...................................................................................... Esquema eltrico........................................................................................ Fluxograma................................................................................................. Cdigo......................................................................................................... Dicas e comentrios.................................................................................... Exerccios propostos................................................................................... Capitulo 7 Conversor Analgico-Digital Interno................................ Introduo................................................................................................... Teoria.......................................................................................................... Recursos do PIC......................................................................................... Lgica do exemplo...................................................................................... Esquema eltrico......................................................................................... Fluxograma................................................................................................. Cdigo......................................................................................................... Dicas e comentrios.................................................................................... Exerccios propostos................................................................................... Capitulo 8 - Conversor Analgico-Digital POR RC................................. Introduo..................................................................................................... Teoria e recursos do PIC.............................................................................. Lgica do exemplo........................................................................................ Esquema eltrico........................................................................................... Fluxograma.................................................................................................... Cdigo........................................................................................................... Dicas e comentrios...................................................................................... Exerccios propostos..................................................................................... Captulo 9 - Os Mdulos CCP(Capture/Compare/PWM)........................... Introduo...................................................................................................... Teoria e recursos do PIC............................................................................... Modo Capture................................................................................................. Modo Compare............................................................................................... Modo PWM..................................................................................................... Lgica do exemplo......................................................................................... Esquema Eltrico........................................................................................... Conectando o PIC 16F877A - Recursos Avanados 55 56 57 59 65 65 67 67 67 69 71 72 76 95 95 96 96 96 98 100 104 105 106 110 127 127 128 128 128 130 137 137 138 140 148 148 149 149 149 151 153 154 156 169 169 170 170 170 171 172 174 179 180

12
Fluxograma..................................................................................................... Cdigo............................................................................................................ Dicas e comentrios....................................................................................... Exerccios propostos...................................................................................... Captulo 10 - Trabalhando com as Memrias No-Volteis..................... Introduo...................................................................................................... Teoria e Recursos do PIC............................................................................. Escrevendo na EPROM (Dados).................................................................. Lendo a EPROM (Dados)............................................................................. Escrevendo na FLASH (Programa)............................................................... Lendo a FLASH (Programa).......................................................................... 2 Tratando a interrupo de final de escrita na E PROM e FLASH................. 204 Lgica do exemplo......................................................................................... Esquema eltrico........................................................................................... Fluxograma.................................................................................................... Cdigo............................................................................................................ Dicas e Comentrios...................................................................................... Exerccios propostos...................................................................................... Captulo 11-Comunicao Serial 1 - SPI e I C........................................... 240 Introduo...................................................................................................... Teoria e recursos do PIC para SPI................................................................ 2 Teoria para I C............................................................................................... 246 Condio de Start.......................................................................................... Condio de Stop.......................................................................................... Condio de Re-Start.................................................................................... Condio de Acknowledge (ACK)................................................................. Transmisso de endereo............................................................................. Transmisso de dados.................................................................................. Pausas.......................................................................................................... Diagramas de tempo..................................................................................... 2 Recursos do PIC para I C............................................................................. 253 Modo Slave.................................................................................................... Modo Master.................................................................................................. Lgica do exemplo......................................................................................... Esquema eltrico........................................................................................... Fluxograma.................................................................................................... Cdigo........................................................................................................... Dicas e comentrios...................................................................................... Exerccios propostos..................................................................................... 240 240 247 247 248 248 249 249 249 249 253 259 266 268 269 274 297 297
2

181 183 199 199 200 200 200 202 203 203 204 205 206 207 212 239 239

Captulo 12 - Comunicao Serial 2 USART......................................... Introduo.................................................................................................... Teoria........................................................................................................... Modo assncrono......................................................................................... Modo sncrono............................................................................................. Recursos do PIC.......................................................................................... Modo assncrono.......................................................................................... Modo sncrono.............................................................................................. Lgica do exemplo....................................................................................... Esquema eltrico......................................................................................... Fluxograma.................................................................................................. Cdigo......................................................................................................... Dicas e comentrios.................................................................................... Exerccios propostos.................................................................................... Conectando o PIC 16F877A - Recursos Avanados

299 299 299 299 301 302 306 307 309 310 311 313 327 327

13
Captulo 13-Outras Caractersticas.......................................................... 328

Introduo.................................................................................................... 328 Comunicao paralela (PSP).328 Watchdog Tirner (WDT)..330 Power-on Reset (POR)331 Power-upTimer(PWRT)...331 Oscilator Start-upTimer (OST)331 Brown-out Reset (BOR).................................................................... 332 SLEEP (Power-downMode)......................................................................... 332 Controle de Resets...................................................................................... 333 Oscilador...................................................................................................... 333 Sistema de proteo do cdigo (Code Protection)...................................... 335 Registradoras de identificao (IDs)............................................................ 335 Sistema de emulao In-Circuit (Debugger Mode)...................................... 335 Proteo de escrita interna da FLASH........................................................ 336 Gravao In-Circuit (ICSP).......................................................................... 336 Gravao em baixa tenso (Low Voltage Programiriing)............................ 336
Capitulo 14 - Implementando um Sistema de Medio de Temperatura............. 338

Inroduo..................................................................................................... O sistema..................................................................................................... O sensor de temperatura............................................................................. O aquecimento............................................................................................. O resfriamento............................................................................................. Comunicao serial...................................................................................... Consideraes gerais................................................................................... Esquema eltrico.......................................................................................... Fluxograma................................................................................................... Cdigo.......................................................................................................... Apndice A-Detalhamento dos Registradores Especiais (SFRS).......... Introduo..................................................................................................... Agrupamento e localizao........................................................................... Resumo e condies aps reset................................................................... Apndice B - Set de Instrues Completo (para 14 bits)......................... Apndice C - Diretrizes da Linguagem MPASWI....................................... Apndice D-Instrues Especiais............................................................... Apndice E-Operadores do Compilador..................................................... Apndice F - Esquema Eltrico da Placa Proposta (McLab2).................. ndice Remissivo........................................................................................... Referncias Bibliogrficas...........................................................................

338 338 338 339 339 339 340 340 341 346 379 379 379 406 409 430 454 456 458 462 466

Conectando o PIC 16F877A - Recursos Avanados

14

Conectando o PIC

1
Introduo
Nossos objetivos
Quando criamos nossa primeira obra sobre este tema, o livro "Desbravando o PIC",dedicamos muitas horas de trabalho para que tudo sasse conforme nosso intento e que o sucesso alcanado por essa literatura seja o reconhecimento da qualidade do nosso trabalho. Entretanto, era nossa inteno, desde o comeo, que a literatura disponvel para o PIC fosse muito mais abrangente. O objetivo deste segundo livro exatamente este: complementar o conhecimento dos usurios do PIC. Enquanto o primeiro destina-se ao aprendizado da linguagem assembly, utilizando-se para isso dos recursos disponveis no PIC16F628A, nossa inteno agora aprimorar seus conhecimentos nos demais recursos da famlia PIC, alm da integrao com perifricos prticos e totalmente necessrios nos dias de hoje, como varredura de displays, LCD e comunicao RS-232, Com esses conhecimentos, seus projetos podero dar um salto evolutivo em relao aos recursos empregados, possibilitando uma melhor interface com o usurio e o mundo exterior de uma forma geral. Com os novos recursos do PIC, seus programas ficaro menores e mais eficientes, seus circuitos mais enxutos e robustos, seus sistemas muito mais avanados e poderosos. A partir de agora, seus limites sero sua dedicao e criatividade.

Pr-requisitos sugeridos
Entretanto, tudo isso exige um conhecimento prvio. Por isso, para um bom desempenho neste treinamento, necessrio que voc j tenha conhecimento da linguagem assembly do PIC, assim como as ferramentas de trabalho: o MpLab e um sistema de gravao. Como j dissemos, nossa inteno no o aprendizado da programao bsica, mas sim a explorao de recursos avanados e os sistemas complementares. Caso voc ainda no domine a linguagem, recomendamos a leitura da obra "Desbravando o PIC", tambm publicado pela Editora rica.

A didtica do sistema
Mais uma vez houve, de nossa parte, grande empenho em relao didtica e ordem cronolgica aplicada ao texto. Consideramos essa sistemtica muito importante para o seu desempenho, principalmente numa aplicao autodidata.

Conectando o PIC 16F877A - Recursos Avanados

15

Desta vez resolvemos dividir o conhecimento em quatro grandes partes:

Introduo
Esta parte ser destinada ao esclarecimento das caractersticas do PIC utilizado como base no estudo. Antes de nos aprofundarmos sobre os recursos, devemos conhecer bem todas as facetas do PIC em questo, tais como seus registradores especiais, caractersticas eltricas, pinagem, etc.

Prtica
Todas as funes e recursos estudados esto divididos em dez captulos prticos. Cada um desses captulos possui uma estruturao padronizada, baseada nos seguintes tpicos: Introduo: Explicaes gerais sobre os assuntos estudados; Teoria: Quando necessrio, detalha o embasamento terico obrigatrio para o entendimento de assunto em questo; Recursos do PIC: Detalhamento dos recursos do PIC que sero utilizados nos exemplos expostos, com a explicao do funcionamento, registradores envolvidos, etc. Muitas vezes esse tpico pode estar agrupado com o anterior; Lgica do exemplo: Explicar qual a lgica utilizada para a montagem do programa de exemplo; Esquema eltrico: Apresenta o esquema eltrico necessrio para a implementao do programa, Esse esquema totalmente compatvel com o hardware apresentado no Apndice F(McLab2), porm apresenta somente os elementos relacionados com o captulo em questo; Fluxograma: Este tpico apresentar o fluxograma de operao para complementar a lgica apresentada anteriormente e facilitar o entendimento do exemplo; Cdigo: O cdigo propriamente dito, em assembly, para o exemplo do captulo; Dicas e comentrios: Dicas, comentrios importantes e demais desdobramentos resultantes da utilizao do exemplo apresentado; Exerccios propostos: Outros problemas e questes que podem ser discutidos e resolvidos com os recursos j aprendidos Um fato importante que, com essa sistemtica, todos os tpicos relacionados a um determinado assunto encontram-se agrupados no mesmo captulo, desde o embasamento terico at o exemple estudado e os exerccios propostos. Desta maneira, cada captulo torna-se independente dos demais, podendo ser estudado separadamente.

Projeto final
Ao trmino dos captulos prticos ser apresentado um projeto real envolvendo a medio de temperatura, com atuadores para aquecimento e resfriamento. Trata-se de um exemplo capaz de utilizar os recursos adicionais da placa apresentada no Apndice F (McLab2), baseando-se nas prticas aprendidas durante o treinamento.

Conectando o PIC 16F877A - Recursos Avanados

16
Apndices
Como j conhecemos as caractersticas marcantes de nossos leitores, os apndices tornaram-se obrigatrios em uma boa literatura didtica. Eles lhe sero de grande valia quando voc se transformar em um programador dedicado, pois tornam-se fontes de consulta permanente. Desta forma, tentamos colocar nos apndices informaes teis ao dia-a-dia do programador, seguindo, sempre que possvel a formatao e os termos utilizados nas literaturas tcnicas da prpria Microchip

. Padres textuais
Para facilitar o entendimento deste livro, alguns padres textuais foram utilizados: Itlico Termo em lngua estrangeira que ainda no foi popularmente adotado no Brasil, Nome de registrador, bit ou pino. Nome do registrador e nome do(s) bit(s) interno(s).

Negrito Registrador<bit>

Conectando o PIC 16F877A - Recursos Avanados

17
Anotaes

__________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________

Conectando o PIC 16F877A - Recursos Avanados

18

Conectando o PIC

2
O PIC 16F877A
Para podermos conhecer os demais recursos da famlia PIC, devemos adotar como base de nossos estudos um modelo extremamente poderoso que agrupe de uma s vez o maior nmero possvel de recursos disponveis. Desta vez escolhemos trabalhar com o modelo 16F877A. Vejamos agora o porqu: Micro controlador de 40 pinos, o que possibilita a montagem de um hardware complexo e capaz de interagir com diversos recursos e funes ao mesmo tempo; Via de programao com 14 bits e 35 instrues 33 portas configurveis como entrada ou sada; 15 interrupes disponveis; Memria de programao E PROM FLASH, que permite a gravao rpida do programa diversas vezes no mesmo chip, sem a necessidade de apag-lo por meio de luz ultravioleta, como acontece nos Microcontroladores de janela; Memria de programa com 8kwords, com capacidade de escrita e leitura pelo prprio cdigo interno; Memria E PROM (no-voltil) interna com 256 bytes; Memria RAM com 368 bytes; Trs Timers (2x8 bits e 1x16 bits); Comunicaes seriais: SPI, PC e USART; Conversores analgicos de 10 bits (8x) e comparadores analgicos (2x); Dois mdulos CCP: Capture, Compare e PWM; Programao in-circuit (alta e baixa tenso); Power-on Reset (POR) interno; Brown-out Reset (BOR) interno. A grande vantagem da famlia PIC que todos os modelos possuem um set de instrues bem parecido, assim como tambm mantm muitas semelhanas entre suas caractersticas bsicas. Desta maneira ao conhecermos e estudarmos o PIC 16F877A estaremos nos familiarizando com todos os Microcontroladores da Microchip, o que tornar a migrao para outros modelos muito mais simples. Os recursos aqui estudados encontram-se disponveis em diversos outros modelos. Conectando o PIC 16F877A - Recursos Avanados
2 2

19

Nomenclatura dos pinos


Para entendermos melhor o significado de cada nomenclatura utilizada para identificao dos pinos, montaremos uma tabela onde descreveremos detalhes da sua utilizao.

Nm. Nome do Pino Pino OSC1/CLKIN OSC2/CLKOUT 13 14

I/O/P

Tipo

Descrio

I O

Entrada para cristal. CMOS(4) Entrada para osciladores externos. (hbridos ou RC) Sada para cristal. Os cristais ou ressonadores devem ser ligados ao pinos OSC1 e OSC2. Sada com onda quadrada em da freqncia imposta em OSC1 quando em modo RC. Essa freqncia equivale aos ciclos de mquina internos.

ST/

Conectando o PIC 16F877A - Recursos Avanados

20
Nm. I/O/ Pino P

Nome do Pino MCLR/Vpp Vss vdd RA0/AN0 RA1/AN1 RA2/AN2/ Vref-/CVref RA3/AN3/VREF+ RA4 / T0CKI / C1OUT RA5/SS/AN4/ C2OUT

Tipo ST TTL TTL TTL TTL ST

Descrio Master Clear (reset) externo. 0 microcontrolador s funciona quando este pino encontra-se em nvel alto. Entrada para tenso de programao (13V). GND. Alimentao positiva. PORTA (l/Os digitais bidirecionais e sistema analgico): RA0: I/O digital ou entrada analgica ANO. RA1 : I/O digital ou entrada analgica AN1 . RA2: I/O digital ou entrada analgica AN2 ou tenso negativa de referncia analgica. RA3: I/O digital ou entrada analgica AN3 ou tenso positiva de referncia analgica. RA4: I/O digital (quando sada open drayn, isto , no consegue impor nvel alto) ou entrada externa do contador TMR0 ou sada do comparador 1 . RA5: I/O digital ou entrada analgica AN4 ou habilitao externa (slave select) para comunicao SPI ou sada do comparador 2. PORTB (l/Os digitais bidirecionais). Todos os pinos deste PORT possuem pull-up interno que podem ser ligados/ desligados pelo software: RB0: I/O digital com interrupo externa. RB1: I/O digital. RB2: I/O digital. RB3: I/O digital ou entrada para programao em baixa tenso (5V). RB4: I/O digital com interrupo por mudana de estado. RB5: I/O digital com interrupo por mudana de estado. RB6: I/O digital com interrupo por mudana de estado ou clock da programao serial ou pino de in-circuit debugger. RB7: I/O digital com interrupo por mudana de estado ou data da programao seriai ou pino de in-circuit debugger. PORTC (l/Os digitais bidirecionais): RC0:I/O digital ou sada do oscilador externo para TMR1 ou entrada de incremento para TMR1 . RC1: I/O digital ou entrada do oscilador externo para TMR1 ou entrada do Capture2 ou sadas para Compare2/PWM2. RC2: I/O digital ou entrada do Capturei ou sadas para Compare1/PWM1. RC3: I/O digital ou entrada/sada de clock para comunicao 2 serial SPI / I C. RC4: I/O digital ou entrada de dados para SPI ou via de 2 dados (entrada/sada) para I C.

l/p

12/3 p 1 11/3 p 2 2 3 4 5 6 l/O I/O l/O I/O I/O

I/O

TTL

RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC

33 34 35 36 37 38 39

I/O I/O I/O

TTL/ST(1) TTL TTL TTL TTL TTL TTL/ST

RB7/PGD

40

I/O TT17ST(2)

RCO/T10SO/ T1CKI RC1/T10SI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA

15 16 17 18 23

I/O l/O I/O I/O I/O

ST ST ST ST ST

Conectando o PIC 16F877A - Recursos Avanados

21
Nome do Pino RC5/SDO RC6/TX/CK Nm. Pino 24 25

I/O/P I/O I/O

Tipo ST ST

Descrio RC5: I/O digital e sada de dados para SPI. RC6: I/O digital ou TX (transmisso) para comunicao USART assncrona ou clock para comunicao sncrona. RC7: I/O digital ou RX (recepo) para comunicao USART assncrona ou data para comunicao sncrona. PORTD (I/Os digitais bidirecionais) ou porta de comunicao paralela.

RC7/RX/DT

26

I/O

ST

RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7

19 20 21 22 27 28 29 30

I/O I/O I/O I/O I/O I/O I/O I/O

(3)

TTL/ST (3) TTL/ST (3) TTL/ST (3) TTL/ST (3) TTL/ST (3) TTL/ST (3) TTL/ST (3) TTL/ST

RD0: I/O digital ou dado 0 (comunicao paralela). RD1: I/O digital ou dado 1 (comunicao paralela). RD2: I/O digital ou dado 2 (comunicao paralela). RD3: I/O digital ou dado 3 (comunicao paralela). RD4: I/O digital ou dado 4 (comunicao paralela). RD5: I/O digital ou dado 5 (comunicao paralela). RD6: I/O digital ou dado 6 (comunicao paralela). RD7: I/O digital ou dado 7 (comunicao paralela).

PORTE (I/OS digitais bidirecionais e sistema analgico): RE0/RD/AN5 8 I/O


(3)

TTL/ST
(3)

RE0: I/O digital ou controle de leitura da porta paralela ou entrada analgica AN5. RE1: I/O digital ou controle de escrita da porta paralela ou entrada analgica AN6. RE2: I/O digital ou habilitao externa da porta paralela ou entrada analgica AN7.

RE1/WR/AN6

I/O

TTL/ST
(3)

RE2/CS/AN7

10

I/O

TTL/ST

Legenda:

l O I/O P TTL ST

= = = = = = =

Input (entrada) Output(sada) Input/Output (entrada ou sada) Power (alimentao) No-utilizado Entrada tipo TTL Estrada tipo Schmitt Trigger

Notas: (1) Esta entrada do tipo ST, somente quando configurado como interrupo externa. (2) Esta entrada do tipo ST, somente durante o modo de programao serial. (3) Esta entrada do tipo ST, quando configurado como l/O de uso geral e TTL quando.usado em modo de porta paralela. (4) Esta entrada ST quando em modo RC e CMOS nos demais casos.

Conectando o PIC 16F877A - Recursos Avanados

22
A estruturao interna
J que estamos nos aprofundando nas caractersticas do PIC 16F877A, que tal darmos uma olhadinha em seu interior? O que h por dentro deste componente? Como sua estrutura? O diagrama de blocos, mostrado a seguir, detalhar todos os perifricos e comunicaes que compem esse to poderoso microcontrolador:

No diagrama de blocos (retirado do data sheet original da Microchip) podem ser visualizadas as diversas partes que compem o microcontrolador PIC16F877A. No centro encontramos a ULA (em ingls: ULA), que a unidade de processamento e est diretamente ligada ao registrador Work (W reg). No canto superior esquerdo temos a memria de programa (FLASH) saindo desse bloco temos um barramento de 14 bits (Program Bus). Mais a direita est a memria de dados (RAM). Ela j possui um carregamento de 8 bits (Data Bus). Totalmente do lado direito encontram-se os PORTs, de PORTA a

Conectando o PIC 16F877A - Recursos Avanados

23

PORTE. Na parte inferior podem ser encontrados os demais perifricos, tais como a E2PROM (memria de dados no-voltil), os timers (TMR0, TMR1 e TMR2), os A/Ds de 10 bits, os modos CCP (Compare, Capture e PWM), as comunicaes seriais (SPI, I C e USART), os comparadores e a tenso de referncia. Observe que, entre todos os perifricos, a comunicao feita atravs de um barramento de oito vias. Um pouco mais ao centro, podemos encontrar ainda o registrador de status (STATUS reg), onde algumas informaes importantes sobre as operaes aritmticas da ULA ficam armazenadas, e os demais SFRs (registradores especiais). Na parte superior temos ainda o contador de linha de programa (Program Counter) e a pilha de oito nveis (Stack). Temos ainda os circuitos internos de reset, POR, BOR, osciladores, Watchdog Timer (WDT) e sistema de programao.

Os ciclos de mquina
Para quem j trabalha com Microcontroladores, possivelmente este assunto j conhecido, mas, devido sua grande importncia, achamos melhor revis-lo e, quem sabe, aperfeioar seus conhecimentos. O bsico que deve ser conhecido que, neste microcontrolador (assim como na maioria dos modelos da linha PIC), o clock interno (CKINT) equivalente ao clock externo (CKEXT ou FOSC) dividido por 4. Com isso teremos:

CKINT = CKEXT _______ 4


Desta forma, quando trabalhamos, por exemplo, com um cristal de 4 MHz, o PIC estar trabalhando internamente com uma freqncia de 1 MHz. Para ns, mais importante que o clock interno, o perodo dessa freqncia (o inverso da mesma), que equivalente ao tempo de durao de um ciclo de mquina, popularmente chamado de CM ou TCY. Assim sendo teremos:

TCY =

1 ______ CKINT

Continuando com nosso exemplo de 4 MHz externo, nosso ciclo de mquina (CM) ser de 1s. Mas, afinal de contas, qual o motivo da necessidade da diviso do clock externo por 4? Isso pode ser visualizado e explicado quando entendermos o funcionamento interno do processador. Para a execuo de uma nica instruo pelo processador, vrias operaes precisam ser realizadas. Como no existe capacidade de processamento paralelo, essas operaes so executadas em subciclos do ciclo de mquina, originados pela diviso do clock externo. Esses subciclos so chamados de Q1, Q2, Q3 e 04. O PC (contador de programa) incrementado automaticamente no incio de 01. Durante o decorrer dos quatro tempos (Q1 a Q4), a instruo previamente carregada para dentro da ULA executada, sendo trocadas informaes com a memria de dados e o registrador Work sempre que necessrio. Por ltimo, ao final do tempo 04, a prxima instruo (lembre-se de que o PC j foi incrementado) buscada da memria de programa e armazenada na ULA. Conectando o PIC 16F877A - Recursos Avanados

24
Essa caracterstica de buscar a informao em um ciclo de mquina e execut-la no prximo conhecida como Pipeline. Ela permite que quase todas as instrues sejam executadas em apenas um ciclo, gastando assim 1s (continuando com nosso exemplo de 4 MHz) e tornando o sistema muito mais rpido. As nicas excees referem-se s instrues que geram "saltos" no program counter (PC), como chamadas de rotinas e retornos. Ao executar essas instrues, o Pipeline deve ser primeiramente limpo para depois poder ser carregado novamente com o endereo correto, consumindo para isso 2 ciclos de mquina. O diagrama seguinte ilustra os quatro subciclos (Q1 a Q4) e o conceito de Pipeline.

A memria de programa
A memria de programa do PIC 16F877A de 14 bits do tipo FLASH, uma memria regravvel eletronicamente com escrita rpida. Uma outra caracterstica muito importante da memria de programa desse PIC que ela pode ser acessada por software, possibilitando que o programa seja reescrito dinamicamente, ou, ainda, que ela 2 seja usada como uma expanso da memria E PROM de dados. Vamos conhecer, ento, as demais caractersticas dessa memria:

Vetor de reset
Trata-se do primeiro endereo da memria de programa que ser executado aps um Start-up ou Reset. Neste modelo, o Vetor de Reset encontra-se no endereo 0x0000.

Vetor de interrupo
Este PIC possui 15 tipos de interrupes diferentes. Entretanto, quando qualquer uma delas acontece (se todas as condies necessrias forem favorveis), o programa ser desviado para um ponto especfico, que denominado Vetor de Interrupo. Como na maioria dos Microcontroladores PIC, para o modelo 16F877A este vetor encontra-se na posio 0x0004.

Tamanho da memria e pginas


Este PIC possui uma memria de 8kwords, isto , 8.192 endereos diferentes. Quando falamos da memria de programa sempre nos referimos ao termo WORD e nunca a BYTE, isso porque esta memria de 14 bits, enquanto um byte possui somente 8 bits.

Conectando o PIC 16F877A - Recursos Avanados

25
No entanto, o tamanho desta memria gera um grande problema de gerenciamento. Relembremos o funcionamento do processador. Cada instruo carregada atravs do endereo armazenado no PC (program counter), correto? Assim sendo, para podermos acessar os 8.192 endereos diferentes, necessitaremos de um PC com 13 bits. Isso resolvido por meio do desmembramento do PC em dois registradores (FSRs): PCL e PCLATH. At ai tudo bem. Mas vamos checar outros casos que interferem no gerenciamento da memria de programa, como quando utilizamos as instrues CALL e GOTO. Essas instrues vinculam ao seu Opcode (cdigo de mquina) de 14 bits e o endereo para onde o programa deve ser desviado. Vejamos esses Opcodes mais detalhadamente: Instruo CALL GOTO Opcode 100 kkk kkkk kkkk 101 kkk kkkk kkkk Observaes kkk kkkk kkkk equivale ao endereo de destino

Conhecendo os detalhes dos Opcodes (todos os Opcodes podem ser encontrados no apndice B) percebemos que s existem 11 bits para o endereo de destino da instruo. Ora, mas com 11 bits s conseguimos gerenciar 2 K de memria. Ento como que podemos usar essas instrues com toda a memria de programa? Para resolver esse problema foi criado o conceito de paginao. A memria total foi ento dividida em vrias pginas (no nosso caso 4) de 2 K cada uma. Dentro de cada pgina as instrues CALL e GOTO funcionam perfeitamente, pois possuem capacidade de gerenciamento para esse tamanho. O problema ento passou a existir somente quando quisermos utilizar essas instrues com um endereo de destino localizado em outra pgina. A soluo para isso configurarmos manualmente os 2 bits faltantes localizado nas posies 3 e 4 do PCLATH. Estes bits passam, ento, a operar como chaves seletoras da pgina de programa ativa no momento.

Para podermos ento utilizar as instrues CALL e GOTO entre pginas, devemos primeiro selecionar a pgina correta do endereo de destino atravs dos bits PCLATH<4:3>. O diagrama anterior demonstrou essa seleo. Uma dica interessante que a diretriz do compilador denominada PAGESEL pode ser utilizada para selecionar facilmente a pgina correta para um destino qualquer. Consulte o apndice C para obter mais informaes.

Conectando o PIC 16F877A - Recursos Avanados

26
Pilha (Stack)
A pilha um local, fisicamente separado da memria de programa, onde sero armazenados os endereos de retorno quando utilizarmos instrues de desvio para rotinas de chamada. Quando o programa desviado para o comeo de uma rotina atravs da instruo correta (CALL ou interrupo), o endereo seguinte ao ponto que estava sendo executado armazenado na pilha para que, ao fim da rotina, o programa possa retornar novamente ao ponto em que estava. Esse PIC possui uma pilha de oito nveis, isto , possvel o armazenamento de oito endereos de retorno, possibilitando oito desvios consecutivos. Caso se tente chamar um nmero de rotinas maior que o tamanho da pilha, o endereo de retorno mais antigo ser perdido. Outra caracterstica que devemos saber sobre a pilha o seu tamanho em bits. Esse tamanho representa a quantidade de endereos que o sistema de retorno automtico poder gerenciar. No nosso caso, a pilha armazena endereos de 13 bits, o que suficiente para o gerenciamento de at 8 K de memria de programa. Como nosso PIC possui exatamente 8 K, os retornos atravs da pilha no apresentam problemas com a paginao da memria de programa.

Mapa da memria de programa

A memria de dados voltil (RAM)


A memria de dados tambm conhecida como RAM e serve para guardar as variveis e os registradores utilizados pelo programa. Esta memria armazena dados de 8 bits e voltil, ou seja, quando o PIC desenergizado, ela automaticamente perdida. Podemos dividi-la em dois grupos que sero estudados a seguir: Registradores especiais e Registradores de uso geral. Conectando o PIC 16F877A - Recursos Avanados

27
Registradoras especiais
Nesta regio da memria encontram-se todos os registradoras especiais, denominados SFRs (Special Functions Registers) e que so utilizados pelo microcontrolador para a execuo do programa e processamentos da ULA. Esses registradores podem ser escritos e lidos tanto pelo usurio quanto pelo hardware e servem tambm para a configurao de muitas funes e para a utilizao de todos os perifricos. O mapa da memria apresentar a posio de todos os registradores especiais e seus devidos nomes. Para um melhor detalhamento de suas propriedades e funes especficas, o apndice A deve ser consultado.

Registradores de uso geral


Trata-se de uma rea destinada ao armazenamento de variveis definidas pelo usurio para serem escritas e lidas pelo programa. O PIC 16F877A possui 368 bytes disponveis para uso geral.

Tamanho da memria e bancos


A arquitetura do nosso PIC est preparada para operar com uma RAM de at 512 bytes. Entretanto, verificaremos que nem toda memria est disponvel ao usurio. So 368 bytes para uso geral, 77 bytes para registradores especiais (sendo alguns espelhados) e 19 indisponveis. Os 48 endereos restantes (no fisicamente implementados) equivalem a posies espelhadas de 16 endereos vlidos (Banco 0). Entenda por termo espelhado como um registrador nico que pode ser acessado por mais de um endereo. Isso pode ser facilmente visualizado atravs do mapa da memria de dados, onde vemos um mesmo SFR aparecendo em diversos bancos (os bancos sero explicados em seguida). Esse espelhamento tambm acontece com a regio inferior da memria de uso geral, para facilitar a vida do programador em relao a variveis que so constantemente usadas, sem a necessidade de troca de banco. Quanto aos endereos indisponveis, tratam-se de posies no implementadas pela Microchip e que, no caso de uma leitura, retornaro somente zeros (0). Muito bem, ao detalharmos o tamanho da memria de dados surgimos com o termo Banco. Mas, afinal, o que isso significa? O mesmo tipo de problema de gerenciamento de endereos que enfrentamos ao trabalharmos com a memria de programas, surge novamente para a memria de dados. Vejamos os Opcodes de algumas instrues que trabalham com a RAM:
Instruo MOVF MOVWF

Opcode 00 1000 dfff ffff 00 0000 1fff ffff

Observaes
d= destino fffffff= endereo da RAM

Fica fcil percebermos que s existem 7 bits para endereamento de todos os registradores. Acontece que, com este nmero de bits, s podemos gerenciar 128 endereos diferentes. Por isso, a Microchip dividiu a memria de dados em grupos de 128 bytes, aos quais deu o nome de Banco. diferenciando assim da nomenclatura utilizada para a memria de programa (Pgina). No caso do nosso PIC, a memria de dados composta por quatro bancos. De maneira anloga ao sistema utilizado na memria de programa, aqui tambm os demais bits (2) necessrios para o

Conectando o PIC 16F877A - Recursos Avanados

28
complemento do gerenciamento so utilizados como chaves seletoras para o banco atual e encontram--se no registrador STATUS<RP1:RP0>. Devido a essa estruturao, antes de utilizarmos qualquer comando que trabalhe com os registradores (RAM) devemos comutar para o banco onde o mesmo se encontre. Como j foi comentado, registradores de uso muito comum podem ser armazenados nos endereos de 070h a 07Fh, para que possam ser acessados diretamente em qualquer um dos quatro bancos disponveis (vide mapa da memria).

Para a seleo do banco de memria existe tambm uma diretriz do compilador que pode ser pesquisada no apndice C: BANKSEL. J que estamos falando dos bancos de memria, existe um outro caso onde a seleo do banco feita de maneira diferente. Trata-se do acesso indireto atravs dos registradores FSR e INDF. Acontece que, quando acessamos a memria desta forma, o endereo do registrador desejado ser colocado em FSR, que possui 8 bits. Por isso, s falta 1 bit para complementarmos o gerenciamento. Neste caso, ento, a chave seletora de banco ser o bit STATUS<IRP>.

Conectando o PIC 16F877A - Recursos Avanados

29

Mapa da memria de dados

Memrias no-volteis (E2PROM e FLASH)


A memria no-voltil at poderia ser tratada diretamente dentro do tpico anterior, no qual falvamos da memria de dados. Entretanto, para o PIC 16F877A, o acesso a essa memria mais poderoso. Em alguns modelos de PIC, quando falamos dos recursos internos para manipulao desta

Conectando o PIC 16F877A - Recursos Avanados

30
memria, nos referimos somente a um bloco de bytes disponveis para o usurio como urna memria de dados no-voltil, conhecida como EPROM. Esse PIC possui este bloco e seu acesso feito como nos demais modelos. O que ele tem a mais ento? que o mesmo sistema de manipulao da EPROM tambm pode ser utilizado para escrever e ler na memria de programa (FLASH). Com esse poderoso recurso, podemos utilizar a memria de programa como uma expanso da EPROM, com uma outra vantagem: a memria de programa de 14 bits, enquanto a memria de dados de 8 bits. Outro benefcio desse sistema que podemos escrever na memria de programa tambm, possibilitando alterarmos o prprio software de controle. Isso possibilita tcnicas e recursos extremamente avanados. Mas cuidado! Este benefcio tambm pode ser uma arma letal, pois podemos alterar o programa erroneamente, travando o sistema permanentemente. A nica diferena para acessarmos uma memria ou a outra o bit de seleo denominado EECON1< EEPGD> As tcnicas e os exemplos para acessarmos estas memrias sero vistas no captulo 10. No momento, basta conhecermos as caractersticas de ambas:

Caractersticas Tipo Tamanho Acesso

Dados 8 bits 256 bytes EEPGD=0

Programa 14 bits 8 K (menos o programa) EEPGD=1

As interrupes
Este PIC possui um total de 15 interrupes diferentes, Entretanto, como nos demais modelos, todas geraro o desvio do programa para o mesmo vetor de interrupo (0004h), desde que devidamente configuradas para isso. Essas interrupes podem ser divididas em dois grupos: as convencionais (as mesmas existentes em modelos menores, como o 16F84), e as de perifricos, que esto diretamente relacionadas aos demais perifricos existentes neste modelo. As trs interrupes descritas a seguir so as convencionais, enquanto as demais so as de perifricos.

Interrupo de Timer 0
Esta interrupo acontece sempre que o contador TMR0(Timer 0) estoura, ou seja, como ele um contador de 8 bits, sempre que ele passar de 0xFF para 0x00. Esta interrupo utilizada normalmente para a contagem de tempo. Como ela pode acontecer a qualquer momento, a contagem de tempo fica precisa, no dependendo de anlises constantes durante o programa para garantir que o tempo seja contado. Os Timers sero estudados no captulo 4.

Interrupo externa
Esta interrupo gerada por um sinal externo ligado ao pino RB0, caso ele esteja configurado como entrada. Desta maneira, podemos identificar e processar imediatamente um sinal externo. Ela utilizada para diversas finalidades, corno por exemplo, para a comunicao entre micros, garantindo o sincronismo, para o reconhecimento de boto ou outro sinal cio sistema que necessite de uma ao imediata.

Conectando o PIC 16F877A - Recursos Avanados

31
Esta interrupo pode ser configurada para a borda de subida ou para a borda de descida.

Interrupo por mudana de estado


Ao contrrio da interrupo externa, a interrupo por mudana de estado acontece em ambas as bordas (subida e descida). Na verdade, esta interrupo sensvel a diferena de nvel existente entre o pino e o latch interno. Esta interrupo est relacionada s portas RB4, RB5, RB6 e RB7, simultaneamente. Por isso, se estas portas forem configuradas como entradas, a mudana de estado em qualquer uma delas ir gerar a interrupo. Como o latch s atualizado quando a porta lida, a leitura obrigatria para que o evento da interrupo pare de ocorrer. Esse tipo de interrupo pode ser utilizado, por exemplo, para criar um sincronismo com a rede de 60 Hz, para o controle de um triac ou outro sistema semelhante.

Interrupo da porta paralela (PSP)


Esta interrupo est diretamente ligada a porta paralela do tipo escravo (PSP Parallel Slave Port) e acontece sempre que uma operao de escrita ou leitura desta porta completada. O estudo completo deste recurso ser realizado no captulo 13.

Interrupo dos conversores A/D


Esta interrupo acontece quanto uma converso A/D (Analgica/Digital) completada. O estudo completo deste recurso ser realizado no captulo 7.

Interrupo de recepo da USART


Esta interrupo indica o trmino da recepo de um dado pela USART (Universal Synchronous Asynchronous ReceiverTransmitter). O estudo completo deste recurso ser realizado no captulo 12.

Interrupo de transmisso da USART


Esta interrupo indica o esvaziamento do buffer relacionado transmisso de um dado pela USART (Universal Synchronous Asynchronous Receiver Transmitter). O estudo completo deste recurso ser realizado no captulo 12.

Interrupo da comunicao serial (SPI e I2C)


O segundo sistema de comunicao serial deste PIC, alm da USART, denominado MSSP (Master Synchronous Serial Port), e possui dois modos de 2 comunicao: SPI e I C. Sempre que um dado transmitido ou recebido por esta porta serial, esta interrupo acontecer. Ela tambm acontecer em muitas outras situaes, que sero estudadas no captulo 11.

Interrupo do CCP1 (Capture/Compare/PWM)


Esta interrupo est vinculada ao primeiro sistema CCP, que engloba os seguintes recursos: Capturei, Compare! e PWM1. O estudo completo deste recurso ser realizado no captulo 9.

Conectando o PIC 16F877A - Recursos Avanados

32
Interrupo do Timer 2
Esta interrupo acontecer sempre que o Timer 2 (TMR2) acrescido do seu Postscaler estourar. Este um contador de 8 bits que possu um Prescaler para incrementar o registrador e um Postscaler para gerar a interrupo. Os Timers sero estudados no captulo 4.

Interrupo do Timer 1
Esta interrupo acontecer sempre que o Timer 1 (TMR1) estourar. Este um contador de 16 bits. Os Timers sero estudados no captulo 4.

Interrupo de Um de escrita na E2PROM/FLASH


Como j foi visto anteriormente, alguns PICs possuem uma memria EPROM interna. Esta interrupo serve para detectarmos o final de uma rotina de escrita nesta memria. A utilizao da interrupo no obrigatria para que a escrita funcione, mas, 2 como a E PROM lenta na hora de escrever, em alguns sistemas sua utilizao pode ser necessria para evitar que o programa pare durante a escrita na EPROM. A interrupo tambm vlida para a memria FLASH (programa).

Interrupo de coliso de dados (Bus Collision)


Esta interrupo serve para Informar o sistema sobre colises de dados na 2 comunicao I C. O estudo completo deste recurso ser realizado no captulo 11.

Interrupo do CCP2 (Capture/Compare/PWM)


Esta interrupo est vinculada ao segundo sistema CCP, que engloba os seguintes recursos: Capture2, Compare2 e PWM2. O estudo completo deste recurso ser realizado no captulo 9.

Interrupo dos comparadores


Esta interrupo est diretamente ligada a mudar de estado dos comparadores internos do PIC. Este recurso no ser estudado em detalhes no decorrer deste livro.

Operando com as interrupes


O primeiro conceito que devemos entender para o uso das Interrupes que, para elas realmente acontecerem, isto , paralisarem o programa e desviarem para o vetor de interrupo, algumas questes devem ser verificadas: 1. 2. 3. Uma ao (ou evento) relacionada interrupo deve acontecer. Quando a ao acontece, o flag da interrupo marcado. Caso as chaves de habilitao da interrupo (geral e individual) estejam ligadas, o sistema ser paralisado e desviado para o vetor de interrupo.

Conectando o PIC 16F877A - Recursos Avanados

33
A ao propriamente dita exatamente o que queremos monitorar. Mas e as chaves de acesso? Tratam-se de bits especficos que servem como chaves ON/OFF para ligar e desligar as interrupes, individualmente ou em grupo. O prximo diagrama ilustra todas as chaves e flags relacionados s interrupes.

Chaves GIE PEIE T0IE INTE RBIE PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE

SRF INTCON INTCON INTCON INTCON INTCON PIE1 PIE1 PIE1 PIE1 PIE1 PIE1 PIE1

Bits 7 6 5 4 3 7 6 5 4 3 2 1 Chaves T0IF INTF RBIF PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF SRF INTCON INTCON INTCON PIR1 PIR1 PIR1 PIR1 PIR1 PIR1 PIR1 Bits 2 1 0 7 6 5 4 3 2 1

Conectando o PIC 16F877A - Recursos Avanados

34
Chaves TMR1IE EEIE BCLIE CCP2IE Flags TMR1IF EEIF BCLIF CCP2IF SRF PIE1 PIE2 PIE3 PIE4 SRF PIR1 PIR2 PIR3 PIR4 Bits 0 4 3 0 Bits 0 4 3 0

Agora que todas as chaves e flags foram demonstradas, o fluxograma seguinte ajuda a entender a lgica de tratamento de uma interrupo. Atente-se para os seguintes pontos: 1. Como a chave GIE desligada antes de desviar para o vetor de interrupo, duas interrupes no sero tratadas ao mesmo tempo, isto , uma interrupo no gerar um desvio caso outra interrupo j esteja sendo tratada. Entretanto, o flag da segunda interrupo ser marcado, e quando o tratamento da primeira terminar, o GIE ser novamente ligado (atravs da instruo RETFIE) e o sistema voltar a ser desviado para o vetor de interrupo (devido ao flag). Como todas as interrupes desviam para o mesmo ponto, necessrio testar os flags de todas as interrupes ligadas para saber qual realmente ocorreu. Como mais de uma ao vinculada s interrupes podem acontecer ao mesmo tempo, a ordem dos testes que determina a prioridade de tratamento.

2.

3.

Os flags das interrupes no so limpos automaticamente pelo sistema (exceto ADIF, TXIF e RCIF). Cabe ao usurio efetuar esta operao na rotina de tratamento da interrupo.

Conectando o PIC 16F877A - Recursos Avanados

35
Demais recursos e perifricos
Todos os demais recursos e perifricos que esto disponveis no PIC 16F877A sero detalhados e estudados no decorrer dos captulos (de 4 a 13). A tabela seguinte relaciona todos os itens a serem estudados e os respectivos captulos onde os mesmos aparecem detalhadamente. Recursos Internos do PIC Captulos Assunto Portas Porta Paralela (PSP) E2PROM (dados) FLASH (programa) Timer 0 Timer 1 Timer 2 CCP (Capture/Compare/PWM) MSSP (SPI e I C) USART Conversor A/D Interrupo de Timer 0 Interrupo de Timer 1 Interrupo de Timer 2 Interrupo Externa (RB0) Interrupo de mudana de estado (RB4...7) Interrupo da porta paralela (PSP) Interrupo dos conversores A/D Interrupo de recepo da USART Interrupo de transmisso da USART
Interrupo da comunicao MSSP (SPI e I2C)
2

10

11

12

13

Interrupo de CCP1 Interrupo de CCP2


Interrupo de fim de escrita na E2PROM/FLASH Interrupo de coliso de dados (Bus Collision)

Osciladores Sistemas de Resets (POR, PWRT e BOR) Watchdog Timer (WDT) SLEEP Code Protection Gravao In-circuit

Conectando o PIC 16F877A - Recursos Avanados

36
Outros Recursos Estudados Captulos Assunto 4 Varredura de display de 7 segmentos (4 dgitos) Operao com LCD padro Comunicao com memria E PROM externa Simulao de A/D por meio de RC Acionamento de Buzzer Entrada e sada no mesmo pino (Botes e Leds) Acionamento de motor DC (Ventilador)
2

10

11

12

13

Caractersticas eltricas
Temperatura de trabalho.......................................................................... Temperatura de armazenamento............................................................... Tenso de trabalho............................................................................................ Tenso mxima no pino VDD (em relao ao Vss}...................................... Tenso mxima no pino MCRL (em relao ao Vss).......................................... Tenso mxima no pino RA4 (em relao ao Vss)............................................. Tenso mxima nos demais pinos (em relao ao Vss)................. -55Cat+125C -65'Cat 150C 4.0Va5.5V -0.3Vat 7.5V 0at 14V 0at 8.5V

-0.3Vat (VDD + 0.3V) 1.0W 300mA 250mA 25rnA 25mA 200mA 200mA 200mA 200mA

Dissipao mxima de energia................................................................................. Corrente mxima de sada no pino Vss.................................................................. Corrente mxima de entrada no pino VDD.............................................................. Corrente mxima de entrada de um pino (quando em Vss)...................................... Corrente mxima de sada de um pino (quando em VDD)........................................ Corrente mxima de entrada do PORTA, PORTB e PORTE combinados............. Corrente mxima de sada do PORTA, PORTB e PORTE combinados................ Corrente mxima de entrada do PORTC e PORTD combinados ........................... Corrente mxima de sada do PORTC e PORTD combinados..............................

Conectando o PIC 16F877A - Recursos Avanados

37
Anotaes

__________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________
Conectando o PIC 16F877A - Recursos Avanados

38

Conectando o PIC

3
Resumo do Set de Instrues
Os termos utilizados
Para facilitar o aprendizado do set de instrues do PIC conveniente entendermos corretamente os termos utilizados na construo dos nomes das instrues e seus argumentos. Work: Trata-se de um registrador temporrio para as operaes da ULA. No assembly do PIC ele conhecido como W. Tambm comum cham-lo de acumulador. File: Referncia a um registrador (posio de memria) propriamente dito. Utilizaremos a letra F para sua representao nos nomes de instrues e f nos argumentos das mesmas. Literal: Um nmero qualquer, que pode ser escrito na forma decimal, hexadecimal ou binrio. Utilizaremos a letra L para sua representao nos nomes de instrues e k nos argumentos das mesmas. Destino: O local onde deve ser armazenado o resultado da operao. Existem somente dois destinos possveis: f, que guardar o resultado no prprio registrador passado como argumento ou w, que colocar o resultado em Work. Na verdade, na sintaxe das instrues o destino deve ser expressado pelos nmeros 0 ( w ) e 1 ( f ). No entanto, como veremos mais adiante, as letras f e w so definidas no include para facilitar a programao. Bit: Refere-se a um bit especifico dentro de um byte. Utilizaremos a leira B para sua representao nos nomes das instrues e b nos argumentos das mesmas.

Teste: Quando queremos testar o estado de um bit, para descobrirmos se ele zero ou um, Utilizaremos a letra T para represent-lo nos nomes das instrues, Skip: Significa "pulo", e utilizado para criar desvios, pulando a prxima linha. Utilizaremos a letra S para represent-lo nos nomes das instrues.

Set: Refere-se ao ato de setar um bit, isto , torn-lo equivalente a UM. Utilizaremos a letra S para represent-lo nos nomes das instrues. Clear: Refere-se ao clear de um bit, isto , torn-lo equivalente a ZERO. Utilizaremos a letra C para represent-lo nos nomes das instrues.

Zero: Algumas instrues podem gerar desvios se o resultado da operao efetuada for zero. Neste caso utilizaremos a letra Z para indicar tal condio,

Conectando o PIC 16F877A - Recursos Avanados

39

ADD: Somatria. AND: Lgica "E", CLR: Limpar, zerar (Clear). COM: Complemento. DEC: Decremento de uma unidade. INC: Incremento de uma unidade. IOR: Lgica "OU". MOV: Mover, transferir para algum lugar. RL: Rotacionar 1 bit para a esquerda (rotation left). RR: Rotacionar 1 bit para a direita (rotation right). SUB: Subtrao. SWAP: Inverso entre as partes alta e baixa de um registrador. XOR: Lgica "OU exclusivo".

A construo dos nomes das instrues


Com base nos termos demonstrados, ser muito mais fcil entender o significado de urna instruo por intermdio do seu nome, pois ele composto pela juno destes termos. Por exemplo, digamos que voc deseja decrementar o valor de um determinado registrador. A instruo que far isso composta pelos termos referentes ao que voc quer fazer: Decrementar (DEC) um registrador (F) = DECF Agora vamos fazer a anlise ao contrrio, isto , partindo do nome de urna instruo, vamos descobrir para que ela serve: DECFSZ = Decrementa (DEC) o registrador (F) e pula (S) se o resultado for zero (Z)

O resumo das instrues


O Set de instruo do PIC 16F877A exatamente o mesmo para todos os modelos de 14 bits, e composto de 35 instrues divididas em quatro grupos: operaes com registradores, operaes com literais, operaes com bits e controles,

Operaes com Registradores Instruo ADDWF ANDWF CRLF CLRW Argumentos f,d f,d f Descrio Soma W e f, guardando o resultado em d. Lgica E entre W e f, guardando o resultado em d. Limpa f. Limpa W.

Conectando o PIC 16F877A - Recursos Avanados

40
Operaes com Registradores Instruo COMF DECF DECFSZ INCF INCFSZ IORWF MOVF MOVWF RLF RRF SUBWF SWAPF XORWF Argumentos f,d f,d f,d f,d f,d f,d f,d f,d f,d f,d f,d f,d f,d Descrio Calcula o complemento de f, guardando o resultado em d. Decrementa f, guardando o resultado em d. Decrementa f, guardando o resultado em d, e pula a prxima linha se o resultado for zero. Incrementa f, guardando o resultado em d. Incrementa f, guardando o resultado em d, e pula a prxima linha se o resultado for zero. Lgica OU entre W e f, guardando o resultado em d. Move f par d. Move W para f. Rotaciona f 1 bit para esquerda, guardando o resultado em d. Rotaciona f 1 bit para direita, guardando o resultado em d. Subtrai W de f (f-W), guardando o resultado em d. Executa uma inverso em as partes alta e baixa de f,guardando o resultado em d. Lgica OU exclusivo entre W e f, guardando o resultado em d.

Operaes com literais Instruo ADDLW ANDLW IORLW MOVLW SUBLW XORLW Argumentos K K K K K K Descrio Soma k com W, guardando o resultado em W. Lgica E entre k e W, guardando o resultado em W. Lgica OU entre em k e W, guardando o resultado em W. Move k para W. Subtrai W de k (k-W), guardando o resultado em W. Lgica OU exclusivo entre k e W, guardando o resultado em W

Conectando o PIC 16F877A - Recursos Avanados

41

Operaes com Bits Instruo BCF BSF BTFSC BTFSS Argumentos f,b f,b f,b f,b Descrio Impe 0 (zero) no bit do registrador f. Impe 1 (um) no bit do registrador f. Testa o bit do registrador f, e pula a prxima linha se ele for 0 (zero). Testa o bit do registrador f, e pula a prxima linha se ele for 01(um).

Controles Instruo NOP CALL CLRWDT GOTO RETFIE RETLW RETURN SLEEP Argumentos R R K Descrio Gasta um ciclo de mquina sem fazer absolutamente nada. Executa a rotina R. Limpa o registrador WDT para no acontecer o reset Desvia para o ponto R, mudando o PC. Retorna de uma interrupo. Retorna de uma rotina, com k em W. Retorna de uma rotina, sem afetar W. Coloca o PIC em modo sleep (dormindo )para economia de energia.

Conectando o PIC 16F877A - Recursos Avanados

42

Conectando o PIC

4 4As Primeiras Exploraes (l/Os e Timers)


Introduo
O objetivo deste captulo pegarmos um pouco mais de intimidade com o PIC 16F877A. Quem aprendeu o assembly da Microchip com um PIC menor, provavelmente um de 18 pinos (16F84 ou "16F628, por exemplo), j deve ter percebido que, apesar da diferena de tamanho e quantidade de recursos, o set de instrues de todos esses modelos exatamente o mesmo. Assim sendo, todo o seu conhecimento adquirido com a programao de outros PICs ser de grande valia neste treinamento. Mas, por enquanto, vamos comear com o bsico. E nada mais bsico do que os l/Os do microcontrolador. Mas convenhamos que. apesar do 16F877A possuir 33 l/Os, um captulo inteiro dedicado a estes muita coisa. Para aproveitarmos melhor este estudo, vamos aprender tambm como maximizar estes l/Os, utilizando um mesmo pino hora como entrada, hora como sada. Vamos aproveitar tambm a oportunidade para nos aprofundarmos nos 3 Timers existentes neste modelo.

Teoria e recursos do PIC


O capitulo ser dividido em trs tpicos principais: l/Os e Timers. Cada um desses assuntos merece consideraes particulares, tanto na parte terica quanto na parte prtica, j que utilizaremos o mesmo exemplo para demonstrarmos os dois.

Estudo das PORTAS


A primeira coisa que devemos saber sobre os l/Os de um microcontrolador que eles so agrupados por PORTs. Este agrupamento se d geralmente por caractersticas eltricas particulares e rara facilitar o gerenciamento da mquina. Por exemplo, como toda a memria de dados interna de B bits. os SFRs tambm so. Corno existem SFRs especficos para controlar os l/Os, melhor agrup-los em conjuntos de oito. Desta forma, o 16F877A possui seus l/Os divididos da seguinte forma:

1 PORT de 6 l/Os (PORTA); 3 PORTs de 8 l/Os (PORTB, PORTC e PORTD); 1 PORT de 3 l/Os (PORTE).

Conectando o PIC 16F877A - Recursos Avanados

43
Ao total temos ento 33 l/Os que podem ser configurados como entrada ou sada pelo programador, conforme as necessidades do projeto. Outras caractersticas importantes que devemos saber sobre essas portas dizem respeito sua operao eltrica. Internamente esses pinos so ligados de formas diferentes, principalmente pela sobrecarga de recursos aplicados a cada um deles. Vamos conhecer melhor cada uma delas.

PORTA
Analisando os diagramas de blocos das ligaes internas conheceremos melhor cada uma das caractersticas importantes:

O primeiro ponto a ser observado que algumas portas so do tipo TTL e outras so do tipo Schmitt Trigger. Este dado muito relevante quando estamos operando com uma porta como entrada, porque interfere diretamente nos nveis de tenso interpretados pelo PIC como O (zero) e 1 (um). Vejamos como isso acontece.

Conectando o PIC 16F877A - Recursos Avanados

44
Repare, ento, que nas entradas ST necessitamos de um nvel de tenso bem mais elevado para que o PIC interprete a mudana de estado. Isso muito til para enquadrarmos uma senide, por exemplo. Por outro lado, isso ruim quando possumos um hardware que gera nveis de tenso menores, como pode acontecer quando sobrecarregamos o mesmo pino com diversas funes. Essa explicao sobre TTL e ST aplicvel a todas as portas. Outra caracterstica comum a todos os l/Os quanto as diferenas existentes entre escrita e leitura dos mesmos, Repare que a leitura feita diretamente sobre o pino, enquanto a escrita passa por um Lacth. Isso pode ocasionar um atraso entre o comando de escrita e a efetiva alterao da sada. por esse motivo que no recomendvel efetuar uma operao de leitura imediatamente aps a alterao uma sada. O certo aguardarmos pelo menos um ciclo de mquina entre essas duas operaes. Este Lach possibilita tambm que uma operao de escrita seja executada mesmo que o pino esteja configurado como entrada, atravs do TRIS. O Lacth alterado e, quando o estado do pino for modificado para sada, o valor atual do Lacth lhe ser imposto. Lembre-se de que a configurao das entradas e sadas deste port feita atravs do registrador TRISA, enquanto as operaes de escrita e leitura so executadas pelo registrador PORTA. Para os pinos de RA0 a RA3 e o RA5, o diagrama mostra tambm uma ligao para o conversor analgico/digital (A/D). "Analog Input Mode" representa a seleo entre modo digital ou analgico para esses pinos. Um captulo ser completamente dedicado ao sistema de converso, mas a seleo entre as portas digitais ou analgicas realizada pelo registrador ADCON1, Em contrapartida, o pino RA4 no possui circuito analgico, mas ligado internamente ao sistema de incremento do Timer 0 (TMR0). Isso possibilita que um clock imposto a esse pino incremente automaticamente o TMRO, independentemente do clock real da mquina. O registrador onde se encontra a configurao para incremento do TMR0 o OPTION_REG. Outra caracterstica eltrica que :ode ser observada no diagrama que este pino no possui o FET do tipo P capaz de impor VDD sada. Por isso, essa sada denominada open drain. Isso significa que o PIC no capaz de liberar V s (5V) em RA4, Caso isso seja necessrio, um resistor de pull-up externo deve ser providenciado.

Resumo dos registradores associados ao PORTA


Endereo 05h 85h 9Fh 81h/181h Nome PORTA TRISA ADCON1 OPTION_REG Bit 7 ADFM /RBPU Bit 6 INTEDG Bit 5 RA5 TOCS Bit 4 RA4 TOSE Bit 3 RA3 PCFG3 PSA Bit 2 RA2 PCFG2 PS2 Bit 1 RA1 PCFG1 PS1 Bit 0 RA0 PCFG0 PS0

Configuraao como Entrada (I) ou Sada (0)

No usado para essa finalidade. Para obter mais informaes, consulte apndice A

PORTB
O PORTB possui 8 l/Os, estando 5 deles associados tambm s interrupes: externa e mudana de estado. Na prxima figura podemos observar os diagramas deste PORT. Uma caracterstica eltrica bem interessante para todos os pinos do PORTB a ligao do pull-up interno. Esta ligao para VDD pode ser ligada ou no (em todos os pinos ao mesmo tempo) atravs da chave /RBPU localizada em OPTION_REG. Alm da ativao desta chave, o pino deve ser configurado como entrada para poder ter seu pullup ativado. A resistncia interna para VDD de aproximadamente 12,5k, para uma corrente mxima de 400A. Na verdade, o pull-up feito por intermdio de um FET e no de um resistor, e sua corrente tpica de 250A, o que aumenta a resistividade.

Conectando o PIC 16F877A - Recursos Avanados

45

Todo o PORTB do tipo TTL, exceto o pino RB0 quando configurado para utilizar a interrupo externa e os pinos RB3, RB6 e RB7 quando em modo de programao serial. Neste caso, estes pinos tornam-se ST. Os pinos de RB4 a RB7 so interligados interrupo de mudana de estado e o pino RB0 associado interrupo externa, desde que configurados como entrada. As chaves e flags dessas interrupes encontram-se em INTCON. A configurao da borda que gera a interrupo externa (RB0) feita em OPTION_REG<INTEDG>.

Resumo dos registradores associados ao PORTB


Endereo 06h/106h 86h/186h 0Bh... 81h/181h Nome PORTB TRISB INTCON OPTION_REG Bit 7 RB 7 GIE /RBPU Bit 6 RB 6 Bit 5 RB5 Bit 4 RB4 Bit 3 RB3 Bit 2 RB2 Bit 1 RB1 INTF PS1 Bit 0 RB0 RBIF PS0

Configuraao como Entrada (I) ou Sada (0) PEIE T0IE INTE RBIE T0IF INTEDG TOCS TOSE PSA PS2

No usado para essa finalidade. Para obter mais informaes, consulte apndice A

PORTC
Neste PORT, alm dos 8 l/Os digitais, existe uma srie de perifricos ligados aos seus pinos. Cada um desses perifricos ser estudado em um captulo especfico. No momento, vejamos uma simplificao das suas ligaes internas atravs dos prximos diagramas.

Resumo dos registradores associados ao PORTC


Endereo 07h 87h Nome PORTC TRISC Bit 7 RC7 Bit 6 RC6 Bit 5 RC5 Bit 4 RC4 Bit 3 RC3 Bit 2 RC2 Bit 1 RC1 Bit 0 RC0

Configuraao como Entrada (I) ou Sada (0)

No usado para essa finalidade. Para obter mais informaes, consulte apndice A

Conectando o PIC 16F877A - Recursos Avanados

46

PORTD
O PORTD um dos mais simples de todos, pois seus oito pinos so l/Os digitais. Alm disso, estes pinos s so ligados ao sistema de porta paralela (Parallel Slave Port) que ser estudado no captulo 13. Observe que, de acordo com o diagrama ao lado, todos os pinos do PORTD so do tipo ST quando configurados para entrada. Entretanto, para o sistema de porta paralela, esses pinos operam em modo TTL. A chave de seleo do sistema de porta paralela encontra-se em TRISE<PSPMODE>

Resumo dos registradoras associados ao PORTD.


Endereo 08h 88h 89h Nome PORTD TRISD TRISE IBF Bit 7 RD7 Bit 6 RD6 Bit 5 RD5 Bit 4 RD4 Bit 3 RD3 Bit 2 RD2 Bit 1 RD1 Bit 0 RD0

Configurao como Entrada (I) ou Sada (0) OBF IBOV PSPMODE Configurao I/Os

No usado para essa finalidade. Para obter mais informaes, consulte pndice A

Conectando o PIC 16F877A - Recursos Avanados

47
PORTE
Este PORT o menor de todos, possuindo somente trs pinos. Observe que, de acordo com o diagrama ao lado, todos os pinos do PORTE so do tipo ST quando configurados para entrada. Entretanto, para o sistema de porta paralela (/RD, /RW e /CS), estes pinos operam em modo TTL. A chave de seleo do sistema de porta paralela encontra-se em TRISE<PSPMODE>. Apesar do diagrama simplificado no apresentar, estes trs pinos tambm operam como entradas analgicas, ligadas ao conversor interno.

Resumo dos registradoras associados ao PORTE


Endereo 09h 89h 9Fh Nome PORTE TRISE ADCON 1 Bit 7 IOF AMF Bit 6 OBF Bit 5 IBOV Bit 4 PSPMODE Bit 3 PCFG3 Bit 2 RE2 Bit 1 RE1 Bit 0 RE0

Configurao dos I/Os PCFG2 PCFG1 PCFG0

No usado para essa finalidade. Para obter mais informaes, consulte pndice A

Estudo dos Timers


Vamos aprender agora sobre os recursos dos trs timers disponveis no PIC 16F877A e como utiliz-los. Cada um desses contadores internos possui caractersticas prprias, como o limite de contagem, o tipo de incremento, os pr e postscales, a gerao de interrupes, perifricos associados, etc. Vamos, ento, explor-los individualmente:

Timer0
Tambm conhecido como TMR0, um contador de 8 bits, cujo valor atual encontra-se disponvel no registrador TMR0. Este registrador pode ser tanto lido quanto escrito, possibilitando a inicializao do contador. Outra caracterstica interessante do TMR0 que apesar dele ser somente incrementai, seus incrementos podem ocorrer de duas maneiras distintas, atravs da chave OPTION_REG<TOCS>: T0CS = 1: Incremento a cada transio no pino RA4 / T0CKI. T0CS = 0: Incremento a cada ciclo de mquina. Quando selecionado o incremento pelo pino TOCKI, isto , um pulso ou clock externo, possvel ainda selecionar se o incremento acontecer na borda de subida ou na borda de descida do sinal de entrada, atravs de OPTION_REG<TOSE>: Conectando o PIC 16F877A - Recursos Avanados

48
T0SE = 1: Incremento na borda de descida; T0SE = 0: Incremento na borda de subida. Entretanto, para incremento externo ou interno, ser aplicado um prescaler (PS) antes do registrador TMR0 ser realmente alterado. Desta forma, caso o prescaler esteja configurado em 1:4, por exemplo, sero necessrios quatro ciclos de mquina (ou pulsos externos) para que TMR0 seja incrementado. O contador interno do PS de 8 bits, mas no est disponvel nem para leitura nem para escrita. Vale lembrar que toda vez que algum dado escrito em TMR0, o contador de PS zerado.

Para a utilizao do prescaler necessrio primeiramente direcion-lo ao Timer 0 ou ao WDT. Isso possvel por intermdio do OPTION_REG<PSA>: PSA = 1: Prescale aplicado ao WDT; PSA = 0: Prescale aplicado ao TMR0. Depois disso, necessrio ainda a configurao do valor do PS, conforme ajustes em OPTION_REG<PS2:PS0>: PS2
0 0 0 0 1 1 1 1

PS1
0 0 1 1 0 0 1 1

PS0
0 1 0 1 0 1 0 1

TMR0 (PSA=0)
1:2 1:4 1:8 1:16 1:32 1:64 1:128 1:256

WTD (PSA=1)
1:1 1:2 1:4 1:8 1:16 1:32 1:64 1:128

Conectando o PIC 16F877A - Recursos Avanados

49
Desta forma, a nica maneira de incrementarmos o TMR0 com uma relao de 1:1 se aplicarmos o PS ao WDT. Isso pode ser verificado tambm por meio do diagrama de bloco. Para aumentar o poder de operao do TMR0, associado a ele existe uma interrupo acontecendo toda vez que o registrador TMR0 estourar, isto , sempre que o limite de 8 bits (FFh ou 255d) for ultrapassado. Quando isso acontecer, o flag INTCON<T0IF> ser setado. Para utilizar esta interrupo, a chave INTCON<T0IE> deve ser ligada, assim como a chave geral INTCON<GIE>. No esquecer de limpar o flag (T0IF) manualmente durante o tratamento da interrupo.

Resumo dos registradoras associados ao Timer0


Endereo 01h... 0Bh... 81h... Nome TMR0 INTCON OPTIN_REG GIE /RBPU PEIE INTEDG Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

Contador 8 bits (aps prescaler) T0IE TOCS INTE TOSE RBIE PSA T0IF PS2 INTF PS1 RBIF PS0

No usado para essa finalidade. Para obter mais informaes, consulte pndice A

Timer1
Este timer bem mais poderoso que o Tirner0 por uma srie de motivos. Primeiramente, trata-se de um timer de 16 bits, composto de dois registradores de 8 bits (TMR1H e TMR1 L) que podem ser escritos e lidos pelo programador. Alm disso, como no Timer0, tambm pode operar com um sinal externo, mas com uma vantagem: existe um circuito interno que possibilita ligar diretamente um cristal aos pinos RC0/T1OSO e RC1/T1OSI. Outra forma de operar com sinal externo ligando um sinal pulsado qualquer ao pino RC0/T1CKI, de forma similar ao Timer0. Para escolher entre incremento interno ou externo, a chave T1CON<TMR1CS> deve ser configurada: TMR1CS = 1: Incremento externo, atravs de sinal RC0/TOCKI ou oscilador em RC0/T1OSO e RC1/T1OSI; TMR1CS = 0: Incremento interno atravs dos ciclos de mquina.

A chave T1CON<T1OSCEN> a responsvel pela habilitao ou no do circuito de oscilao interna: T1OSCEN = V. Oscilador ligado. RC0 e RC1 so configurados como entrada, independentemente do estado do TRISC. Estes pinos so perdidos como l/Os; T1OSCEN = 0: Circuito oscilador desligado. RC0 opera como T1CKI (sinal externo para contagem) e RC1 opera corno I/O normal. Esse circuito de oscilao idntico ao utilizado pelo prprio cristal do PIC quando na opo LP. Desta forma, ele de baixo consumo, mas tambm tem sua freqncia de trabalho limitada em 200 kHz. Para melhorar o sinal externo utilizado para incrementar o TMR1, o mesmo passa por uma porta Schmitt Trigger. Isso pode ser observado no diagrama de blocos deste timer.

Conectando o PIC 16F877A - Recursos Avanados

50

Depois de selecionada a origem do sinal, o sistema possui um prescaler prprio para efetivar o - remonto. Esse prescaler deve ser configurado atravs de T1CON<T1CKPS1:T1CKPS0>: T1CKPS1 T1CKPS0 Prescale

0 0 1:1 0 1 1:2 1 0 1:4 1:2 11 0 1 1 1:8 1.4 1 1 De forma anloga ao Timer0, este timer tambm possui um sistema de 1:8 sincronismo do clock externo com o clock interno. Entretanto, ao contrrio do Timer0, esse sincronismo pode ser desligado atravs da chaveT1CON</T1SYNC>: /T1SYNC = 1: Sincronismo desligado; /T1SYNC = 0: Sincronismo ligado. Este recurso muito interessante, pois se mantivermos o sincronismo desligado podemos continuar operando com o Timer1 mesmo com o PIC em modo SLEEP, desde que seu incremento seja externo. Quando o sincronismo est ligado, como no caso do Time0, isso no possvel, pois o sistema de sincronismo para de operar no SLEEP, uma vez que o clock interno desligado. Quando estamos trabalhando com um sinal externo, o incremento do TMR1 ser efetuado na borda de subida do sinal. Entretanto, aps o timer ser ligado, necessria uma borda de descida antes da primeira borda de subida que ser considerada. Este timer possui ainda uma chave de habilitao, que pode ser utilizada para ligar e desligar os incrementos de TMR1. Esta chave localiza-se em T1CON<TMR1ON>: TMR1ON = 1: Incremento de TMR1 habilitado; TMR1ON = 0: Incremento de TMR1 desabilitado. Escrever e ler o Timer1 pode ser um tanto complicado, pois como ele possui dois registradores, enquanto estamos trabalhando com um o outro pode ser alterado. A maneira mais convencional seria desligarmos o timer antes de executarmos essas operaes, mas nem sempre isso possvel. Outra forma lermos os valores (primeiro TMR1H e depois TMR1L) guardando-os em variveis temporrias. Depois da leitura, comparamos o valor de TMR1H. Caso ele tenha aumentado, lemos ambos os valores novamente. Para a escrita, devemos primeiro limpar TRM1L, depois carregamos TMR1H e TMR1L. Assim como no TMRO, a escrita nestes registradores reseta o prescaler. Conectando o PIC 16F877A - Recursos Avanados

51
Associado ao estouro do Timer1 tambm temos uma interrupo, que deve ser habilitada por PIE1<TMR1IE>, alm de INTCON<PEIE:GIE>. O flag de indicao para essa interrupo o PIR1<TMR1IF>.

Resumo dos registradores associados ao Timer1


Endereo 0Bh... 0Ch... 8Ch... 0Eh 0Fh 10h Nome INTCON PIR1 PIER1 TMR1L TMR1H T1CON Bit 7 GIE PSPIF PSPIE Bit 6 PEIE ADIF ADIE Bit 5 T0IE RCIF Bit 4 INTE RXIF Bit 3 RBIE SSPIF Bit 2 T0IF CCP1IF Bit 1 INTF TMR2IF TMR2IE Bit 0 RBIF TMR1IF TMR1IE

RCIE RXIE SSPIE CCP1IE Contador 8 bits (parte menos significativa) Contador 8 bits (parte menos significativa) TCKPS1 TCKPS0 T1OSCEN /T1SYNC

TMR1CS

TMR1ON

No usado para essa finalidade. Para obter mais informaes, consulte apndice A

Timer2
O Timer2 um contador de 8 bits, relacionado somente ao clock interno, que possui um prescaler um postscale, sendo ambos configurveis.

Uma caracterstica que o difere bastante dos demais Timers que ele no conta de O (zero) at o limite imposto pelos 8 bits. Na verdade, quem impe o limite de incremento o valor escrito no registrador PR2. Desta forma, sempre que TMR2 = PR2, o timer resetado, voltando a zero. Neste mesmo momento, o contador de postscale incrementado. Quando o postscale terminar, a interrupo associada ao Timer2 ser gerada. O ajuste do prescaler deve ser efetuado atravs de T2CON<T2CKPS1:T2CKPS0>:

T2CKPS1 0 0 0 1.41 1 1 1 1:8

T2CKPS0 0 1 0 1

Prescale 1:1 1:4 1:16 1:16

Conectando o PIC 16F877A - Recursos Avanados

52
Apesar de parecer um erro, as duas ltimas opes so realmente idnticas. Quanto ao postscale, sua funo est diretamente ligada interrupo cie Timer2. Isso porque ele da mais que um contador de estouros do TMR2 (no se esquea de que esses estouros so em comparao com PR2, e no no limite de 8 bits), Somente quando a quantidade de estouros for igual ao valor configurado no postscale que a Interrupo ir acontecer. Uma caracterstica interessante para o postscale que ele pode ser ajustado entre 1 e 16, com incrementos unitrios. Em relao aos SFRs, sua configurao deve ser feita em T2CON<TOUTPS3:TOUTPS0>: TOUPS3 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 TOUTPS2 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 TOUTPS1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 TOUTPS0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 Postscale 1:1 1:2 1:3 1:4 1:5 1:6 1:7 1:8 1:9 1:10 1:11 1:12 1:13 1:14 1:15 1:16

Observe que, tanto o prescaler quanto o postscale, sero zerados sempre que uma das seguintes iteraes acontecer: Uma operao de escrita envolvendo o registrador TMR2; Uma operao de escrita envolvendo o registrador T2CON; Qualquer tipo de reset do PIC. Entretanto, o TMR2 zerado somente durante algum tipo de reset, diferentemente dos demais timers, que, nos resets, ou mantm seu valor ou possuiro um valor desconhecido. Apesar do diagrama simplificado de blocos no mostrar, o Timer2 possui ainda uma chave de habilitao idntica existente no Time1. Esta chave encontrase em T2CON<TMR2ON>: TMR2ON = 1: Incremento de TMR2 habilitado; TMR2ON = 0: Incremento de TMR2 desabilitado.

Conectando o PIC 16F877A - Recursos Avanados

53
Resumo dos registradoras associados ao Timer2
Endereo 0Bh... OCh 8Ch 11H 12h 92h Nome INTCON PIR1 PIE1 TMR2 T2CON PR2 TOUTPS3 TOUTPS2 Bit 7 GIE PSPIF PSPIE Bit 6 PEIE ADIF ADIE Bit 5 T0IE RCIF RCIE Bit 4 INTE RXIF RXIE Bit 3 RBIE SSPIF SSPPIE Bit 2 T0IF CCP1IF CCP1IE Bit 1 INTF TMR2IF TMR2IE Bit 0 RBIF TMR1IF TMRIE

Contador 8 bits TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0

Limite de incremento para TMR2

No usado para essa finalidade. Para obter mais informaes, consulte apndice A

Maximizao de pino
Este assunto muito solicitado e necessrio nos projetos atuais. Isso porque de grande valia economizarmos recursos de hardware, seja para podermos utilizar um PIC menor, seja para viabilizarmos o projeto ou ainda para obtermos l/Os sobrando para futuras expanses. O importante lembrarmos que o investimento em um projeto mais aprimorado feito uma nica vez, enquanto o custo de um PIC maior inerente a toda a vida do produto. A maximizao mais comum que podemos efetuar o reaproveitamento de um mesmo I/O para mais de uma funo, muitas vezes extremamente diferenciadas. Mas como isso possvel? Uma maneira para realizarmos isso , por exemplo, atravs do chaveamento de um MUX externo, fazer com que hardwares diferentes possam ser interligados no mesmo pino do PIC, um de cada vez. Outra forma de maximizao a varredura, onde trabalhamos com matrizes do tipo linhas versus colunas. Essa tcnica comumente utilizada para teclados com grande nmero de teclas, Leds ou displays de segmentos. O prximo captulo ser dedicada ao sistema de varredura de displays. Por fim, outra tcnica muito utilizada a ligao de dois hardwares diferentes no mesmo pino, ao mesmo tempo, sem a separao por MUX. Mas como isso possvel? Obviamente nem sempre isso real, mas existem diversos casos em que podemos ligar um hardware equivalente a um sinal de entrada junto a outro hardware responsvel pelo controle de uma sada. Est parecendo um pouco confuso no mesmo? Mas, na verdade, muito simples. Vamos pegar o modelo mais utilizado para essa aplicao, sobre o qual trabalharemos em nosso exemplo. Trata-se da ligao de um boto e um Led ao mesmo pino do PIC. Para que isso funcione corretamente, projetamos um hardware capaz de operar com o boto normalmente, informando ao PIC dois nveis de tenso diferenciados (alto e baixo). Conjuntamente, acrescentamos ao esquema um Led que ser controlado quando o PIC impor o nvel de tenso (alto e baixo). Para que isso funcione, o segredo est na operao conjunta entre esse hardware e o controle efetuado pelo software, pois o pino que est sendo utilizado deve ficar constantemente chaveado como sada (para controlar o Led) e entrada, para ler o valor do boto.

Conectando o PIC 16F877A - Recursos Avanados

54
Vamos, ento, nos aprofundar um pouco mais nesta teoria. Comeamos pelo esquema eltrico do hardware necessrio aplicao. Do lado esquerdo temos a ligao padro para um boto, Isto , um pull-up para garantir o nvel alto quando o boto est liberado (aberto) e o boto propriamente dito, ligado ao Vss, que garante o nvel baixo quando pressionado (fechado). Depois temos a ligao de um Led para terra com um resistor para o PIC, limitando a corrente mxima permitida. Entre o circuito do boto e do Led existe um terceiro resistor para evitarmos um curto durante o momento em que queremos acender o Led e pressionamos o boto. Vamos agora entender a lgica do sistema. Na maior parte do tempo, o pino do PIC configurado como sada, j que, se ele estiver impondo 0 (VSS) o Led permanece apagado. Se ele impor 1 (VDD), o Led ser se. Devido ao resistor de proteo, o pressionamento ou no do boto no interfere no funcionamento do Led. At a tudo bem, mas corno vamos manter o Led controlado e lermos o boto ao mesmo tempo? A questo muito mais simples do que parece. Vamos fazer uso da tcnica de configurarmos o pino como sarada para lermos o estado do boto. Acontece que faremos isso to rpido que ser imperceptvel para o led. Assim sendo, na maior parte do tempo o pino permanece corno sada, e periodicamente ele invertido para entrada, o boto lido e em seguida, vira sada novamente. A figura seguinte apresentar claramente o sinal em relao ao pino do PIC. Repare que a relao entre o tempo de entrada e sada muito mais propcia ao controle do Led (sada). Como isso feito em uma freqncia relativamente alta para o olho humano (no mnimo 100 Hz), a piscada do Led durante o estado de entrada ser imperceptvel. Desta forma, o boto no lido o tempo inteiro, mas somente uma vez dentro de cada perodo da freqncia de chaveamento. Por isso, para que possamos Implementar bons filtros para o debounce do boto, necessrio uma boa amostragem do estado do boto. Isso nos obriga a trabalharmos com freqncias mais altas (em torno de 1 kHz). Outro ponto importante que deve ser observado nesse diagrama o fato de que, durante a leitura do boto, o nvel de tenso sobre o pino do PIC no muito alto. Isso se d devido a uma certa polarizao do Led quando o boto no est pressionado. Por Isso, o clculo dos resistores deve ser feito para garantir um nvel mnimo que ser interpretado pelo PIC como sendo 1 (nvel alto). Isso ainda mais crtico se estivermos utilizando uma entrada do tipo Schmitt Trigger (ST).

Conectando o PIC 16F877A - Recursos Avanados

55

Lgica do exemplo
Chegamos agora ao nosso primeiro exemplo prtico. Est na hora de visualizarmos as primeiras linhas de cdigo para esse nosso treinamento. Comecemos, ento, entendendo qual a lgica empregada ao exemplo para que possamos ver na prtica os conceitos j estudados na parte terica deste captulo. Nosso exemplo ser composto de um programa capaz de ler quatro botes e tocar o buzzer com uma freqncia diferente para cada combinao de botes. Para cada boto existe um Led ligado ao mesmo pino, que ser utilizado para indicar os botes pressionados no momento. Utilizaremos os timers e duas interrupes para controlarmos a freqncia de leitura dos botes e a freqncia do buzzer. Timer 0: controlar a freqncia de varredura dos botes; Timer 2: controlar a freqncia do som. O som ser feito excitando o buzzer com uma onda quadrada de freqncia varivel. Variaremos essa freqncia alterando o valor de PR2, que controla o estouro deste timer. Desta forma, nosso programa principal ser um loop infinito sem nenhum efeito. Somente ficaremos esperando o acontecimento das interrupes. Para a varredura dos botes, ajustaremos a interrupo de TMR0 para aproximadamente 500 Hz:
Ciclo de Maq. 1s Prescale 8 Conta TMR0 256 Auxiliar Perodo 2048s Freqncia 448 Hz

Alm disso, o sistema possui um filtro, regulado pela constante FILTRO_BOTAO, para evitar o debaunce da tecla. Esse filtro garante que a tecla fique pressionada pelo tempo de FILTRO_BOTAO x 2048s. Quanto a freqncia do buzzer, esta ser controlada por TMR2. Calibramos os valores de pr e postscale para que a freqncia da interrupo do TMR2 varie entre 100 Hz e 2 kHz, com a variao de PR2 entre 16 e 240:
Ciclo de Maq. 1s 1s Prescale 16 16 Postscale 2 2 PR2 16 240 Perodo 512s 7680s Freqncia 1953 Hz 130Hz

Para facilitar a implementao, a cada interrupo inverteremos o estado do pino de acionamento do buzzer. Desta forma, a freqncia deste ser equivalente metade da freqncia da interrupo do TMR2. Conectando o PIC 16F877A - Recursos Avanados

56

Esquema eltrico

Conectando o PIC 16F877A - Recursos Avanados

57

Conectando o PIC 16F877A - Recursos Avanados

58

Conectando o PIC 16F877A - Recursos Avanados

59
;************************************** ;* CONECTANDO O PIC - RECURSOS AVANADOS ;* EXEMPLO 1 * ;* * ;* NICOLS CSAR LAVINIA e DAVID JOS DE SOUZA ;* * ;************************************** ; * VERSO : 2.0 * ;* DATA : 24/02/2003 * ;**************************************

;************************************** ;* DESCRIO GERAL * ;************************************** ; ESTE SOFTWARE EST PREPARADO PARA LER QUATRO BOTES E TOCAR O BUZZER COM ; DURAO VARIVEL CONFORME A TECLA PRESSIONADA, ALM DE ACENDER O LED ; INDICANDO A LTIMA TECLA PRESSIONADA. ; ;************************************** ;* CONFIGURAES PARA GRAVAO * ;************************************** __CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_ON & _XT_OSC ;************************************** ;* DEFINIO DAS VARIVEIS * ;************************************** ; ESTE BLOCO DE VARIVEIS EST LOCALIZADO NO FINAL DO BANCO 0, A PARTIR ; DO ENDEREO 0X70, POIS ESTA LOCALIZAO ACESSADA DE QUALQUER BANCO, ; FACILITANDO A OPERAO COM AS VARIVEIS AQUI LOCALIZADAS. CBLOCK 0X70 W_TEMP STATUS_TEMP BOTOES_TEMP STATUS_BOTOES STATUS_LEDS FILTRO_BT0 FILTRO_BT1 FILTRO_BT2 FILTRO_BT3 ENDC ;************************************** ;* DEFINIO DAS VARIVEIS INTERNAS DO PIC * ;************************************** ; O ARQUIVO DE DEFINIES DO PIC UTILIZADO DEVE SER REFERENCIADO PARA QUE ; OS NOMES DEFINIDOS PELA MICROCHIP POSSAM SER UTILIZADOS, SEM A NECESSIDADE ; DE REDIGITAO. #INCLUDE <P16F877A.INC> ; MICROCONTROLADOR UTILIZADO ; POSIO COMUM A TODOS OS BANCOS ; REGISTRADOR TEMPORRIO PARA W ; REGISTRADOR TEMPORRIO PARA STATUS ; REGISTRADOR TEMPORRIO PARA BOTES ; ARMAZENA O ESTADO DOS BOTES ; ARMAZENA O ESTADO DOS LEDS ; FILTRO PARA BOTAO 0 ; FILTRO PARA BOTAO 1 ; FILTRO PARA BOTAO 2 ; FILTRO PARA BOTAO 3

;************************************** ;* DEFINIO DOS BANCOS DE RAM * ;************************************** ; OS PSEUDOS-COMANDOS "BANK0" E "BANK1", AQUI DEFINIDOS, AJUDAM A COMUTAR ; ENTRE OS BANCOS DE MEMRIA. #DEFINE BANK1 BSF STATUS,RP0 ; SELECIONA BANK1 DA MEMORIA RAM #DEFINE BANK0 BCF STATUS,RP0 ; SELECIONA BANK0 DA MEMORIA RAM ;************************************** ;* CONSTANTES INTERNAS * ;************************************** ; A DEFINIO DE CONSTANTES FACILITA A PROGRAMAO E A MANUTENO. FILTRO_BOTAO EQU .20 ; FILTRO P/ EVITAR RUIDOS DOS BOTES

;************************************** ;* DECLARAO DOS FLAGs DE SOFTWARE * ;************************************** ; A DEFINIO DE FLAGs AJUDA NA PROGRAMAO E ECONOMIZA MEMRIA RAM.

Conectando o PIC 16F877A - Recursos Avanados

60
; ESTE PROGRAMA NO UTILIZA NENHUM FLAG DE USURIO ;************************************** ;* ENTRADAS * ;************************************** ; AS ENTRADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE. #DEFINE BOTOES #DEFINE BOTAO_0 PORTB ; ENTRADA DOS BOTES (RB0 AT RB3) BOTOES_TEMP,0 ; ESTADO DO BOTO 0 ; 1 -> LIBERADO ; 0 -> PRESSIONADO BOTOES_TEMP,1 ; ESTADO DO BOTO 1 ; 1 -> LIBERADO ; 0 -> PRESSIONADO BOTOES_TEMP,2 ; ESTADO DO BOTO 2 ; 1 -> LIBERADO ; 0 -> PRESSIONADO BOTOES_TEMP,3 ; ESTADO DO BOTO 3 ; 1 -> LIBERADO ; 0 -> PRESSIONADO

#DEFINE BOTAO_1

#DEFINE BOTAO_2

#DEFINE BOTAO_3

;************************************** ;* SADAS * ;************************************** ; AS SADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE. #DEFINE LEDS #DEFINE LED_BOTAO_0 PORTB ; SADA PARA LEDS (RB0 AT RB3)

STATUS_LEDS,0 ; LED CORRESPONDENTE AO BOTO 0 ; 1 -> LED LIGADO ; 0 -> LED DESLIGADO STATUS_LEDS,1 ; LED CORRESPONDENTE AO BOTO 1 ; 1 -> LED LIGADO ; 0 -> LED DESLIGADO STATUS_LEDS,2 ; LED CORRESPONDENTE AO BOTO 2 ; 1 -> LED LIGADO ; 0 -> LED DESLIGADO STATUS_LEDS,3 ; LED CORRESPONDENTE AO BOTO 3 ; 1 -> LED LIGADO ; 0 -> LED DESLIGADO PORTA,5 ; SADA PARA BUZZER

#DEFINE LED_BOTAO_1

#DEFINE LED_BOTAO_2

#DEFINE LED_BOTAO_3

#DEFINE BUZZER

;************************************** ;* VETOR DE RESET DO MICROCONTROLADOR ;************************************** ; POSIO INICIAL PARA EXECUO DO PROGRAMA ORG GOTO 0X0000 CONFIG

; ENDEREO DO VETOR DE RESET ; PULA PARA CONFIG DEVIDO A REGIO ; DESTINADA S INTERRUPES

;************************************** ;* VETOR DE INTERRUPO DO MICROCONTROLADOR * ;************************************** ; POSIO DE DESVIO DO PROGRAMA QUANDO UMA INTERRUPO ACONTECE ORG ; ; ; ; 0X0004 ; ENDEREO DO VETOR DE INTERRUPO

MUITO IMPORTANTE QUE OS REGISTRADORES PRIORITRIOS AO FUNCIONAMENTO DA MQUINA, E QUE PODEM SER ALTERADOS TANTO DENTRO QUANTO FORA DAS INTS SEJAM SALVOS EM REGISTRADORES TEMPORRIOS PARA PODEREM SER POSTERIORMENTE RECUPERADOS.

SALVA_CONTEXTO MOVWF W_TEMP SWAPF STATUS,W MOVWF STATUS_TEMP

; COPIA W PARA W_TEMP ; COPIA STATUS PARA STATUS_TEMP

Conectando o PIC 16F877A - Recursos Avanados

61

;************************************** ;* TESTA QUAL INTERRUPO FOI SOLICITADA * ;************************************** ; TESTA O FLAG DAS INTERRUPES PARA SABER PARA QUAL ROTINA DESVIAR. TESTA_INT BTFSC GOTO

INTCON,T0IF INT_TMR0

; FOI INTERRUPO DE TMR0 ? ; SIM - PULA P/ INT_TMR0 ; NO - ENTO FOI TMR2

;************************************** ;* TRATAMENTO DA INTERRUPO DE TIMER 2 ;************************************** ; ROTINA PARA TRATAMENTO DA INTERRUPO DE TIMER 2. ; INVERTE O ESTADO DO PINO DO BUZZER. INT_TMR2 BCF BTFSS GOTO BCF GOTO LIGA_BUZZER BSF GOTO

PIR1,TMR2IF BUZZER LIGA_BUZZER BUZZER SAI_INT

; LIMPA FLAG DA INTERRUPO ; BUZZER LIGADO? ; NO - ENTO LIGA ; SIM ; DESLIGA O BUZZER ; SAI DA INTERRUPO

BUZZER SAI_INT

; LIGA O BUZZER ; SAI DA INTERRUPO

;************************************** ;* TRATAMENTO DA INTERRUPO DE TIMER 0 * ;************************************** ; TRATAMENTO DA INTERRUPO DE TIMER 0. RESPONSVEL POR CONVERTER OS PINOS ; DOS BOTES EM ENTRADA, SALVAR A SITUAO DOS MESMOS NUMA VARIVEL ; TEMPORRIA, CONVERTER NOVAMENTE OS PINOS PARA SADA E ATUALIZAR OS LEDS. INT_TMR0 BCF

INTCON,T0IF

; LIMPA FLAG DA INTERRUPO

; ***************** FOTOGRAFA O ESTADO DOS BOTES *************************** BANK1 MOVLW B'00001111' IORWF TRISB,F BANK0 GOTO GOTO $+1 $+1 ; SELECIONA BANCO 1 DA RAM ; PREPARA MASCARA ; EXECUTA MASCARA (RB0...RB3 ENTRADA) ; SELECIONA BANCO 0 DA RAM

; DELAY(ESTABILIZAO ENTR.=4 CICLOS) ; CARREGA NO WORK O ESTADO DOS BOTES ; INVERTE TODOS OS BITS DEVIDO ; LGICA INVERTIDA DOS BOTES ; LIMPA A PARTE ALTA, QUE NO USADA ; SALVA EM BOTOES_TEMP ; SELECIONA BANCO 1 DA RAM ; PREPARA MASCARA ; EXECUTA MASCARA (RB0...RB3 SADA) ; SELECIONA BANCO 0 DA RAM

MOVF BOTOES,W XORLW 0XFF ANDLW B'00001111' MOVWF BOTOES_TEMP BANK1 MOVLW B'11110000' ANDWF TRISB,F BANK0

; ********* ATUALIZA STATUS_BOTOES CONFORME BOTES PRESSIONADOS ************* TESTA_BT0 BTFSS GOTO DECFSZ GOTO BSF PRESSIONADO GOTO BT0_LIB MOVLW FILTRO_BOTAO MOVWF FILTRO_BT0 ; REINICIALIZA FILTRO

BOTAO_0 BT0_LIB FILTRO_BT0,F TESTA_BT1 STATUS_BOTOES,0 TESTA_BT1

; BOTO 0 PRESSIONADO? ; NO - TRATA BOTO COMO LIBERADO ; SIM ; DECREMENTA FILTRO DO BOTO. ACABOU? ; NO - TESTA PRXIMO BOTO ; SIM - MARCA BOTO COMO ; TESTA PRXIMO BOTO

Conectando o PIC 16F877A - Recursos Avanados

62
BCF TESTA_BT1 BTFSS GOTO DECFSZ GOTO BSF PRESSIONADO GOTO BT1_LIB MOVLW FILTRO_BOTAO MOVWF FILTRO_BT1 BCF STATUS_BOTOES,1 TESTA_BT2 BTFSS GOTO DECFSZ GOTO BSF PRESSIONADO GOTO BT2_LIB MOVLW FILTRO_BOTAO MOVWF FILTRO_BT2 BCF STATUS_BOTOES,2 TESTA_BT3 BTFSS GOTO DECFSZ GOTO BSF PRESSIONADO GOTO BT3_LIB MOVLW FILTRO_BOTAO MOVWF FILTRO_BT3 BCF STATUS_BOTOES,3 CONTINUA MOVF STATUS_BOTOES,W MOVWF LEDS MOVF BTFSS GOTO STATUS_BOTOES,F STATUS,Z MUDA_FREQ ; REINICIALIZA FILTRO ; MARCA BOTO COMO LIBERADO ; REINICIALIZA FILTRO ; MARCA BOTO COMO LIBERADO ; REINICIALIZA FILTRO ; MARCA BOTO COMO LIBERADO STATUS_BOTOES,0 ; MARCA BOTO COMO LIBERADO

BOTAO_1 BT1_LIB FILTRO_BT1,F TESTA_BT2 STATUS_BOTOES,1 TESTA_BT2

; BOTO 1 PRESSIONADO? ; NO - TRATA BOTO COMO LIBERADO ; SIM ; DECREMENTA FILTRO DO BOTO. ACABOU? ; NO - TESTA PRXIMO BOTO ; SIM - MARCA BOTO COMO ; TESTA PRXIMO BOTO

BOTAO_2 BT2_LIB FILTRO_BT2,F TESTA_BT3 STATUS_BOTOES,2 TESTA_BT3

; BOTO 2 PRESSIONADO? ; NO - TRATA BOTO COMO LIBERADO ; SIM ; DECREMENTA FILTRO DO BOTO. ACABOU? ; NO - TESTA PRXIMO BOTO ; SIM - MARCA BOTO COMO ; TESTA PRXIMO BOTO

BOTAO_3 BT3_LIB FILTRO_BT3,F CONTINUA STATUS_BOTOES,3 CONTINUA

; BOTO 3 PRESSIONADO? ; NO - TRATA BOTO COMO LIBERADO ; SIM ; DECREMENTA FILTRO DO BOTO. ACABOU? ; NO - CONTINUA EXECUO DO PROGRAMA ; SIM - MARCA BOTO COMO ; E CONTINUA EXECUO DO PROGRAMA

; ATUALIZA LEDS CONFORME BOTES

BANK1 MOVLW .255 MOVWF PR2 BCF PIE1,TMR2IE BANK0 BCF BUZZER GOTO SAI_INT MUDA_FREQ CALL ACERTA_FREQ BANK1 MOVWF PR2 BSF BANK0 PIE1,TMR2IE

; TODOS OS BOTES SOLTOS? ; NO - DEVE ALT. A FREQ. ; SIM ; MUDA PARA BANK1 ; PR2 = 255 ; DESLIGA INT. TIMER2 ; MUDA PARA BANK0 ; GARANTE PINO DO BUZZER EM 0 ; SAI DA INTERRUPO

; CHAMA TABELA DE FREQ. ; MUDA PARA BANK1 ; ACERTA VALOR DE PR2 CONFORME ; RETORNO DA TABELA ; LIGA INT. TIMER2 ; MUDA PARA BANK0

;************************************** ;* FIM DA ROTINA DE INTERRUPO * ;************************************** ; RESTAURAR OS VALORES DE "W" E "STATUS" ANTES DE RETORNAR. SAI_INT

Conectando o PIC 16F877A - Recursos Avanados

63
SWAPF MOVWF SWAPF SWAPF RETFIE STATUS_TEMP,W STATUS W_TEMP,F W_TEMP,W

; COPIA STATUS_TEMP PARA STATUS ; COPIA W_TEMP PARA W ; RETORNA DA INTERRUPO

;************************************** ;* TABELA DE ACERTO DA FREQUNCIA DO BUZZER ;************************************** ACERTA_FREQ MOVF STATUS_BOTOES,W ADDWF PCL,F

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

.255 .16 .32 .48 .64 .80 .96 .112 .128 .144 .160 .176 .192 .208 .224 .240

; COLOCA STATUS_BOTOES EM W ; SOMA STATUS_BOTOES AO PCL ; CRIANDO UMA SELEO TIPO "CASE" ; CONFORME TABELA ABAIXO: ; - -> LIBERARO ; X -> PRESSIONADO ; BT3 BT2 BT1 BT0 ; - - ; - - X ; - X ; - X X ; X - ; X - X ; X X ; X X X ; X - - ; X - - X ; X - X ; X - X X ; X X - ; X X - X ; X X X ; X X X X

;************************************** ;* CONFIGURAES INICIAIS DE HARDWARE E SOFTWARE * ;************************************** ; NESTA ROTINA SO INICIALIZADAS AS PORTAS DE I/O DO MICROCONTROLADOR E AS ; CONFIGURAES DOS REGISTRADORES ESPECIAIS (SFR). A ROTINA INICIALIZA A ; MQUINA E AGUARDA O ESTOURO DO WDT. CONFIG CLRF CLRF CLRF CLRF CLRF BANK1 MOVLW B'11011111' MOVWF TRISA MOVLW B'11110000' MOVWF TRISB MOVLW B'11111111' MOVWF TRISC MOVLW B'11111111' MOVWF TRISD MOVLW B'00000111' MOVWF TRISE MOVLW B'11001111' MOVWF OPTION_REG PORTA PORTB PORTC PORTD PORTE ; GARANTE TODAS AS SADAS EM ZERO

; SELECIONA BANCO 1 DA RAM

; CONFIGURA I/O DO PORTA

; CONFIGURA I/O DO PORTB

; CONFIGURA I/O DO PORTC

; CONFIGURA I/O DO PORTD

; CONFIGURA I/O DO PORTE

; CONFIGURA OPTIONS ; PULL-UPs DESABILITADOS ; INTER. NA BORDA DE SUBIDA DO RB0 ; TIMER0 INCREM. PELO CICLO DE MQUINA ; WDT - 1:128 ; TIMER - 1:1

MOVLW B'01100000' MOVWF INTCON

; CONFIGURA INTERRUPES ; HABILITA AS INT. DE TMR0 E PERIF.

Conectando o PIC 16F877A - Recursos Avanados

64
MOVLW B'00000000' MOVWF PIE1 MOVLW B'00000111' MOVWF ADCON1 BANK0 MOVLW B'00001111' MOVWF T2CON ; ; ; ;

; CONFIGURA INTERRUPES ; DESABILITA AS INT. DE TMR1 E TMR2

; CONFIGURA CONVERSOR A/D ; CONFIGURA PORTA E PORTE COMO I/O DIGITAL ; SELECIONA BANCO 0 DA RAM

; TIMER2: PRESCALE - 1:16 ; POSTSCALE - 1:2

AS INSTRUES A SEGUIR FAZEM COM QUE O PROGRAMA TRAVE QUANDO HOUVER UM RESET OU POWER-UP, MAS PASSE DIRETO SE O RESET FOR POR WDT. DESTA FORMA, SEMPRE QUE O PIC LIGADO, O PROGRAMA TRAVA, AGUARDA UM ESTOURO DE WDT E COMEA NOVAMENTE. ISTO EVITA PROBLEMAS NO START-UP DO PIC. BTFSC GOTO STATUS,NOT_TO $ ; RESET POR ESTOURO DE WDT? ; NO - AGUARDA ESTOURO DO WDT ; SIM

; RECONFIGURA O VALOR DO OPTION_REG PARA ACERTAR O PRESCALE. BANK1 MOVLW B'11000010' MOVWF OPTION_REG ; SELECIONA BANCO 1 DA RAM ; RECONFIGURA OPTIONS ; PULL-UPs DESABILITADOS ; INTER. NA BORDA DE SUBIDA DO RB0 ; TIMER0 INCR. PELO CICLO DE MQUINA ; WDT - 1:1 ; TIMER0 - 1:8 ; SELECIONA BANCO 0 DA RAM

BANK0

;************************************** ;* INICIALIZAO DA RAM * ;************************************** ; ESTA ROTINA IR LIMPAR TODA A RAM DO BANCO 0, INDO DE 0X20 A 0X7F. ; EM SEGUIDA, AS VARIVEIS DE RAM DO PROGRAMA SO INICIALIZADAS. MOVLW 0X20 MOVWF FSR LIMPA_RAM CLRF INCF MOVF XORLW BTFSS GOTO

; APONTA O ENDEREAMENTO INDIRETO PARA ; A PRIMEIRA POSIO DA RAM ; LIMPA A POSIO ; INCREMENTA PONTEIRO P/ A PRX. POS. ; COMPARA PONTEIRO COM A LT. POS. +1 ; J LIMPOU TODAS AS POSIES? ; NO - LIMPA A PRXIMA POSIO ; SIM ; INICIALIZA OS FILTROS DOS BOTES

INDF FSR,F FSR,W 0X80 STATUS,Z LIMPA_RAM

MOVLW FILTRO_BOTAO MOVWF FILTRO_BT0 MOVWF FILTRO_BT1 MOVWF FILTRO_BT2 MOVWF FILTRO_BT3

;************************************** ;* LOOP PRINCIPAL * ;************************************** ; ESTA ROTINA PRINCIPAL SIMPLESMENTE LIMPA O WDT, POIS TODA A LGICA DO ; PROGRAMA TRATADA DENTRO DAS INTERRUPES. BSF LOOP CLRWDT GOTO LOOP ;************************************** ;* FIM DO PROGRAMA ;************************************** END ; LIMPA WATCHDOG TIMER ; VOLTA AO LOOP INTCON,GIE ; LIGA AS INTERRUPES

* ; FIM DO PROGRAMA

Conectando o PIC 16F877A - Recursos Avanados

65
Dicas e comentrios
Observe que, pela lgica e funcionabilidade do sistema, no seria necessrio o tratamento do filtro dos botes, uma vez que o som s gerado enquanto o boto pressionado. Entretanto, este sistema j foi implementado desta forma para fornecer uma lgica eficiente de tratamento de debaunce. Lembre-se tambm de que em muitos sistemas onde ser necessrio filtrar corretamente uma entrada este filtro poder ter de ser aplicado duas vezes, uma para cada mudana de estado, isto , quando o boto e escoado e quando liberado. Este programa tambm no precisaria salvar o contexto para a interrupo, mas j deixamos pronto efeito ilustrativo.

Exerccios propostos
Agora que o exemplo j foi estudado e esclarecido, aproveite para gerar novos problemas e solues, seguindo os exerccios propostos: 1. Faa o sistema trabalhar em outra faixa de freqncia, alterando os valores de ajuste do TMR2. Acrescentar um delay enquanto os pinos (leds/botes) esto configurados como entrada e verificar o efeito sobre os leds.

2.

3.

Inibir o buzzer atravs do desligamento do Timer2 no lugar da desabilitao da interrupo. Inverter o estado do pino do buzzer por intermdio do XOR. Inverter a escala de freqncias, trocando a mais alta pela mais baixa.

4. 5.

Conectando o PIC 16F877A - Recursos Avanados

66 Anotaes _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________
Conectando o PIC 16F877A - Recursos Avanados

67

Conectando o PIC

5
Varredura de Display de Quatro Dgitos
Introduo
Atualmente, um dos pontos mais importantes de qualquer projeto pode ser considerado a interface :com o usurio, j que esta interface composta por entradas e sadas. No captulo anterior comeamos a estudar estas interfaces, mas, como ponto de sada, utilizamos somente os Leds e o buzzer. Para aprimorarmos mais a interface de sada, podemos fazer uso de displays. Neste captulo estudaremos displays de Leds, que apesar de possurem recursos limitados, ainda so os mais utilizados no mercado devido ao seu baixo custo e fcil visualizao.b

Teoria e recursos do PIC


Os displays com os quais trabalharemos so conhecidos como displays de Leds de sete segmentos, pois os nmeros so compostos por sete traos. Estes componentes possuem ainda o ponto dcima e se considerados displays numricos, por no possurem traos suficientes para a exibio de todas as eras do nosso alfabeto. Para facilitar a vida do projetista, o mercado padronizou uma nomenclatura para todos os traos do display, possibilitando que tratemos cada um deles individualmente:

Desta forma, temos um pino para controlar cada um dos segmentos (A...G) e mais o ponto (Dp). Os dois pinos adicionais so os comuns, que podem ser ligados a todos os catodos ou anodos dos Leds internos. Por causa disso, este displays so fornecidos em dois tipos: catodo comum ou anodo comum. No nosso caso, os displays utilizados so do tipo catodo comum, isto , o pino comum deve se ligado ao terra e os segmentos devem ser ligados ao VDD para acenderem.

Conectando o PIC 16F877A - Recursos Avanados

68

Outra observao importante que a pinagem descrita no desenho vlida para o tipo de display utilizado na placa proposta (McLab2). Existem displays de outros tamanhos que possuem uma disposio de pinos diferente. Bem, agora que j conhecemos melhor o componente, vejamos como operlo. Como cada segmento um Led individual, precisaremos de um pino do PIC para controlar cada um deles. Desta forma, precisaremos de oito pinos para acionar os sete segmentos e mais o ponto decimal. At a tudo bem. Acontece que, na nossa placa (e na maioria dos projetos existentes) possumos no um nico display, mas um conjunto deles. Por isso, uma maneira de controlarmos vrios displays disponibilizarmos um conjunto de oito pinos para cada um. Acontece que, na nossa placa, possumos quatro displays, sendo necessrio ento 32 pinos no total (8x4). Usaramos o PIC inteiro somente para controlar os quatro displays. Mas qual a soluo, ento? O segredo para minimizarmos a quantidade de pinos utilizados o emprego de um conceito denominado varredura. Para isso, interligamos todos os pinos de um mesmo segmento (para todos os displays) criando assim oito vias de dados, de A a Dp. Depois, utilizaremos um pino para controlar o comum de cada um dos displays (total de quatro pinos). Assim, quando quisermos escrever em um dos displays, basta informar os segmentos a serem acionados nas vias de dados e ligarmos o comum do display desejado. Mas, ento, s poderemos escrever em um display de cada vez? Na verdade, sim. Acontece que faremos a escrita na seqncia, isto , primeiro escrevemos no display 1, depois no 2, no 3 e no 4, voltando novamente para o 1 e repetindo o ciclo infinitamente. Desta forma estaremos "varrendo" todos os displays. Faremos isso numa freqncia to rpida que nossos olhos no sero capazes de perceber que somente um display est realmente aceso de cada vez. Assim controlaremos os quatro displays com somente 12 pinos do PIC. Uma melhoria e tanto, no?

Para que no seja possvel percebermos a varredura dos displays, sugerimos que a freqncia do ciclo completo (chaveamento de todos os displays) seja de no mnimo 100 Hz. Freqncias bem superiores a esta podem ser utilizadas para facilitar a integrao da varredura com as demais funes do sistema. Por outro lado, freqncias mais altas comprometem a velocidade dos demais componentes utilizados, como os transistores ligados aos pinos comuns dos displays. Caso esses transistores no estejam respondendo corretamente freqncia aplicada, comear a surgir um problema denominado sombreamento. O sombreamento nada mais que a exibio do valor de um dgito no display seguinte. Alm disso, como o tempo de resposta dos Leds tambm no muito rpido, o problema do sombreamento pode tornar-se crtico. Conectando o PIC 16F877A - Recursos Avanados

69
Para evitarmos esses sombreamentos, alm da velocidade dos transistores, utilizamos tambm recurso de desligarmos todos os segmentos durante o chaveamento de um display para o outro display com todos os segmentos apagados chamado de blank.

Outro ponto importante a ser observado na utilizao da varredura que o tempo de permanncia se um segmento aceso o inverso da quantidade de display. No nosso caso, cada display permanece-a aceso aproximadamente 25% (1/4) do tempo. Por isso, a intensidade luminosa do Led durante a varredura bem menor que se o mesmo fosse controlado individualmente. Para compensar isto, a corrente aplicada ao Led normalmente maior. No caso da varredura ser feita com muitos displays talvez seja necessria a utilizao de displays de alto brilho.

Lgica do exemplo
O exemplo desenvolvido para este captulo faz muito mais que simplesmente implementa- a varredura dos displays. Trata-se de um contador regressivo de segundos, ou seja, um temporizador capaz de contar at 9.999 segundos. Para isso, utilizaremos os displays para indicar o valor atual do temporizador. A primeira tecla (S1)no possui nenhuma funo. Por outro lado, o Led relacionado a ela (L1) ser utilizado para indicar: estado do temporizador:

L1
Aceso Apagado

Descrio
Temporizador em contagem regressiva Temporizador paralisado

Os demais botes apresentam as funes de controle do temporizador: Boto S2 S3 S4 Descrio


Incrementa o valor inicial em 1 segundo Decrementa o valor inicial em 1 segundo Inicia e paralisa o temporizador

Conectando o PIC 16F877A - Recursos Avanados

70
Os botes de incremento e decremento operam de forma rotativa, isto , comutam automaticamente entre 0000 e 9999. Outra caracterstica desses botes que eles executam suas funes repetidamente quando mantidos pressionados e s funcionam quando o temporizador est paralisado. Ao atingir o valor zero (0000), o temporizador automaticamente paralisado, desligando-se o Led indicativo (L1). Para o sistema de varredura foram criadas quatro variveis para armazenamento dos dgitos mostrados nos respectivos displays: UNIDADE, DEZENA, CENTENA e MILHAR. Essas variveis representam o valor atual do temporizador e so incrementadas e decrementadas atravs dos botes. Na verdade, os botes alteram diretamente o valor da unidade. A lgica do sistema compara esse valor com os limites (0 e 9) para alterar ou no os demais dgitos. A freqncia de varredura controlada pela interrupo de Timer0. Ajustamos seus parmetros para que a comutao entre displays (tempo da interrupo) seja de aproximadamente 4 kHz:

Ciclo de Maq. 1s

Prescale 1

Conta TMRQ 256

Auxiliar -

Perodo 256s

Freqncia 3900 Hz

A freqncia de varredura ser a freqncia de comutao dividida pelo nmero de displays, que no nosso caso ser de aproximadamente 1 kHz. Dentro do tratamento da interrupo de TMRO so desligados todos os segmentos (blank), depois comutado para o prximo display (desligado o atual e ligado o seguinte), dando um delay (cerca de 11s no total) para resposta do transistor e s depois que ser carregado o valor do dgito correspondente ao display atualmente ativo. Quanto a contagem dos segundos, utilizamos a interrupo de Timer1 para essa finalidade. Veja os ajustes dos parmetros para essa interrupo:

Ciclo de Maq. Prescale 1s 8

Conta TMR1 62500

Auxiliar 2

Perodo 1.000.000s

Freqncia 1 Hz

Para isso, configuramos o prescaler de TMR1 em 1:8 e iniciamos o contador com o valor total menos o desejado para a contagem (65.536 - 62.500). Como este valor de 16 bits, a constante de inicializao foi dividida em TMR1_HIGH e TMR1_LOW. Desta maneira, a interrupo acontecer a cada 0,5 segundo. Para podermos contar um segundo foi criada uma varivel auxiliar denominada DIVISOR_TMR1. Cada vez que o sistema entrar na interrupo de TMR1 e o contador auxiliar (DIVISOR_TMR1) terminar, o tempo decrementado, comeando pela unidade e chegando at a milhar, se for necessrio. Quando o tempo termina (0000), tanto o Led quanto o TMR1 so desligados.

Conectando o PIC 16F877A - Recursos Avanados

71
Esquema eltrico

Conectando o PIC 16F877A - Recursos Avanados

72

Conectando o PIC 16F877A - Recursos Avanados

73

Conectando o PIC 16F877A - Recursos Avanados

74

Conectando o PIC 16F877A - Recursos Avanados

75

Conectando o PIC 16F877A - Recursos Avanados

76
;************************************** ;* ;* ;* ;* ;* ;************************************** ; * VERSO : 2.0 ;* DATA : 24/02/2003 ;************************************** * * CONECTANDO O PIC - RECURSOS AVANADOS EXEMPLO 2 * NICOLS CSAR LAVINIA e DAVID JOS DE SOUZA * * * *

;************************************** ;* DESCRIO GERAL *

;************************************** ; ESTE EXEMPLO FOI PREPARADO PARA DEMONSTRAR O FUNCIONAMENTO DO TIMER DE ; 16 BITS DO PIC (TMR1) E DA VARREDURA DE DISPLAYS. ; CONSISTE NUM TEMPORIZADOR DE SEGUNDOS. DOIS BOTES FORAM UTILIZADOS PARA ; PROGRAMAR O TEMPO DA CONTAGEM. UM OUTRO BOTO FOI UTILIZADO PARA DISPARAR ; O CONTADOR. O TEMPORIZADOR CONSEGUE CONTAR AT 9999 SEGUNDOS, DE FORMA QUE ; OS 4 DISPLAYS DE 7 SEGMENTOS FORAM NECESSRIOS. A CONTAGEM REGRESSIVA. ; UM LED INDICA QUE O TEMPORIZADOR EST OPERANDO. QUANDO O SISTEMA CHEGA ; A 0000 (ZERO) O LED DESLIGADO AUTOMATICAMENTE. ; ;************************************** ;* CONFIGURAES PARA GRAVAO *

;**************************************

__CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_ON & _XT_OSC

;************************************** ;* DEFINIO DAS VARIVEIS *

;************************************** ; O PRIMEIRO BLOCO DE VARIVEIS EST LOCALIZADO LOGO NO INCIO DO BANCO 0

Conectando o PIC 16F877A - Recursos Avanados

77
CBLOCK 0X20 ; POSIO INICIAL DA RAM

UNIDADE DEZENA CENTENA MILHAR ; (MSD) ;

; (LSD)

FILTRO_BOTOES

; FILTRO PARA RUIDOS

TEMPO_TURBO

; TEMPORIZADOR P/ TURBO DAS TECLAS

INDICE_VARRE_DISPLAY

; INDEXADOR P/ VARREDURA DOS DISPLAYS

DIVISOR_TMR1

; CONTADOR AUXILIAR P/ SEGUNDOS

ENDC

; O SEGUNDO BLOCO DE VARIVEIS EST LOCALIZADO NO FINAL DO BANCO 0, A PARTIR ; DO ENDEREO 0X70, POIS ESTA LOCALIZAO ACESSADA DE QUALQUER BANCO, ; FACILITANDO A OPERAO COM AS VARIVEIS AQUI LOCALIZADAS.

CBLOCK 0X70

; REGIO COMUM A TODOS OS BANCOS

STATUS_TEMP WORK_TEMP FSR_TEMP PCLATH_TEMP ENDC

; REGISTRADOR DE STATUS TEMPORRIO ; REGISTRADOR DE TRABALHO TEMPORRIO ; REG. DE ENDERECO INDIRETO TEMPORRIO ; REGISTRADOR DE PAGINAO TEMPORRIO

;************************************** ;* DEFINIO DAS VARIVEIS INTERNAS DO PIC *

;************************************** ; O ARQUIVO DE DEFINIES DO PIC UTILIZADO DEVE SER REFERENCIADO PARA QUE ; OS NOMES DEFINIDOS PELA MICROCHIP POSSAM SER UTILIZADOS, SEM A NECESSIDADE ; DE REDIGITAO.

Conectando o PIC 16F877A - Recursos Avanados

78

#INCLUDE <P16F877A.INC>

; ARQUIVO DE DEFINIES DO PIC ATUAL

;************************************** ;* DEFINIO DOS BANCOS DE RAM *

;************************************** ; OS PSEUDOS-COMANDOS "BANK0" E "BANK1", AQUI DEFINIDOS, AJUDAM A COMUTAR ; ENTRE OS BANCOS DE MEMRIA.

#DEFINE BANK1 BSF #DEFINE BANK0 BCF

STATUS,RP0 STATUS,RP0

; SELECIONA BANK1 DA MEMORIA RAM ; SELECIONA BANK0 DA MEMORIA RAM

;************************************** ;* CONSTANTES INTERNAS *

;************************************** ; A DEFINIO DE CONSTANTES FACILITA A PROGRAMAO E A MANUTENO.

FILTRO_TECLA TURBO_TECLA

EQU EQU

.200 .70

; FILTRO P/ EVITAR RUIDOS DOS BOTES ; TEMPORIZADOR P/ TURBO DAS TECLAS

TMR1_HIGH TMR1_LOW

EQU EQU

HIGH (.65536-.62500) LOW (.65536-.62500) ; VALOR PARA CONTAGEM DE ; 62500 CICLOS DE CONTAGEM ; DO TMR1 (PROGRAMADO P/ ; PRESCALER DE 1:8)

;************************************** ;* DECLARAO DOS FLAGs DE SOFTWARE *

;************************************** ; A DEFINIO DE FLAGs AJUDA NA PROGRAMAO E ECONOMIZA MEMRIA RAM.

; ESTE PROGRAMA NO UTILIZA NENHUM FLAG DE USURIO

;************************************** ;* ENTRADAS *

Conectando o PIC 16F877A - Recursos Avanados

79
;************************************** ; AS ENTRADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE.

#DEFINE BT_UP

PORTB,1

; ESTADO DO BOTO 1 ; 1 -> LIBERADO ; 0 -> PRESSIONADO

#DEFINE BT_DOWN

PORTB,2

; ESTADO DO BOTO 2 ; 1 -> LIBERADO ; 0 -> PRESSIONADO

#DEFINE BT_START_STOP PORTB,3

; ESTADO DO BOTO 3 ; 1 -> LIBERADO ; 0 -> PRESSIONADO

;************************************** ;* SADAS *

;************************************** ; AS SADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE.

#DEFINE ESTADO_TIMER PORTB,0

; LED DE ESTADO DO TIMER ; (FUNCIONA TAMBM COMO FLAG) ; 1 -> TIMER CONTANDO ; 0 -> TIMER PARADO

#DEFINE MUX

PORTB

; MUX PARA ACIONAMENTO DOS DISPLAYS ; (DE RB4 AT RB7)

#DEFINE SEGMENTOS

PORTD

; SEGMENTOS DOS DISPLAYS

;************************************** ;* VETOR DE RESET DO MICROCONTROLADOR *

;**************************************

Conectando o PIC 16F877A - Recursos Avanados

80
; POSIO INICIAL PARA EXECUO DO PROGRAMA

ORG GOTO

0X0000 CONFIG

; ENDEREO DO VETOR DE RESET ; PULA PARA CONFIG DEVIDO A REGIO ; DESTINADA S INTERRUPES

;************************************** ;* VETOR DE INTERRUPO *

;************************************** ; POSIO DE DESVIO DO PROGRAMA QUANDO UMA INTERRUPO ACONTECE

ORG

0X0004

; ENDEREO DO VETOR DE INTERRUPO

; MUITO IMPORTANTE QUE OS REGISTRADORES PRIORITRIOS AO FUNCIONAMENTO DA ; MQUINA, E QUE PODEM SER ALTERADOS TANTO DENTRO QUANTO FORA DAS INTS SEJAM ; SALVOS EM REGISTRADORES TEMPORRIOS PARA PODEREM SER POSTERIORMENTE ; RECUPERADOS.

SALVA_CONTEXTO MOVWF WORK_TEMP SWAPF STATUS,W MOVWF STATUS_TEMP MOVF FSR,W ; SALVA REGISTRADOR FSR ; SALVA REGISTRADOR DE TRABALHO E ; DE STATUS DURANTE O TRATAMENTO ; DA INTERRUPO.

MOVWF FSR_TEMP MOVF PCLATH,W

MOVWF PCLATH_TEMP

; SALVA REGISTRADOR PCLATH

CLRF

PCLATH

; LIMPA REGISTRADOR PCLATH ; (SELECIONA PGINA 0)

CLRF

STATUS

; LIMPA REGISTRADOR STATUS ; (SELECIONA BANCO 0)

;************************************** ;* TESTA QUAL INTERRUPO FOI SOLICITADA *

;**************************************

Conectando o PIC 16F877A - Recursos Avanados

81
; TESTA O FLAG DAS INTERRUPES PARA SABER PARA QUAL ROTINA DESVIAR.

BTFSS GOTO

INTCON,T0IF INT_TMR1

; FOI INTERRUPO DE TMR0 ? ; NO - ENTO PULA P/ INT_TMR1 ; SIM

;************************************** ;* TRATAMENTO DA INTERRUPO DE TIMER 0 *

;************************************** ; ROTINA PARA EXECUTAR AS AES NECESSRIAS SEMPRE QUE A INTERRUPO ; ACONTECE. NESTE CASO, A INTERRUPO ESTA SENDO UTILIZADA PARA GERAR A ; FREQNCIA DE VARREDURA DOS DISPLAYS. POR ISSO, CADA VEZ QUE ELA ACONTECER, ; O PRXIMO DISPLAY SER ACIONADO.

INT_TMR0 INCF INDICE_VARRE_DISPLAY,F ; INCR. O NDICE DE VAR. DOS DISPLAYS

MOVLW B'00000011' ANDWF INDICE_VARRE_DISPLAY,F ; LIMITA CONTAGEM DE 0 A 3

MOVF

INDICE_VARRE_DISPLAY,W

; CARREGA NO WORK O VALOR DO NDICE ; SOMA ENDEREO DO PRIMEIRO DGITO ; SALVA RESULTADO NO FSR, APONTANDO ; PARA O ENDEREO DO DGITO ATUAL. ; (ENDEREAMENTO INDIRETO)

ADDLW UNIDADE MOVWF FSR

CLRF

SEGMENTOS

; LIMPA OS SEGMENTOS (BLANK) ; UTILIZADO P/ EVITAR SOMBRAS NOS ; DISPLAYS

MOVLW B'00001111' ANDWF MUX,F

; PREPARA MSCARA ; EXECUTA MSCARA (DESLIGA OS DISP.)

MOVF CALL

INDICE_VARRE_DISPLAY,W TABELA_MUX

; SALVA NO WORK O VALOR DO NDICE ; CONSULTA TABELA MUX

Conectando o PIC 16F877A - Recursos Avanados

82
IORWF MUX,F ; ATUALIZA MUX, SELECIONANDO O ; DISPLAYS CORRETO PARA O MOMENTO

GOTO

$+1

; DELAY DE 2US ; (TEMPO DE RESPOSTA DO TRANSISTOR)

MOVF CALL

INDF,W

; RECUPERA NO WORK O VALOR DO DGITO

TABELA_DISPLAY_7_SEG ; CONSULTA TABELA P/ DISPLAYS ; ATUALIZA OS SEGMENTOS, ESCREVENDO ; O VALOR DO DGITO CORRETO (PORTD)

MOVWF SEGMENTOS

SAI_INT_TMR0 BCF GOTO INTCON,T0IF SAI_INT ; LIMPA FLAG DA INTERRUPO DE TMR0 ; PULA P/ SAI_INT

;************************************** ;* TRATAMENTO DA INTERRUPO DE TIMER 1 *

;************************************** ; ROTINA PARA EXECUTAR AS AES NECESSRIAS SEMPRE QUE A INTERRUPO ; ACONTECE. NESTE CASO, A INTERRUPO ESTA SENDO UTILIZADA PARA CONTAR O ; TEMPO DO TEMPORIZADOR. POR ISSO, CADA VEZ QUE ELA ACONTECER O VALOR DO ; TIMER SER DECREMENTADO, CASO J TENHA SE PASSADO 1SEG. ; PERIODO DA INTERRUPO: 1US (CICLO DE MAQUINA) * 8 (PRESCALER DO TMR1) * ; * 62500 (CONTAGEM DO TMR1) = 0,5SEG.

INT_TMR1 MOVLW TMR1_HIGH MOVWF TMR1H MOVLW TMR1_LOW MOVWF TMR1L ; RECARREGA CONTADOR DO TMR1 ; PERIODICIDADE DE 0,5SEG.

DECFSZ DIVISOR_TMR1,F GOTO SAI_INT_TMR1

; PASSOU-SE 1 SEGUNDO ? ; NO - ENTO SAI DA INTERRUPO ; SIM

Conectando o PIC 16F877A - Recursos Avanados

83
MOVLW .2 MOVWF DIVISOR_TMR1 ; RECARREGA CONTADOR DE 1SEG.

CALL

DECREMENTA_TIMER

; DECREMENTA O VALOR DO TIMER

MOVF BTFSS GOTO MOVF BTFSS GOTO MOVF BTFSS GOTO MOVF BTFSS GOTO

UNIDADE,F STATUS,Z SAI_INT_TMR1 DEZENA,F STATUS,Z SAI_INT_TMR1 CENTENA,F STATUS,Z SAI_INT_TMR1 MILHAR,F STATUS,Z SAI_INT_TMR1 ; FINAL DA CONTAGEM ? (TIMER=0?) ; NO - SAI DA INTERRUPO ; SIM

BCF BCF

ESTADO_TIMER T1CON,TMR1ON

; DESLIGA LED DE TIMER OPERANDO ; PARALIZA CONTADOR DO TMR1

SAI_INT_TMR1 BCF PIR1,TMR1IF ; LIMPA FLAG DA INTERRUPO DE TMR1

;************************************** ;* SADA DA INTERRUPO *

;************************************** ; ANTES DE SAIR DA INTERRUPO, O CONTEXTO SALVO NO INCIO DEVE SER ; RECUPERADO PARA QUE O PROGRAMA NO SOFRA ALTERAES INDESEJADAS.

SAI_INT MOVF PCLATH_TEMP,W ; RECUPERA REG. PCLATH (PAGINAO)

MOVWF PCLATH MOVF FSR_TEMP,W

MOVWF FSR

; RECUPERA REG. FSR (END. INDIRETO)

Conectando o PIC 16F877A - Recursos Avanados

84
SWAPF STATUS_TEMP,W MOVWF STATUS SWAPF WORK_TEMP,F SWAPF WORK_TEMP,W RETFIE ; RECUPERA REG. WORK ; RETORNA DA INTERRUPO (HABILITA GIE) ; RECUPERA REG. STATUS

;************************************** ;* TABELA PARA OS DISPLAYS DE 7 SEGMENTOS *

;************************************** ; ROTINA PARA CONVERSO DO VALOR NMRICO DO DGITO EM RELAO AOS SEGMENTOS ; QUE DEVEM SER ACESOS E APAGADOS NO DISPLAY

TABELA_DISPLAY_7_SEG ANDLW B'00001111' ADDWF PCL,F ; EXECUTA MASCARA P/ EVITAR PULOS ERRADOS ; SOMA DESLOCAMENTO AO PROGRAM COUNTER, ; GERANDO UMA TABELA DO TIPO "CASE". ; PGFEDCBA RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW B'00111111' B'00000110' B'01011011' B'01001111' B'01100110' B'01101101' B'01111101' B'00000111' B'01111111' B'01101111' B'00000000' B'00000000' B'00000000' B'00000000' B'00000000' B'00000000' ; POSIO RELATIVA AOS SEGMENTOS ; 0H - 0 ; 1H - 1 ; 2H - 2 ; 3H - 3 ; 4H - 4 ; 5H - 5 ; 6H - 6 ; 7H - 7 ; 8H - 8 ; 9H - 9 ; AH - BLANK ; BH - BLANK ; CH - BLANK ; DH - BLANK ; EH - BLANK ; FH - BLANK

;**************************************

Conectando o PIC 16F877A - Recursos Avanados

85
;* TABELA PARA ACIONAMENTO DOS DISPLAYS *

;************************************** ; ROTINA PARA CONVERTER O DGITO ATUAL EM RELAO AO PORT QUE DEVE SER ; LIGADO PARA ACIONAMENTO DO DISPLAY RELACIONADO.

TABELA_MUX ADDWF PCL,F ; SOMA DESLOCAMENTO AO PROGRAM COUNTER ; GERANDO UMA TABELA DO TIPO "CASE". RETLW RETLW RETLW RETLW B'00010000' B'00100000' B'01000000' B'10000000' ; 0 - ACIONA DISPLAY 0 ; 1 - ACIONA DISPLAY 1 ; 2 - ACIONA DISPLAY 2 ; 2 - ACIONA DISPLAY 3

;************************************** ;* ROTINA PARA INCREMENTAR O VALOR DO TIMER (BCD) *

;************************************** ; ROTINA UTILIZADA PARA INCREMENTAR O VALOR DOS REGISTRADORES UNIDADE, ; DEZENA, CENTENA E MILHAR, QUE SO OS CONTADORES DO TIMER. A CONTAGEM ; FEITA DIRETAMENTE EM BCD.

INCREMENTA_TIMER INCF UNIDADE,F ; INCREMENTA UNIDADE

MOVLW .10 XORWF UNIDADE,W BTFSS RETURN STATUS,Z ; UNIDADE = 10 ? ; NO - RETORNA ; SIM CLRF INCF UNIDADE DEZENA,F ; ZERA A UNIDADE ; INCREMENTA A DEZENA

MOVLW .10 XORWF DEZENA,W BTFSS RETURN STATUS,Z ; DEZENA = 10 ? ; NO - RETORNA

Conectando o PIC 16F877A - Recursos Avanados

86
; SIM CLRF INCF DEZENA CENTENA,F ; ZERA A DEZENA ; INCREMENTA A CENTENA

MOVLW .10 XORWF CENTENA,W BTFSS RETURN STATUS,Z ; CENTENA = 10 ? ; NO - RETORNA ; SIM CLRF INCF CENTENA MILHAR,F ; ZERA A CENTENA ; INCREMENTA O MILHAR

MOVLW .10 XORWF MILHAR,W BTFSC CLRF RETURN STATUS,Z MILHAR ; MILHAR = 10 ? ; SIM - ZERA MILHAR ; NO - RETORNA

;************************************** ;* ROTINA PARA DECREMENTAR O VALOR DO TIMER (BCD) *

;************************************** ; ROTINA UTILIZADA PARA DECREMENTAR O VALOR DOS REGISTRADORES UNIDADE, ; DEZENA, CENTENA E MILHAR, QUE SO OS CONTADORES DO TIMER. A CONTAGEM ; FEITA DIRETAMENTE EM BCD.

DECREMENTA_TIMER DECF UNIDADE,F ; INCREMENTA UNIDADE

MOVLW 0XFF XORWF UNIDADE,W BTFSS RETURN STATUS,Z ; UNIDADE = 0XFF ? ; NO - RETORNA ; SIM MOVLW .9 MOVWF UNIDADE ; CARREGA UNIDADE COM 9

Conectando o PIC 16F877A - Recursos Avanados

87
DECF DEZENA,F ; DECREMENTA A DEZENA

MOVLW 0XFF XORWF DEZENA,W BTFSS RETURN STATUS,Z ; DEZENA = 0XFF ? ; NO - RETORNA ; SIM MOVLW .9 MOVWF DEZENA DECF CENTENA,F ; CARREGA A DEZENA COM 9 ; DECREMENTA A CENTENA

MOVLW 0XFF XORWF CENTENA,W BTFSS RETURN STATUS,Z ; CENTENA = 0XFF ? ; NO - RETORNA ; SIM MOVLW .9 MOVWF CENTENA DECF MILHAR,F ; CARREGA CENTENA COM 9 ; DECREMENTA O MILHAR

MOVLW 0XFF XORWF MILHAR,W BTFSS RETURN STATUS,Z ; MILHAR = 0XFF ? ; NO - RETORNA ; SIM MOVLW .9 MOVWF MILHAR RETURN ; CARREGA O MILHAR COM 9 ; RETORNA

;************************************** ;* CONFIGURAES INICIAIS DE HARDWARE E SOFTWARE *

;************************************** ; NESTA ROTINA SO INICIALIZADAS AS PORTAS DE I/O DO MICROCONTROLADOR E AS ; CONFIGURAES DOS REGISTRADORES ESPECIAIS (SFR). A ROTINA INICIALIZA A ; MQUINA E AGUARDA O ESTOURO DO WDT.

Conectando o PIC 16F877A - Recursos Avanados

88

CONFIG CLRF CLRF CLRF CLRF CLRF PORTA PORTB PORTC PORTD PORTE ; GARANTE TODAS AS SADAS EM ZERO

BANK1

; SELECIONA BANCO 1 DA RAM

MOVLW B'11111111' MOVWF TRISA ; CONFIGURA I/O DO PORTA

MOVLW B'00001110' MOVWF TRISB ; CONFIGURA I/O DO PORTB

MOVLW B'11111111' MOVWF TRISC ; CONFIGURA I/O DO PORTC

MOVLW B'00000000' MOVWF TRISD ; CONFIGURA I/O DO PORTD

MOVLW B'00000111' MOVWF TRISE ; CONFIGURA I/O DO PORTE

MOVLW B'11011111' MOVWF OPTION_REG ; CONFIGURA OPTIONS ; PULL-UPs DESABILITADOS ; INTER. NA BORDA DE SUBIDA DO RB0 ; TIMER0 INCREM. PELO CICLO DE MQUINA ; WDT - 1:128 ; TIMER0- 1:1

MOVLW B'01100000' MOVWF INTCON ; CONFIGURA INTERRUPES

Conectando o PIC 16F877A - Recursos Avanados

89
; HABILITADA A INTERRUPO DE TIMER0 ; HABILITA AS INTERRUPES DE PERIFRICO

MOVLW B'00000001' MOVWF PIE1 ; CONFIGURA INTERRUPES DE PERIFIRICOS ; HABILITADA A INTERRUPO DE TMR1 MOVLW B'00000111' MOVWF ADCON1 ; CONFIGURA CONVERSOR A/D ; CONFIGURA PORTA E PORTE COMO I/O DIGITAL

BANK0

; SELECIONA BANCO 0 DA RAM

MOVLW B'00110000' MOVWF T1CON ; CONFIGURA TMR1 ; PRESCALER -> 1:8 ; INCREMENTADO PELO CICLO DE MQUINA

; AS INSTRUES A SEGUIR FAZEM COM QUE O PROGRAMA TRAVE QUANDO HOUVER UM ; RESET OU POWER-UP, MAS PASSE DIRETO SE O RESET FOR POR WDT. DESTA FORMA, ; SEMPRE QUE O PIC LIGADO, O PROGRAMA TRAVA, AGUARDA UM ESTOURO DE WDT ; E COMEA NOVAMENTE. ISTO EVITA PROBLEMAS NO START-UP DO PIC.

BTFSC GOTO

STATUS,NOT_TO $

; RESET POR ESTOURO DE WATCHDOG TIMER? ; NO - AGUARDA ESTOURO DO WDT ; SIM

;************************************** ;* INICIALIZAO DA RAM *

;************************************** ; ESTA ROTINA IR LIMPAR TODA A RAM DO BANCO 0, INDO DE 0X20 A 0X7F. ; EM SEGUIDA, AS VARIVEIS DE RAM DO PROGRAMA SO INICIALIZADAS.

MOVLW 0X20 MOVWF FSR ; APONTA O ENDEREAMENTO INDIRETO PARA ; A PRIMEIRA POSIO DA RAM

Conectando o PIC 16F877A - Recursos Avanados

90
LIMPA_RAM CLRF INCF MOVF INDF FSR,F FSR,W ; COMPARA O PONTEIRO COM A LT. POS. +1 ; J LIMPOU TODAS AS POSIES? ; NO - LIMPA A PRXIMA POSIO ; SIM ; LIMPA A POSIO ; INCREMENTA O PONTEIRO P/ A PRX. POS.

XORLW 0X80 BTFSS GOTO STATUS,Z LIMPA_RAM

BCF

ESTADO_TIMER

; INICIA COM ESTADO EM OFF

MOVLW .2 MOVWF DIVISOR_TMR1 ; CARREGA CONTADOR DE 1SEG.

;************************************** ;* ;* VARREDURA DOS BOTES LOOP PRINCIPAL * *

;************************************** ; A ROTINA PRINCIPAL FICA CHECANDO O ESTADO DOS BOTES. CASO ALGUM SEJA ; PRESSIONADO, A ROTINA DE TRATAMENTO DO BOTO CHAMADA.

BSF

INTCON,GIE

; HABILITA AS INTERRUPES ; USADA INT. TMR0 PARA VARREDURA ; DOS DISPLAYS

VARRE CLRWDT ; LIMPA WATCHDOG TIMER

BTFSS GOTO

BT_UP TRATA_BT_UP

; O BOTO DE UP EST PRESSIONADO? ; SIM - PULA P/ TRATA_BT_UP ; NO

BTFSS GOTO

BT_DOWN TRATA_BT_DOWN

; O BOTO DE DOWN EST PRESSIONADO? ; SIM - PULA P/ TRATA_BT_DOWN ; NO

Conectando o PIC 16F877A - Recursos Avanados

91

BTFSS GOTO

BT_START_STOP

; O BOTO START/STOP EST PRESSIONADO?

TRATA_BT_START_STOP ; SIM - PULA P/ TRATA_BT_START_STOP ; NO

MOVLW FILTRO_TECLA MOVWF FILTRO_BOTOES

; CARREGA NO WORK O VALOR DE FILTRO_TECLA ; SALVA EM FILTRO_BOTOES ; RECARREGA FILTRO P/ EVITAR RUIDOS

MOVLW .1 MOVWF TEMPO_TURBO ; CARREGA TEMPO DO TURBO DAS TECLAS ; COM 1 - IGNORA O TURBO A PRIMEIRA ; VEZ QUE A TECLA PRESSIONADA

GOTO

VARRE

; VOLTA PARA VARRER TECLADO

;************************************** ;* TRATAMENTO DOS BOTES *

;**************************************

; ************************* TRATAMENTO DO BOTO DE UP ***********************

TRATA_BT_UP BTFSC GOTO ESTADO_TIMER VARRE ; TIMER EST PARADO ? ; NO - VOLTA P/ VARRE ; SIM

DECFSZ FILTRO_BOTOES,F GOTO VARRE

; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO

DECFSZ TEMPO_TURBO,F GOTO VARRE

; FIM DO TEMPO DE TURBO ? ; NO - VOLTA P/ VARRE ; SIM

MOVLW TURBO_TECLA

Conectando o PIC 16F877A - Recursos Avanados

92
MOVWF TEMPO_TURBO ; RECARREGA TEMPORIZADOR DO TURBO ; DAS TECLAS

CALL

INCREMENTA_TIMER

; INCREMENTA O VALOR DO TIMER

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

; ************************* TRATAMENTO DO BOTO DE DOWN **********************

TRATA_BT_DOWN BTFSC GOTO ESTADO_TIMER VARRE ; TIMER EST PARADO ? ; NO - VOLTA P/ VARRE ; SIM

DECFSZ FILTRO_BOTOES,F GOTO VARRE

; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO

DECFSZ TEMPO_TURBO,F GOTO VARRE

; FIM DO TEMPO DE TURBO ? ; NO - VOLTA P/ VARRE ; SIM

MOVLW TURBO_TECLA MOVWF TEMPO_TURBO ; RECARREGA TEMPORIZADOR DO TURBO ; DAS TECLAS

CALL

DECREMENTA_TIMER

; DECREMENTA O VALOR DO TIMER

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

; ************************* TRATAMENTO DO BOTO START / STOP *****************

TRATA_BT_START_STOP MOVF BTFSC FILTRO_BOTOES,F STATUS,Z ; FILTRO J IGUAL A ZERO ? ; (FUNO J FOI EXECUTADA?)

Conectando o PIC 16F877A - Recursos Avanados

93
GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO ; NO

DECFSZ FILTRO_BOTOES,F GOTO VARRE

; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO

BTFSS GOTO

ESTADO_TIMER LIGA_TIMER

; TIMER ESTA LIGADO ? ; NO - ENTO LIGA ; SIM - ENTO DESLIGA

DESLIGA_TIMER BCF BCF GOTO ESTADO_TIMER T1CON,TMR1ON VARRE ; DESLIGA LED E FLAG DO ESTADO DO TIMER ; PARA CONTADOR DO TMR1 ; VOLTA P/ VARREDURA DOS BOTES

LIGA_TIMER MOVF BTFSS GOTO UNIDADE,F STATUS,Z LIGA_TIMER_2 ; UNIDADE EST ZERADA ? ; NO - PULA P/ LIGA_TIMER_2 ; SIM - TESTA DEZENA MOVF BTFSS GOTO DEZENA,F STATUS,Z LIGA_TIMER_2 ; DEZENA EST ZERADA ? ; NO - PULA P/ LIGA_TIMER_2 ; SIM - TESTA CENTENA MOVF BTFSS GOTO CENTENA,F STATUS,Z LIGA_TIMER_2 ; CENTENA EST ZERADA ? ; NO - PULA P/ LIGA_TIMER_2 ; SIM - TESTA MILHAR MOVF BTFSS GOTO GOTO MILHAR,F STATUS,Z LIGA_TIMER_2 VARRE ; MILHAR EST ZERADO ? ; NO - PULA P/ LIGA_TIMER_2 ; SIM - VOLTA P/ VARRER TECLADO ; SEM LIGAR O TIMER

Conectando o PIC 16F877A - Recursos Avanados

94

LIGA_TIMER_2 BSF ESTADO_TIMER ; LIGA LED E FLAG DO ESTADO DO TIMER

MOVLW TMR1_HIGH MOVWF TMR1H MOVLW TMR1_LOW MOVWF TMR1L ; INICIALIZA CONTADORES

MOVLW .2 MOVWF DIVISOR_TMR1 ; INICIALIZA DIVISOR

BSF

T1CON,TMR1ON

; LIGA CONTAGEM DO TMR1

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

;************************************** ;* FIM DO PROGRAMA *

;**************************************

END

; FIM DO PROGRAMA

Conectando o PIC 16F877A - Recursos Avanados

95
Dicas e comentrios
Observe que neste exemplo, ao entrarmos no tratamento das interrupes, a operao de salvar contexto maior que no exemplo anterior. Isto por que agora salvamos tambm os valores de FSR e PCLATH pois os mesmos podem ser alterados dentro da interrupo. Como a varredura dos displays no precisa ter uma freqncia 100% ajustada, ela poderia ser feita sem o emprego de interrupo, isto , atravs do loop principal, como foi o caso da checagem dos botes. O nico cuidado a ser tomado neste caso que determinadas aes podem atrapalhar o tempo deste loop, interferindo na freqncia de varredura. Por isso, muito comum encontrarmos certos projetos onde o display cintila quando pressionamos uma tecla.

Exerccios propostos
Agora que o exemplo j foi estudado e esclarecido, aproveite para gerar novos problemas e solues, seguindo os exerccios propostos; 1. Implemente o quarto boto, para resetar o temporizador (voltar a zero). Este boto tambm s deve funcionar quando o temporizador estiver parado; Implemente uma segunda velocidade para os botes de incremento e decremento, de forma que facilite o ajuste de valores maiores; Em vez de fazer um timer somente de segundos, utilize os dois dgitos da esquerda para mostrar o tempo em minutos e os da direita para mostrar o tempo em segundos. O ponto do display DS2 pode ser usado para marcar a separao. No se esquea que agora os displays da direita devem contar somente de 0 a 59 e no mais de 0 a 99.

2.

3.

Conectando o PIC 16F877A - Recursos Avanados

96

Conectando o PIC

6
Operao com Display de Cristal Lquido (LCD)

Introduo
Dando continuidade s melhorias no sistema de interface com o usurio, veremos agora a operao com display de cristal lquido. Esses displays so muito mais poderosos que os displays de segmentos, pois possuem muito mais caracteres e so alfanumricos. Entretanto, so tambm mais caros e com uma visualizao inferior, pois os caracteres no possuem iluminao prpria e so de tamanho bem reduzido.

Teoria e recursos do PIC


Existem muitos displays de cristal lquido (LCD) no mercado, mas trabalharemos com o modelo mais padro de todos. Trata-se de um display de duas linhas com 16 caracteres cada uma. Esse display bem conhecido por ser o modelo utilizado nos telefones pblicos (orelhes). Outra caracterstica importante do display que estaremos estudando que ele j possui um drive de controle interno. Desta forma, nos comunicaremos com ele atravs de uma comunicao paralela, passando comandos e os caracteres que desejamos escrever, diretamente em cdigo ASCII. Vejamos agora o formato do LCD que estaremos estudando:

Neste LCD possumos 16 pinos para ligao do mesmo ao nosso projeto. A tabela seguinte identifica cada um desses pinos:

Conectando o PIC 16F877A - Recursos Avanados

97
Pino 1 2 3 4 5 6 7 8 Funo Vss VDD V0 RS R/W E DB0 DB1 Pino 9 10 11 12 13 14 15 16 Funo DB2 DB3 DB4 DB5 DB6 DB7 A K

Os dois primeiros pinos (Vss e VDD) so relativos alimentao do componente e devem ser ligados a uma tenso nominal de 5VDC. As tenses mnima e mxima para a alimentao podem variar conforme o fabricante, mas na maioria dos casos ficam entre 4,75 e 5,25 VDC. O pino Vo utilizado para controle do contraste e normalmente o ligamos ao centro de um potencimetro de 10k com as extremidades ligadas ao Vss e ao VDD. Na verdade, esse pino deve possuir uma tenso varivel ou fixa entre Vss e VDD. O pino RS (Register Select) utilizado para definirmos o tipo de informao passada atravs da comunicao paralela:
RS 0 1 Descrio A informao um comando ou instruo. A informao um dado.

O pino R/W muda o estado do LCD entre Leitura (Read) e Escrita (Write). Essa mudana pode ser feita para escrevermos um comando ou dado e checarmos quando o LCD terminou a operao e est pronto para darmos continuidade ao processo.

R/W 0 1

Descrio Operao de escrita. Operao de leitura.

Em muitos projetos, como no caso da placa proposta (McLab2), esse pino no utilizado, ficando permanentemente ligado ao Vss. Neste caso, o LCD s opera em modo de escrita. Por isso, precisamos garantir o trmino das operaes internas do mdulo de LCD atravs de tempos pr-estabelecidos. Esses tempos sero descritos adiante. O pino E (Enable) utilizado para efetivar a leitura da informao escrita no barramento de dados. Essa leitura efetuada na borda de descida deste sinal. Os pinos de DB0 a DB7 equivalem ao barramento de dados paralelo. Apesar de existirem oito vias de dados, esses displays tambm podem operar com quatro vias (DB4 a DB7), j que as demais vias ficam sem funes. Neste caso, as informaes so enviadas em dois pacotes de 4 bits cada um. Os pinos A (Anode) e K (Katode) so usados para ligao do Backligth (iluminao de fundo). O fato que, apesar da existncia dos pinos, nem todos os displays possuem essa iluminao.

Conectando o PIC 16F877A - Recursos Avanados

98
Para ns, ento, valer a comunicao em oito vias de dados, acrescida dos controles RS e E, dando um total de dez pinos interligando o PIC ao LCD. Desta forma, para enviarmos uma informao ao LCD precisaremos primeiramente ajustar RS para informarmos se um comando ou um dado. Em seguida, devemos escrever a informao no barramento de dados. O prximo passo darmos um pulso em E.

Inicializao do LCD
A primeira ao a ser efetuada no display sua inicializao, garantindo a comunicao em 8 vias. Para isso, devemos criar uma rotina baseada no seguinte roteiro: 1. Aguarde pelo menos 15ms aps a energizao do LCD para garantir que ele j est operando corretamente. Envie o comando 0x30 para o display. RS 0 3. 4. DB7 0 DB6 0 DB5 1 DB4 1 DB3 0 DB2 0 DB1 0 DB0 0

2.

Aguarde pelo menos 4ms para garantir o trmino da operao. Envie novamente o comando 0x30 para o display.

RS 0 5. 6.

DB7 0

DB6 0

DB5 1

DB4 1

DB3 0

DB2 0

DB1 0

DB0 0

Aguarde pelo menos 100s. Envie novamente o comando 0x30 para o display. RS 0 DB7 0 DB6 0 DB5 1 DB4 1 DB3 0 DB2 0 DB1 0 DB0 0

7.

Aguarde pelo menos 40s.

Conectando o PIC 16F877A - Recursos Avanados

99
8. Estabelea as condies de utilizao. Neste caso, comunicao em oito vias, display de duas linhas e matriz de 7x5. RS 0 9. DB7 0 DB6 0 DBS 1 DB4 1 DBS 1 DB2 0 DB1 0 DB0 0

Aguarde pelo menos 40S.

10. Comando para limpar o display e posicionar o cursor na primeira linha, primeira coluna (esquerda). RS 0 11. 12. DB7 0 DB6 0 DBS 0 DB4 0 DBS 0 DB2 0 DB1 0 DB0 1

Aguarde pelo menos 1,8 ms. Envie o comando para ligar o display sem cursor. RS 0 DB7 0 DB6 0 DBS 0 DB4 0 DBS 1 DB2 1 DB1 0 DB0 0

13.

Aguarde pelo menos 40s.

14. Envie o comando para estabelecer o modo de operao. Por exemplo, deslocamento automtico do cursor para a direita. RS 0 15. DB7 0 DB6 0 DBS 0 DB4 0 DBS 0 DB2 1 DB1 1 DB0 0

Aguarde pelo menos 40s.

Para o caso de utilizao com quatro vias, o roteiro ligeiramente diferente. 1. Aguarde pelo menos 15ms aps a energizao do LCD para garantir que ele j esteja operando corretamente. Envie o comando 0x30 para o display. RS 0 3. 4. DB7 ,0 DB6 0 DBS 1 DB4 1 DBS DB2 DB1 DB0 -

2.

Aguarde pelo menos 4ms para garantir o trmino da operao. Envie novamente o comando 0x30 para o display. RS 0 DB7 0 DB6 0 DB5 1 DB4 1 DBS DB2 DB1 DB0 -

5. 6.

Aguarde pelo menos 100s. Envie novamente o comando 0x30 para o display.

Conectando o PIC 16F877A - Recursos Avanados

100
RS 0 7. 8. DB7 0 DB6 0 DBS 1 DB4 1 DBS DB2 DB1 DB0 -

Aguarde pelo menos 40s. Estabelea a comunicao em 4 vias. RS 0 DB7 0 DB6 0 DBS 1 DB4 0 DBS DB2 DB1 DB0 -

9.

Aguarde pelo menos 40s.

10. Estabelea as condies de utilizao. Neste caso, comunicao em quatro vias, display de duas linhas e matriz de 7x5. RS 0 0 DB7 0 1 DB6 0 0 DBS 1 0 DB4 0 0 DBS DB2 DB1 DB0 -

11. Aguarde pelo menos 40s. 12. Comando para limpar o display e posicionar o cursor na primeira linha, primeira coluna (esquerda). RS 0 0 DB7 0 0 DB6 0 0 DBS DB4 0 0 0 1 DB3 DB2 DB1 DB0 -

13. Aguarde pelo menos 1,8 ms. 14. Envie o comando para ligar o display sem cursor. RS 0 0 DB7 0 1 DB6 0 1 DBS DB4 0 0 0 0 DBS DB2 DB1 DB0

15. Aguarde pelo menos 40s. 16. Envie o comando para estabelecer o modo de operao. Por exemplo, deslocamento automtico do cursor para a direita. RS 0 0 DB7 0 0 DB6 0 1 DB5 0 1 DB4 0 0 DBS DB2 DB1 DB0 -

17. Aguarde pelo menos 40s.

Comandos do LCD
Vejamos agora quais so realmente os comandos existentes no display. As nomenclaturas utilizadas respeitam a maioria dos data sheets existentes para esse tipo de componente. Para informaes mais

Conectando o PIC 16F877A - Recursos Avanados

101
detalhadas, recomendamos a consulta direta ao manual do modelo em uso no seu projeto. Os tempos apresentados tambm podem variar de um modelo para outro. Limpeza do display RS 0 DB7 0 DB6 0 DBS 0 DB4 0 DBS 0 DB2 0 DB1 0 DB0 1

Este comando apaga todo o display, escrevendo um espao em branco (ASCII 20h) em todas as 32 posies disponveis na memria interna do display (DDRAM). Depois disso, o cursor posicionado no primeiro caractere (lado esquerdo) da primeira linha. Este comando dura cerca de 1,64ms. Retorno do cursor RS 0 DB7 0 DB6 0 DBS DB4 0 0 DBS DB2 0 0 DB1 1 DB0 (1/0)

Este comando faz com que o cursor retorne posio inicial (primeira linha/primeira coluna) sem afetar a memria do display. Este comando dura cerca de 1,64ms. Modo de operao RS 0 DB7 0 DB6 0 DBS 0 DB4 0 DBS 0 DB2 1 DB1 I/D DBO S

Este comando possui dois bits de configurao que podem ser ajustados para deslocamento automtico do cursor e deslocamento automtico da mensagem: Bit I/D = 0 Descrio 0 cursor desloca-se automaticamente para a esquerda (decrementado) aps uma operao de escrita ou leitura. 0 cursor desloca-se automaticamente para a direita (incrementado) aps uma operao de escrita ou leitura. Desliga o deslocamento da mensagem. Liga o deslocamento da mensagem. A mensagem desloca-se para a direita ou para a esquerda, conforme o valor do bit I/D. Serve para implementar as funes Insert e Backspace. Este comando dura cerca de 40s. Controle do display e cursor RS 0 DB7 0 DB6 0 085 0 DB4 0 DBS 1 DB2 D DB1 C DB0 B

I/D=1 S=0 S=1

Conectando o PIC 16F877A - Recursos Avanados

102
Este comando possui 3 bits para a configurao da visualizao dos caracteres e do cursor:

Bit D=0 D=1 C=0 C=1 B=0 B=1

Descrio Inibe a visualizao dos caracteres no display. A memria interna do LCD permanece inalterada. Habilita a visualizao dos caracteres no display, conforme os dados existentes na memria interna. 0 cursor no visvel. 0 cursor visvel como uma linha embaixo do caractere (oitava linha da matriz), como se fosse um sublinhado. Desativa o cursor piscante. Ativa o cursor piscante. Na verdade, neste modo o caractere da posio atual alternado com um bloco negro em intervalos de 0,4s. Pode ser combinado com o cursor tipo sublinhado quando C=1.

Este comando dura cerca de 40s. Deslocamento do cursor ou da mensagem RS 0 DB7 0 DB6 0 DBS 0 DB4 1 DB3 S/C DB2 R/L DB1 DB0 -

Este comando possui dois bits de configurao para que o cursor ou a mensagem sejam deslocados para a direita ou para a esquerda, sem a necessidade de uma operao de escrita ou de leitura:

S/C 0 0 1 1

R/L 0 1 0 1

Descrio 0 cursor desloca-se para a esquerda. Decrementa o endereo da memriadesloca-se para a direita. Incrementa o endereo da 0 cursor interna DDRAM. Deslocamemriaa internamensagemDDRAM.e o cursor para a esquerda, em r
elao posio atual do cursor. Funo Insert. cursor para a direita, em relao posio atual do Desloca a mensagem e o cursor. Funo Backspace.

Este comando dura cerca de 40s. Configurao para utilizao RS 0 DB7 0 DB6 0 DBS 1 DB4 DL DBS N DB2 F DB1 DB0 -

Este comando possui um bit para configurao da quantidade de vias de comunicao: DL


1 0

Descrio
Comunicao feita pelas oito vias de dados, de DB0 a DB7. 0 Comunicao feita em quatro vias de dados, de DB4 a DB7. Inicialmente deve ser enviado, a parte alta do byte e, em seguida, a parte baixa.

Existem ainda mais dois bits de configurao para definir a quantidade de linhas e o tamanho da matriz do caractere:

Conectando o PIC 16F877A - Recursos Avanados

103
N 0 0 1 F 0 1 Descrio 1 linha com matriz de 7x5 + cursor 1 linha com matriz de 10x5 + cursor
2 linhas com matriz de 7x5 + cursor (McLab2)

Este comando dura cerca de 40s. Posicionamento do cursor (DDRAM) RS 0 DB7 DB6 1 A DBS A DB4 A DBS A DB2 A DB1 A DB0 A

Para escrever um caractere em qualquer local do display, basta posicionar corretamente o cursor antes da operao de escrita do dado. Para isso, cada posio possui um endereo representado por AAAAAAA. Para ficar ainda mais fcil, vamos montar uma tabela com os 32 caracteres do display e seus endereos absolutos (em Hexadecimal), j considerando DB7=1:
Coluna 0

10

11

12

13

14

15

Linha 0 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F Linha 1 C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF

Desta forma, fica fcil posicionar o cursor em qualquer local. Basta enviar ao LCD o comando relativo posio desejada. Este comando dura cerca de 40s. Escrita de um caractere RS 1 DB7 D DB6 D DB5 D DB4 D DB3 D DB2 D DB1 D DB0 D

Uma vez posicionado o cursor corretamente, basta enviar o caractere que se deseja escrever. Para isso devemos manter RS=1 e colocar o cdigo ASCII do caractere desejado nas vias de dados. Como no caso dos comandos, um pulso em E tambm deve ser executado. Este comando dura cerca de 40s. A tabela ASCII interna do display, gravada em ROM, pode alterar de um modelo para outro. Por isso, forneceremos somente a tabela ASCII no extendida (primeiros 127 caracteres) que permanece inalterada para a maioria dos modelos disponveis. Quanto parte alta, os displays mais comuns encontrados no Brasil possuem os caracteres na lngua japonesa nessas posies. Observe que as primeiras posies so definidas como oito endereos da memria CGRAM duplicados. Esses endereos acessam os caracteres especiais que podem ser desenhados na RAM dos mdulos de LCD. Para a definio e uso destes caracteres especiais, consulte o manual do LCD.

Conectando o PIC 16F877A - Recursos Avanados

104
Valores em Hexa 0 1 2 3 4 5 6 7D 8 9 A B C D E F Digito mais significativo (primeiro) 0 1 2 3 4 5 CGRAM (1) 0 @ P CGRAM (2) ! 1 A Q CGRAM (3) 2 B R CGRAM (4) # 3 C S CGRAM (5) $ 4 D T CGRAM (6) % 5 E U CGRAM (7) & 6 F V CGRAM (8) 7 G W CGRAM (1) ( 8 H x CGRAM (2) ) 9 1 Y CGRAM (3) * : J Z CGRAM (4) + ; K [ CGRAM (5) , < L CGRAM (6) = M ] CGRAM (7) . > N ^ CGRAM (8) / ? O _

6 a b c d e f g h i j k l m n o

7 p q r s t u v w x y z { | }

Lgica do exemplo
Nosso exemplo para demonstrao do LCD bem reduzido. Simplesmente utilizaremos esse display para informar ao usurio qual boto foi pressionado. Para isso elaboramos uma rotina chamada ESCREVE que envia a informao passada pelo W para o display. Para evitarmos problemas de temporizao, esta rotina j garante um tempo de espera de 1ms. Para os comandos que exigem um tempo maior, um delay adicional ser dado aps a chamada dessa rotina. A rotina ESCREVE pode ser usada tanto para enviar comandos quanto dados para o display. Acontece que, como essa rotina no verifica ou altera o valor de RS, essa sada deve ser configurada antes da rotina ser chamada. Seguindo o roteiro descrito na parte terica deste captulo, implementamos tambm uma rotina de preparao do LCD, chamada INICIALIZACAO_DISPLAY. Essa rotina configura o sistema para comunicao com oito vias, duas linhas, sem cursor visvel e com movimento automtico do cursor para a direita. Alm disso, ela j limpa a tela e posiciona o cursor na primeira linha, primeiro caractere da esquerda. Para cada boto pressionado, posicionamos o cursor em um local diferente da tela e escrevemos o referido nmero do boto. Aps a liberao, uma tela padro utilizada. Este exemplo no utiliza nenhuma interrupo.

Dgitomenossiguinificativo(segundo)

Conectando o PIC 16F877A - Recursos Avanados

105

Conectando o PIC 16F877A - Recursos Avanados

106

Conectando o PIC 16F877A - Recursos Avanados

107

Conectando o PIC 16F877A - Recursos Avanados

108

Conectando o PIC 16F877A - Recursos Avanados

109

Conectando o PIC 16F877A - Recursos Avanados

110

;************************************** ;* ;* ;* ;* ;* ;************************************** ; * VERSO : 2.0 ;* DATA : 24/02/2003 ;************************************** * * CONECTANDO O PIC - RECURSOS AVANADOS EXEMPLO 3 * NICOLS CSAR LAVINIA e DAVID JOS DE SOUZA * * * *

;************************************** ;* DESCRIO GERAL *

;************************************** ; ESTE EXEMPLO FOI ELABORADO PARA EXPLICAR O FUNCIONAMENTO DO MDULO DE LCD. ; FOI CRIADA UMA ROTINA PARA ESCREVER COMANDOS OU CACACTRES NO LCD. EXISTE ; TAMBM UMA ROTINA DE INICIALIZAO NECESSRIA PARA A CORRETA CONFIGURAO ; DO LCD. OS BOTES CONTINUAM SENDO MONITORADOS. UMA MENSAGEM ESCRITA ; NO LCD PARA CADA UM DOS BOTES, QUANDO O MESMO PRESSIONADO. ; ;************************************** ;* CONFIGURAES PARA GRAVAO *

;**************************************

__CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_ON & _XT_OSC

;************************************** ;* DEFINIO DAS VARIVEIS *

;************************************** ; ESTE BLOCO DE VARIVEIS EST LOCALIZADO LOGO NO INCIO DO BANCO 0

CBLOCK 0X20

; POSIO INICIAL DA RAM

Conectando o PIC 16F877A - Recursos Avanados

111
TEMPO1 TEMPO0 ; CONTADORES P/ DELAY

FILTRO_BOTOES

; FILTRO PARA RUIDOS

FLAG

; FLAG DE USO GERAL

ENDC

;************************************** ;* DEFINIO DAS VARIVEIS INTERNAS DO PIC *

;************************************** ; O ARQUIVO DE DEFINIES DO PIC UTILIZADO DEVE SER REFERENCIADO PARA QUE ; OS NOMES DEFINIDOS PELA MICROCHIP POSSAM SER UTILIZADOS, SEM A NECESSIDADE ; DE REDIGITAO.

#INCLUDE <P16F877A.INC>

; MICROCONTROLADOR UTILIZADO

;************************************** ;* DEFINIO DOS BANCOS DE RAM *

;************************************** ; OS PSEUDOS-COMANDOS "BANK0" E "BANK1", AQUI DEFINIDOS, AJUDAM A COMUTAR ; ENTRE OS BANCOS DE MEMRIA.

#DEFINE BANK1 BSF #DEFINE BANK0 BCF

STATUS,RP0 STATUS,RP0

; SELECIONA BANK1 DA MEMORIA RAM ; SELECIONA BANK0 DA MEMORIA RAM

;************************************** ;* CONSTANTES INTERNAS *

;************************************** ; A DEFINIO DE CONSTANTES FACILITA A PROGRAMAO E A MANUTENO.

FILTRO_TECLA

EQU

.200

; FILTRO P/ EVITAR RUIDOS DOS BOTES

;**************************************

Conectando o PIC 16F877A - Recursos Avanados

112
;* DECLARAO DOS FLAGs DE SOFTWARE *

;************************************** ; A DEFINIO DE FLAGs AJUDA NA PROGRAMAO E ECONOMIZA MEMRIA RAM.

#DEFINE TELA_PRINCIPAL FLAG,0

; FLAG P/ INDICAR QUE DEVE MOSTRAR ; A TELA PRINCIPAL ; 1-> MOSTRA TELA PRINCIPAL ; 0-> TELA PRINCIPAL J FOI MOSTRADA

;************************************** ;* ENTRADAS *

;************************************** ; AS ENTRADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE.

#DEFINE BOTAO_0

PORTB,0

; ESTADO DO BOTO 0 ; 1 -> LIBERADO ; 0 -> PRESSIONADO

#DEFINE BOTAO_1

PORTB,1

; ESTADO DO BOTO 1 ; 1 -> LIBERADO ; 0 -> PRESSIONADO

#DEFINE BOTAO_2

PORTB,2

; ESTADO DO BOTO 2 ; 1 -> LIBERADO ; 0 -> PRESSIONADO

#DEFINE BOTAO_3

PORTB,3

; ESTADO DO BOTO 3 ; 1 -> LIBERADO ; 0 -> PRESSIONADO

;************************************** ;* SADAS *

;************************************** ; AS SADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E

Conectando o PIC 16F877A - Recursos Avanados

113
; FUTURAS ALTERAES DO HARDWARE.

#DEFINE DISPLAY

PORTD

; BARRAMENTO DE DADOS DO DISPLAY

#DEFINE RS

PORTE,0

; INDICA P/ O DISPLAY UM DADO OU COMANDO ; 1 -> DADO ; 0 -> COMANDO

#DEFINE ENABLE

PORTE,1

; SINAL DE ENABLE P/ DISPLAY ; ATIVO NA BORDA DE DESCIDA

;************************************** ;* VETOR DE RESET DO MICROCONTROLADOR *

;************************************** ; POSIO INICIAL PARA EXECUO DO PROGRAMA

ORG GOTO

0X0000 CONFIG

; ENDEREO DO VETOR DE RESET ; PULA PARA CONFIG DEVIDO A REGIO ; DESTINADA AS ROTINAS SEGUINTES

;************************************** ;* ROTINA DE DELAY (DE 1MS AT 256MS) *

;************************************** ; ESTA UMA ROTINA DE DELAY VARIVEL, COM DURAO DE 1MS X O VALOR PASSADO ; EM WORK (W).

DELAY_MS MOVWF TEMPO1 MOVLW .250 MOVWF TEMPO0 ; CARREGA TEMPO0 (P/ CONTAR 1MS) ; CARREGA TEMPO1 (UNIDADES DE MS)

CLRWDT DECFSZ TEMPO0,F GOTO $-2

; LIMPA WDT (PERDE TEMPO) ; FIM DE TEMPO0 ? ; NO - VOLTA 2 INSTRUES ; SIM - PASSOU-SE 1MS

Conectando o PIC 16F877A - Recursos Avanados

114
DECFSZ TEMPO1,F GOTO $-6 ; FIM DE TEMPO1 ? ; NO - VOLTA 6 INSTRUES ; SIM RETURN ; RETORNA

;************************************** ;* ROTINA DE ESCRITA DE UM CARACTER NO DISPLAY *

;************************************** ; ESTA ROTINA ENVIA UM CARACTER PARA O MDULO DE LCD. O CARACTER A SER ; ESCRITO DEVE SER COLOCADO EM WORK (W) ANTES DE CHAMAR A ROTINA.

ESCREVE MOVWF DISPLAY NOP BSF GOTO BCF ENABLE $+1 ENABLE ; ATUALIZA DISPLAY (PORTD) ; PERDE 1US PARA ESTABILIZAO ; ENVIA UM PULSO DE ENABLE AO DISPLAY ;. ;.

MOVLW .1 CALL RETURN DELAY_MS ; DELAY DE 1MS ; RETORNA

;************************************** ;* ROTINA DE ESCRITA DA TELA PRINCIPAL *

;************************************** ; ESTA ROTINA ESCREVE A TELA PRINCIPAL DO PROGRAMA, COM AS FRASES: ; LINHA 1 - " MOSAICO ENG. " ; LINHA 2 - "CURSO MODULO 2"

MOSTRA_TELA_PRINCIPAL

BCF

TELA_PRINCIPAL

; LIMPA FLAG DE MOSTRAR TELA PRINCIPAL

BCF

RS

; SELECIONA O DISPLAY P/ COMANDOS ; ESCREVE COMANDO PARA

MOVLW 0X01

Conectando o PIC 16F877A - Recursos Avanados

115
CALL ESCREVE ; LIMPAR A TELA

MOVLW .1 CALL DELAY_MS ; DELAY DE 1MS

MOVLW 0X82 CALL BSF ESCREVE RS

; COMANDO PARA POSICIONAR O CURSOR ; LINHA 0 / COLUNA 2 ; SELECIONA O DISPLAY P/ DADOS

; COMANDOS PARA ESCREVER AS ; LETRAS DE "MOSAICO ENG." MOVLW 'M' CALL ESCREVE

MOVLW 'O' CALL ESCREVE

MOVLW 'S' CALL ESCREVE

MOVLW 'A' CALL ESCREVE

MOVLW 'I' CALL ESCREVE

MOVLW 'C' CALL ESCREVE

MOVLW 'O' CALL ESCREVE

MOVLW ' ' CALL ESCREVE

MOVLW 'E' CALL ESCREVE

MOVLW 'N' CALL ESCREVE

MOVLW 'G' CALL ESCREVE

MOVLW '.' CALL ESCREVE

Conectando o PIC 16F877A - Recursos Avanados

116
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 0 ; SELECIONA O DISPLAY P/ DADOS

MOVLW 0XC1 CALL BSF ESCREVE RS

; COMANDOS PARA ESCREVER AS ; LETRAS DE "CURSO MODULO 2" MOVLW 'C' CALL ESCREVE

MOVLW 'U' CALL ESCREVE

MOVLW 'R' CALL ESCREVE

MOVLW 'S' CALL ESCREVE

MOVLW 'O' CALL ESCREVE

MOVLW ' ' CALL ESCREVE

MOVLW 'M' CALL ESCREVE

MOVLW 'O' CALL ESCREVE

MOVLW 'D' CALL ESCREVE

MOVLW 'U' CALL ESCREVE

MOVLW 'L' CALL ESCREVE

MOVLW 'O' CALL ESCREVE

MOVLW ' ' CALL ESCREVE

MOVLW '2' CALL ESCREVE

Conectando o PIC 16F877A - Recursos Avanados

117
RETURN

;************************************** ;* CONFIGURAES INICIAIS DE HARDWARE E SOFTWARE *

;************************************** ; NESTA ROTINA SO INICIALIZADAS AS PORTAS DE I/O DO MICROCONTROLADOR E AS ; CONFIGURAES DOS REGISTRADORES ESPECIAIS (SFR). A ROTINA INICIALIZA A ; MQUINA E AGUARDA O ESTOURO DO WDT.

CONFIG CLRF CLRF CLRF CLRF CLRF PORTA PORTB PORTC PORTD PORTE ; GARANTE AS SADAS EM ZERO

BANK1

; SELECIONA BANCO 1 DA RAM

MOVLW B'11011111' MOVWF TRISA ; CONFIGURA I/O DO PORTA

MOVLW B'11111111' MOVWF TRISB ; CONFIGURA I/O DO PORTB

MOVLW B'11111111' MOVWF TRISC ; CONFIGURA I/O DO PORTC

MOVLW B'00000000' MOVWF TRISD ; CONFIGURA I/O DO PORTD

MOVLW B'00000100' MOVWF TRISE ; CONFIGURA I/O DO PORTE

MOVLW B'11011111' MOVWF OPTION_REG ; CONFIGURA OPTIONS

Conectando o PIC 16F877A - Recursos Avanados

118
; PULL-UPs DESABILITADOS ; INTER. NA BORDA DE SUBIDA DO RB0 ; TIMER0 INCREM. PELO CICLO DE MQUINA ; WDT - 1:128 ; TIMER - 1:1

MOVLW B'00000000' MOVWF INTCON ; CONFIGURA INTERRUPES ; DESABILITADA TODAS AS INTERRUPES

MOVLW B'00000111' MOVWF ADCON1 ; CONFIGURA CONVERSOR A/D ; CONFIGURA PORTA E PORTE COM I/O DIGITAL

BANK0

; SELECIONA BANCO 0 DA RAM

; AS INSTRUES A SEGUIR FAZEM COM QUE O PROGRAMA TRAVE QUANDO HOUVER UM ; RESET OU POWER-UP, MAS PASSE DIRETO SE O RESET FOR POR WDT. DESTA FORMA, ; SEMPRE QUE O PIC LIGADO, O PROGRAMA TRAVA, AGUARDA UM ESTOURO DE WDT ; E COMEA NOVAMENTE. ISTO EVITA PROBLEMAS NO START-UP DO PIC.

BTFSC GOTO

STATUS,NOT_TO $

; RESET POR ESTOURO DE WATCHDOG TIMER? ; NO - AGUARDA ESTOURO DO WDT ; SIM

;************************************** ;* INICIALIZAO DA RAM *

;************************************** ; ESTA ROTINA IR LIMPAR TODA A RAM DO BANCO 0, INDO DE 0X20 A 0X7F. ; EM SEGUIDA, AS VARIVEIS DE RAM DO PROGRAMA SO INICIALIZADAS.

MOVLW 0X20 MOVWF FSR ; APONTA O ENDEREAMENTO INDIRETO PARA ; A PRIMEIRA POSIO DA RAM LIMPA_RAM

Conectando o PIC 16F877A - Recursos Avanados

119
CLRF INCF MOVF INDF FSR,F FSR,W ; COMPARA O PONTEIRO COM A LT. POS. +1 ; J LIMPOU TODAS AS POSIES? ; NO - LIMPA A PRXIMA POSIO ; SIM ; LIMPA A POSIO ; INCREMENTA O PONTEIRO P/ A PRX. POS.

XORLW 0X80 BTFSS GOTO STATUS,Z LIMPA_RAM

BSF

TELA_PRINCIPAL

; INICIALIZA MOSTRANDO TELA PRINCIPAL

;************************************** ;* CONFIGURAES INICIAIS DO DISPLAY *

;************************************** ; ESTA ROTINA INICIALIZA O DISPLAY P/ COMUNICAO DE 8 VIAS, DISPLAY PARA 2 ; LINHAS, CURSOR APAGADO E DESLOCAMENTO DO CURSOR DIREITA.

INICIALIZACAO_DISPLAY BCF RS ; SELECIONA O DISPLAY P/ COMANDOS

MOVLW 0X30 CALL ESCREVE

; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO

MOVLW .3 CALL DELAY_MS ; DELAY DE 3MS (EXIGIDO PELO DISPLAY)

MOVLW 0X30 CALL ESCREVE

; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO

MOVLW 0X30 CALL ESCREVE

; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO

MOVLW B'00111000' CALL ESCREVE

; ESCREVE COMANDO PARA ; INTERFACE DE 8 VIAS DE DADOS

MOVLW B'00000001'

; ESCREVE COMANDO PARA

Conectando o PIC 16F877A - Recursos Avanados

120
CALL ESCREVE ; LIMPAR TODO O DISPLAY

MOVLW .1 CALL DELAY_MS ; DELAY DE 1MS

MOVLW B'00001100' CALL ESCREVE

; ESCREVE COMANDO PARA ; LIGAR O DISPLAY SEM CURSOR

MOVLW B'00000110' CALL ESCREVE

; ESCREVE COMANDO PARA INCREM. ; AUTOMTICO DIREITA

BSF

RS

; SELECIONA O DISPLAY P/ DADOS

;************************************** ;* ;* VARREDURA DOS BOTES LOOP PRINCIPAL * *

;************************************** ; A ROTINA PRINCIPAL FICA CHECANDO O ESTADO DOS BOTES. CASO ALGUM SEJA ; PRESSIONADO, A ROTINA DE TRATAMENTO DO BOTO CHAMADA.

VARRE CLRWDT ; LIMPA WATCHDOG TIMER

BTFSS GOTO

BOTAO_0 TRATA_BOTAO_0

; O BOTO 0 EST PRESSIONADO ? ; SIM - PULA P/ TRATA_BOTAO_0 ; NO

BTFSS GOTO

BOTAO_1 TRATA_BOTAO_1

; O BOTO 1 EST PRESSIONADO ? ; SIM - PULA P/ TRATA_BOTAO_1 ; NO

BTFSS GOTO

BOTAO_2 TRATA_BOTAO_2

; O BOTO 2 EST PRESSIONADO ? ; SIM - PULA P/ TRATA_BOTAO_2 ; NO

Conectando o PIC 16F877A - Recursos Avanados

121
BTFSS GOTO BOTAO_3 TRATA_BOTAO_3 ; O BOTO 3 EST PRESSIONADO ? ; SIM - PULA P/ TRATA_BOTAO_3 ; NO

MOVLW FILTRO_TECLA MOVWF FILTRO_BOTOES

; CARREGA NO WORK O VALOR DE FILTRO_TECLA ; SALVA EM FILTRO_BOTOES ; RECARREGA FILTRO P/ EVITAR RUIDOS

BTFSS GOTO

TELA_PRINCIPAL VARRE

; DEVE MOSTRAR TELA PRINCIPAL ? ; NO - VOLTA P/ VARRE ; SIM

CALL GOTO

MOSTRA_TELA_PRINCIPAL VARRE ; VOLTA PARA VARRER TECLADO

;************************************** ;* TRATAMENTO DOS BOTES *

;**************************************

; ************************* TRATAMENTO DO BOTO 0 ***************************

TRATA_BOTAO_0 MOVF BTFSC FILTRO_BOTOES,F STATUS,Z ; FILTRO J IGUAL A ZERO ? ; (FUNO J FOI EXECUTADA?) GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO ; NO

DECFSZ FILTRO_BOTOES,F GOTO VARRE

; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO

; OS COMANDOS A SEGUIR SO PARA ESCREVER A FRASE RELACIONADA AO BOTO 0

BCF

RS

; SELECIONA O DISPLAY P/ COMANDOS

MOVLW 0X01

Conectando o PIC 16F877A - Recursos Avanados

122
CALL ESCREVE ; COMANDO P/ LIMPAR A TELA

MOVLW .1 CALL DELAY_MS ; DELAY DE 1MS

MOVLW 0X80 CALL BSF ESCREVE RS

; COMANDO PARA POSICIONAR O CURSOR ; LINHA 0 / COLUNA 0 ; SELECIONA O DISPLAY P/ DADOS

; COMANDOS PARA ESCREVER AS ; LETRAS DE "TECLA 0" MOVLW 'T' CALL ESCREVE

MOVLW 'E' CALL ESCREVE

MOVLW 'C' CALL ESCREVE

MOVLW 'L' CALL ESCREVE

MOVLW 'A' CALL ESCREVE

MOVLW ' ' CALL ESCREVE

MOVLW '0' CALL ESCREVE

BSF

TELA_PRINCIPAL

; SETA FLAG P/ MOSTRAR TELA PRINCIPAL

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

; ************************* TRATAMENTO DO BOTO 1 ***************************

TRATA_BOTAO_1 MOVF BTFSC FILTRO_BOTOES,F STATUS,Z ; FILTRO J IGUAL A ZERO ? ; (FUNO J FOI EXECUTADA?)

Conectando o PIC 16F877A - Recursos Avanados

123
GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO ; NO

DECFSZ FILTRO_BOTOES,F GOTO VARRE

; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO

; OS COMANDOS A SEGUIR SO PARA ESCREVER A FRASE RELACIONADA AO BOTO 1

BCF

RS

; SELECIONA O DISPLAY P/ COMANDOS

MOVLW 0X01 CALL ESCREVE ; COMANDO P/ LIMPAR A TELA

MOVLW .1 CALL DELAY_MS ; DELAY DE 1MS

MOVLW 0X88 CALL BSF ESCREVE RS

; COMANDO PARA POSICIONAR O CURSOR ; LINHA 0 / COLUNA 8 ; SELECIONA O DISPLAY P/ DADOS

; COMANDOS PARA ESCREVER AS ; LETRAS DE "TECLA 1" MOVLW 'T' CALL ESCREVE

MOVLW 'E' CALL ESCREVE

MOVLW 'C' CALL ESCREVE

MOVLW 'L' CALL ESCREVE

MOVLW 'A' CALL ESCREVE

MOVLW ' ' CALL ESCREVE

MOVLW '1' CALL ESCREVE

Conectando o PIC 16F877A - Recursos Avanados

124

BSF

TELA_PRINCIPAL

; SETA FLAG P/ MOSTRAR TELA PRINCIPAL

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

; ************************* TRATAMENTO DO BOTO 2 ***************************

TRATA_BOTAO_2 MOVF BTFSC FILTRO_BOTOES,F STATUS,Z ; FILTRO J IGUAL A ZERO ? ; (FUNO JA FOI EXECUTADA?) GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO ; NO

DECFSZ FILTRO_BOTOES,F GOTO VARRE

; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO

; OS COMANDOS A SEGUIR SO PARA ESCREVER A FRASE RELACIONADA AO BOTO 2

BCF

RS

; SELECIONA O DISPLAY P/ COMANDOS

MOVLW 0X01 CALL ESCREVE ; COMANDO P/ LIMPAR A TELA

MOVLW .1 CALL DELAY_MS ; DELAY DE 1MS

MOVLW 0XC0 CALL BSF ESCREVE RS

; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 0 ; SELECIONA O DISPLAY P/ DADOS

; COMANDOS PARA ESCREVER AS ; LETRAS DE "TECLA 2" MOVLW 'T' CALL ESCREVE

MOVLW 'E'

Conectando o PIC 16F877A - Recursos Avanados

125
CALL ESCREVE

MOVLW 'C' CALL ESCREVE

MOVLW 'L' CALL ESCREVE

MOVLW 'A' CALL ESCREVE

MOVLW ' ' CALL ESCREVE

MOVLW '2' CALL ESCREVE

BSF

TELA_PRINCIPAL

; SETA FLAG P/ MOSTRAR TELA PRINCIPAL

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

; ************************* TRATAMENTO DO BOTO 3 ***************************

TRATA_BOTAO_3 MOVF BTFSC FILTRO_BOTOES,F STATUS,Z ; FILTRO J IGUAL A ZERO ? ; (FUNO JA FOI EXECUTADA?) GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO ; NO

DECFSZ FILTRO_BOTOES,F GOTO VARRE

; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO

; OS COMANDOS A SEGUIR SO PARA ESCREVER A FRASE RELACIONADA AO BOTO 3

BCF

RS

; SELECIONA O DISPLAY P/ COMANDOS

MOVLW 0X01 CALL ESCREVE ; COMANDO P/ LIMPAR A TELA

MOVLW .1

Conectando o PIC 16F877A - Recursos Avanados

126
CALL DELAY_MS ; DELAY DE 1MS

MOVLW 0XC8 CALL BSF ESCREVE RS

; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 8 ; SELECIONA O DISPLAY P/ DADOS

; COMANDOS PARA ESCREVER AS ; LETRAS DE "TECLA 3" MOVLW 'T' CALL ESCREVE

MOVLW 'E' CALL ESCREVE

MOVLW 'C' CALL ESCREVE

MOVLW 'L' CALL ESCREVE

MOVLW 'A' CALL ESCREVE

MOVLW ' ' CALL ESCREVE

MOVLW '3' CALL ESCREVE

BSF

TELA_PRINCIPAL

; SETA FLAG P/ MOSTRAR TELA PRINCIPAL

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

;************************************** ;* FIM DO PROGRAMA *

;**************************************

END

; FIM DO PROGRAMA

Conectando o PIC 16F877A - Recursos Avanados

127
Dicas e comentrios
Apesar da estrutura do sistema ficar muito simples com a implementao da rotina ESCREVE, nunca se esquea de confirmar o estado da sada RS antes de utiliz-la. Conforme foi empregado neste exemplo, recomendamos deixar RS=1 como valor padro, alterando-o para O sempre que desejar escrever algum comando. Em seguida, retornar RS=1 (padro) para enviar dados. Para enviar um caractere ao LCD, no se esquea que deve ser especificado seu cdigo ASCII. Para facilitar sua vida, o MpLab efetua essa converso quando voc digita um caractere entre aspas simples (Ex: 'A'). Neste caso, existe diferena entre maisculas e minsculas. Para caracteres no "printveis", seu cdigo pode ser diretamente definido (Ex: 0x35). O MpLab, assim como a maioria dos programas para Windows, tambm aceita a especificao de um caractere que no aparece no teclado atravs da combinao da tecla ALT seguido do cdigo ASCII, imprimindo o resultado na tela. O problema que nem sempre o cdigo ASCII equivalente ao mesmo smbolo para o LCD e para a fonte do MpLab. Apesar da placa proposta (McLab2), possuir ligao com o mdulo de LCD atravs de oito vias de dados possvel utiliz-la para testar e implementar a comunicao com quatro vias. Basta modificar a rotina de inicializao e a de escrita de um byte.

Exerccios propostos
Agora que o exemplo j foi estudado e esclarecido, aproveite para gerar novos problemas e solues, seguindo os exerccios propostos: 1. 2. Altere a comunicao para 4 vias. Mantenha a tela principal disponvel, somente quando o sistema ligado. Aps alguns segundos, mostre uma tela com o nome das quatro teclas e indique a tecla pressionada atravs de um caractere de seta () ou outro qualquer.

Conectando o PIC 16F877A - Recursos Avanados

128

Conectando o PIC

7
Conversor Analgico-Digital Interno
Introduo
Como j dissemos mais de uma vez, vivemos em um mundo analgico. Sendo assim, por mais digital que seja nosso sistema, quase impossvel no trabalharmos com variveis analgicas. Seja o valor de uma tenso, ou de uma temperatura, seja uma posio ou o sinal de um sensor qualquer. Conforme aumenta a complexibilidade do sistema, maior ser o nmero de entradas analgicas que devem ser monitoradas pelo microcontrolador. Mas como isso ser possvel? Uma vez que o PIC s pode processar dados digitais, ser necessrio converter qualquer sinal analgico para valores digitais. Este o assunto que trataremos neste captulo.

Teoria
Para comearmos a entender melhor a teoria da converso dos sinais analgicos em dados digitais, nada melhor que partirmos para um exemplo prtico: os sensores de temperatura normalmente fornecem uma informao analgica (como, por exemplo, uma tenso) proporcional temperatura e, portanto, para que esta possa ser analisada pelo microcontrolador, necessitamos de um conversor analgico digital (CAD ou simplesmente A/D). O menor passo, ou resoluo, de um CAD dado diretamente pelo seu nmero de bits e pode ser expresso por:

Em que: Vref uma tenso de referncia e n o nmero de bits do conversor. Cada um dos n bits que compem a informao digital representa uma parcela do valor da tenso analgica a ser convertida, de forma que a soma de todas as contribuies de cada um dos n bits forma a tenso de entrada do conversor A/D. Assim, a parcela de tenso proporcional ao bit m do conversor A/D dada por:

Conectando o PIC 16F877A - Recursos Avanados

129
Em que: bm o valor do bit m, ou seja, 0 ou 1. Veja, que apenas os bits em 1 representam algum valor em termos de tenso analgica, uma vez que os bits em zero no contribuem para formar a tenso de entrada. Quanto maior a quantidade de bits, maior a resoluo e a preciso do conversor. O PIC 16F877A possui um conversor interno de 10 bits, mas existem outros modelos com 8 ou 12 bits. Vamos supor que o CAD para o nosso exemplo da temperatura seja de quatro bits, a tenso de referncia seja de 5V e o valor da converso em binrio seja 1101. A tenso de entrada, ento, :

Este valor de tenso equivalente a uma dada temperatura, e por isso o valor convertido (1101) equivalente mesma temperatura. Obviamente, para o exemplo da temperatura, assim como para a maioria dos demais casos prticos, no ser necessria somente a converso. Teremos tambm que nos preocupar com uma equao ou tabela para a adequao dos valores convertidos para a unidade desejada. Muitas vezes essa equao ou tabela ser a responsvel tambm pela linearizao. Assim sendo, temos ento duas converses a serem feitas: a primeira de sinal analgico para valor digital, e a segunda de valor digital para a unidade realmente desejada, como por exemplo C.

Existem diversas maneiras de implementarmos um conversor analgico/digital. Porm, como este livro trata do microcontrolador PIC16F877A, faremos um estudo aprofundado do sistema de converso adotado pelo mesmo, que denominado conversor de aproximao sucessiva. Nesse tipo de conversor, a converso realizada do bit mais significativo para o menos significativo. Uma vez que o bit mais significativo (Msb) representa metade da tenso de referncia, conhecer o estado deste bit (0 ou 1) j significa saber se a tenso de entrada maior ou menor que a metade da referncia. Conhecido o bit mais significativo, passa-se ao prximo bit, que representa a metade da metade da tenso de referncia, ou seja, 1/4 da tenso de referncia. A converso segue assim at o bit menos significativo (Lsb).

Conectando o PIC 16F877A - Recursos Avanados

130
Vamos supor um CAD de quatro bits com tenso de referncia de 5V: Bit 4 (Msb) 3 2 1 (Lsb) Tenso 2,5000 V 1,2500 V 0,6250 V 0,325 V

Suponha que a tenso de entrada seja de 3,3V. Neste caso, o procedimento de converso seria assim: 1. Testa-se o bit mais significativo, ou seja, a tenso de entrada maior do que 2,5V? Sim, portanto, este bit vale 1. Testa-se o prximo bit, ou seja, a tenso de entrada maior do que 3,75V (2,5V + 1,25V)? No, portanto, este bit 0. Testa-se o prximo bit, ou seja, a tenso de entrada maior do que 3.125V (2,5V + 0.625V)? Sim, portanto, este bit 1. Finalmente testa-se o bit menos significativo, ou seja, a tenso de entrada maior do que 3,4375V (2,5V + 0.625V + 0,3125V)? No, portanto, este bit 0 e o valor final da converso em binrio 1010.

2.

3.

4.

Essa forma de converso muito rpida, pois veja que para um conversor de n bits so necessrias " interaes, independente do valor a ser convertido. Em termos de hardware (diagrama de blocos), esse tipo de conversor pode ser representado por:

Recursos do PIC
Vamos agora estudar os modos de operao do conversor interno do PIC 16F877A, conhecendo seus recursos e os registradores de configurao e trabalho. A primeira coisa que precisamos saber so as caractersticas desse conversor: Conversor interno de 10 bits, dando um total de 1024 pontos; At oito canais de converso, com diversas configuraes entre analgicos e digitais; Quatro tipos de referncia: VDD (interna), Vss (interna), (externa);
VREF+

(externa) e VREF-

Conectando o PIC 16F877A - Recursos Avanados

131
Freqncia de converso baseada no clock da mquina ou em RC dedicado, possibilitando o funcionamento em modo SLEEP; Trs ajustes de freqncia (divisores) para o clock de mquina; Dois tipos de justificao para o resultado da converso: direita e esquerda; Um interrupo para trmino da converso. Bem, agora que j sabemos o resumo dos recursos analgicos do nosso PIC, aprenderemos a utiliz-los. O primeiro conceito que deve ser entendido que apesar do microcontrolador possuir diversos canais analgicos, internamente s existe um sistema de converso. Por isso, somente um canal pode ser utilizado de cada vez. Vamos comear, ento, aprendendo como configurar os canais corretamente. Inicialmente devemos definir, conforme as necessidades do nosso projeto, qual a quantidade de canais analgicos que sero necessrios. Como este PIC possui at oito canais analgicos, podemos utilizar todos ou s parte deles, deixando os demais pinos configurados como l/Os digitais. O problema que, infelizmente, no possvel configurar individualmente cada canal, conforme nosso desejo. Existem valores padres de configurao que devem ser respeitados. Para configurarmos os canais analgicos precisamos alterar o valor dos bits existentes em ADCON1<PCFG3:PCFG0>: PCFG3: PCFG0 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 AN7 RE2 A A D D D D D D A D D D D D D D AN6 RA1 A A D D D D D D A D D D D D D D AN5 RA0 A A D D D D D D A A A A D D D D AN4 RA5 A A A A D D. D D A A A A A D D D AN3 RA3 A VREF+ A VREF+ A VREF.+ D D VREF+ A VREF+ VREF+ VREF+ VREF+ D VREF+ AN2 RA2 A A A A D D D D VREFA A VREFVREFVREFD VREFAN1 RA1 A A A A A A D D A A A A A A D D AN0 RA0 A A A A A A D D A A A A A A A A VDD RA3 VDD RA3 VDD RA3 VDD VDD RA3 VDD RA3 RA3 RA3 RA3 VDD RA3 VSS VSS VSS VSS VSS VSS VSS VSS RA2 VSS VSS RA2 RA2 RA2 VSS RA2 VREF+ VREFCanais Anal. 8 7 5 4 3 2 0 0 6 6 5 4 3 2 1 1 Ref. Ext. 0 1 0 1 0 1 0 0 2 0 1 2 2 2 0 2

Conectando o PIC 16F877A - Recursos Avanados

132

Alm da configurao dos pinos analgicos, conforme tabela apresentada, no pode ser esquecido de configurar corretamente os registradores TRISA e TRISE, de forma que os canais utilizados estejam ajustados para entrada (TRIS = 1). Caso um canal analgico esteja como sada, o sistema de converso continuar funcionando, mas os valores convertidos sero equivalentes aos nveis alto (1 = VDD) e baixo (0 = VSS). Outro ponto importante a ser observado nesta tabela diz respeito s tenses de referncia. A converso sempre ser feita comparando-se a tenso no pino em relao as tenses de referncia VREF+ e VREF.. Desta forma, quando a tenso de entrada for igual tenso VREF+, a converso resultar no valor mximo (1024) e quando a tenso de entrada for igual VREF ento o resultado da converso ser zero (0). Como j foi dito anteriormente, podemos ter quatro tipos de referncias, sendo duas internas (VDD e VDD) , e duas externas, ligadas aos pinos RA2 (VREF.) e RA3 (VREF+). Nossa entrada analgica poder operar, por exemplo, com uma tenso varivel de 0 a 5V. Para isso podemos utilizar as referncias internas como VREF+ = VDD(5V) e VREF. = VSS(0V). Em uma outra aplicao, nosso sensor pode variar de 1 a 4V. Para que no percamos resoluo do A/D, podemos trabalhar com tenses de referncia externas: VREF+ (RA3) = 4V e V REF. (RA2) = 1V. O importante respeitarmos os limites eltricos impostos a essas referncias:

Referncia

Mnimo (V)

Mximo (V)

VREF+ VREF(VREF+ -VREF-)

VDD -2,5 VSS -0,3 2,0

VDD + 0,3 VREF+ -2,0 VDD + 0,3

O prximo ponto a ser aprendido diz respeito velocidade e, conseqentemente, aos tempos, de amostragem para a converso A/D. Vamos comear entendendo como o sistema de converso funciona internamente. Para evitarmos problemas de rudo e variaes da entrada analgica durante o processo de inverso (no podemos esquecer que nada absolutamente instantneo), o PIC utiliza internamente -n processo denominado Sample and Hold (S/H). Esse nome poderia ser traduzido como amostra e congela. Mas como isso feito? Muito simples. Internamente o PIC possui um capacitar (120pF) que ligado ao canal analgico em uso. Sendo assim, ele fica carregado com a tenso existente no canal amostra). Quando o processo de converso iniciado, este capacitar desligado, automaticamente, do canal analgico, mantendo a tenso sobre o capacitar constante (congela). Por isso, durante todo o processo de converso, a tenso utilizada a existente no capacitar e no mais a do canal analgico. Mesmo que a tenso externa no canal varie, a converso no ser afetada. Agora que j sabemos como o sistema funciona no mbito do hardware, vamos conhecer quais so os tempos a serem respeitados de forma a no gerarmos erros durante a converso. Para ilustrar o processo, mostraremos um grfico resumido dos tempos de converso:

Conectando o PIC 16F877A - Recursos Avanados

133

Conforme o grfico mostrado, podemos agora analisar cada um dos tempos envolvidos no sistema de converso:

Cdigo A B C D E

Nome
Adequao do capacitor Desligamento do capacitor

Converso
Religamento do capacitor Nova adequao do capacitor

Adequao do capacitor
Internamente o capacitor nunca fica desligado, exceto durante a converso. Ele sempre encontra-se ligado ao sistema de entradas analgicas. Mas imaginemos que no momento o canal ativo esteja ligado ao GND. Desta forma o capacitor estar totalmente descarregado. No momento seguinte desejamos medir uma outra entrada analgica (outro canal) e por isso o sistema ser chaveado internamente (veremos como isso possvel mais frente). Caso o outro canal esteja com uma tenso de 5V, o capacitor interno ter que ser completamente carregado antes que possamos comear a efetuar a converso. Obviamente essa carga no ser instantnea. Para evitar problemas, sugerimos que o tempo padro deixado para garantir a carga do capacitor seja de pelo menos 40s. Obviamente, este um tempo que garante a pior condio. Na verdade, o tempo de adequao pode ser bem menor que isso, chegando no mnimo a 10s. Essa variao depende basicamente da diferena de tenso entre a entrada e o capacitor, da temperatura e da impedncia de entrada. Essa impedncia deve ser de no mnimo 50Q e no mximo 10 k. Quanto menor a impedncia, menor tambm o tempo de adequao. Para o clculo exato desse tempo, consulte o data sheet do PIC.

Desligamento do capacitor
Depois de iniciada a converso, o capacitor ser desligado internamente. Isso feito em aproximadamente 100ns, sendo um valor praticamente desprezvel.

Converso
O tempo de converso j no to desprezvel assim. Para entendermos o tempo de converso precisaremos entender melhor sobre a freqncia de trabalho do A/D. Para que o sistema de converso

Conectando o PIC 16F877A - Recursos Avanados

134
funcione corretamente, um clock deve ser aplicado a ele. Cada perodo deste clock ser chamado de TAD e equivalente ao tempo de converso de 1 bit. Como nosso conversor de 10 bits, o tempo total da converso ser de 10 TAD + 2 TAD. Os dois perodos adicionais so para a adequao e o incio da inverso. O valor de TAD depender da freqncia empregada, e para isso o sistema possui um RC interno ou divisores para o oscilador da prpria mquina, mas veremos isso mais adiante. Assim sendo, o tempo de converso 12 TAD.

Reliqamento do capacitor
Ao final da converso, o valor dos registradores de resultado sero atualizados, o flag da interrupo ser marcado e o capacitor ser religado. O tempo mnimo recomendado para que tudo isso acontea 2 TAD.

Nova adequao do capacitor


Durante o tempo da converso, o valor da tenso no capacitor interno no foi alterado; porm, ao termino da converso ele ser religado entrada analgica, que pode ter sofrido uma variao brusca (como no exemplo), seja por imposio do prprio sistema, seja por uma troca de canal. Por isso, entre uma converso e outra necessrio uma nova adequao da carga do capacitor. Recomendamos novamente um tempo de 40s. As observaes do item "Adequao do capacitor" tambm so vlidas aqui para a diminuio deste tempo. Agora que j entendemos um pouco mais as caractersticas e conceitos do A/D, vejamos como realmente devemos proceder para operar com ele. Depois de termos configurado quais sero os canais utilizados (ADCON1 e TRIS), teremos que configurar tambm a freqncia de trabalho. Para isso devemos ajustar 2 bits em ADCON0<ADCS1:ADCS0>:

ADCS1 0 0 1 1

ADCS0 0 1 0 1

Freqncia Fosc /2 Fosc /8 Fosc /32 RC Interno

Para os trs primeiros ajustes, a freqncia de trabalho do A/D ser a freqncia do oscilador externo do PIC (FOSC) dividida por uma das opes (2, 8 ou 32). Desta forma, obteremos o valor de TAD. 3or exemplo, para um cristal externo de 4MHz e uma opo de FOSC / 8 teremos:

TAD = 8/4.000.000 TAD = 0,000002s ou 2s

Neste caso, nosso TAD de 2s. O importante na escolha do cristal e da opo de diviso da freqncia respeitar os valores mnimos de TAD aceitos pelo PIC. No caso do PIC 16F877A (Standard) este valor deve ser maior que 1,6s. Valores muito altos para o TAD tambm no so muito aconselhveis, e por isso recomendamos que no seja ultrapassado o limite de 20s.

Conectando o PIC 16F877A - Recursos Avanados

135

Continuando com o exemplo dado, chequemos ento a freqncia mxima de amostragem para a comutao entre canais:

Desconsiderando-se o tempo de desligamento (desprezvel), teramos um tempo total para a converso de 68s (40 + 24 + 4). Sendo assim, nossa freqncia de amostragem mxima seria de 14,7 kHz. A ltima opo de escolha para o clock do A/D refere-se a um RC interno dedicado para essa finalidade. Neste caso o valor nominal para TAD de 4s (pode variar de 2 a 6s). Esta opo pode ser utilizada para que o sistema de converso continue funcionando mesmo em modo SLEEP. Na verdade, este RC pode ser usado a qualquer momento, mas recomendado que para sistemas que operem com freqncias superiores a 4 MHz este oscilador seja usado somente no modo SLEEP. A ltima configurao necessria quanto s caractersticas de funcionamento do A/D diz respeito forma como o resultado ser armazenado nos registradores especficos. Como a converso gera um resultado de 10 bits, sero necessrios dois registradores para armazenar este valor. Para isso existem os registradores ADRESH e ADRESL, equivalentes parte alta e parte baixa do resultado. Acontece que a soma desses dois registradores resultam em 16 bits. Por isso, o resultado pode ser armazenado neles justificando pela esquerda ou direita. O bit de configurao ADCON1<ADFM> ajusta esta orientao: ADFM
1

Freqncia
Justificado pela direita. Utiliza todos os bits de ADRESL<7:0> e somente 2 bits de ADRESH<1:0>

Justificado pela esquerdta. Utiliza todos os bits de ADRESL<7:0> e somente 2 bits de 0 1 ADRESH<1:0> Justifi cado pela Essa justificao vlida quando queremos, por exemplo, trabalhar com somente 8 bits do conversor. Neste caso, podemos justificar pela esquerda e direita acessarmos somente a parte mais significativa atravs de ADRESH. Com isso . estaremos criando um filtro, onde jogamos fora os 2 bits menos significativos, que se Utiliza encontram em ADRESL. todos os bits Agora que os ajustes da configurao j foram feitos, podemos finalmente efetuar uma converso. de ADRE SL<7: Comecemos ligando o sistema de converso. Isso feito atravs de ADCON0<ADON>: 0> e some ADON Estado do A/D nte 2 Sistema desligado 00 bits Sistem de Sistema ligado 1 a ADRE desliga SH<1 do 1 :0>. 0 Sistem a Justifi Conectando ligado 16F877A - Recursos Avanados PIC cado pela esque rda. Utiliza

136
O sistema pode ser mantido desligado sempre que no estiver sendo utilizado para reduo do consumo. A prxima ao a escolha do canal a ser utilizado, entre os oito disponveis. Essa escolha ser feita atravs de ADCON0<CHS2:CHS0>: CHS2 : CHS0 000 001 010 011 Canal Selecionado Canal 0 (RA0/AN0) Canal 1 (RA1/AN1) Canal 2 (RA2/AN2) Canal 3 (RA3/AN3) CHS2 : CHS0 100 101 110 111 Canal Selecionado Canal 4 (RA5/AN4) Canal 5 (RE0/AN5) Canal 6 (RE1/AN6) Canal 7 (RE2/AN7)

O ltimo passo iniciar a converso por meio do bit ADCONO<GO/DONE>: GO/DONE 1 Inicia a converso Estado do A/D

1 Indica que a converso terminou. Caso seja forado Inicia a manualmente, cancela a converso atual. 0 converso Q Depoisqueiniciada a converso, todo o processo ser executado. O capacitar Indica de interno adesconectado. A converso efetuada (12TAD) e logo em seguida (no ciclo de prximoconversomquina), os registradores ADRESH e ADRESL so atualizados. Neste momento, o bit ADCON0<GO/DONE> volta =.-1omaticamente para 0 (zero) e terminou. poder ser monitorado pelo programa para checar o trmino da converso. Alm disso, Caso seja o flag da forado interrupo PIR1<ADIF> tambm ativado. Caso a converso seja cortada manualmente atravs de ADCON0<GO/DONE>=0, os registradores ADRESH e manualme no ADRESLnte, so alterados. cancela a Para fazer uso da interrupo de A/D, no se esquea de efetuar os converso seguintes ajustes antes de iniciar a converso: atual. Limpar o flag PIR1<ADIF>=0; Ligar a interrupo de A/D em PIE1 <ADIE>=1; Ligar as interrupes de perifricos em INTCON<PEIE>=1; Ligar a chave geral das interrupes em INTCON<GIE>=1; Resumo dos registradores associados ao A/D
Endereo 0Bh... 0ch 8Ch 1Eh 9Eh 1Fh 9Fh 85h 89h Nome INTCON PIR1 PIE1 ADRESH ADRESL ACON0 ADCON1 TRISA TRISE Bit 7 GIE PSPIF PSPIE Bit 6 PEIE ADIF ADIE Bit 5 T0IE RCIF Bit 4 INTE TXIF Bit 3 RBIE SSPIF Bit 2 T0IF CCP1IF Bit 1 INTF TMR2IF Bit 0 RBIF TMR1IF

RCIE TXIE PSPIE CCPIE TMR2IE TMR1IE Resultado da converso (Parte alta) Resultado da converso (Parte baixa) ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE ADON ADFM PCFG3 PCFG2 PCFG1 PCFG0 Configurao do PORTA como Entrada(1) ou Sada(0) IBF OBF IBOV PSP Configurao do PORTE como MODE Entrada(1) ou Sada(0) No usado para essa finalidade. Para obter mais informaes, consulte apndice A

Conectando o PIC 16F877A - Recursos Avanados

137 Lgica do exemplo


Neste exemplo efetuaremos a leitura da tenso regulada pelo potencimetro P2 da placa proposta (McLab2). A converso feita diretamente no loop principal, sem a utilizao de nenhuma interrupo, nem para checar o trmino da converso, nem para definir uma freqncia de amostragem. Desta forma, a converso ser feita uma aps a outra, na freqncia definida pelo perodo do loop principal. Uma vez terminada a converso, descartamos os 2 bits menos significativos e consideramos somente o resultado armazenado em ADRESH. Com isso j estaremos executando uma espcie de filtragem, evitando assim que o valor final fique oscilando. Aplicaremos ento uma regra de trs bsica para converter o valor do A/D para a unidade desejada Volts. Conseguiremos isso considerando que, quando o A/D resultar em 0 (zero), a entrada possui 0,0V, e quando o A/D resultar em 255 a entrada equivalente a 5,0V. Esta conta tambm diminuir i resoluo, aumentando ainda mais a estabilidade. Por ltimo escreveremos o valor, j em Volts, no LCD.

Esquema eltrico

Conectando o PIC 16F877A - Recursos Avanados

138

Conectando o PIC 16F877A - Recursos Avanados

139

Conectando o PIC 16F877A - Recursos Avanados

140
;************************************** ;* CONECTANDO O PIC - RECURSOS AVANADOS ;* EXEMPLO 4 * ;* * ;* NICOLS CSAR LAVINIA e DAVID JOS DE SOUZA ;* * ;************************************** ; * VERSO : 2.0 * ; * DATA : 24/02/2003 * ;**************************************

;************************************** ;* DESCRIO GERAL * ;************************************** ; ESTE EXEMPLO FOI ELABORADO PARA EXPLICAR O FUNCIONAMENTO DO MDULO DE ; CONVERSO ANALGICO DIGITAL INTERNO DO PIC. CONVERTIDO O VALOR ANALGICO ; PRESENTE NO PINO RA2 DO MICROCONTROLADOR, SENDO QUE ESTE VALOR PODE SER ; ALTERADO ATRAVS DO POTENCIMETRO P2 DA PLACA MCLAB2. O VALOR DA CONVERSO ; A/D AJUSTADO NUMA ESCALA DE 0 5V E MOSTRADO NO LCD. ; FORAM UTILIZADAS ROTINAS DE MULTIPLICAO DE 8x8 E DIVISO DE 16x16. ESTAS ; ROTINAS FORAM RETIRADAS DE APLICATION NOTES DA PRPRIA MICROCHIP. ; ;************************************** ;* CONFIGURAES PARA GRAVAO * ;************************************** __CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_ON & _XT_OSC ;************************************** ;* DEFINIO DAS VARIVEIS * ;************************************** ; ESTE BLOCO DE VARIVEIS EST LOCALIZADO LOGO NO INCIO DO BANCO 0 CBLOCK 0X20 ACCaHI ACCaLO ACCbHI ACCbLO ACCcHI ACCcLO ACCdHI ACCdLO temp ; POSIO INICIAL DA RAM ; ACUMULADOR a DE 16 BITS UTILIZADO ; NA ROTINA DE DIVISO ; ACUMULADOR b DE 16 BITS UTILIZADO ; NA ROTINA DE DIVISO ; ACUMULADOR c DE 16 BITS UTILIZADO ; NA ROTINA DE DIVISO ; ACUMULADOR d DE 16 BITS UTILIZADO ; NA ROTINA DE DIVISO ; CONTADOR TEMPORRIO UTILIZADO ; NA ROTINA DE DIVISO ; ACUMULADOR DE 16 BITS UTILIZADO ; P/ RETORNAR O VALOR DA ROTINA ; DE MULTIPLICAO ; OPERADOR P/ ROTINA DE MUTIPLICAO ; OPERADOR P/ ROTINA DE MUTIPLICAO

H_byte L_byte mulplr mulcnd TEMPO0 TEMPO1 AUX UNIDADE TENSO DEZENA ENDC

; TEMPORIZADORES P/ ROTINA DE DELAY ; REGISTRADOR AUXILIAR DE USO GERAL ; ARMAZENA VALOR DA UNIDADE DA ; ARMAZENA VALOR DA DEZENA DA TENSO

;************************************** ;* DEFINIO DAS VARIVEIS INTERNAS DO PIC * ;************************************** ; O ARQUIVO DE DEFINIES DO PIC UTILIZADO DEVE SER REFERENCIADO PARA QUE ; OS NOMES DEFINIDOS PELA MICROCHIP POSSAM SER UTILIZADOS, SEM A NECESSIDADE ; DE REDIGITAO. #INCLUDE <P16F877A.INC> ; MICROCONTROLADOR UTILIZADO

Conectando o PIC 16F877A - Recursos Avanados

141

;************************************** ;* DEFINIO DOS BANCOS DE RAM * ;************************************** ; OS PSEUDOS-COMANDOS "BANK0" E "BANK1", AQUI DEFINIDOS, AJUDAM A COMUTAR ; ENTRE OS BANCOS DE MEMRIA. #DEFINE BANK1 BSF #DEFINE BANK0 BCF STATUS,RP0 STATUS,RP0 ; SELECIONA BANK1 DA MEMORIA RAM ; SELECIONA BANK0 DA MEMORIA RAM

;************************************** ;* CONSTANTES INTERNAS * ;************************************** ; A DEFINIO DE CONSTANTES FACILITA A PROGRAMAO E A MANUTENO. ; ESTE PROGRAMA NO UTILIZA NENHUMA CONSTANTE. ;************************************** ;* DECLARAO DOS FLAGs DE SOFTWARE * ;************************************** ; A DEFINIO DE FLAGs AJUDA NA PROGRAMAO E ECONOMIZA MEMRIA RAM. ; ESTE PROGRAMA NO UTILIZA NENHUM FLAG DE USURIO ;************************************** ;* ENTRADAS * ;************************************** ; AS ENTRADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE. ; ; ; ; ; ; ESTE PROGRAMA UTILIZA APENAS UMA ENTRADA P/ O CONVERSOR A/D. ESTA ENTRADA NO PRECISA SER DECLARADA, POIS O SOFTWARE NUNCA FAZ REFERNCIA A ELA DE FORMA DIRETA, POIS O CANAL A/D A SER CONVERTIDO SELECIONADO NO REGISTRADOS ADCON0 DE FORMA BINRIA E NO ATRAVS DE DEFINES. PORM PARA FACILITAR O ENTENDIMENTO DO HARDWARE VAMOS DECLARAR ESTA ENTRADA NORMALMENTE. ; ENTRADA A/D P/ O POTENCIMETRO P2

#DEFINE CAD_P2 PORTA,1

;************************************** ;* SADAS * ;************************************** ; AS SADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE. #DEFINE DISPLAY #DEFINE RS PORTD PORTE,0 ; BARRAMENTO DE DADOS DO DISPLAY ; INDICA P/ O DISPLAY UM DADO OU COMANDO ; 1 -> DADO ; 0 -> COMANDO ; SINAL DE ENABLE P/ DISPLAY ; ATIVO NA BORDA DE DESCIDA

#DEFINE ENABLE

PORTE,1

;************************************** ;* VETOR DE RESET DO MICROCONTROLADOR ;************************************** ; POSIO INICIAL PARA EXECUO DO PROGRAMA ORG GOTO 0X0000 CONFIG

; ENDEREO DO VETOR DE RESET ; PULA PARA CONFIG DEVIDO A REGIO ; DESTINADA AS ROTINAS SEGUINTES

;************************************** ;* ROTINA DE DELAY (DE 1MS AT 256MS) * ;************************************** ; ESTA UMA ROTINA DE DELAY VARIVEL, COM DURAO DE 1MS X O VALOR PASSADO ; EM WORK (W). DELAY_MS MOVWF TEMPO1 MOVLW .250 MOVWF TEMPO0 CLRWDT DECFSZ TEMPO0,F GOTO $-2

; CARREGA TEMPO1 (UNIDADES DE MS) ; CARREGA TEMPO0 (P/ CONTAR 1MS) ; LIMPA WDT (PERDE TEMPO) ; FIM DE TEMPO0 ? ; NO - VOLTA 2 INSTRUES

Conectando o PIC 16F877A - Recursos Avanados

142
; SIM - PASSOU-SE 1MS ; FIM DE TEMPO1 ? ; NO - VOLTA 6 INSTRUES ; SIM ; RETORNA

DECFSZ TEMPO1,F GOTO $-6 RETURN

;************************************** ;* ROTINA DE ESCRITA DE UM CARACTER NO DISPLAY * ;************************************** ; ESTA ROTINA ENVIA UM CARACTER PARA O MDULO DE LCD. O CARACTER A SER ; ESCRITO DEVE SER COLOCADO EM WORK (W) ANTES DE CHAMAR A ROTINA. ESCREVE MOVWF NOP BSF GOTO BCF

DISPLAY ENABLE $+1 ENABLE

; ATUALIZA DISPLAY (PORTD) ; PERDE 1US PARA ESTABILIZAO ; ENVIA UM PULSO DE ENABLE AO DISPLAY ;. ;.

MOVLW .1 CALL DELAY_MS RETURN

; DELAY DE 1MS ; RETORNA

;************************************** ;* AJUSTE DECIMAL * ;* W [HEX] = DEZENA [DEC] ; UNIDADE [DEC] * ;************************************** ; ESTA ROTINA RECEBE UM ARGUMENTO PASSADO PELO WORK E RETORNA NAS VARIVEIS ; DEZENA E UNIDADE O NMERO BCD CORRESPONDNTE AO PARMETRO PASSADO. AJUSTE_DECIMAL MOVWF AUX CLRF UNIDADE CLRF DEZENA MOVF AUX,F BTFSC STATUS,Z RETURN INCF MOVF XORLW BTFSS GOTO CLRF INCF UNIDADE,F UNIDADE,W 0X0A STATUS,Z $+3 UNIDADE DEZENA,F

; SALVA VALOR A CONVERTER EM AUX ; RESETA REGISTRADORES

; VALOR A CONVERTER = 0 ? ; SIM - RETORNA ; NO ; INCREMENTA UNIDADE

; UNIDADE = 10d ? ; NO ; SIM ; RESETA UNIDADE ; INCREMENTA DEZENA ; FIM DA CONVERSO ? ; NO - VOLTA P/ CONTINUAR CONVERSO ; SIM

DECFSZ AUX,F GOTO $-.8 RETURN

;************************************** ;* ROTINA DE DIVISO * ;************************************** ;**************************************************************************** ; Double Precision Division ;**************************************************************************** ; Division : ACCb(16 bits) / ACCa(16 bits) -> ACCb(16 bits) with ; Remainder in ACCc (16 bits) ; (a) Load the Denominator in location ACCaHI & ACCaLO ( 16 bits ) ; (b) Load the Numerator in location ACCbHI & ACCbLO ( 16 bits ) ; (c) CALL D_divF ; (d) The 16 bit result is in location ACCbHI & ACCbLO ; (e) The 16 bit Remainder is in locations ACCcHI & ACCcLO ;**************************************************************************** D_divF MOVLW .16 MOVWF temp MOVF MOVWF MOVF MOVWF ACCbHI,W ACCdHI ACCbLO,W ACCdLO ; CARREGA CONTADOR PARA DIVISO

; SALVA ACCb EM ACCd

Conectando o PIC 16F877A - Recursos Avanados

143
CLRF CLRF CLRF CLRF DIV BCF RLF RLF RLF RLF MOVF SUBWF BTFSS GOTO MOVF SUBWF NOCHK BTFSS GOTO MOVF SUBWF BTFSS DECF MOVF SUBWF BSF NOGO RLF RLF ACCbLO,F ACCbHI,F ; FIM DA DIVISO ? ; NO - VOLTA P/ DIV ; SIM ; RETORNA STATUS,C NOGO ACCaLO,W ACCcLO,F STATUS,C ACCcHI,F ACCaHI,W ACCcHI,F STATUS,C ;carry set if c>a ;c-a into c STATUS,C ACCdLO,F ACCdHI,F ACCcLO,F ACCcHI,F ACCaHI,W ACCcHI,W STATUS,Z NOCHK ACCaLO,W ACCcLO,W ACCbHI ACCbLO ACCcHI ACCcLO

; LIMPA ACCb

; LIMPA ACCc

;check if a>c

;if msb equal then check lsb

;shift a 1 into b (result)

DECFSZ temp,F GOTO DIV RETURN

;************************************** ;* ROTINA DE MULTIPLICAO * ;************************************** ;**************************************************************************** ; 8x8 Software Multiplier ; ( Fast Version : Straight Line Code ) ;**************************************************************************** ; ; The 16 bit result is stored in 2 bytes ; Before calling the subroutine " mpy ", the multiplier should ; be loaded in location " mulplr ", and the multiplicand in ; " mulcnd " . The 16 bit result is stored in locations ; H_byte & L_byte. ; Performance : ; Program Memory : 37 locations ; # of cycles : 38 ; Scratch RAM : 0 locations ;******************************************************************* ; ******************************************** ; Define a macro for adding & right shifting ; ******************************************** mult MACRO bit BTFSC ADDWF RRF RRF ENDM ; ***************************** ; Begin Multiplier Routine ; ***************************** mpy_F CLRF CLRF H_byte L_byte mulplr,bit H_byte,F H_byte,F L_byte,F ; End of macro ; Begin macro

Conectando o PIC 16F877A - Recursos Avanados

144
MOVF BCF mult mult mult mult mult mult mult mult 0 1 2 3 4 5 6 7 ; RETORNA mulcnd,W STATUS,C ; move the multiplicand to W reg. ; Clear carry bit in the status Reg.

RETURN

;************************************** ;* CONFIGURAES INICIAIS DE HARDWARE E SOFTWARE * ;************************************** ; NESTA ROTINA SO INICIALIZADAS AS PORTAS DE I/O DO MICROCONTROLADOR E AS ; CONFIGURAES DOS REGISTRADORES ESPECIAIS (SFR). A ROTINA INICIALIZA A ; MQUINA E AGUARDA O ESTOURO DO WDT. CONFIG CLRF CLRF CLRF CLRF CLRF BANK1 MOVLW B'11111111' MOVWF TRISA MOVLW B'11111111' MOVWF TRISB MOVLW B'11111111' MOVWF TRISC MOVLW B'00000000' MOVWF TRISD MOVLW B'00000100' MOVWF TRISE MOVLW B'11011011' MOVWF OPTION_REG PORTA PORTB PORTC PORTD PORTE ; GARANTE TODAS AS SADAS EM ZERO

; SELECIONA BANCO 1 DA RAM

; CONFIGURA I/O DO PORTA

; CONFIGURA I/O DO PORTB

; CONFIGURA I/O DO PORTC ; CONFIGURA I/O DO PORTD ; CONFIGURA I/O DO PORTE

; CONFIGURA OPTIONS ; PULL-UPs DESABILITADOS ; INTER. NA BORDA DE SUBIDA DO RB0 ; TIMER0 INCREM. PELO CICLO DE MQUINA ; WDT - 1:8 ; TIMER - 1:1

MOVLW B'00000000' MOVWF INTCON MOVLW B'00000100' MOVWF ADCON1

; CONFIGURA INTERRUPES ; DESABILITA TODAS AS INTERRUPES

; CONFIGURA CONVERSOR A/D ; RA0, RA1 E RA3 COMO ANALGICO ; RA2, RA4 E RA5 COMO I/O DIGITAL ; PORTE COMO I/O DIGITAL ; JUSTIFICADO ESQUERDA ; 8 BITS EM ADRESH E 2 BITS EM ADRESL ; Vref+ = VDD (+5V) ; Vref- = GND ( 0V) ; SELECIONA BANCO 0 DA RAM

BANK0 MOVLW B'01001001' MOVWF ADCON0

; CONFIGURA CONVERSOR A/D ; VELOCIDADE -> Fosc/8 ; CANAL 1 ; MDULO LIGADO

; AS INSTRUES A SEGUIR FAZEM COM QUE O PROGRAMA TRAVE QUANDO HOUVER UM ; RESET OU POWER-UP, MAS PASSE DIRETO SE O RESET FOR POR WDT. DESTA FORMA, ; SEMPRE QUE O PIC LIGADO, O PROGRAMA TRAVA, AGUARDA UM ESTOURO DE WDT

Conectando o PIC 16F877A - Recursos Avanados

145
; E COMEA NOVAMENTE. ISTO EVITA PROBLEMAS NO START-UP DO PIC. BTFSC GOTO STATUS,NOT_TO $ ; RESET POR ESTOURO DE WATCHDOG TIMER ? ; NO - AGUARDA ESTOURO DO WDT ; SIM

;************************************** ;* INICIALIZAO DA RAM * ;************************************** ; ESTA ROTINA IR LIMPAR TODA A RAM DO BANCO 0, INDO DE 0X20 A 0X7F. ; EM SEGUIDA, AS VARIVEIS DE RAM DO PROGRAMA SO INICIALIZADAS. MOVLW 0X20 MOVWF FSR LIMPA_RAM CLRF INCF MOVF XORLW BTFSS GOTO

; APONTA O ENDEREAMENTO INDIRETO PARA ; A PRIMEIRA POSIO DA RAM ; LIMPA A POSIO ; INCREMENTA O PONTEIRO P/ A PRX. POS. ; COMPARA O PONTEIRO COM A LT. POS. +1 ; J LIMPOU TODAS AS POSIES? ; NO - LIMPA A PRXIMA POSIO ; SIM

INDF FSR,F FSR,W 0X80 STATUS,Z LIMPA_RAM

;************************************** ;* CONFIGURAES INICIAIS DO DISPLAY ;************************************** ; ESTA ROTINA INICIALIZA O DISPLAY P/ COMUNICAO DE 8 VIAS, DISPLAY PARA 2 ; LINHAS, CURSOR APAGADO E DESLOCAMENTO DO CURSOR DIREITA. INICIALIZACAO_DISPLAY BCF RS MOVLW CALL MOVLW CALL 0X30 ESCREVE .3 DELAY_MS

; SELECIONA O DISPLAY P/ COMANDOS ; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO ; DELAY DE 3MS (EXIGIDO PELO DISPLAY) ; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO ; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO ; ESCREVE COMANDO PARA ; INTERFACE DE 8 VIAS DE DADOS ; ESCREVE COMANDO PARA ; LIMPAR TODO O DISPLAY

MOVLW 0X30 CALL ESCREVE MOVLW 0X30 CALL ESCREVE MOVLW B'00111000' CALL ESCREVE MOVLW B'00000001' CALL ESCREVE MOVLW .1 CALL DELAY_MS MOVLW B'00001100' CALL ESCREVE MOVLW B'00000110' CALL ESCREVE

; DELAY DE 1MS ; ESCREVE COMANDO PARA ; LIGAR O DISPLAY SEM CURSOR ; ESCREVE COMANDO PARA INCREM. ; AUTOMTICO DIREITA

;************************************** ;* ROTINA DE ESCRITA DA TELA PRINCIPAL * ;************************************** ; ESTA ROTINA ESCREVE A TELA PRINCIPAL DO PROGRAMA, COM AS FRASES: ; LINHA 1 - " A/D Int. (P2) " ; LINHA 2 - " Volts " MOVLW 0X81 CALL ESCREVE BSF RS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 0 / COLUNA 1 ; SELECIONA O DISPLAY P/ DADOS ; COMANDOS PARA ESCREVER AS ; LETRAS DE "A/D Int. (P2)" MOVLW CALL MOVLW CALL 'A' ESCREVE '/' ESCREVE

Conectando o PIC 16F877A - Recursos Avanados

146
MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL BCF MOVLW CALL BSF 'D' ESCREVE '' ESCREVE 'I' ESCREVE 'n' ESCREVE 't' ESCREVE '.' ESCREVE '' ESCREVE '' ESCREVE '(' ESCREVE 'P' ESCREVE '2' ESCREVE ')' ESCREVE RS 0XC7 ESCREVE RS ; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 7 ; SELECIONA O DISPLAY P/ DADOS ; COMANDOS PARA ESCREVER AS ; LETRAS DE "Volts"

MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL

'V' ESCREVE 'o' ESCREVE 'l' ESCREVE 't' ESCREVE 's' ESCREVE

;************************************** ;* LOOP PRINCIPAL * ;************************************** ; A ROTINA PRINCIPAL FICA CONVERTENDO O CANAL A/D, CALCULANDO O VALOR EM ; VOLTS E MOSTRANDO NO DISPLAY. LOOP CLRWDT BSF BTFSC GOTO ADCON0,GO ADCON0,GO $-1 ; LIMPA WATCHDOG TIMER ; INICIA CONVERSO A/D ; FIM DA CONVERSO ? ; NO - VOLTA 1 INSTRUO ; SIM ; SALVA VALOR DA CONVERSO NO WORK ; CARREGA WORK EM mulplr

MOVF ADRESH,W MOVWF mulplr MOVLW .50 MOVWF mulcnd CALL MOVF MOVWF MOVF MOVWF mpy_F H_byte,W ACCbHI L_byte,W ACCbLO

; CARREGA 50d EM mulcnd ; CHAMA ROTINA DE MULTIPLICAO

; SALVA VALOR DA MULTIPLICAO ; EM ACCb PARA SER UTILIZADO NA ; ROTINA DE DIVISO ; CARREGA ACCa COM 255d (FUNDO DE ; ESCALA DO CONVERSOR A/D) ; (ESTO SENDO UTILIZADOS 8 BITS) ; CHAMA ROTINA DE DIVISO ; FAZ O AJUSTE DECIMAL PARA ; MOSTRAR NO DISPLAY (LCD)

CLRF ACCaHI MOVLW .255 MOVWF ACCaLO CALL MOVF CALL D_divF ACCbLO,W AJUSTE_DECIMAL

Conectando o PIC 16F877A - Recursos Avanados

147
BCF MOVLW CALL BSF RS 0XC3 ESCREVE RS ; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 3 ; SELECIONA O DISPLAY P/ DADOS

MOVF DEZENA,W ADDLW 0X30 CALL ESCREVE MOVLW ',' CALL ESCREVE MOVF UNIDADE,W ADDLW 0X30 CALL ESCREVE GOTO LOOP

; CONVERTE BCD DA DEZENA EM ASCII ; ENVIA AO LCD

; ESCREVE UMA VIRGULA NO LCD

; CONVERTE BCD DA UNIDADE EM ASCII ; ENVIA AO LCD ; VOLTA PARA LOOP

;************************************** ;* FIM DO PROGRAMA ;************************************** END

* ; FIM DO PROGRAMA

Conectando o PIC 16F877A - Recursos Avanados

148
Dicas e comentrios
Inicialmente podemos comentar que toda a estrutura e rotinas utilizadas para a escrita no LCD so as mesmas j aplicadas no exemplo do captulo 6. Observe tambm que, conforme foi comentado anteriormente, no foi utilizada nenhuma interrupo nesse programa. Por isso, o programa permanece parado em um pequeno loop enquanto a converso no termina. Isso checado atravs do bit ADCON0<GO/DONE>. Outro ponto interessante que nenhum delay especificado antes do incio da converso. Isso no necessrio, pois o sistema analgico lento (potencimetro), s utilizamos um canal e, ainda por cima, o resto do loop principal dura mais de 40s, garantindo o tempo mnimo entre uma converso e outra. A rotina de multiplicao (8 bits x 8 bits) e a de diviso (16 bits) foram obtidas dos Aplication Notes da prpria Microchip e podem ser utilizadas em outros projetos. Outra rotina bem interessante que aparece nesse sistema a de converso de um nmero qualquer (limitado entre O e 99) em dois dgitos separados, para a composio de nmeros decimais, facilitando a escrita no LCD. Essa rotina devolve os dgitos nas variveis UNIDADE e DEZENA. No se esquea de que antes de transmitir uma varivel decimal para o LCD, deve-se convert-la para ASCII, bastando para isso somar o valor 0x30 (Hex). Para facilitar as contas e no utilizarmos nmeros fracionrios, a converso para Volts feita considerando-se 50 no lugar de 5,0. Na hora de enviar para o LCD, simplesmente colocada uma vrgula entre os dois dgitos.

Exerccios propostos
Agora que o exemplo j foi estudado e esclarecido, aproveite para gerar novos problemas e solues, seguindo os exerccios propostos: 1. Simule que a entrada analgica um sensor de temperatura linear que deve marcar de 10 a 80 C. 2. Altere o exemplo para indicar a tenso entre O e 2,50V, utilizando 10 bits de resoluo. Para isso, faa uso da tenso de referncia externa existente na placa proposta (pino RA3).

Conectando o PIC 16F877A - Recursos Avanados

149

Conectando o PIC

8
Conversor Analgico-Digital por RC

Introduo
Quando o microcontrolador no dispe de um CAD interno possvel utilizarmos conversores externos que efetuaro a converso e disponibilizaro o dado convertido atravs de uma comunicao serial ou paralela. Mas existem alguns casos em que o custo ou os recursos do projeto no possibilitam a escolha de -n PIC com conversor interno e muito menos o uso de um conversor externo. Neste caso estamos Destinados a operar com valores meramente digitais? Nem sempre, pois existe uma soluo que, apesar se no ser muito precisa, pode ser a salvao.

Teoria e recursos do PIC


s vezes estamos interessados em quantizar apenas alguns nveis de tenso analgica, criando patamares de referenciais. Por exemplo, em um sistema alimentado bateria interessante sabermos se a mesma encontra--se carregada, normal ou descarregada e, portanto, acenas trs nveis comparativos so necessrios. O custo de um conversor A/D convencional para esse tipo de aplicao no se justifica. Nessas ocasies pode-se recorrer a um sistema de converso baseada na carga e descarga de um capacitar. A idia consiste em medir, atravs do microcontrolador, o tempo de carga de um capacitor em um circuito RC. Veja o exemplo de hardware colocado a seguir: Admitindo-se que o pino do PIC est configurado como entrada, o tempo de carga do capacitor C est relacionado com o valor de entrada (Vin), do resistor RA e do prprio capacitor C. O resistor RB no interfere no tempo de carga, pois o pino do PIC est em alta impedncia (entrada). J se o pino do PIC estiver configurado como sada em nvel lgico O, o capacitor tende a se descarregar pelo resistor RB e carregar reto resistor RA. Porm, vamos admitir que o valor do resistor RB seja muito menor do que o de RA e, portanto, nesta configurao, podemos desprezar a carga proveniente do resistor RA e admitir que o

Conectando o PIC 16F877A - Recursos Avanados

150
capacitor C apenas se descarrega atravs de RB. Em resumo, o capacitor se carrega atravs de RA (pino como entrada) e se descarrega atravs de Rb (pino como sada em 0), foi que o tempo de carga/desa depende do prprio valor do capacitor, da tenso de entrada (Vin e do resistor em questo. Como funciona ento a converso A/D? 1. 2. O software deve configurar o pino do PIC como sada em 0. Esperar o tempo de descarrega do capacitor C. Este tempo deve ser garantido por software conforme os valores dos componentes utilizados. Configurar o pino como entrada, ou seja, permitir a carga do capacitor. Contar o tempo que o capacitor leva para que o PIC entenda nvel lgico 1, ou seja, conte tempo de carga do capacitor. Repetir o processo para uma nova converso.

3. 4.

5.

Como os valores do resistor e do capacitor so fixos e conhecidos, o tempo de carga do capacitor ser proporcional tenso de entrada Vin. Admitindo-se que a tenso de entrada Vin no varia durante a converso A/D, o modelo matemtico aproximado para a curva de descarga do capacitor

Conforme foi comentado no incio, esse tipo de conversor no apresenta uma boa preciso, alm de apresentar uma srie de inconvenientes:

Conectando o PIC 16F877A - Recursos Avanados

151

Nota-se nos grficos que a tenso no varia linearmente no tempo e, portanto, esse tipo de conversor A/D no linear. O valor da converso, ou seja, o tempo de carga do capacitor est sujeito s variaes dos componentes envolvidos. Para o caso do resistor, pode-se utilizar resistores de 1 %, porm para o capacitor o problema torna-se mais grave, j que geralmente existe muita variao de um lote de componentes para o outro. Normalmente o capacitor muito suscetvel a variaes trmicas. A tenso de entrada deve ser suficientemente alta para que o PIC entenda nvel lgico 1, por isso esse conversor no funciona no range completo de 0 a 5V. O valor de tenso necessrio para que o PIC entenda nvel lgico 1 pode variar em funo da pastilha, da tenso da fonte (alimentao do PIC) e do tipo de pino (TTL/ST). Reavalie a teoria do captulo 4. Como dica, podemos sugerir: Utilizar RB pelo menos dez vezes menor que RA; No utilizar capacitores maiores do que 1 F; D preferncia ao uso de capacitores de tntalo ou cermico; No discretizar mais do que oito nveis.

Lgica do exemplo
O exerccio proposto para este captulo mostrar no LCD o tempo de carga de um circuito RC disponvel na placa do apndice F (McLab2). Para isso, vamos colocar em prtica a teoria vista posteriormente. O pino de entrada do PIC (RA1) do tipo TTL; portanto, o nvel mnimo de tenso para indicar nvel caco 1 de aproximadamente 1,25V. Vamos admitir que a tenso de entrada varie entre 1,5V e 5V. A escolha de 1,5V e no 1,25V deve-se ao fato da curva do capacitor ser exponencial e, portanto, o capacitor tende a se carregar com uma tenso um pouco abaixo da tenso de entrada. Caso a tenso a; entrada fosse de 1,25V, nunca o PIC atingiria nvel lgico 1. Para o circuito da placa temos: RA=4,7k RB = 330 C = 1F O tempo de carga do capacitor para uma tenso de entrada de 1,5V, considerando que o PIC entenda nvel lgico 1 com uma tenso de entrada de 1,25V ser ento:

Conectando o PIC 16F877A - Recursos Avanados

152

J o tempo de carga do capacitar para uma tenso de entrada de 5V ser:

t = 1,4ms
Verifica-se, ento, que para o range de tenso de entrada proposto (1,5V a 5,0V) o tempo de carga do capacitor varia entre 1,4ms e 8,4ms. Admitindo que a rotina que checa se o capacitor j est carregado tm um tempo de execuo de 50s e que a varivel que armazenar o tempo (em mltiplos de 50s) de 8 bits (256 nveis), temos que o tempo mximo de carga do capacitor no pode ser maior do que:

tmx =256* 50s = 12,8ms


Veja que esse valor est acima dos 8,4ms calculados, o que garante que mesmo com um tempo de carga lento, o contador da rotina no ir estourar, a no ser no caso em que a tenso de entrada est abaixo da mnima admissvel interpretada como nvel lgico 1. O tempo mnimo de carga do capacitor, ou seja, tenso mxima de entrada, foi calculado em 1,4ms. Como a rotina do software proposto executa uma contagem a cada 50s, nesta condio, o valor mnimo medido pelo conversor A/D deve ser de:

Esses dados esto prximos aos reais e podem ser comprovados no software de exemplo. As diferenas encontradas podem ser explicadas levando-se em conta todos os comentrios j discutidos anteriormente. Alm do tempo de carga do capacitor, devemos calcular tambm o tempo de descarga, uma vez que o ciclo de converso deve ser iniciado com o capacitor descarregado. Considerando que o capacitor est totalmente carregado, ou seja, com 5V e que ele ser considerado descarregado quando sua tenso for menor do que 50mV, podemos calcular o tempo mximo de descarga em:

t = 1,5ms
Na realidade, o capacitar nunca se descarregar tanto (50mV), pois o resistor RA (ligado tenso de entrada) forma em conjunto com o resistor RB (ligado ao terra atravs do PIC) um divisor de tenso que no permitir a descarga do capacitar at uma tenso to baixa. De qualquer forma, o clculo deve ser utilizado para estimar a ordem de grandeza do tempo de descarga do capacitar. Para efeitos ilustrativos, segue o exemplo plotado da forma de onda no capacitar para uma tenso de entrada de 5,0V: Conectando o PIC 16F877A - Recursos Avanados

153

Levando-se em conta os clculos apresentados, no software de exemplo foi criado um loop de 50us para a contagem do tempo de carga do capacitor. O valor do contador foi armazenado na varivel denominada CONTADOFLAD. Aps a carga do capacitar, o valor desse contador mostrado no LCD. Para garantir a descarga do capacitor foi deixado um delay de 3ms. Nenhuma interrupo foi empregada neste exemplo.

Esquema eltrico

Conectando o PIC 16F877A - Recursos Avanados

154 Fluxograma

Conectando o PIC 16F877A - Recursos Avanados

155

Conectando o PIC 16F877A - Recursos Avanados

156
;************************************** ;* ;* ;* ;* ;* ;************************************** ; * VERSO : 2.0 ;* DATA : 24/02/2003 ;************************************** * * CONECTANDO O PIC - RECURSOS AVANADOS EXEMPLO 5 * NICOLS CSAR LAVINIA e DAVID JOS DE SOUZA * * * *

;************************************** ;* DESCRIO GERAL *

;************************************** ; ESTE EXEMPLO FOI ELABORADO PARA EXPLICAR O FUNCIONAMENTO DE UM TIPO DE ; CONVERSOR A/D FUNDAMENTADO NO TEMPO DE CARGA DE UM CAPACITOR. O TEMPO DE ; CARGA DO CAPACITOR MOSTRADO NO LCD E INVERSAMENTE PROPORCIONAL ; TENSO APLICADA ATRVS DO POTENCIMETRO P2. ; ;************************************** ;* CONFIGURAES PARA GRAVAO *

;**************************************

__CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_ON & _XT_OSC

;************************************** ;* DEFINIO DAS VARIVEIS *

;************************************** ; ESTE BLOCO DE VARIVEIS EST LOCALIZADO LOGO NO INCIO DO BANCO 0

CBLOCK 0X20

; POSIO INICIAL DA RAM

TEMPO1 TEMPO0 ; CONTADORES P/ DELAY

Conectando o PIC 16F877A - Recursos Avanados

157

FILTRO_BOTOES

; FILTRO PARA RUIDOS DOS BOTES

CONTADOR_AD

; CONTADOR PARA CONVERSOR A/D

AUX

; REGISTRADOR AUXILIAR DE USO GERAL

ENDC

;************************************** ;* DEFINIO DAS VARIVEIS INTERNAS DO PIC *

;************************************** ; O ARQUIVO DE DEFINIES DO PIC UTILIZADO DEVE SER REFERENCIADO PARA QUE ; OS NOMES DEFINIDOS PELA MICROCHIP POSSAM SER UTILIZADOS, SEM A NECESSIDADE ; DE REDIGITAO.

#INCLUDE <P16F877A.INC>

; MICROCONTROLADOR UTILIZADO

;************************************** ;* DEFINIO DOS BANCOS DE RAM *

;************************************** ; OS PSEUDOS-COMANDOS "BANK0" E "BANK1", AQUI DEFINIDOS, AJUDAM A COMUTAR ; ENTRE OS BANCOS DE MEMRIA.

#DEFINE BANK1 BSF #DEFINE BANK0 BCF

STATUS,RP0 STATUS,RP0

; SELECIONA BANK1 DA MEMORIA RAM ; SELECIONA BANK0 DA MEMORIA RAM

;************************************** ;* CONSTANTES INTERNAS *

;************************************** ; A DEFINIO DE CONSTANTES FACILITA A PROGRAMAO E A MANUTENO.

FILTRO_TECLA

EQU

.200

; FILTRO P/ EVITAR RUIDOS DOS BOTES

;**************************************

Conectando o PIC 16F877A - Recursos Avanados

158
;* DECLARAO DOS FLAGs DE SOFTWARE *

;************************************** ; A DEFINIO DE FLAGs AJUDA NA PROGRAMAO E ECONOMIZA MEMRIA RAM.

; ESTE PROGRAMA NO UTILIZA NENHUM FLAG DE USURIO

;************************************** ;* ENTRADAS *

;************************************** ; AS ENTRADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE.

#DEFINE PINO_AD

TRISA,1

; PINO P/ LEITURA DO RC ; 0 -> FORA A DESCARGA DO CAPACITOR ; 1 -> LIBERA A CARGA DO CAPACITOR

#DEFINE CAD

PORTA,1

; PINO P/ LEITURA DO CONV. A/D ; 0 -> CAPACITOR DESCARREGADO ; 1 -> CAPACITOR CARREGADO

;************************************** ;* SADAS *

;************************************** ; AS SADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE.

#DEFINE DISPLAY

PORTD

; BARRAMENTO DE DADOS DO DISPLAY

#DEFINE RS

PORTE,0

; INDICA P/ DISPLAY UM DADO OU COMANDO ; 1 -> DADO ; 0 -> COMANDO

#DEFINE ENABLE

PORTE,1

; SINAL DE ENABLE P/ DISPLAY ; ATIVO NA BORDA DE SUBIDA

Conectando o PIC 16F877A - Recursos Avanados

159
;************************************** ;* VETOR DE RESET DO MICROCONTROLADOR *

;************************************** ; POSIO INICIAL PARA EXECUO DO PROGRAMA

ORG GOTO

0X000 CONFIG

; ENDEREO DO VETOR DE RESET ; PULA PARA CONFIG DEVIDO A REGIO ; DESTINADA AS ROTINAS SEGUINTES

;************************************** ;* ROTINA DE DELAY (DE 1MS AT 256MS) *

;************************************** ; ESTA UMA ROTINA DE DELAY VARIVEL, COM DURAO DE 1MS X O VALOR PASSADO ; EM WORK (W).

DELAY_MS MOVWF TEMPO1 MOVLW .250 MOVWF TEMPO0 ; CARREGA TEMPO0 (P/ CONTAR 1MS) ; CARREGA TEMPO1 (UNIDADES DE MS)

CLRWDT DECFSZ TEMPO0,F GOTO $-2

; LIMPA WDT (PERDE TEMPO) ; FIM DE TEMPO0 ? ; NO - VOLTA 2 INSTRUES ; SIM - PASSOU-SE 1MS

DECFSZ TEMPO1,F GOTO $-6

; FIM DE TEMPO1 ? ; NO - VOLTA 6 INSTRUES ; SIM

RETURN

; RETORNA

;************************************** ;* ROTINA DE ESCRITA DE UM CARACTER NO DISPLAY *

;************************************** ; ESTA ROTINA ENVIA UM CARACTER PARA O MDULO DE LCD. O CARACTER A SER ; ESCRITO DEVE SER COLOCADO EM WORK (W) ANTES DE CHAMAR A ROTINA.

Conectando o PIC 16F877A - Recursos Avanados

160
ESCREVE MOVWF DISPLAY NOP BSF GOTO BCF ENABLE $+1 ENABLE ; ATUALIZA DISPLAY (PORTD) ; PERDE 1US PARA ESTABILIZAO ; ENVIA UM PULSO DE ENABLE AO DISPLAY ;. ;.

MOVLW .1 CALL RETURN DELAY_MS ; DELAY DE 1MS ; RETORNA

;************************************** ;* CONFIGURAES INICIAIS DE HARDWARE E SOFTWARE *

;************************************** ; NESTA ROTINA SO INICIALIZADAS AS PORTAS DE I/O DO MICROCONTROLADOR E AS ; CONFIGURAES DOS REGISTRADORES ESPECIAIS (SFR). A ROTINA INICIALIZA AS ; VARIVEIS DE RAM E AGUARDA O ESTOURO DO WDT.

CONFIG CLRF CLRF CLRF CLRF CLRF PORTA PORTB PORTC PORTD PORTE ; GARANTE AS SADAS EM ZERO

BANK1

; SELECIONA BANCO 1 DA RAM

MOVLW B'11011111' MOVWF TRISA ; CONFIGURA I/O DO PORTA

MOVLW B'11111111' MOVWF TRISB ; CONFIGURA I/O DO PORTB

MOVLW B'11111111' MOVWF TRISC ; CONFIGURA I/O DO PORTC

Conectando o PIC 16F877A - Recursos Avanados

161

MOVLW B'00000000' MOVWF TRISD ; CONFIGURA I/O DO PORTD

MOVLW B'00000100' MOVWF TRISE ; CONFIGURA I/O DO PORTE

MOVLW B'11011111' MOVWF OPTION_REG ; CONFIGURA OPTIONS ; PULL-UPs DESABILITADOS ; INTER. NA BORDA DE SUBIDA DO RB0 ; TIMER0 INCREM. PELO CICLO DE MQUINA ; WDT - 1:128 ; TIMER - 1:1

MOVLW B'00000000' MOVWF INTCON ; CONFIGURA INTERRUPES ; DESABILITADA TODAS AS INTERRUPES

MOVLW B'00000111' MOVWF ADCON1 ; CONFIGURA CONVERSOR A/D ; CONFIGURA PORTA COM I/O DIGITAL

BANK0

; SELECIONA BANCO 0 DA RAM

; AS INTRUES A SEGUIR FAZEM COM QUE O PROGRAMA TRAVE QUANDO HOUVER UM ; RESET OU POWER-UP, MAS PASSE DIRETO SE O RESET FOR POR WDT. DESTA FORMA, ; SEMPRE QUE O PIC LIGADO, O PROGRAMA TRAVA, AGUARDA UM ESTOURO DE WDT ; E COMEA NOVAMENTE. ISTO EVITA PROBLEMAS NO START-UP DO PIC.

BTFSC GOTO

STATUS,NOT_TO $

; RESET POR ESTOURO DE WATCHDOG TIMER ? ; NO - AGUARDA ESTOURO DO WDT ; SIM

;**************************************

Conectando o PIC 16F877A - Recursos Avanados

162
;* INICIALIZAO DA RAM *

;************************************** ; ESTA ROTINA IR LIMPAR TODA A RAM DO BANCO 0, INDO DE 0X20 A 0X7F

MOVLW 0X20 MOVWF FSR ; APONTA O ENDEREAMENTO INDIRETO PARA ; A PRIMEIRA POSIO DA RAM LIMPA_RAM CLRF INCF MOVF INDF FSR,F FSR,W ; COMPARA O PONTEIRO COM A LT. POS. +1 ; J LIMPOU TODAS AS POSIES? ; NO - LIMPA A PRXIMA POSIO ; SIM ; LIMPA A POSIO ; INCREMENTA O PONTEIRO P/ A PRX. POS.

XORLW 0X80 BTFSS GOTO STATUS,Z LIMPA_RAM

;************************************** ;* CONFIGURAES INICIAIS DO DISPLAY *

;************************************** ; ESTA ROTINA INICIALIZA O DISPLAY P/ COMUNICAO DE 8 VIAS, DISPLAY PARA 2 ; LINHAS, CURSOR APAGADO E DESLOCAMENTO DO CURSOR DIREITA.

INICIALIZACAO_DISPLAY BCF RS ; SELECIONA O DISPLAY P/ COMANDOS

MOVLW 0X30 CALL ESCREVE

; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO

MOVLW .3 CALL DELAY_MS ; DELAY DE 3MS (EXIGIDO PELO DISPLAY)

MOVLW 0X30 CALL ESCREVE

; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO

MOVLW 0X30

; ESCREVE COMANDO 0X30 PARA

Conectando o PIC 16F877A - Recursos Avanados

163
CALL ESCREVE ; INICIALIZAO

MOVLW B'00111000' CALL ESCREVE

; ESCREVE COMANDO PARA ; INTERFACE DE 8 VIAS DE DADOS

MOVLW B'00000001' CALL ESCREVE

; ESCREVE COMANDO PARA ; LIMPAR TODO O DISPLAY

MOVLW .1 CALL DELAY_MS ; DELAY DE 1MS

MOVLW B'00001100' CALL ESCREVE

; ESCREVE COMANDO PARA ; LIGAR O DISPLAY SEM CURSOR

MOVLW B'00000110' CALL ESCREVE

; ESCREVE COMANDO PARA INCREM. ; AUTOMTICO A ESQUERDA

;************************************** ;* ROTINA DE ESCRITA DA TELA PRINCIPAL *

;************************************** ; ESTA ROTINA ESCREVE A TELA PRINCIPAL DO PROGRAMA, COM AS FRASES: ; LINHA 1 - "A/D por RC (P2)" ; LINHA 2 - "T.CARGA: x50us"

MOVLW 0X80 CALL ESCREVE

; COMANDO PARA POSICIONAR O CURSOR ; LINHA 0 / COLUNA 0

BSF

RS

; SELECIONA O DISPLAY P/ DADOS ; COMANDOS PARA ESCREVER AS ; LETRAS DE "A/D por RC (P2)"

MOVLW 'A' CALL ESCREVE

MOVLW '/' CALL ESCREVE

MOVLW 'D'

Conectando o PIC 16F877A - Recursos Avanados

164
CALL ESCREVE

MOVLW ' ' CALL ESCREVE

MOVLW 'p' CALL ESCREVE

MOVLW 'o' CALL ESCREVE

MOVLW 'r' CALL ESCREVE

MOVLW ' ' CALL ESCREVE

MOVLW 'R' CALL ESCREVE

MOVLW 'C' CALL ESCREVE

MOVLW ' ' CALL ESCREVE

MOVLW ' ' CALL ESCREVE

MOVLW '(' CALL ESCREVE

MOVLW 'P' CALL ESCREVE

MOVLW '2' CALL ESCREVE

MOVLW ')' CALL ESCREVE

BCF

RS

; SELECIONA O DISPLAY P/ COMANDOS

MOVLW 0XC0 CALL ESCREVE

; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 0

BSF

RS

; SELECIONA O DISPLAY P/ DADOS ; COMANDOS PARA ESCREVER AS

Conectando o PIC 16F877A - Recursos Avanados

165
; LETRAS DE "T.CARGA: x50us" MOVLW 'T' CALL ESCREVE

MOVLW '.' CALL ESCREVE

MOVLW 'C' CALL ESCREVE

MOVLW 'A' CALL ESCREVE

MOVLW 'R' CALL ESCREVE

MOVLW 'G' CALL ESCREVE

MOVLW 'A' CALL ESCREVE

MOVLW ':' CALL ESCREVE

MOVLW ' ' CALL ESCREVE

MOVLW ' ' CALL ESCREVE

MOVLW ' ' CALL ESCREVE

MOVLW 'x' CALL ESCREVE

MOVLW '5' CALL ESCREVE

MOVLW '0' CALL ESCREVE

MOVLW 'u' CALL ESCREVE

MOVLW 's' CALL ESCREVE

;**************************************

Conectando o PIC 16F877A - Recursos Avanados

166
;* ROTINA PARA DESCARREGAR O CAPACITOR DE LEITURA DO CONVERSOR A/D *

;************************************** ; ESTA ROTINA CONVERTE O PINO DO MICROCONTROLADOR EM SADA COM NVEL LGICO 0 ; E AGUARDA QUE O CAPACITOR SE DESCARREGUE. EM SEGUIDA O PINO CONVERTIDO ; NOVAMENTE EM ENTRADA PARA PERMITIR QUE O CAPACITOR DE CARREGUE.

DESCARGA_CAPACITOR CLRWDT ; LIMPA WATCHDOG TIMER

CLRF

CONTADOR_AD

; ZERA O CONTADOR DE TEMPO DE CARGA ; DO CAPACITOR

BANK1 BCF BANK0 BCF CAD PINO_AD

; SELECIONA BANCO 1 DA RAM ; TRANSFORMA PINO EM SAIDA ; VOLTA P/ BANCO 0 DA RAM ; DESCARREGA O CAPACITOR

MOVLW .3 CALL DELAY_MS ; CHAMA ROTINA DE DELAY (3ms) ; TEMPO NECESSRIO P/ DESCARGA ; DO CAPACITOR

BANK1 BSF BANK0 PINO_AD

; SELECIONA BANCO 1 DA RAM ; TRANSFORMA PINO EM ENTRADA ; VOLTA P/ BANCO 0 DA RAM

;************************************** ;* LOOP P/ ESPERAR CARGA DO CAPACITOR *

;************************************** ; O TEMPO CONTA O TEMPO QUE O CAPACITOR LEVA PARA ATINGIR UM NVEL DE TENSO ; SUFICIENTE PARA QUE O MICROCONTROLADOR ENTENDA NVEL LGICO 1 NA ENTRADA TTL ; DO PINO RA1. CASO O CAPACITOR NUNCA SE DEMORE MAIS DO QUE 256 CICLOS DESTE ; LOOP, A ROTINA DESVIA PARA UMA ROTINA DE SATURAO. ; O LOOP DA ROTINA DE 50us (CRISTAL DE 4MHz).

Conectando o PIC 16F877A - Recursos Avanados

167
LOOP_CAD NOP ; [1us]

MOVLW .14 MOVWF AUX DECFSZ AUX,F GOTO $-1

; [2us] ; [3us] - CARREGA AUX COM 14d

; [4us] [44us] - DELAY

INCFSZ CONTADOR_AD,F GOTO GOTO $+2 SATURACAO

; INCREM. CONTADOR E VERIFICA ESTOURO ; NO HOUVE ESTOURO - PULA 1 INSTRUO ; HOUVE ESTOURO - PULA P/ SATURAO

BTFSS GOTO GOTO

CAD LOOP_CAD MOSTRA_CONTADOR

; CAPACITOR J CARREGOU ? ; NO - VOLTA P/ LOOP_CAD ; SIM - MOSTRA TEMPO DE CARGA

;************************************** ;* MOSTRA O TEMPO DE CARGA DO CAPACITOR NO LCD *

;************************************** ; ESTA ROTINA MOSTRA O TEMPO DE CARGA DO CAPACITOR EM HAXADECIMAL NO LCD. ; CASO O CAPACITOR NO TENHA SE CARREGADO, A ROTINA DE SATURAO GARANTE ; UM VALOR MXIMO PARA O TEMPO DE CARGA (0xFF).

SATURACAO MOVLW 0XFF MOVWF CONTADOR_AD ; SATURA O CONTADOR ; (CAPACITOR NO CARREGOU)

MOSTRA_CONTADOR MOVLW 0XC9 CALL ESCREVE ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 9

BSF

RS

; SELECIONA O DISPLAY P/ DADOS

SWAPF CONTADOR_AD,W

; INVERTE NIBLE DO CONTADOR_AD

Conectando o PIC 16F877A - Recursos Avanados

168
ANDLW B'00001111' MOVWF AUX ; MASCARA BITS MAIS SIGNIFICATIVOS ; SALVA EM AUXILIAR

MOVLW 0X0A SUBWF AUX,W MOVLW 0X30 BTFSC STATUS,C ; AUX - 10d (ATUALIZA FLAG DE CARRY) ; CARREGA WORK COM 30h ; RESULTADO E POSITIVO? ( UMA LETRA?) ; SIM - CARREGA WORK COM 37h ; NO - WORK FICA COM 30h (NMERO) ADDWF AUX,W ; SOMA O WORK AO AUXILIAR ; (CONVERSO ASCII) CALL ESCREVE ; MOSTRA NO DISPLAY

MOVLW 0X37

MOVF

CONTADOR_AD,W

; CARREGA NO WORK O CONTADOR_AD ; MASCARA BITS MAIS SIGNIFICATIVOS ; SALVA EM AUXILIAR

ANDLW B'00001111' MOVWF AUX

MOVLW 0X0A SUBWF AUX,W MOVLW 0X30 BTFSC STATUS,C ; AUX - 10d (ATUALIZA FLAG DE CARRY) ; CARREGA WORK COM 30h ; RESULTADO E POSITIVO? ( UMA LETRA?) ; SIM - CARREGA WORK COM 37h ; NO - WORK FICA COM 30h (NMERO) ADDWF AUX,W ; SOMA O WORK AO AUXILIAR ; (CONVERSO ASCII) CALL BCF ESCREVE RS ; MOSTRA NO DISPLAY ; SELECIONA O DISPLAY P/ COMANDOS

MOVLW 0X37

GOTO

DESCARGA_CAPACITOR

; VOLTA P/ DESCARREGAR O CAPACITOR

;************************************** ;* FIM DO PROGRAMA *

;**************************************

END

; FIM DO PROGRAMA

Conectando o PIC 16F877A - Recursos Avanados

169
Dicas e comentrios
Observe que foi feita uma verificao para garantir que, se o tempo de carga do capacitar ultrapassar o limite da varivel CONTADOR_AD, essa varivel ter seu valor assegurado em 0xFF atravs da rotina SATURAO. Toda a estrutura e rotinas para escrita no LCD so as mesmas utilizadas no exemplo do captulo 6.

Exerccios propostos
Agora que o exemplo j foi estudado e esclarecido, aproveite para gerar novos problemas e solues, seguindo os exerccios propostos: 1. Seguindo o exemplo dado no comeo do captulo em relao ao monitoramento de uma bateria, estabelea trs nveis de comparao e altere a tela do LCD para mostrar as mensagens de bateria Fraca, Normal e Carregada. 2. A placa proposta (Apndice G) possui um outro RC ligado ao PIC, s que com a tenso constante e o R varivel. Trata-se dos jumpers A, B e C. A combinao desses jumpers cria sete nveis de resistncia aplicadas ao RC que est ligado no pino RA4. Altere o programa para ter esses jumps e indicar seus estados no LCD. Os detalhes do esquema de ligao e valores dos componentes podem ser encontrados no Apndice G.

Conectando o PIC 16F877A - Recursos Avanados

170

Conectando o PIC

9
Os Mdulos CCP (Capture/Compare/PWM)
Introduo
Vamos estudar agora os mdulos denominados CCPs, cujo nome originado dos trs tipos de recursos oferecidos por eles: Capture, Compare e PWM. Cada um desses recursos empregado para uma finalidade diferente, que ser conhecida a partir de agora.

Teoria e recursos do PIC


O PIC 16F877A possui dois mdulos de CCP, denominados CCP1 e CCP2. Esses mdulos so praticamente idnticos e, por isso, sero explicados ao mesmo tempo, sendo feito os comentrios necessrios quando houver algum tipo de diferena. Para facilitar o entendimento, cada um dos recursos (Capture, Compare e PWM) ser descrito separadamente. Para comear, entretanto, bom esclarecermos a nomenclatura padro que ser utilizada para descrevermos caractersticas comuns aos dois mdulos existentes:

Padro CCPxCON CCPRxH CCPRxL CCPx

CCP1 CCP1CON CCPR1H CCPR1L CCP1 (RC2)

CCP2 ; CCP2CON CCPR2H CCPR2L CCP2 (RC1)

Descrio Registrador de configurao Parte alta do valor de controle Parte baixa do valor de controle Pino relacionado

Outro dado interessante que devemos informar neste momento quanto ao uso dos dois mdulos conjuntamente. Como eles utilizam recursos compartilhados para suas bases de tempo (Timer 1 e Timer 2), podem existir algumas limitaes ou conflitos, conforme a combinao de recursos desejada:

Modo Capture Compare PWM

Base de tempo Timer 1 Timer 1 Timer 2

Conectando o PIC 16F877A - Recursos Avanados

171
Recursos Desejados
Capture Capture Compare PWM PWM PWM Capture Compare Compare PWM Capture Compare

Observaes
Sem conflitos, entretanto, ambos utilizaro a mesma base de tempo TMR1 e, por isso, sero sincronizados. Caso o Compare esteja configurado para zerar o Timer 1 , isso poder acarretar em um conflito com o outro modo. Caso o Compare esteja configurado para zerar o Timer 1 , isso poder acarretar em um conflito com o outro modo. Ambos os PWM tero a mesma freqncia e sero sincronizados, devido ao uso da mesma base de tempo. Os Duty Cycles possuem controles independentes. Ambos os modos so completamente independentes. Ambos os modos so completamente independentes.

Modo Capture
Este mdulo tem como objetivo a contagem de tempo entre dois eventos ocorridos em um dos pinos CCPx. Para isso ser utilizado como base de tempo o Timer 1 e no momento do evento seu valor ser capturado (dai o nome Capture). Como o Timer 1 de 16 bits, a captura ser feita em dois registradores: CCPRxH e CCPRxL. Com esse recurso possvel ento criarmos um periodmetro, contando o tempo gasto, por exemplo, entre duas bordas de subida da onda ligada ao pino CCPx. importante observarmos, entretanto, que a captura do valor de Timer 1 no reseta este timer, e por isso, para definirmos o tempo real entre duas leituras ser necessrio uma conta de subtrao entre a ltima leitura e a anterior. Esta conta dever ser implementada pelo software. Vejamos, ento, como configurar o Capture para que possamos utiliz-lo corretamente. O modo Capture opera com os pinos como entrada, mas essa configurao no feita automaticamente. Por isso, antes de mais nada configure, atravs do TRISC, o pino CCPx como entrada. Caso este esteja configurado como sada, operaes de escrita neste pino podem ser consideradas como mudana de borda, ativando a captura. Quanto ao Timer 1, que ser usado como base de tempo para este modo, ele no pode estar configurado para operao assncrona, isto , confirme a condio T1CON</T1SYNC>=0. O Capture possui tambm quatro diferentes configuraes (fora o desligamento), que podem ser escolhidas atravs de CCPxCON<CCPxM3:CCPxM0>: CCPxM3: CCPxM0 0000 0100 0101 0110 0111 Descrio CCPx desligado Capture ligado para borda de descida Prescale de 1:1 Capture ligado para borda de subida Prescale de 1:1 Capture ligado para borda de subida Prescale de 1 :4 Capture ligado para borda de subida Prescale de 1:16

Obs. As demais opes de configurao dizem respeito aos outros modos


(Compara/PWM).

Conectando o PIC 16F877A - Recursos Avanados

172
As diferenas bsicas entre essas configuraes dizem respeito borda que gerar o evento e ao prescaler adotado. Esse prescaler um contador interno (no acessvel) de bordas. Por exemplo: caso seja escolhida a opo 0111, a captura do TMR1 acontecer a cada 16 bordas de subida. A finalidade desse prescaler o aumento da preciso do sistema. Quando optamos em trabalhar com prescaler de 1:1, a erro mximo em um perodo de um ciclo de mquina (TCY). Quando aumentamos o prescaler, esse erro diminui proporcionalmente, e teremos para 1:16 um erro mximo de TCY/16. Toda vez que o evento de Capture acontecer, o flag CCPxlF ser ativado, e caso essa interrupo esteja ligada, ela ir acontecer. Esta uma maneira fcil de implementarmos a conta de subtrao dos tempos absolutos para chegarmos ao perodo correto. No se esquea de que, quando uma nova :aptura acontece, ela ser gravada em CCPRxH e CCPRxL, sobrescrevendo os valores anteriores. Para alterar entre as opes de configurao do modo, alguns cuidados devem ser tomados. Como o prescaler um contador interno que no pode ser zerado manualmente, a alterao de configurao ceder gerar uma interrupo. Uma maneira de evitarmos isso seria o desligamento da interrupo CCPxIE) antes dessa operao. Uma outra maneira, mais prtica, desligarmos o modo Capture tirando o registrador CCPxCON). Isso ir resetar o modo, limpando tambm o contador de prescaler. Depois, basta escolhermos a nova configurao, carregando CCPxCON com o valor desejado. Quanto ao funcionamento do Capture em modo SLEEP, a histria um pouco confusa, pois nessa situao ou o Timer 1 no est funcionando ou est em modo assncrono. Por isso, a interrupo de 3CP pode at acontecer, acordando o PIC, mas os registradores CCPRxH e CCPRxL no sero atualizados. Resumo dos registradores associados ao Capture
Endereo 0Bh 0Ch 8Ch 0Dh 8Dh 17h 16h 15h 1Dh 1Ch 1Bh 87h Nome INTCON PIR1 PIE1 PIR2 PIE2CCP1CON CCPR1H CCPR1L CCP2CON CCPR2H CCPR2L TRISC DC2B1 Bit 7 GIE PSPIF PSPIE Bit 6 PEIE ADIF ADIE Bit 5 T0IE RCIF RCIE DC1B1 Bit 4 INTE Bit 3 RBIE Bit 2 T0IF Bit 1 INTF TMR2IF TMR2IE CCP1M1 Bit 0 RBIF TMR1IF TMR1IE CCP2IF CCP2IE CCP1M0

TXIF SSPIF CCP1IF TXIE SSPIE CCP1IE EEIF BCLIF EEIE BCLIE DC1B0 CCP1M3 CCP1M2 Captura de TMR1H (Parte alta) Captura de TMR1H (Parte baixa) DC2B0 CCP2M3 CCP2M2

CCP2M1

CCP2M0

Captura de TMR1H (Parte alta) Captura de TMR1L (Parte baixa) Configurao do PORTC com Entrada(1) ou Sada(0)

No usado para essa finalidade. Para obter mais informaes, consulte apndice A

Modo Compare
Enquanto no modo Capture o valor de Timer 1 era capturado e armazenado, aqui ele ser constantemente comparado (olha a origem do nome novamente) com os valores dos registradores CCPRxH e CCPRxL. Sempre que essa comparao de 16 bits resultar numa igualdade, o flag CCPxlF ser ativado e a interrupo poder acontecer, caso a mesma esteja devidamente ligada. Alm disso, se desejado, rodemos alterar automaticamente o estado do pino CCPx.

Conectando o PIC 16F877A - Recursos Avanados

173
Aqui tambm vale a observao quanto ao funcionamento do Timer 1, que deve obrigatoriamente estar ajustado em modo sncrono (T1CON</T1SYNC>=0). No esquea tambm de configurar o pino CCPx como sada, atravs do TRISC. A ativao do Compare e as opes para mudana no pino podem ser configuradas em CCPxCON<CCPxM3:CCPxM0>: CCPxM3: CCPxM0 0000 1000 1001 1010 1011 CCPx desligado Inicia com o pino em 0 (baixo) e altera para 1 (alto) quando a comparao Inicia com o pino em 1 (alto) e altera para 0 (baixo) quando a comparao No altera o pino. No altera o pino, mas reseta TMR1 .

Descrio

Obs: As demais opes de configurao dizem respeitos aos outros modos (Compare/PWM).

Em todas as opes, o flag da interrupo sempre ser ativado. A ltima opo (1011) chamada no Data Sheet do PIC de Special Event Trigger, e apesar dela no alterar o estado do pino CCPx, uma outra alterao muito importante acontece. Os registradores do Timer 1 (TMR1H e TMR1L) so zerados. Com isso podemos utilizar o Timer 1 de forma similar ao Timer 2 com o registrador de limite PR2. A vantagem aqui que estamos trabalhando com 16 bits, e no mais com 8. Este o nico caso de diferena entre CCP1 e CCP2, pois CCP2 alm de resetar o TMR1, ir tambm iniciar uma converso analgica (ADCONO<GO/DONE>) se o conversor estiver ligado. Ateno ao escolher essa configurao quando os dois modos CCP1 e CCP2 estiverem em uso, pois tanto o Compare quanto o Capture utilizam o Timer 1 como base de tempo. No modo SLEEP, ou Timer 1, est em modo assncrono ou est paralisado. Em nenhum dos dois casos o Compare poder funcionar. Por isso, este modo no opera durante o SLEEP. S no se esquea de que a sada CCPx um pino como outro qualquer e, por isso, o nvel de tenso da mesma ser garantido mesmo em SLEEP. Resumo dos registradores associados ao Compare
Endereo 0Bh... OCh 8Ch ODh 8Dh 17h 16 15h 1Dh 1Ch 1Bh 87h Nome INTCON PIR1 PIE1 PIR2 PIE2 CCP1CON CCPR1H CCPR1L CCP2CON CCPR2H CCPR2L TRISC Bit 7 GIE PSPIF PSPIE Bit 6 PEIE ADIF ADIE Bit 5 T0IE RCIF Bit 4 INTE TXIF Bit 3 RBIE SSPIF Bit 2 T0IF CCP1IF Bit 1 INTF TMR2IF Bit 0 RBIF TMR1IF TMR1IE CCP2IF CCP2IE CCPM0

RCIE TXIE SSPIE CCP1IE TMR2IE EEIF BCLIF EEIE BCLIE DC1B1 DC1B0 CCPM3 CCPM2 CCPM1 Comparao com TMR1H (Parte alta) Comparao com TMR1L (Parte baixa) DC2B1 DC2B0 CCP2M3 CCP2M2 CCP2M1 Comparao com TMR1H Parte alta) Comparao com TMR1L (Parte baixa) Configurao do PORTC com Entrada(1) ou Sada(0)

CCP2M0

No usado para essa finalidade. Para obter mais informaes, consulte apndice A

Conectando o PIC 16F877A - Recursos Avanados

174
Modo PWM
O Modo PWM provavelmente o recurso mais poderoso dos mdulos CCPs, pois com ele podemos obter uma tenso analgica a partir de um sinal digital. Na verdade, esta sada meramente digital, isto e. somente pode assumir os estados O e 1. Porm, pelo conceito aplicado ao PWM, podemos transform-la em uma tenso varivel. Obviamente isso exigir um hardware complementar (filtros) depois da sada do PIC, mas isso uma outra histria. Por enquanto, vamos entender melhor o que um PWM. O nome PWM tem sua origem no ingls Pulse Width Modulation que em Portugus pode ser considerado como Modulao por Largura de Pulso. Mas o que exatamente significa isso? Trata-se de Uma onda com freqncia constante (perodo fixo) e largura de pulso (duty cycle) varivel. Na figura seguinte temos a representao de duas formas de onda tipo PWM, cada uma delas com .im largura de pulso diferente:

Freqncia constante

Largura de pulso varivel

Esse tipo de sinal particularmente importante, j que a partir dele possvel implementar um conversor digital analgico com um nico pino do microcontrolador, uma vez que controlando a largura do pulso possvel obter uma tenso analgica varivel. Vejamos a teoria. Genericamente, a tenso mdia de uma forma de onda dada por:

Onde T o perodo da forma de onda e V(t) a funo da tenso no tempo. Para o caso do PWM temos que:

Onde:

Tp a durao do pulso em nvel lgico 1 Vpulso a tenso de pulso do sinal PWM.

Conectando o PIC 16F877A - Recursos Avanados

175
Ento

A razo entre a largura de pulso e o perodo da forma de onda recebe o nome de duty cycle, ou em portugus, ciclo ativo. O pulso da onda PWM apresenta tenso fixa, porm o valor mdio da tenso t forma de onda varia em funo do duty cycle. A tenso mdia (Vdc) diretamente proporcional ao duty cycle e como este varia entre 0 (quando tp = 0) e 1 (quando tp = T) temos que a tenso mdia deIa pode variar entre 0 e Vpulso. No nosso caso a variao ser de Vssa VDD, ou seja, de 0 a 5V. Assim, para obtermos um conversor digital analgico a partir do pino CCPx, basta implementar um sinal tipo PWM e adicionar sada um filtro que passa baixa freqncia de corte menor que a prpria freqncia do PWM.

Clculo da freqncia de corte do filtro (fc):

Quando no necessrio obter uma tenso mdia continua, a implementao do filtro descartada, mo nos casos da placa proposta. Tanto o resistor de aquecimento quanto o ventilador trabalham com VMs sem filtro, pois a funo desses componentes faz com que eles atuem como filtros, desde que a freqncia do PWM no seja muito baixa. Assim sendo, a teoria continua vlida, o que significa que podemos, atravs do PWM, regular a taxa i aquecimento do resistor e a velocidade do ventilador, variando a tenso mdia aplicada a eles. Vamos aprender agora um pouco mais sobre o funcionamento dos PWMs dentro do 16F877A.

Conectando o PIC 16F877A - Recursos Avanados

176
Esse PIC possui dois canais de PWMs (CCP1 e CCP2), cada um com resoluo mxima de dez bits. Isso significa que nosso duty cycle poder ser regulado de 0 a 100% com uma resoluo mxima de 1024 pontos. No entanto, dependendo da configurao adotada, essa resoluo no ser atingida. Vamos estudar como os tempos do PWM (pulso e perodo) so controlados internamente para podermos entender melhor esse problema. O perodo do PWM (T) controlado diretamente pelo Timer 2, atravs do registrador PR2. Como j foi visto no captulo 4, sempre que TMR2 = PR2, o timer zerado. Neste momento, um novo perodo do PWM iniciado. Desta forma, podemos definir o perodo e a freqncia do PWM pelas seguintes formulas:

Tudo bem quanto ao perodo, mas como definimos o duty cycle? Na realidade, no PIC no definimos : valor do duty cycle e sim o tempo do pulso em nvel alto. Desta forma, o tempo do pulso pode ser calculado por:

Repare que a largura do pulso ajustada em dois registradores: CCPRxL que armazena os 8 bits mais significativos, e CCPxCON, que armazena os dois bits menos significativos. Assim, temos os 10 bits que controlam o duty cycle do PWM alocados da seguinte maneira:

Para ficarmos de acordo com a teoria, calcularemos efetivamente o duty cycle dividindo o tempo do pulso em nvel alto pelo perodo total do PWM.

Verifica-se ento que apesar do perodo e o do tempo de pulso dependerem do cristal (Tosc) e do ajuste do prescaler do Timer 2, o duty cycle depende nica e exclusivamente dos valores ajustados nos registradores PR2, CCPRxL e CCPxCON (bits 5 e 4). Veja que o registrador PR2 (8 bits) que controla o perodo do PWM multiplicado por quatro para poder igualar-se aos 10 bits que controlam o duty cycle. justamente esse o problema da resoluo mxima atingida. Se o registrador PR2 for ajustado com um valor menor que 8 bits, ou seja, menor do que 255, sero necessrios menos do que 10 bits para atingir um PWM com 100% de duty cycle. Portanto, o nmero de pontos para ajuste do duty cycle quatro vezes maior do que o valor ajustado em (PR2+1). Em termos de bits, podemos dizer que a resoluo do duty cycle 2 bits maior do que o Conectando o PIC 16F877A - Recursos Avanados

177
nmero de bits que formam o valor ajustado em PR2. Repare tambm que, caso PR2 seja ajustado com 255, nunca ser atingido um duty cycle de 100%, pois o perodo atingir o valor mximo de 1024 ([PR2+1]x4), enquanto o tempo do pulso em nvel alto (<DCxB9:DCxB0>) ser no mximo 1023. fcil notar tambm que a resoluo para o ajuste do perodo depende do prescaer do Timer 2. assim: Prescale 1 4 16 Tempo do menor passo (resoluo) Tosc 4TOSC ou TCY 16Tosc ou 4TCY

Porm, de qualquer forma, a menor resoluo para o tempo do pulso (duty cycle) ser sempre quatro vezes menor que a do perodo. Note tambm que o postscale do Timer 2 no utilizado para a construo dos tempos envolvidos no PWM. Uma forma de calcular a quantidade mxima de bits que define a quantidade mxima de passos do nosso PWM :

Vamos a um exemplo prtico. Calculemos os valores para um PWM de 78,125 kHz, como um PIC rodando a 20 MHz e ajuste do prescaler do Timer2 em 1:1.

Partimos agora para a conta da resoluo:

Quanto operao prtica do PWM, j ficou claro que antes de mais nada necessrio definirmos a freqncia de trabalho, com base na freqncia de funcionamento do PIC e na resoluo desejada. Com isso calculamos o valor para ser colocado em PR2. Conectando o PIC 16F877A - Recursos Avanados

178
Depois devemos configurar o pino CCPx para ser utilizado como sada. Essa configurao no automtica e deve ser feita atravs do TRISC. Em seguida, devemos calcular a largura de pulso 3 desejada.: O resultado deve ser armazenado em dois registradores, sendo os 8 bits mais significativos ir CCPRxL e os outros dois bits restantes em CCPxCON<DCxB1:DCxB0>. Para o PWM, o registrador CCPRxH do tipo somente leitura e ele utilizado pelo sistema para armazenar uma cpia do CCPRxL. Essa cpia utilizada para possibilitar que a largura de pulso seja superada durante o funcionamento do PWM. Assim sendo, a nova largura ser adotada automaticamente c prximo perodo do PWM. Os dois bits adicionais tambm so armazenados internamente pelo sistema. Quando TMR2 = PR2, as seguintes aes iro acontecer: TMR2 = 0, iniciando o prximo perodo; O pino CCPx colocado em 1 (alto), a menos que a largura do pulso esteja definida para 0 (zero); O valor do registrador CCPRxL copiado para CCPRxH, atualizando a largura de pulso. O sistema passa, ento, a monitorar o trmino do pulso, quando TMR2 = CCPRxH. Essa comparao ir considerar ainda os 2 bits menos significativos. Neste momento, a sada CCPx ser colocada 0 (baixo), at que um novo perodo comece. Caso o tamanho do pulso seja especificado como sendo maior que o perodo total, a sada CCPx nunca ser colocada em 0 (baixo), mas o sistema funcionar normalmente, como ajustado para 100% do PWM. Para que, finalmente, a sada comece a operar, necessrio ainda ajustar o prescaler do Timer 2 e liga-lo, atravs do registrador T2CON. Por ltimo, ligue tambm o mdulo de PWM, atravs dos bits CCPxCON<CCPxM3:CCPxM0>:

CCPxM3:CCPxM0 0000 11XX

Descrio CCPx desligado. Ativa a sada PWM.

Os PWMs no funcionam em modo SLEEP nem geram interrupes; porm, no se esquea de que a interrupo de Timer2 pode continuar acontecendo.

Resumo dos registradores associados ao PWM


Endereo 17h 16h 15h 1Dh 1Ch 1Bh 87h Nome CCP1CON CCPR1H CCPR1L CCP2CON CCPPR2H CCPR2L TRISC Bit 7 Bit 6 Bit 5 DC1B1 Bit 4 DC1B0 Bit 3 CCP1M3 Bit 2 CCP1M2 Bit 1 CCP1M1 Bit 0 CCP1M0

Cpia de CCPR1L (somente leitura) Largura do pulso, bits de 9 a 2 (Parte baixa) DC2B1 DC2B0 CCP2M3 CCP2M2 CCP2M1 Cpia de CCPPR2L (somente leitura) Largura do pulso, bits de 9 a 2 (Parte baixa) Configurao do PORTC com Entrada(1) ou Sada(0) CCP2M0

No usado para essa finalidade. Para obter mais informaes, consulte apndice A

Conectando o PIC 16F877A - Recursos Avanados

179
Lgica do exemplo
Infelizmente no possvel construirmos um exemplo que utilize todos os modos do CCP ao mesmo tempo. Por isso, optamos pela criao de um nico exemplo que trabalhe com o recurso que ns consideramos o mais importante: o PWM. Neste exemplo ativaremos a sada do mdulo CCP2 para podermos controlar a rotao do ventilador que est ligado ao pino RC1. Optamos por trabalhar com PR2 no valor mximo (255) e o prescaler em 16. Com isso a freqncia do PWM ser de 244,14 Hz (PWMperodo = 4,096ms), considerando-se que na placa proposta o PIC est rodando a 4 MHz. Esta conta foi feita utilizando-se a frmula dada na aula terica. Para ajuste do duty cycle, optamos pela implementao de quatro botes:

Boto S1 S2 S3 S4

Duty Cicle 0% 50% 75% 100%

A fim de deixarmos nosso sistema mais interativo, utilizamos o LCD para mostrar o valor atua' ajustado para o PWM.

Conectando o PIC 16F877A - Recursos Avanados

180

Conectando o PIC 16F877A - Recursos Avanados

181

Conectando o PIC 16F877A - Recursos Avanados

182

Conectando o PIC 16F877A - Recursos Avanados

183
;************************************** ;* ;* ;* ;* ;* ;************************************** ; * VERSO : 2.0 ;* DATA : 24/02/2003 ;************************************** * * CONECTANDO O PIC - RECURSOS AVANADOS EXEMPLO 6 * NICOLS CSAR LAVINIA e DAVID JOS DE SOUZA * * * *

;************************************** ;* ;* ;************************************** ; ESTE EXEMPLO FOI ELABORADO PARA EXPLICAR O FUNCIONAMENTO DO MDULO PWM ; DO PIC16F877. ELE MONITORA OS QUATRO BOTES E CONFORME O BOTO SELECIONADO ; APLICA UM VALOR DIFERENTE NO PWM, FAZENDO ASSIM UM CONTROLE SOBRE A ; VELOCIDADE DO VENTILADOR. NO LCD MOSTRADO O VALOR ATUAL DO DUTY CYCLE. ; ;************************************** ;* CONFIGURAES PARA GRAVAO * DESCRIO GERAL * *

;**************************************

__CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_ON & _XT_OSC

;************************************** ;* DEFINIO DAS VARIVEIS *

;************************************** ; ESTE BLOCO DE VARIVEIS EST LOCALIZADO LOGO NO INCIO DO BANCO 0

CBLOCK 0X20

; POSIO INICIAL DA RAM

FILTRO_BOTOES

; FILTRO PARA RUIDOS

Conectando o PIC 16F877A - Recursos Avanados

184

TEMPO1 TEMPO0 ; CONTADORES P/ DELAY

ENDC

;************************************** ;* DEFINIO DAS VARIVEIS INTERNAS DO PIC *

;************************************** ; O ARQUIVO DE DEFINIES DO PIC UTILIZADO DEVE SER REFERENCIADO PARA QUE ; OS NOMES DEFINIDOS PELA MICROCHIP POSSAM SER UTILIZADOS, SEM A NECESSIDADE ; DE REDIGITAO.

#INCLUDE <P16F877A.INC>

; MICROCONTROLADOR UTILIZADO

;************************************** ;* DEFINIO DOS BANCOS DE RAM *

;************************************** ; OS PSEUDOS-COMANDOS "BANK0" E "BANK1", AQUI DEFINIDOS, AJUDAM A COMUTAR ; ENTRE OS BANCOS DE MEMRIA.

#DEFINE BANK1 #DEFINE BANK0

BSF BCF

STATUS,RP0 STATUS,RP0

; SELECIONA BANK1 DA MEMORIA RAM ; SELECIONA BANK0 DA MEMORIA RAM

;************************************** ;* CONSTANTES INTERNAS *

;************************************** ; A DEFINIO DE CONSTANTES FACILITA A PROGRAMAO E A MANUTENO.

FILTRO_TECLA

EQU

.200

; FILTRO P/ EVITAR RUIDOS DOS BOTES

;************************************** ;* DECLARAO DOS FLAGs DE SOFTWARE *

;************************************** ; A DEFINIO DE FLAGs AJUDA NA PROGRAMAO E ECONOMIZA MEMRIA RAM.

Conectando o PIC 16F877A - Recursos Avanados

185

; ESTE PROGRAMA NO UTILIZA NENHUM FLAG DE USURIO

;************************************** ;* ENTRADAS *

;************************************** ; AS ENTRADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE.

#DEFINE BOTAO_0

PORTB,0

; ESTADO DO BOTO 0 ; 1 -> LIBERADO ; 0 -> PRESSIONADO

#DEFINE BOTAO_1

PORTB,1

; ESTADO DO BOTO 1 ; 1 -> LIBERADO ; 0 -> PRESSIONADO

#DEFINE BOTAO_2

PORTB,2

; ESTADO DO BOTO 2 ; 1 -> LIBERADO ; 0 -> PRESSIONADO

#DEFINE BOTAO_3

PORTB,3

; ESTADO DO BOTO 3 ; 1 -> LIBERADO ; 0 -> PRESSIONADO

;************************************** ;* SADAS *

;************************************** ; AS SADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE.

#DEFINE DISPLAY

PORTD

; BARRAMENTO DE DADOS DO DISPLAY

#DEFINE RS

PORTE,0

; INDICA P/ O DISPLAY UM DADO OU COMANDO ; 1 -> DADO

Conectando o PIC 16F877A - Recursos Avanados

186
; 0 -> COMANDO

#DEFINE ENABLE

PORTE,1

; SINAL DE ENABLE P/ DISPLAY ; ATIVO NA BORDA DE DESCIDA

#DEFINE VENTILADOR

PORTC,1

; SADA P/ O VENTILADOR ; 1 -> VENTILADOR LIGADO ; 0 -> VENTILADOR DESLIGADO

;************************************** ;* VETOR DE RESET DO MICROCONTROLADOR *

;************************************** ; POSIO INICIAL PARA EXECUO DO PROGRAMA

ORG GOTO

0X0000 CONFIG

; ENDEREO DO VETOR DE RESET ; PULA PARA CONFIG DEVIDO A REGIO ; DESTINADA AS ROTINAS SEGUINTES

;************************************** ;* ROTINA DE DELAY (DE 1MS AT 256MS) *

;************************************** ; ESTA UMA ROTINA DE DELAY VARIVEL, COM DURAO DE 1MS X O VALOR PASSADO ; EM WORK (W).

DELAY_MS MOVWF TEMPO1 MOVLW .250 MOVWF TEMPO0 ; CARREGA TEMPO0 (P/ CONTAR 1MS) ; CARREGA TEMPO1 (UNIDADES DE MS)

CLRWDT DECFSZ TEMPO0,F GOTO $-2

; LIMPA WDT (PERDE TEMPO) ; FIM DE TEMPO0 ? ; NO - VOLTA 2 INSTRUES ; SIM - PASSOU-SE 1MS

DECFSZ TEMPO1,F GOTO $-6

; FIM DE TEMPO1 ? ; NO - VOLTA 6 INSTRUES

Conectando o PIC 16F877A - Recursos Avanados

187
; SIM RETURN ; RETORNA

;************************************** ;* ROTINA DE ESCRITA DE UM CARACTER NO DISPLAY *

;************************************** ; ESTA ROTINA ENVIA UM CARACTER PARA O MDULO DE LCD. O CARACTER A SER ; ESCRITO DEVE SER COLOCADO EM WORK (W) ANTES DE CHAMAR A ROTINA.

ESCREVE MOVWF DISPLAY NOP BSF GOTO BCF ENABLE $+1 ENABLE ; ATUALIZA DISPLAY (PORTD) ; PERDE 1US PARA ESTABILIZAO ; ENVIA UM PULSO DE ENABLE AO DISPLAY ;. ;.

MOVLW .1 CALL RETURN DELAY_MS ; DELAY DE 1MS ; RETORNA

;************************************** ;* CONFIGURAES INICIAIS DE HARDWARE E SOFTWARE *

;************************************** ; NESTA ROTINA SO INICIALIZADAS AS PORTAS DE I/O DO MICROCONTROLADOR E AS ; CONFIGURAES DOS REGISTRADORES ESPECIAIS (SFR). A ROTINA INICIALIZA A ; MQUINA E AGUARDA O ESTOURO DO WDT.

CONFIG CLRF CLRF CLRF CLRF CLRF PORTA PORTB PORTC PORTD PORTE ; GARANTE TODAS AS SADAS EM ZERO

BANK1

; SELECIONA BANCO 1 DA RAM

Conectando o PIC 16F877A - Recursos Avanados

188

MOVLW B'11111111' MOVWF TRISA ; CONFIGURA I/O DO PORTA

MOVLW B'11111111' MOVWF TRISB ; CONFIGURA I/O DO PORTB

MOVLW B'11111101' MOVWF TRISC ; CONFIGURA I/O DO PORTC

MOVLW B'00000000' MOVWF TRISD ; CONFIGURA I/O DO PORTD

MOVLW B'00000100' MOVWF TRISE ; CONFIGURA I/O DO PORTE

MOVLW B'11011111' MOVWF OPTION_REG ; CONFIGURA OPTIONS ; PULL-UPs DESABILITADOS ; INTER. NA BORDA DE SUBIDA DO RB0 ; TIMER0 INCREM. PELO CICLO DE MQUINA ; WDT - 1:128 ; TIMER - 1:1

MOVLW B'00000000' MOVWF INTCON ; CONFIGURA INTERRUPES ; DESABILITADA TODAS AS INTERRUPES

MOVLW B'00000111' MOVWF ADCON1 ; CONFIGURA CONVERSOR A/D ; CONFIGURA PORTA E PORTE COMO I/O DIGITAL

MOVLW .255 MOVWF PR2 ; CONFIGURA PERODO DO PWM ; T=((PR2)+1)*4*Tosc*TMR2 Prescale

Conectando o PIC 16F877A - Recursos Avanados

189
; T=((255)+1)*4*250ns*16 ; T=4,096ms -> 244,14Hz

BANK0

; SELECIONA BANCO 0 DA RAM

MOVLW B'00000111' MOVWF T2CON ; CONFIGURA TMR2 ; TIMER 2 LIGADO ; PRESCALE - 1:16 ; POSTSCALE - 1:1

MOVLW B'00001111' MOVWF CCP2CON ; CONFIGURA CCP2CON PARA PWM ; (PINO RC1)

CLRF

CCPR2L

; INICIA COM DUTY CYCLE EM ZERO

; AS INSTRUES A SEGUIR FAZEM COM QUE O PROGRAMA TRAVE QUANDO HOUVER UM ; RESET OU POWER-UP, MAS PASSE DIRETO SE O RESET FOR POR WDT. DESTA FORMA, ; SEMPRE QUE O PIC LIGADO, O PROGRAMA TRAVA, AGUARDA UM ESTOURO DE WDT ; E COMEA NOVAMENTE. ISTO EVITA PROBLEMAS NO START-UP DO PIC.

BTFSC GOTO

STATUS,NOT_TO $

; RESET POR ESTOURO DE WATCHDOG TIMER ? ; NO - AGUARDA ESTOURO DO WDT ; SIM

;************************************** ;* INICIALIZAO DA RAM *

;************************************** ; ESTA ROTINA IR LIMPAR TODA A RAM DO BANCO 0, INDO DE 0X20 A 0X7F. ; EM SEGUIDA, AS VARIVEIS DE RAM DO PROGRAMA SO INICIALIZADAS.

MOVLW 0X20 MOVWF FSR ; APONTA O ENDEREAMENTO INDIRETO PARA ; A PRIMEIRA POSIO DA RAM

Conectando o PIC 16F877A - Recursos Avanados

190
LIMPA_RAM CLRF INCF MOVF INDF FSR,F FSR,W ; COMPARA O PONTEIRO COM A LT. POS. +1 ; J LIMPOU TODAS AS POSIES? ; NO - LIMPA A PRXIMA POSIO ; SIM ; LIMPA A POSIO ; INCREMENTA O PONTEIRO P/ A PRX. POS.

XORLW 0X80 BTFSS GOTO STATUS,Z LIMPA_RAM

;************************************** ;* CONFIGURAES INICIAIS DO DISPLAY *

;************************************** ; ESTA ROTINA INICIALIZA O DISPLAY P/ COMUNICAO DE 8 VIAS, DISPLAY PARA 2 ; LINHAS, CURSOR APAGADO E DESLOCAMENTO DO CURSOR DIREITA.

INICIALIZACAO_DISPLAY BCF RS ; SELECIONA O DISPLAY P/ COMANDOS

MOVLW 0X30 CALL ESCREVE

; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO

MOVLW .3 CALL DELAY_MS ; DELAY DE 3MS (EXIGIDO PELO DISPLAY)

MOVLW 0X30 CALL ESCREVE

; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO

MOVLW 0X30 CALL ESCREVE

; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO

MOVLW B'00111000' CALL ESCREVE

; ESCREVE COMANDO PARA ; INTERFACE DE 8 VIAS DE DADOS

MOVLW B'00000001' CALL ESCREVE

; ESCREVE COMANDO PARA ; LIMPAR TODO O DISPLAY

Conectando o PIC 16F877A - Recursos Avanados

191

MOVLW .1 CALL DELAY_MS ; DELAY DE 1MS

MOVLW B'00001100' CALL ESCREVE

; ESCREVE COMANDO PARA ; LIGAR O DISPLAY SEM CURSOR

MOVLW B'00000110' CALL ESCREVE

; ESCREVE COMANDO PARA INCREM. ; AUTOMTICO DIREITA

;************************************** ;* ROTINA DE ESCRITA DA TELA PRINCIPAL *

;************************************** ; ESTA ROTINA ESCREVE A TELA PRINCIPAL DO PROGRAMA, COM AS FRASES: ; LINHA 1 - "CURSO MODULO 2" ; LINHA 2 - " PWM: xx% "

MOSTRA_TELA_PRINCIPAL MOVLW 0X81 CALL BSF ESCREVE RS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 0 / COLUNA 1 ; SELECIONA O DISPLAY P/ DADOS

; COMANDOS PARA ESCREVER AS ; LETRAS DE "CURSO MODULO 2" MOVLW 'C' CALL ESCREVE

MOVLW 'U' CALL ESCREVE

MOVLW 'R' CALL ESCREVE

MOVLW 'S' CALL ESCREVE

MOVLW 'O' CALL ESCREVE

MOVLW ' '

Conectando o PIC 16F877A - Recursos Avanados

192
CALL ESCREVE

MOVLW 'M' CALL ESCREVE

MOVLW 'O' CALL ESCREVE

MOVLW 'D' CALL ESCREVE

MOVLW 'U' CALL ESCREVE

MOVLW 'L' CALL ESCREVE

MOVLW 'O' CALL ESCREVE

MOVLW ' ' CALL ESCREVE

MOVLW '2' CALL ESCREVE

BCF

RS

; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 3 ; SELECIONA O DISPLAY P/ DADOS

MOVLW 0XC3 CALL BSF ESCREVE RS

; COMANDOS PARA ESCREVER AS ; LETRAS DE " PWM: OFF " MOVLW 'P' CALL ESCREVE

MOVLW 'W' CALL ESCREVE

MOVLW 'M' CALL ESCREVE

MOVLW ':' CALL ESCREVE

MOVLW ' ' CALL ESCREVE

Conectando o PIC 16F877A - Recursos Avanados

193
MOVLW ' ' CALL ESCREVE

MOVLW 'O' CALL ESCREVE

MOVLW 'F' CALL ESCREVE

MOVLW 'F' CALL ESCREVE

;************************************** ;* VARREDURA DOS BOTES *

;************************************** ; ESTA ROTINA VERIFICA SE ALGUM BOTO EST PRESSIONADO E CASO AFIRMATIVO ; DESVIA PARA O TRATAMENTO DO MESMO.

VARRE CLRWDT ; LIMPA WATCHDOG TIMER

; **************** VERIFICA ALGUM BOTO PRESSIONADO *************************

VARRE_BOTOES BTFSS GOTO BOTAO_0 TRATA_BOTAO_0 ; O BOTO 0 ESTA PRESSIONADO ? ; SIM - PULA P/ TRATA_BOTAO_0 ; NO

BTFSS GOTO

BOTAO_1 TRATA_BOTAO_1

; O BOTO 1 ESTA PRESSIONADO ? ; SIM - PULA P/ TRATA_BOTAO_1 ; NO

BTFSS GOTO

BOTAO_2 TRATA_BOTAO_2

; O BOTO 2 ESTA PRESSIONADO ? ; SIM - PULA P/ TRATA_BOTAO_2 ; NO

BTFSS GOTO

BOTAO_3 TRATA_BOTAO_3

; O BOTO 3 ESTA PRESSIONADO ? ; SIM - PULA P/ TRATA_BOTAO_3

Conectando o PIC 16F877A - Recursos Avanados

194
; NO

; *************************** FILTRO P/ EVITAR RUIDOS ***********************

MOVLW FILTRO_TECLA MOVWF FILTRO_BOTOES

; CARREGA O VALOR DE FILTRO_TECLA ; SALVA EM FILTRO_BOTOES ; RECARREGA FILTRO P/ EVITAR RUIDOS ; NOS BOTES

GOTO

VARRE

; VOLTA PARA VARRER TECLADO

;************************************** ;* TRATAMENTO DOS BOTES *

;************************************** ; NESTE TRECHO DO PROGRAMA ESTO TODOS OS TRATAMENTOS DOS BOTES

; ************************* TRATAMENTO DO BOTO 0 ***************************

TRATA_BOTAO_0 MOVF BTFSC FILTRO_BOTOES,F STATUS,Z ; FILTRO J IGUAL A ZERO ? ; (FUNO JA FOI EXECUTADA?) GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO ; NO DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO

CLRF BCF BCF

CCPR2L CCP2CON,5 CCP2CON,4

; ZERA CCPR2L ; ZERA OS BITS 5 e 4 ; (LSB DO DUTY CYCLE) ; Tp = CCPR2L:CCP2CON<5,4>*Tosc*TMR2 Prescale ; Tp = 0 * 250ns * 16 ; Tp = 0 ; PWM -> DUTY CYCLE = 0% -> OFF

Conectando o PIC 16F877A - Recursos Avanados

195

BCF

RS

; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 8 ; SELECIONA O DISPLAY P/ DADOS

MOVLW 0XC8 CALL BSF ESCREVE RS

; COMANDOS PARA ESCREVER AS ; LETRAS DE " OFF" MOVLW ' ' CALL ESCREVE

MOVLW 'O' CALL ESCREVE

MOVLW 'F' CALL ESCREVE

MOVLW 'F' CALL ESCREVE

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

; ************************* TRATAMENTO DO BOTO 1 ***************************

TRATA_BOTAO_1 MOVF BTFSC FILTRO_BOTOES,F STATUS,Z ; FILTRO J IGUAL A ZERO ? ; (FUNO JA FOI EXECUTADA?) GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO ; NO DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO MOVLW 0X80 MOVWF CCPR2L BCF BCF CCP2CON,5 CCP2CON,4 ; CARREGA CCPR2L COM 0X80 ; LIMPA OS BITS 5 e 4 ; LSB DO DUTY CYCLE ; Tp = CCPR2L:CCP2CON<5,4>*Tosc*TMR2 Prescale

Conectando o PIC 16F877A - Recursos Avanados

196
; Tp = 512 * 250ns * 16 ; Tp = 2,048ms ; PWM -> DUTY CYCLE = 50%

BCF

RS

; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 8 ; SELECIONA O DISPLAY P/ DADOS

MOVLW 0XC8 CALL BSF ESCREVE RS

; COMANDOS PARA ESCREVER AS ; LETRAS DE " 50%" MOVLW ' ' CALL ESCREVE

MOVLW '5' CALL ESCREVE

MOVLW '0' CALL ESCREVE

MOVLW '%' CALL ESCREVE

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

; ************************* TRATAMENTO DO BOTO 2 ***************************

TRATA_BOTAO_2 MOVF BTFSC FILTRO_BOTOES,F STATUS,Z ; FILTRO J IGUAL A ZERO ? ; (FUNO JA FOI EXECUTADA?) GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO ; NO DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO MOVLW 0XC0 MOVWF CCPR2L ; CARREGA CCPR2L COM 0XC0

Conectando o PIC 16F877A - Recursos Avanados

197
BCF BCF CCP2CON,5 CCP2CON,4 ; LIMPA OS BITS 5 e 4 ; LSB DO DUTY CYCLE ; Tp = CCPR2L:CCP2CON<5,4>*Tosc*TMR2 Prescale ; Tp = 768 * 250ns * 16 ; Tp = 3,072ms ; PWM -> DUTY CYCLE = 75%

BCF

RS

; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 8 ; SELECIONA O DISPLAY P/ DADOS

MOVLW 0XC8 CALL BSF ESCREVE RS

; COMANDOS PARA ESCREVER AS ; LETRAS DE "75%" MOVLW ' ' CALL ESCREVE

MOVLW '7' CALL ESCREVE

MOVLW '5' CALL ESCREVE

MOVLW '%' CALL ESCREVE

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

; ************************* TRATAMENTO DO BOTO 3 ***************************

TRATA_BOTAO_3 MOVF BTFSC FILTRO_BOTOES,F STATUS,Z ; FILTRO J IGUAL A ZERO ? ; (FUNO JA FOI EXECUTADA?) GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO ; NO DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE

Conectando o PIC 16F877A - Recursos Avanados

198
; SIM - BOTO PRESSIONADO MOVLW 0XFF MOVWF CCPR2L BSF BSF CCP2CON,5 CCP2CON,4 ; CARREGA CCPR2L COM 0XFF ; SETA OS BITS 5 e 4 ; LSB DO DUTY CYCLE ; Tp = CCPR2L:CCP2CON<5,4>*Tosc*TMR2 Prescale ; Tp = 1023 * 250ns * 16 ; Tp = 4,092ms ; PWM -> DUTY CYCLE = 99,90%

BCF

RS

; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 8 ; SELECIONA O DISPLAY P/ DADOS

MOVLW 0XC8 CALL BSF ESCREVE RS

; COMANDOS PARA ESCREVER AS ; LETRAS DE "100%" MOVLW '1' CALL ESCREVE

MOVLW '0' CALL ESCREVE

MOVLW '0' CALL ESCREVE

MOVLW '%' CALL ESCREVE

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

;************************************** ;* FIM DO PROGRAMA *

;**************************************

END

; FIM DO PROGRAMA

Conectando o PIC 16F877A - Recursos Avanados

199

Dicas e comentrios
Como foi explicado na lgica do exemplo, deixamos o valor de PR2 em 255 e o prescaler do Timer 2 ajustado para 16. Com isso nosso PWM possui um perodo de 4,096ms. Para podermos operar com o PWM em diversos nveis (O, 50 75 e 100%) foi necessrio calcular os valores corretos a serem carregados em CCPR2. Desta forma, foi efetuada a seguinte conta: CCPR2 = [(PR2)+1] x 4 x Porcentagem desejada No nosso caso: Porcentagem = 0%, 50%, 75% e 100% PR2 = 255 Com isso obtivemos os seguintes valores: Para 0%: CCPR2 = 0, sem arredondamento e sem erro; Para 50%: CCPR2 = 512. Largura do pulso em 2,048ms, resultando numa porcentagem final de 50,0%, tambm sem arredondamento e sem erro; Para 75%: CCPR2 = 768. Largura do pulso em 3,072ms, resultando novamente numa porcentagem final de 75,0% sem erros de arredondamento; Para 100%: CCPR2 = 1023. J neste caso, a largura do pulso ficou em 4,092ms, resultando numa porcentagem final de 99,90%. Para 100%, CCPR2 deve ser arredondado para cima ultrapassando o valor do perodo e garantindo o pulso sempre em 1. Porm, isso no possvel, pois j estamos no limite mximo de 1023.

Exerccios propostos
Agora que o exemplo j foi estudado e esclarecido, aproveite para gerar novos problemas e solues, seguindo os exerccios propostos: 1. Corrija o problema encontrado no nvel 100%, evitando que a sada seja colocada em zero. mesmo que por um perodo de tempo muito curto. Em vez de trabalhar com somente quatro nveis de PWM, altere o sistema para que um boto ligue e desligue a sada e outros dois botes incremente e decremente o PWM, de 50 a 100% com passos de 5%. No recomendamos valores muito baixos para esta sada, pois o ventilador possui uma tenso mnima de trabalho. Ative as duas sadas PWMs ao mesmo tempo, uma para o ventilador e outra para a resistncia. Utilize dois botes para controlar o ajuste de cada uma delas.

2.

3.

Conectando o PIC 16F877A - Recursos Avanados

200

Conectando o PIC

10
Trabalhando com as Memrias No-Volteis

Introduo
Nosso estudo j esta bem avanado e provavelmente o assunto deste captulo voc j conhece, pois os PICs 16F84 ou 16F628 (focos do livro "Desbravando o PIC") tambm possuem esse tipo de memria. Mas no custa nada relembrarmos a matria e explicarmos as caractersticas diferentes do modelo 16F877A, sendo a principal delas o acesso direto memria de programa.

Teoria e recursos do PIC


Quando uma memria do tipo no-voltil, significa que ela capaz de continuar armazenando seus dados mesmo quando no energizada, ao contrrio da RAM, que perde todas as suas informaes quando o PIC desligado. Isso muito utilizado para sistemas que precisam manter dados ou configuraes programadas pelo usurio. Uma discadora telefnica um bom exemplo disso, pois o usurio s precisa programar os nmeros que sero chamados uma nica vez. A grande diferena do PIC 16F877A em relao a outros modelos mais simples, como o 16F84 ou 16F62X, que esse modelo possui acesso a dois tipos de memrias no-volteis:

Tipo
Dados 2 (E PROM) Programa (FLASH)

Tamanho

Observaes

A memria de dados o tipo de memria convencional para 256 x 8 bits armazenamento de informaes do usurio. Esta memria 2 conhecida como E PROM. 8k x 14 bits A memria de programa pode ser usada para alterar o prprio software ou mesmo como expanso da memria de dados. Por ser 2 um tipo especial de E PROM, ela conhecida como FLASH.
2

Muitas vezes uma memria E PROM externa pode ser necessria, principalmente quando os 256 bytes disponveis no so suficientes. A vantagem aqui que a memria de programa tambm pode ser utilizada como expanso da memria de dados, com a vantagem de que ele ainda de 14 bits, e no de 3. O acesso memria externa existente na placa proposta ser visto no prximo captulo. Muito interessante, no ? Quer dizer que podemos sair escrevendo nossos dados na memria de programa indefinidamente? No bem assim, alguns cuidados devem ser observados:

Conectando o PIC 16F877A - Recursos Avanados

201
A memria de dados (E PROM) possui uma vida til bem maior que a memria de programa (FLASH). Enquanto a primeira suporta 100.000 ciclos de escrita, a segunda possui uma vida til assegurada de somente 1.000 ciclos. Quanto velocidade, ambas respondem igualmente: 4ms nominais para um ciclo de escrita (mximo 8ms); No podemos esquecer de que a memria FLASH continua sendo uma "Memria de programa". Isso significa que seu tamanho til ser somente a sobra em relao ao tamanho ocupado pelo programa propriamente dito; Por ltimo, e o mais importante, que o acesso a memria FLASH irrestrito. Com isso, podemos acabar escrevendo onde no se deve. Caso seja utilizada, para armazenar um dado, uma posio da memria ocupada pelo programa, todo o sistema pode travar ou executar aes completamente aleatrias. Por isso, muita ateno ao utilizar essa memria, principalmente porque uma vez escrita, no adianta resetar o sistema para voltar ao normal.
Como j foi dito, a ltima observao considerada a mais importante de todas. Por outro lado, ela possibilita tambm recursos extremamente avanados. Como assim? Bem, se temos acesso irrestrito a toda a rea de programa, ento podemos ler e escrever nela vontade, certo? Isso mesmo. E com isso podemos criar sistemas capazes de se auto-atualizarem. Podemos, por exemplo, elaborar um projeto que recebe um comando via serial (ligao com PC ou modem) e com isso entrar em modo de reconfigurao. Depois, ele recebe, pela mesma via, partes do programa que devem ser alteradas. Nosso sistema pode ento sofrer um up-grade pela porta serial. A grande vantagem disso que no estamos limitados a alterar somente parmetros gravados na E2PROM de dados. Podemos alterar as funes do sistema.
2

Voltemos agora ao nosso assunto principal. Como ter acessos a essas memrias, seja ela de dados ou de programa. As diferenas para as rotinas existentes para os PICs mais simples so: Como a informao pode ser de 8 ou 14 bits, existem dois registradores para armazenar o dado: EEDATH (parte alta) e EEDATA (parte baixa); Para a memria de E2PROM existem 256 posies. Isso significa que um nico byte capaz de enderear toda a rea disponvel. Entretanto, para a memria FLASH existe uma rea com tamanho de 8K. Por isso, para o endereo tambm existem agora dois registradores: EEADRH (parte alta) e EEADR (parte baixa); Os registradores EECON1 e EECON2 continuam existindo e possuem as mesmas funes: controlar as operaes de escrita e leitura. A nica diferena que foi criado mais um bit em EECON1<EEPGD>, que responsvel pela seleo da memria com a qual desejamos trabalhar: EEPGD 0 1
2

Memria E RROM (dados) FLASH (programa)

Ateno especial aos bancos onde se encontram os registradores: Registrador Banco /Endereo EECON1 EECON2 3/18Ch 3/18Dh

Conectando o PIC 16F877A - Recursos Avanados

202
Registrador EEDATA EEDATH EEADR EEADRH Banco / Endereo 2/10CH 2/10Eh 2/10Dh 2/10Fh

Escrevendo na E2PROM (Dados)


A primeira ao que faremos em relao a E2PROM a operao de escrita. Na verdade, ela ligeiramente mais complexa que a operao de leitura, mas cronologicamente mais interessante aprendermos primeiro a escrever. Afinal, como poderemos ler alguma coisa se no escrevermos nada? A complexibilidade da escrita necessria para garantirmos a proteo do sistema, para evitarmos escritas acidentais na memria. Por isso, a inicializao da escrita parecer um pouco confusa e desnecessria, mas isso torna o sistema robusto e seguro.

A escrita da E PROM deve seguir o roteiro: 1. O endereo para a escrita deve ser colocado em EEADR. Como existem 256 bytes disponveis, este endereo deve estar entre O e 255. No se esquea de alterar para o BANK2 antes de atualizar esse registrador. O dado a ser escrito deve ser colocado em EEDATA. S podemos escrever um byte de cada vez. Esse registrador tambm encontra-se em BANK2. Devemos ajustar a opo de trabalho para memria de dados (E PROM) atravs de EECON1<EEPGD>=0. Antes devemos alterar para BANK3. A escrita deve ser habilitada atravs de EECON1 <WREN>=1. Continua em BANKS. As interrupes devem ser desligadas para evitarmos conflitos, por meio de INTCON<GIE>=0. Aqui no existe problema quanto ao banco de memria. O registrador EECON2 deve ser carregado com os valores 0x55 e OxAA, seqencialmente. Esse procedimento obrigatrio e utilizado para a proteo da escrita. Essas operaes tambm continuam sendo feitas no BANK3. A escrita deve ser iniciada atravs do bit EECON1<WR>=1 e EECON1<WREN>=0, nesta ordem. Mais uma vez no se altera o banco. As interrupes podem ser novamente ligadas com INTCON<GIE>=1.
2

2.

3.

4.

5.

6.

7.

8.

9. A operao de escrita um pouco demorada, e ela s ter terminado quando o bit EECON1<WR> tiver sido limpo automaticamente pelo hardware. Por isso, normalmente ficamos esperando que essa ao acontea. No caso de no podermos ficar esperando pelo fim da escrita, podemos ligar a interrupo relacionada a esse evento atravs do bit PIE2<EEIE> e esperar que ela acontea para considerarmos finalizada a escrita.

10. Caso algum erro ocorra durante a operao de escrita, o bit EECON1<WRERR> ser setado (1). No caso de sucesso na operao esse bit ser mantido em zero (0). 11. No se esquea de ajustar o banco de memria novamente, conforme suas necessidades, para a continuao da execuo do programa. Conectando o PIC 16F877A - Recursos Avanados

203
Lendo a E2PROM (Dados)
Agora que voc j sabe escrever alguma coisa nos endereos disponveis da 2 E PROM, poderemos ler essa informao de volta atravs de uma rotina de leitura. A leitura muito mais simples, pois no necessita de tanta proteo. Tambm muito mais rpida. O roteiro para a criao da rotina de leitura o seguinte: 1. O endereo para a escrita deve ser colocado em EEADR. Como existem 256 bytes disponveis, este endereo deve estar entre 0 e 255. No se esquea de alterar para o BANK2 antes de atualizar esse registrador. Devemos ajustar a opo de trabalho para memria de dados (E PROM) atravs de EECON1<EEPGD>=0. Antes devemos alterar para BANK3. A leitura deve ser ligada atravs do bit EECON1 <RD>=1. O dado lido ser colocado em EEDATA. Para acess-lo no se esquea de alterar antes para BANK2.
2

2.

3. 4.

Escrevendo na FLASH (Programa)


Esta operao muito semelhante escrita da memria de dados, com a diferena bsica do endereo e do dado ser de 14 bits. Os PIC mais novos, como a verso 16F877A possuem uma limitao em relao escrita na memria FLASH. Agora, os dados s podem ser escritos em blocos de 4, comeando obrigatoriamente nos endereos terminados em 00 (binrio). Por causa disso, para escrever em um nico endereo, ser necessrio antes ler e armazenar temporariamente o valor existente nos outros 3 endereos, para que os mesmos no sejam perdidos. A complexibilidade a mesma para garantir a segurana em relao escrita acidental. O roteiro para esta operao fica ento da seguinte maneira: 1. O endereo para a escrita deve ser colocado em EEADRH (parte alta) e EEADR (parte baixa). Como existem 8K disponveis, este endereo deve estar entre O e 8.191 (1FFFh), mas deve ser utilizado obrigatoriamente um endereo terminado em 00 (binrio). No se esquea de alterar para o BANK2 antes de atualizar estes registradores. O primeiro dado a ser escrito deve ser colocado em EEDATH (parte alta) e EEDATA (parte baixa). Como s podemos escrever uma palavra de 14 bits de cada vez, os 2 bits mais significativos de EEDATH sero ignorados. Esses registradores tambm encontram-se em BANK2. Devemos ajustar a opo de trabalho para memria de programa atravs de EECON1 <EEPGD>=1. Antes devemos alterar para BANKS. A escrita deve ser habilitada atravs de EECON1 <WREN>=1. Continua em BANK3. As interrupes devem ser desligadas para evitarmos conflitos, atravs de INTCON<GIE>=0. Aqui no existe problema quanto ao banco de memria. O registrador EECON2 deve ser carregado com os valores 0x55 e 0xAA, seqencialmente. Este procedimento obrigatrio e utilizado para a proteo da escrita. Essas operaes tambm continuam sendo feitas no BANK3.

2.

3.

4.

5.

6.

Conectando o PIC 16F877A - Recursos Avanados

204
7. A escrita deve ser iniciada atravs do bit EECON1<WR>=1 e EECON1<WREN>=0, nesta ordem. Mais uma vez no se altera o banco. Duas instrues NOP devem ser colocadas no programa, obrigatoriamente, devido a lgica interna do sistema. No podem ser substitudas por GOTO $+1. As interrupes podem ser novamente ligadas com INTCON<GIE>=1.

8.

9.

10. A operao de escrita um pouco demorada, e ela s ter terminado quando o bit EECON1<WR> tiver sido limpo automaticamente pelo hardware. Por isso, normalmente ficamos esperando que essa ao acontea. No caso de no podermos ficar esperando pelo fim da escrita, podemos ligar a interrupo relacionada a este evento atravs do bit PIE2<EEIE> e esperar que ela acontea para considerarmos finalizada a escrita. 11. O prximo dado deve ser colocado em EEDATAH e EEDATAL e o processo repetido a partir do passo 3. Isto deve ser feito 4 vezes seguidas. Durante as 3 primeiras passagens, os dados sero armazenados em um buffer temporrio. Somente ao trmino da 4 que todos os dados sero gravados de fato. Caso a rotina no seja completa, os dados sero perdidos. 12. Caso algum erro ocorra durante a operao de escrita, o bit EECON1<WRERR> ser selado (1). No caso de sucesso na operao este bit ser mantido em zero (0). 13. No se esquea de ajustar o banco de memria novamente, conforme suas necessidades, para a continuao da execuo do programa.

Lendo a FLASH (Programa)


A relao entre a leitura da memria de dados e a de programa a mesma que a comentada para =s operaes de escrita. O roteiro para a criao da rotina de leitura fica sendo da seguinte maneira: 1. O endereo para a leitura deve ser colocado em EEADRH (parte alta) e EEADR (parte baixa). Como existem 8 K disponveis, este endereo deve estar entre O e 8191 (1FFFh). No se esquea de alterar para o BANK2 antes de atualizar estes registradores. Devemos ajustar a opo de trabalho para memria de programa atravs de EECON1 <EEPGD>=1. Antes devemos alterar para BANK3. A leitura deve ser ligada atravs do bit EECON1 <RD>=1. Duas instrues NOP devem ser colocadas no programa, obrigatoriamente, devido a lgica, interna do sistema. No podem ser substitudas por GOTO $+1. O dado lido ser colocado em EEDATH (parte alta) e EEDATA (parte baixa). Para acess-los no se esquea de alterar antes para BANK2.

2.

3. 4.

5.

Tratando a interrupo de final de escrita na E2PROM e FLASH


Esta interrupo deve ser usada em sistemas que no podem ficar parados esperando a operao de escrita terminar. Por isso, to logo a operao de escrita seja iniciada, a rotina deve ser finalizada (no deve possuir o teste do bit EECON1<WR> como no exemplo anterior). Quando a escrita for terminada, uma interrupo ir ocorrer e o sistema poder tomar as aes pertinentes. Conectando o PIC 16F877A - Recursos Avanados

205
Para que esta interrupo possa ocorrer, sua chave individual PIE2<EEIE> deve estar ligada (1). Dentro da rotina de tratamento devemos testar o flag PIR2<EEIF> para sabermos se foi esta interrupo que ocorreu. Antes de sairmos do tratamento devemos limpar este mesmo flag manualmente. Resumo dos registradores associados a E PROM / FLASH Endereo 0Bh ODh 8Dh 180Ch 18Dh 10Ch 10Eh 10Dh 10Fh Nome INTCON PIR2 PIE2 EECON1 EECON2 EEDATA EEDATH EEADR EEADRH Bit 7 GIE Bit 6 PEIE Bit 5 T0IE Bit 4 INTE EEIF Bit 3 RBIE BCLIF Bit 2 T0IF Bit 1 INTF Bit 0 RBIF CCP2IF
2

EEIE BCLIE CCP2IE EEPGD WRERR WREN WR RD 2 Registrador de segurana para operaes de escrita na E PROM/FLASH 2 Dado a ser escrito na E PROM/FLASH (Parte baixa) Dado a ser escrito na FLASH (Parte alta) 2 Endereo da escrita da E PROM/FLASH (Parte baixa) Endereo da escrita da FLASH (Parte alta)

No usado para essa finalidade. Para obter mais informaes, consulte apndice A

Lgica do exemplo
Nosso sistema dividir o LCD em duas partes. Do lado esquerdo teremos um valor relativo memria de dados, varivel de O a FFh (8-bits), com incremento e decremento rotativo atravs dos botes S2 e S3. Do lado direito o valor ser para a memria de programa, tambm com incremento e decremento rotativo atravs dos botes S2 e S3, podendo ir de O a 3FFFh (14-bits). Para alterar o controle dos botes S2 e S3 entre o lado esquerdo e o lado direito deve ser usado c boto S1. Para o lado ativo, no momento, o valor ser indicado entre os sinais > e <. Depois de ajustados os valores desejados, basta pressionar o boto S4 para que ambos sejam gravados, cada um na memria correspondente. Para checar a gravao, altere os valores e reset o sistema. Os valores gravados sero recuperados na inicializao e mostrados no LCD.

Conectando o PIC 16F877A - Recursos Avanados

206

Conectando o PIC 16F877A - Recursos Avanados

207

Conectando o PIC 16F877A - Recursos Avanados

208

Conectando o PIC 16F877A - Recursos Avanados

209

Conectando o PIC 16F877A - Recursos Avanados

210

Conectando o PIC 16F877A - Recursos Avanados

211

Conectando o PIC 16F877A - Recursos Avanados

212

;************************************** ;* ;* ;* ;* ;* ;************************************** ; * VERSO : 2.0 ;* DATA : 24/02/2003 ;************************************** * * CONECTANDO O PIC - RECURSOS AVANADOS EXEMPLO 7 * NICOLS CSAR LAVINIA e DAVID JOS DE SOUZA * * * *

;************************************** ;* DESCRIO GERAL *

Conectando o PIC 16F877A - Recursos Avanados

213
;* ;************************************** ; ESTE EXEMPLO FOI ELABORADO PARA EXPLICAR O FUNCIONAMENTO DA LEITURA/ESCRITA ; TANTO NA MEMRIA DE DADOS QUANTO NA MEMRIA DE PROGRAMA. ; ;************************************** ;* CONFIGURAES PARA GRAVAO * *

;**************************************

__CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_ON & _XT_OSC

;************************************** ;* DEFINIO DAS VARIVEIS *

;************************************** ; ESTE BLOCO DE VARIVEIS EST LOCALIZADO LOGO NO INCIO DO BANCO 0

CBLOCK 0X20

; POSIO INICIAL DA RAM

FILTRO_BOTOES TEMPO_TURBO

; FILTRO PARA RUIDOS ; TEMPORIZADOR P/ TURBO DAS TECLAS

TEMPO1 TEMPO0 ; CONTADORES P/ DELAY

FLAG

; FLAG DE USO GERAL

VALOR_DADOS

; VALOR ARMAZENADO NA MEMRIA ; DE DADOS (8 BITS)

VALOR_PROG_HIGH VALOR_PROG_LOW

; VALOR ARMAZENADO NA MEMRIA ; DE PROGRAMAS (14 BITS)

AUX

; REGISTRADOR AUXILIAR DE USO GERAL

Conectando o PIC 16F877A - Recursos Avanados

214
ENDERECO_HIGH ENDERECO_LOW ; REGISTRADORES DE ENDEREO PARA ; ACESSO MEMRIA DE DADOS E PROGRAMA ; MAPEADOS NO BANCO 0 DA RAM

DADO_LOW_00 DADO_HIGH_00

; REGISTRADORES DE DADOS PARA ; ACESSO MEMRIA DE DADOS E PROGRAMA ; MAPEADOS NO BANCO 0 DA RAM

DADO_LOW_01 DADO_HIGH_01

; REGISTRADORES DE DADOS PARA ; ACESSO MEMRIA DE DADOS E PROGRAMA ; MAPEADOS NO BANCO 0 DA RAM

DADO_LOW_10 DADO_HIGH_10

; REGISTRADORES DE DADOS PARA ; ACESSO MEMRIA DE DADOS E PROGRAMA ; MAPEADOS NO BANCO 0 DA RAM

DADO_LOW_11 DADO_HIGH_11

; REGISTRADORES DE DADOS PARA ; ACESSO MEMRIA DE DADOS E PROGRAMA ; MAPEADOS NO BANCO 0 DA RAM

ENDC

;************************************** ;* DEFINIO DAS VARIVEIS INTERNAS DO PIC *

;************************************** ; O ARQUIVO DE DEFINIES DO PIC UTILIZADO DEVE SER REFERENCIADO PARA QUE ; OS NOMES DEFINIDOS PELA MICROCHIP POSSAM SER UTILIZADOS, SEM A NECESSIDADE ; DE REDIGITAO.

#INCLUDE <P16F877A.INC>

; MICROCONTROLADOR UTILIZADO

;************************************** ;* DEFINIO DOS BANCOS DE RAM *

;************************************** ; OS PSEUDOS-COMANDOS "BANK0" E "BANK1", AQUI DEFINIDOS, AJUDAM A COMUTAR ; ENTRE OS BANCOS DE MEMRIA.

Conectando o PIC 16F877A - Recursos Avanados

215

#DEFINE BANK1 #DEFINE BANK0

BSF BCF

STATUS,RP0 STATUS,RP0

; SELECIONA BANK1 DA MEMORIA RAM ; SELECIONA BANK0 DA MEMORIA RAM

;************************************** ;* CONSTANTES INTERNAS *

;************************************** ; A DEFINIO DE CONSTANTES FACILITA A PROGRAMAO E A MANUTENO.

FILTRO_TECLA

EQU

.200

; FILTRO P/ EVITAR RUIDOS DOS BOTES

TURBO_TECLA

EQU

.60

; TEMPORIZADOR P/ TURBO DAS TECLAS

END_MEM_DADO EQU

0X10

; ENDEREO P/ LEITURA E GRAVAO ; NA MEMRIA DE DADOS

END_MEM_PROG_H END_MEM_PROG_L

EQU EQU

0X08 0X00

; ENDEREO P/ LEITURA E GRAVAO ; NA MEMRIA DE PROGRAMA

;************************************** ;* DECLARAO DOS FLAGs DE SOFTWARE *

;************************************** ; A DEFINIO DE FLAGs AJUDA NA PROGRAMAO E ECONOMIZA MEMRIA RAM.

#DEFINE TIPO_MEMORIA

FLAG,0

; DEFINE A MEMORIA QUE ESTA SENDO ; UTILIZADA ; 1 -> MEMORIA DE PROGRAMA ; 0 -> MEMORIA DE DADOS

;************************************** ;* ENTRADAS *

;************************************** ; AS ENTRADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE.

Conectando o PIC 16F877A - Recursos Avanados

216
#DEFINE BOTAO_0 PORTB,0 ; ESTADO DO BOTO 0 ; 1 -> LIBERADO ; 0 -> PRESSIONADO

#DEFINE BOTAO_1

PORTB,1

; ESTADO DO BOTO 1 ; 1 -> LIBERADO ; 0 -> PRESSIONADO

#DEFINE BOTAO_2

PORTB,2

; ESTADO DO BOTO 2 ; 1 -> LIBERADO ; 0 -> PRESSIONADO

#DEFINE BOTAO_3

PORTB,3

; ESTADO DO BOTO 3 ; 1 -> LIBERADO ; 0 -> PRESSIONADO

;************************************** ;* SADAS *

;************************************** ; AS SADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE.

#DEFINE DISPLAY

PORTD

; BARRAMENTO DE DADOS DO DISPLAY

#DEFINE RS

PORTE,0

; INDICA P/ O DISPLAY UM DADO OU COMANDO ; 1 -> DADO ; 0 -> COMANDO

#DEFINE ENABLE

PORTE,1

; SINAL DE ENABLE P/ DISPLAY ; ATIVO NA BORDA DE DESCIDA

;************************************** ;* VETOR DE RESET DO MICROCONTROLADOR *

;************************************** ; POSIO INICIAL PARA EXECUO DO PROGRAMA

Conectando o PIC 16F877A - Recursos Avanados

217

ORG GOTO

0X0000 CONFIG

; ENDEREO DO VETOR DE RESET ; PULA PARA CONFIG DEVIDO A REGIO ; DESTINADA AS ROTINAS SEGUINTES

;************************************** ;* ROTINA DE DELAY (DE 1MS AT 256MS) *

;************************************** ; ESTA UMA ROTINA DE DELAY VARIVEL, COM DURAO DE 1MS X O VALOR PASSADO ; EM WORK (W).

DELAY_MS MOVWF TEMPO1 MOVLW .250 MOVWF TEMPO0 ; CARREGA TEMPO0 (P/ CONTAR 1MS) ; CARREGA TEMPO1 (UNIDADES DE MS)

CLRWDT DECFSZ TEMPO0,F GOTO $-2

; LIMPA WDT (PERDE TEMPO) ; FIM DE TEMPO0 ? ; NO - VOLTA 2 INSTRUES ; SIM - PASSOU-SE 1MS

DECFSZ TEMPO1,F GOTO $-6

; FIM DE TEMPO1 ? ; NO - VOLTA 6 INSTRUES ; SIM

RETURN

; RETORNA

;************************************** ;* ROTINA DE ESCRITA DE UM CARACTER NO DISPLAY *

;************************************** ; ESTA ROTINA ENVIA UM CARACTER PARA O MDULO DE LCD. O CARACTER A SER ; ESCRITO DEVE SER COLOCADO EM WORK (W) ANTES DE CHAMAR A ROTINA.

ESCREVE MOVWF DISPLAY NOP BSF ENABLE ; ATUALIZA DISPLAY (PORTD) ; PERDE 1US PARA ESTABILIZAO ; ENVIA UM PULSO DE ENABLE AO DISPLAY

Conectando o PIC 16F877A - Recursos Avanados

218
GOTO BCF $+1 ENABLE ;. ;.

MOVLW .1 CALL RETURN DELAY_MS ; DELAY DE 1MS ; RETORNA

;************************************** ;* ROTINA DE ESCRITA LINHA 1 DO LCD *

;************************************** ; ESTA ROTINA ESCREVE A LINHA 1 DA TELA PRINCIPAL DO LCD, COM A FRASE: ; LINHA 1 - "M.DADOS M.PROG."

ATUALIZA_TELA_LINHA_1 BCF RS ; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 0 / COLUNA 0 ; SELECIONA O DISPLAY P/ DADOS

MOVLW 0X80 CALL BSF ESCREVE RS

; COMANDOS PARA ESCREVER AS ; LETRAS DE "M.DADOS M.PROG." MOVLW 'M' CALL ESCREVE

MOVLW '.' CALL ESCREVE

MOVLW 'D' CALL ESCREVE

MOVLW 'A' CALL ESCREVE

MOVLW 'D' CALL ESCREVE

MOVLW 'O' CALL ESCREVE

MOVLW 'S' CALL ESCREVE

Conectando o PIC 16F877A - Recursos Avanados

219
MOVLW ' ' CALL ESCREVE

MOVLW ' ' CALL ESCREVE

MOVLW 'M' CALL ESCREVE

MOVLW '.' CALL ESCREVE

MOVLW 'P' CALL ESCREVE

MOVLW 'R' CALL ESCREVE

MOVLW 'O' CALL ESCREVE

MOVLW 'G' CALL ESCREVE

MOVLW '.' CALL ESCREVE

RETURN

; RETORNA

;************************************** ;* ROTINA DE ESCRITA LINHA 2 DO LCD *

;************************************** ; ESTA ROTINA ESCREVE A LINHA 2 DA TELA PRINCIPAL DO LCD. ; A ROTINA LEVA EM CONTA TODAS AS VARIVEIS PERTINENTES P/ FORMAR A LINHA 2.

ATUALIZA_TELA_LINHA_2 BCF RS ; SELECIONA O DISPLAY P/ COMANDO ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 1

MOVLW 0XC1 CALL ESCREVE

BSF

RS

; SELECIONA O DISPLAY P/ DADOS

MOVLW '>'

Conectando o PIC 16F877A - Recursos Avanados

220
BTFSC TIPO_MEMORIA ; EST UTILIZANDO A MEMRIA DE DADOS ? ; NO - ESCREVE ESPAO EM BRANCO ; SIM - ESCREVE ">" NO DISPLAY

MOVLW ' ' CALL ESCREVE

SWAPF VALOR_DADOS,W ANDLW B'00001111' MOVWF AUX

; INVERTE NIBLE DO VALOR_DADOS ; MASCARA BITS MAIS SIGNIFICATIVOS ; SALVA EM AUXILIAR

MOVLW 0X0A SUBWF AUX,W MOVLW 0X30 BTFSC STATUS,C ; AUX - 10d (ATUALIZA FLAG DE CARRY) ; CARREGA WORK COM 30h ; RESULTADO POSITIVO? ( UMA LETRA?) ; SIM - CARREGA WORK COM 37h ; NO - WORK FICA COM 30h (NMERO) ADDWF AUX,W ; SOMA O WORK AO AUXILIAR ; (CONVERSO ASCII) CALL ESCREVE ; ENVIA CARACTER AO DISPLAY LCD

MOVLW 0X37

MOVF

VALOR_DADOS,W

; CARREGA WORK COM VALOR_DADOS ; MASCARA BITS MAIS SIGNIFICATIVOS ; SALVA EM AUXILIAR

ANDLW B'00001111' MOVWF AUX

MOVLW 0X0A SUBWF AUX,W MOVLW 0X30 BTFSC STATUS,C ; AUX - 10d (ATUALIZA FLAG DE CARRY) ; CARREGA WORK COM 30h ; RESULTADO POSITIVO? ( UMA LETRA?) ; SIM - CARREGA WORK COM 37h ; NO - WORK FICA COM 30h (NMERO) ADDWF AUX,W ; SOMA O WORK AO AUXILIAR ; (CONVERSO ASCII) CALL ESCREVE ; ENVIA CARACTER AO DISPLAY LCD

MOVLW 0X37

MOVLW 'h' CALL ESCREVE ; ESCREVE "h" NO DISPLAY

Conectando o PIC 16F877A - Recursos Avanados

221
MOVLW '<' BTFSC TIPO_MEMORIA ; EST UTILIZANDO A MEMRIA DE DADOS ? ; NO - ESCREVE ESPAO EM BRANCO ; SIM - ESCREVE "<" NO DISPLAY

MOVLW ' ' CALL ESCREVE

MOVLW ' ' CALL ESCREVE

MOVLW ' ' CALL ESCREVE

MOVLW ' ' CALL ESCREVE ; ESPAOS EM BRANCO

MOVLW '>' BTFSS TIPO_MEMORIA ; EST UTILIZANDO A MEMRIA DE PROGRAMA? ; NO - ESCREVE ESPAO EM BRANCO ; SIM - ESCREVE ">" NO DISPLAY

MOVLW ' ' CALL ESCREVE

SWAPF VALOR_PROG_HIGH,W ANDLW B'00001111' MOVWF AUX

; INVERTE NIBLE DO VALOR_PROG_HIGH ; MASCARA BITS MAIS SIGNIFICATIVOS ; SALVA EM AUXILIAR

MOVLW 0X0A SUBWF AUX,W MOVLW 0X30 BTFSC STATUS,C ; AUX - 10d (ATUALIZA FLAG DE CARRY) ; CARREGA WORK COM 30h ; RESULTADO POSITIVO? ( UMA LETRA?) ; SIM - CARREGA WORK COM 37h ; NO - WORK FICA COM 30h (NMERO) ADDWF AUX,W ; SOMA O WORK AO AUXILIAR ; (CONVERSO ASCII) CALL ESCREVE ; ENVIA CARACTER AO DISPLAY LCD

MOVLW 0X37

MOVF

VALOR_PROG_HIGH,W

; CARREGA WORK COM VALOR_PROG_HIGH ; MASCARA BITS MAIS SIGNIFICATIVOS ; SALVA EM AUXILIAR

ANDLW B'00001111' MOVWF AUX

Conectando o PIC 16F877A - Recursos Avanados

222
MOVLW 0X0A SUBWF AUX,W MOVLW 0X30 BTFSC STATUS,C ; AUX - 10d (ATUALIZA FLAG DE CARRY) ; CARREGA WORK COM 30h ; RESULTADO POSITIVO? ( UMA LETRA?) ; SIM - CARREGA WORK COM 37h ; NO - WORK FICA COM 30h (NMERO) ADDWF AUX,W ; SOMA O WORK AO AUXILIAR ; (CONVERSO ASCII) CALL ESCREVE ; ENVIA CARACTER AO DISPLAY LCD

MOVLW 0X37

SWAPF VALOR_PROG_LOW,W ANDLW B'00001111' MOVWF AUX

; INVERTE NIBLE DO VALOR_PROG_LOW ; MASCARA BITS MAIS SIGNIFICATIVOS ; SALVA EM AUXILIAR

MOVLW 0X0A SUBWF AUX,W MOVLW 0X30 BTFSC STATUS,C ; AUX - 10d (ATUALIZA FLAG DE CARRY) ; CARREGA WORK COM 30h ; RESULTADO POSITIVO? ( UMA LETRA?) ; SIM - CARREGA WORK COM 37h ; NO - WORK FICA COM 30h (NMERO) ADDWF AUX,W ; SOMA O WORK AO AUXILIAR ; (CONVERSO ASCII) CALL ESCREVE ; ENVIA CARACTER AO DISPLAY LCD

MOVLW 0X37

MOVF

VALOR_PROG_LOW,W

; CARREGA WORK COM VALOR_PROG_LOW ; MASCARA BITS MAIS SIGNIFICATIVOS ; SALVA EM AUXILIAR

ANDLW B'00001111' MOVWF AUX

MOVLW 0X0A SUBWF AUX,W MOVLW 0X30 BTFSC STATUS,C ; AUX - 10d (ATUALIZA FLAG DE CARRY) ; CARREGA WORK COM 30h ; RESULTADO POSITIVO? ( UMA LETRA?) ; SIM - CARREGA WORK COM 37h ; NO - WORK FICA COM 30h (NMERO) ADDWF AUX,W ; SOMA O WORK AO AUXILIAR

MOVLW 0X37

Conectando o PIC 16F877A - Recursos Avanados

223
; (CONVERSO ASCII) CALL ESCREVE ; ENVIA CARACTER AO DISPLAY LCD

MOVLW 'h' CALL ESCREVE ; ESCREVE "h" NO DISPLAY

MOVLW '<' BTFSS TIPO_MEMORIA ; EST UTILIZANDO A MEMRIA DE PROGRAMA? ; NO - ESCREVE ESPAO EM BRANCO ; SIM - ESCREVE "<" NO DISPLAY

MOVLW ' ' CALL ESCREVE

RETURN

;************************************** ;* ROTINA DE ESCRITA NA MEMRIA DE DADOS *

;************************************** ; ESTA ROTINA ESCREVE UM DADO (8 BITS) NA MEMRIA DE DADOS (E2PROM). ; O DADO A SER GRAVADO DEVE SER PASSADO PELO REGISTRADOR DADO_LOW_00. ; O REGISTRADOR DADO_HIGH_00 NO UTILIZADO POIS A MEMRIA DE 8 BITS. ; O ENDEREO DEVE SER PASSADO PELO REGISTRADOR ENDERECO_LOW. ; O REGISTRADOR ENDERECO_HIGH NO UTILIZADO, POIS A MEMRIA TEM 256 ENDER.

DATA_EEPROM_WRITE MOVF DADO_LOW_00,W EEDATA ; CARREGA NO WORK DADO P/ SER GRAVADO ; ALTERA P/ BANK DO REGISTRADOR

BANKSEL EEDATA MOVWF EEDATA

; SALVA DADO A SER GRAVADO EM EEDATA ; (CARREGA DADO NO REGISTRADOR ; CORRETO DO BANCO 2 DA RAM A PARTIR ; DO REGISTRADOR DE USURIO MAPEADO ; NO BANCO 0 DA RAM)

BANKSEL ENDERECO_LOW MOVF DESTINO

ENDERECO_LOW

; ALTERA P/BANK DO REGIST.

ENDERECO_LOW,W

; CARREGA NO WORK O ENDEREO DE

Conectando o PIC 16F877A - Recursos Avanados

224
BANKSEL EEADR MOVWF EEADR ; SALVA ENDERECO EM EEADR ; (CARREGA ENDEREO NO REGISTRADOR ; CORRETO DO BANCO 2 DA RAM A PARTIR ; DO REGISTRADOR DE USURIO MAPEADO ; NO BANCO 0 DA RAM) EEADR ; ALTERA P/ BANK DO REGISTRADOR

BANKSEL EECON1 BCF BSF

EECON1

; ALTERA P/ BANK DO REGISTRADOR

EECON1,EEPGD EECON1,WREN

; APONTA P/ MEMRIA DE DADOS ; HABILITA ESCRITA

MOVLW 0X55 MOVWF EECON2 MOVLW 0XAA MOVWF EECON2 BSF EECON1,WR ; ESCREVE 0XAA EM EECON2 (OBRIGATRIO) ; INICIA ESCRITA ; ESCREVE 0X55 EM EECON2 (OBRIGATRIO)

BTFSC EECON1,WR GOTO $-1

; ACABOU ESCRITA ? ; NO - AGUARDA FIM DA ESCRITA ; SIM

BCF

EECON1,WREN

; DESABILITA ESCRITAS NA MEMRIA

BANKSEL 0X20 RETURN

; VOLTA P/ BANK0 ; RETORNA

;************************************** ;* ROTINA DE LEITURA NA MEMRIA DE DADOS *

;************************************** ; ESTA ROTINA L UM DADO (8 BITS) DA MEMRIA DE DADOS (E2PROM). ; O DADO A SER LIDO RETORNADO NO REGISTRADOR DADO_LOW_00. ; O REGISTRADOR DADO_HIGH_00 NO UTILIZADO POIS A MEMRIA DE 8 BITS. ; O ENDEREO DEVE SER PASSADO PELO REGISTRADOR ENDERECO_LOW. ; O REGISTRADOR ENDERECO_HIGH NO UTILIZADO, POIS A MEMRIA TEM 256 ENDER.

Conectando o PIC 16F877A - Recursos Avanados

225
DATA_EEPROM_READ MOVF DESTINO ENDERECO_LOW,W ; CARREGA NO WORK O ENDEREO DE

BANKSEL EEADR MOVWF EEADR

EEADR

; ALTERA P/ BANK DO REGISTRADOR

; SALVA ENDERECO EM EEADR ; (CARREGA ENDERECO NO REGISTRADOR ; CORRETO DO BANCO 2 DA RAM A PARTIR ; DO REGISTRADOR DE USURIO MAPEADO ; NO BANCO 0 DA RAM)

BANKSEL EECON1 BCF BSF

EECON1

; ALTERA P/ BANK DO REGISTRADOR

EECON1,EEPGD EECON1,RD

; APONTA P/ MEMRIA DE DADOS ; HABILITA LEITURA

BANKSEL EEDATA MOVF

EEDATA

; ALTERA P/BANK DO REGISTRADOR

EEDATA,W

; SALVA DADO LIDO NO WORK ; ALTERA P/BANK DO REGIST. DADO_LOW_00 ; SALVA DADO LIDO EM DADO_LOW_00 ; (SALVA DADO LIDO NO REGISTRADOR ; DE USURIO MAPEADO NO BANCO 0 DA RAM ; A PARTIR DO REGISTRADOR UTILIZADO ; PELO MICROCONTROLADOR MAPEADO ; NO BANCO 2 DA RAM)

BANKSEL DADO_LOW_00 MOVWF DADO_LOW_00

RETURN

; RETORNA

;************************************** ;* ROTINA DE ESCRITA NA MEMRIA DE PROGRAMA *

;************************************** ; A ESCRITA NA MEMRIA DE PROGRAMA FEITA DE 4 EM 4 WORDS OU DE 8 EM 8 BYTES ; OBRIGATORIAMENTE. O ENDEREO DEVE OBRIGATORIAMENTE ESTAR ALINHADO, OU SEJA, ; O ENDEREO INICIAL DEVER SEMPRE TER OS LTIMOS DOIS BITS EM 00. DESTA FORMA, ; SEMPRE A ESCRITA NA MEMRIA DE PROGRAMA FEITA NOS ENDEREOS COM FINAIS 00, ; 01, 10 E 11, COMPLETANDO ASSIM 4 WORDS.

Conectando o PIC 16F877A - Recursos Avanados

226
; ESTA ROTINA ESCREVE QUATRO WORDS (14 BITS) NA MEMRIA DE PROGRAMA. ; OS VAORES A SEREM SALVOS DEVEM SER PASSADOS PELOS REGISTRADORES ; DADO_HIGH_00:DADO_LOW_00, DADO_HIGH_01:DADO_LOW_01, ; DADO_HIGH_10:DADO_LOW_10 E DADO_HIGH_11:DADO_LOW_11. ; O ENDEREO DEVE SER PASSADO PELOS REGIST. ENDERECO_HIGH E ENDERECO_LOW.

FLASH_PROGRAM_WRITE MOVF DESTINO ENDERECO_HIGH,W ; CARREGA NO WORK O ENDEREO DE

BANKSEL EEADH MOVWF EEADRH BANKSEL ENDERECO_LOW MOVF DESTINO

EEADRH

; ALTERA P/ BANK DO REGISTRADOR

; SALVA ENDERECO EM EEADH ENDERECO_LOW ; ALTERA P/BANK DO REGIST.

ENDERECO_LOW,W

; CARREGA NO WORK O ENDEREO DE

ANDLW B'11111100' BANKSEL EEADR MOVWF EEADR EEADR

; MASCARA PARA ZERAR OS LTIMOS DOIS BIT ; ALTERA P/ BANK DO REGISTRADOR

; SALVA ENDERECO EM EEADR ; (CARREGA ENDEREO NOS REGISTRADOS ; CORRETOS DO BANCO 2 DA RAM A PARTIR ; DOS REGISTRADORES DE USURIO MAPEADOS ; NO BANCO 0 DA RAM)

MOVLW DADO_LOW_00 DADO_HIGH_00 MOVWF FSR

; CARREGA NO W ENDEREO DO REGISTRADOR

; SALVA O ENDEREO DO REGISTRADOR NO FSR

FLASH_PROGRAM_WRITE_2 BANKSEL EEDATA MOVF INDF,W ; CARREGA NO W O VALOR A SER SALVO ; SALVA DADO A SER GRAVADO EM EEDATA ; INCREMENTA PONTEIRO ; CARREGA NO W O VALOR A SER SALVO ; SALVA DADO A SER GRAVADO EM EEDATH ; INCREMENTA PONTEIRO EEDATA ; ALTERA P/ BANK DO REGISTRADOR

MOVWF EEDATA INCF MOVF FSR,F INDF,W

MOVWF EEDATH INCF FSR,F

Conectando o PIC 16F877A - Recursos Avanados

227

BANKSEL EECON1 BSF BSF

EECON1

; ALTERA P/ BANK DO REGISTRADOR

EECON1,EEPGD EECON1,WREN

; APONTA P/ MEMRIA DE PROGRAMA ; HABILITA ESCRITA

MOVLW 0X55 MOVWF EECON2 MOVLW 0XAA MOVWF EECON2 BSF EECON1,WR ; ESCREVE 0XAA EM EECON2 (OBRIGATRIO) ; INICIA ESCRITA ; ESCREVE 0X55 EM EECON2 (OBRIGATRIO)

NOP NOP ; NO OPERA

BCF

EECON1,WREN

; DESABILITA ESCRITAS NA MEMRIA

BANKSEL EEADR INCF EEADR,F

EEADR

; ALTERA P/ BANK DO REGISTRADOR

; INCREMENTA ENDEREO

MOVLW B'00000011' ANDWF EEADR,W DOIS BITS DO ENDEREO BTFSS STATUS,Z DIFERENTE DE ZERO?) GOTO

; CARREGA MASCARA NO WORK ; WORK FICA COM APENAS OS LTIMOS

; DEVE ESCREVER MAIS ALGUM DADO ? (WORK

FLASH_PROGRAM_WRITE_2 ; NO

; SIM - VOLTA PARA ESCRITA

BANKSEL EECON1

EECON1

; ALTERA P/ BANK DO REGISTRADOR

BTFSC EECON1,WR GOTO $-1

; ACABOU ESCRITA ? ; NO - AGUARDA FIM DA ESCRITA ; SIM

BANKSEL 0X20

; VOLTA P/ BANK0

Conectando o PIC 16F877A - Recursos Avanados

228
RETURN ; RETORNA DA SUBROTINA

;************************************** ;* ROTINA DE LEITURA NA MEMRIA DE DADOS *

;************************************** ; ESTA ROTINA L UM DADO (14 BITS) DA MEMRIA DE PROGRAMA. ; O DADO LIDO RETORNADO NOS REGISTRADORES DADO_HIGH_00 E DADO_LOW._00 ; O ENDEREO DEVE SER PASSADO PELOS REGIST. ENDERECO_HIGH E ENDERECO_LOW.

FLASH_PROGRAM_READ MOVF DESTINO ENDERECO_HIGH,W ; CARREGA NO WORK O ENDEREO DE

BANKSEL EEADH MOVWF EEADRH BANKSEL ENDERECO_LOW MOVF DESTINO

EEADRH

; ALTERA P/ BANK DO REGISTRADOR

; SALVA ENDERECO EM EEADH ENDERECO_LOW ; ALTERA P/BANK DO REGIST.

ENDERECO_LOW,W

; CARREGA NO WORK O ENDEREO DE

BANKSEL EEADR MOVWF EEADR

EEADR

; ALTERA P/ BANK DO REGISTRADOR

; SALVA ENDERECO EM EEADR ; (CARREGA ENDEREO NOS REGISTRADOS ; CORRETOS DO BANCO 2 DA RAM A PARTIR ; DOS REGISTRADORES DE USURIO MAPEADOS ; NO BANCO 0 DA RAM)

BANKSEL EECON1 BSF BSF

EECON1

; ALTERA P/ BANK DO REGISTRADOR

EECON1,EEPGD EECON1,RD

; APONTA P/ MEMRIA DE PROGRAMA ; HABILITA LEITURA

NOP NOP

BANKSEL EEDATH MOVF

EEDATH

; ALTERA P/ BANK DO REGISTRADOR

EEDATH,W

; SALVA DADO LIDO NO WORK

Conectando o PIC 16F877A - Recursos Avanados

229
BANKSEL DADO_HIGH_00 ; ALTERA P/ BANK DO REGIST. DADO_HIGH ; SALVA DADO LIDO EM DADO_HIGH_00 ; ALTERA P/ BANK DO REGISTRADOR

MOVWF DADO_HIGH_00 BANKSEL EEDATA_00 MOVF EEDATA

EEDATA,W DADO_LOW_00

; SALVA DADO LIDO NO WORK ; ALTERA P/ BANK DO REGIST.

BANKSEL DADO_LOW_00

MOVWF DADO_LOW_00

; SALVA DADO LIDO EM DADO_LOW_00 ; (SALVA DADO LIDO NOS REGISTRADORES ; DE USURIO MAPEADOS NO BANCO 0 DA RAM ; A PARTIR DOS REGISTRADORES UTILIZADOS ; PELO MICROCONTROLADOR MAPEADOS ; NO BANCO 2 DA RAM)

RETURN

; RETORNA

;************************************** ;* CONFIGURAES INICIAIS DE HARDWARE E SOFTWARE *

;************************************** ; NESTA ROTINA SO INICIALIZADAS AS PORTAS DE I/O DO MICROCONTROLADOR E AS ; CONFIGURAES DOS REGISTRADORES ESPECIAIS (SFR). A ROTINA INICIALIZA A ; MQUINA E AGUARDA O ESTOURO DO WDT.

CONFIG CLRF CLRF CLRF CLRF CLRF PORTA PORTB PORTC PORTD PORTE ; GARANTE TODA AS SADAS EM ZERO

BANK1

; SELECIONA BANCO 1 DA RAM

MOVLW B'11111111' MOVWF TRISA ; CONFIGURA I/O DO PORTA

MOVLW B'11111111'

Conectando o PIC 16F877A - Recursos Avanados

230
MOVWF TRISB ; CONFIGURA I/O DO PORTB

MOVLW B'11111101' MOVWF TRISC ; CONFIGURA I/O DO PORTC

MOVLW B'00000000' MOVWF TRISD ; CONFIGURA I/O DO PORTD

MOVLW B'00000100' MOVWF TRISE ; CONFIGURA I/O DO PORTE

MOVLW B'11011111' MOVWF OPTION_REG ; CONFIGURA OPTIONS ; PULL-UPs DESABILITADOS ; INTER. NA BORDA DE SUBIDA DO RB0 ; TIMER0 INCREM. PELO CICLO DE MQUINA ; WDT - 1:128 ; TIMER - 1:1

MOVLW B'00000000' MOVWF INTCON ; CONFIGURA INTERRUPES ; DESABILITADA TODAS AS INTERRUPES

MOVLW B'00000111' MOVWF ADCON1 ; CONFIGURA CONVERSOR A/D ; CONFIGURA PORTA E PORTE COMO I/O DIGITAL

BANK0

; SELECIONA BANCO 0 DA RAM

; AS INSTRUES A SEGUIR FAZEM COM QUE O PROGRAMA TRAVE QUANDO HOUVER UM ; RESET OU POWER-UP, MAS PASSE DIRETO SE O RESET FOR POR WDT. DESTA FORMA, ; SEMPRE QUE O PIC LIGADO, O PROGRAMA TRAVA, AGUARDA UM ESTOURO DE WDT ; E COMEA NOVAMENTE. ISTO EVITA PROBLEMAS NO START-UP DO PIC.

BTFSC

STATUS,NOT_TO

; RESET POR ESTOURO DE WATCHDOG TIMER ?

Conectando o PIC 16F877A - Recursos Avanados

231
GOTO $ ; NO - AGUARDA ESTOURO DO WDT ; SIM

;************************************** ;* INICIALIZAO DA RAM *

;************************************** ; ESTA ROTINA IR LIMPAR TODA A RAM DO BANCO 0, INDO DE 0X20 A 0X7F.

MOVLW 0X20 MOVWF FSR ; APONTA O ENDEREAMENTO INDIRETO PARA ; A PRIMEIRA POSIO DA RAM LIMPA_RAM CLRF INCF MOVF INDF FSR,F FSR,W ; COMPARA O PONTEIRO COM A LT. POS. +1 ; J LIMPOU TODAS AS POSIES? ; NO - LIMPA A PRXIMA POSIO ; SIM ; LIMPA A POSIO ; INCREMENTA O PONTEIRO P/ A PRX. POS.

XORLW 0X80 BTFSS GOTO STATUS,Z LIMPA_RAM

;************************************** ;* CONFIGURAES INICIAIS DO DISPLAY *

;************************************** ; ESTA ROTINA INICIALIZA O DISPLAY P/ COMUNICAO DE 8 VIAS, DISPLAY PARA 2 ; LINHAS, CURSOR APAGADO E DESLOCAMENTO DO CURSOR DIREITA.

INICIALIZACAO_DISPLAY BCF RS ; SELECIONA O DISPLAY P/ COMANDOS

MOVLW 0X30 CALL ESCREVE

; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO

MOVLW .3 CALL DELAY_MS ; DELAY DE 3MS (EXIGIDO PELO DISPLAY)

Conectando o PIC 16F877A - Recursos Avanados

232
MOVLW 0X30 CALL ESCREVE ; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO

MOVLW 0X30 CALL ESCREVE

; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO

MOVLW B'00111000' CALL ESCREVE

; ESCREVE COMANDO PARA ; INTERFACE DE 8 VIAS DE DADOS

MOVLW B'00000001' CALL ESCREVE

; ESCREVE COMANDO PARA ; LIMPAR TODO O DISPLAY

MOVLW .1 CALL DELAY_MS ; DELAY DE 1MS

MOVLW B'00001100' CALL ESCREVE

; ESCREVE COMANDO PARA ; LIGAR O DISPLAY SEM CURSOR

MOVLW B'00000110' CALL ESCREVE

; ESCREVE COMANDO PARA INCREM. ; AUTOMTICO DIREITA

BSF

RS

; SELECIONA O DISPLAY P/ DADOS

;************************************** ;* INICIALIZAO DA RAM *

;************************************** ; ESTE TRECHO DO PROGRAMA L OS DADOS DAS MEMRIAS (E2PROM E FLASH) E ; ATUALIZA A RAM.

LE_MEMORIA_PROGRAMA MOVLW END_MEM_PROG_H MOVWF ENDERECO_HIGH MOVLW END_MEM_PROG_L MOVWF ENDERECO_LOW ; CARREGA ENDERECO P/ LEITURA

Conectando o PIC 16F877A - Recursos Avanados

233
CALL FLASH_PROGRAM_READ ; CHAMA ROTINA P/ LER DADO

MOVF

DADO_HIGH_00,W

MOVWF VALOR_PROG_HIGH MOVF DADO_LOW_00,W ; SALVA O DADO LIDO EM ; VALOR_PROG_HIGH E VALOR_PROG_LOW LE_MEMORIA_DADOS MOVLW END_MEM_DADO MOVWF ENDERECO_LOW ; CARREGA ENDERECO P/ LEITURA

MOVWF VALOR_PROG_LOW

CALL

DATA_EEPROM_READ

; CHAMA ROTINA P/ LER DADO

MOVF

DADO_LOW_00,W ; SALVA DADO LIDO EM VALOR_DADOS

MOVWF VALOR_DADOS

;************************************** ;* ROTINA DE ESCRITA DA TELA PRINCIPAL *

;************************************** ; ESTA ROTINA ESCREVE A TELA PRINCIPAL DO PROGRAMA, COM AS FRASES: ; LINHA 1 - "M.DADOS M.PROG." ; LINHA 2 - " >xxh< xxxxh "

CALL

ATUALIZA_TELA_LINHA_1 ; ATUALIZA TELA LINHA 1 DO LCD

CALL

ATUALIZA_TELA_LINHA_2 ; ATUALIZA TELA LINHA 2 DO LCD

;************************************** ;* VARREDURA DOS BOTES *

;************************************** ; ESTA ROTINA VERIFICA SE ALGUM BOTO EST PRESSIONADO E CASO AFIRMATIVO ; DESVIA PARA O TRATAMENTO DO MESMO.

VARRE

Conectando o PIC 16F877A - Recursos Avanados

234
CLRWDT ; LIMPA WATCHDOG TIMER

; **************** VERIFICA ALGUM BOTO PRESSIONADO *************************

VARRE_BOTOES BTFSS GOTO BOTAO_0 TRATA_BOTAO_0 ; O BOTO 0 ESTA PRESSIONADO ? ; SIM - PULA P/ TRATA_BOTAO_0 ; NO

BTFSS GOTO

BOTAO_1 TRATA_BOTAO_1

; O BOTO 1 ESTA PRESSIONADO ? ; SIM - PULA P/ TRATA_BOTAO_1 ; NO

BTFSS GOTO

BOTAO_2 TRATA_BOTAO_2

; O BOTO 2 ESTA PRESSIONADO ? ; SIM - PULA P/ TRATA_BOTAO_2 ; NO

BTFSS GOTO

BOTAO_3 TRATA_BOTAO_3

; O BOTO 3 ESTA PRESSIONADO ? ; SIM - PULA P/ TRATA_BOTAO_3 ; NO

; *************************** FILTRO P/ EVITAR RUIDOS ***********************

MOVLW FILTRO_TECLA MOVWF FILTRO_BOTOES

; CARREGA O VALOR DE FILTRO_TECLA ; SALVA EM FILTRO_BOTOES ; RECARREGA FILTRO P/ EVITAR RUIDOS ; NOS BOTES

MOVLW .1 MOVWF TEMPO_TURBO ; CARREGA TEMPO DO TURBO DAS TECLAS ; COM 1 - IGNORA O TURBO A PRIMEIRA ; VEZ QUE A TECLA PRESSIONADA

GOTO

VARRE

; VOLTA PARA VARRER TECLADO

;**************************************

Conectando o PIC 16F877A - Recursos Avanados

235
;* TRATAMENTO DOS BOTES *

;************************************** ; NESTE TRECHO DO PROGRAMA ESTO TODOS OS TRATAMENTOS DOS BOTES

; ************************* TRATAMENTO DO BOTO 0 ***************************

TRATA_BOTAO_0 MOVF BTFSC FILTRO_BOTOES,F STATUS,Z ; FILTRO J IGUAL A ZERO ? ; (FUNO JA FOI EXECUTADA?) GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO ; NO DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO

MOVLW B'00000001' XORWF FLAG,F ; INVERTE FLAG ; ALTERA A MEMRIA UTILIZADA

CALL

ATUALIZA_TELA_LINHA_2 ; CHAMA ROTINA P/ ATUALIZAR LCD

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

; ************************* TRATAMENTO DO BOTO 1 ***************************

TRATA_BOTAO_1 DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO

DECFSZ TEMPO_TURBO,F GOTO VARRE

; FIM DO TEMPO DE TURBO ? ; NO - VOLTA P/ VARRE ; SIM

MOVLW TURBO_TECLA

Conectando o PIC 16F877A - Recursos Avanados

236
MOVWF TEMPO_TURBO ; RECARREGA TEMPORIZADOR DO TURBO ; DAS TECLAS

BTFSC GOTO

TIPO_MEMORIA INC_MEM_PROG

; EST UTILIZANDO MEMRIA DE DADOS ? ; NO - ENTO PULA P/ INC_MEM_PROG ; SIM

INC_MEM_DADOS INCF VALOR_DADOS,F ; INCREMENTA VALOR_DADOS

CALL

ATUALIZA_TELA_LINHA_2 ; CHAMA ROTINA P/ ATUALIZAR LCD

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

INC_MEM_PROG INCF BTFSC INCF VALOR_PROG_LOW,F STATUS,Z VALOR_PROG_HIGH,F ; INCREMENTA VALOR_PROG_LOW ; HOUVE ESTOURO ? ; SIM - INCREMENTA VALOR_PROG_HIGH ; NO

MOVLW B'00111111' ANDWF VALOR_PROG_HIGH,F ; LIMITA CONTADOR DA MEMRIA DE ; PROGRAMA EM 14 BITS

CALL

ATUALIZA_TELA_LINHA_2 ; CHAMA ROTINA P/ ATUALIZAR LCD

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

; ************************* TRATAMENTO DO BOTO 2 ***************************

TRATA_BOTAO_2 DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO

DECFSZ TEMPO_TURBO,F

; FIM DO TEMPO DE TURBO ?

Conectando o PIC 16F877A - Recursos Avanados

237
GOTO VARRE ; NO - VOLTA P/ VARRE ; SIM MOVLW TURBO_TECLA MOVWF TEMPO_TURBO ; RECARREGA TEMPORIZADOR DO TURBO ; DAS TECLAS

BTFSC GOTO

TIPO_MEMORIA DEC_MEM_PROG

; EST UTILIZANDO MEMRIA DE DADOS ? ; NO - ENTO PULA P/ DEC_MEM_PROG ; SIM

DEC_MEM_DADOS DECF VALOR_DADOS,F ; DECREMENTA VALOR_DADOS

CALL

ATUALIZA_TELA_LINHA_2 ; CHAMA ROTINA P/ ATUALIZAR LCD

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

DEC_MEM_PROG MOVLW .1 SUBWF VALOR_PROG_LOW,F BTFSS DECF STATUS,C VALOR_PROG_HIGH,F ; DECREMENTA VALOR_PROG_LOW ; HOUVE ESTOURO ? ; SIM - DECREMENTA VALOR_PROG_HIGH ; NO

MOVLW B'00111111' ANDWF VALOR_PROG_HIGH,F ; LIMITA CONTADOR DA MEMRIA DE ; PROGRAMA EM 14 BITS

CALL

ATUALIZA_TELA_LINHA_2 ; CHAMA ROTINA P/ ATUALIZAR LCD

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

; ************************* TRATAMENTO DO BOTO 3 ***************************

TRATA_BOTAO_3 MOVF FILTRO_BOTOES,F

Conectando o PIC 16F877A - Recursos Avanados

238
BTFSC STATUS,Z ; FILTRO J IGUAL A ZERO ? ; (FUNO JA FOI EXECUTADA?) GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO ; NO DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO

; ********TRECHO DO PROGRAMA PARA GRAVAR DADOS DA RAM NA MEMRIA *************

GRAVA_MEMORIA_PROGRAMA MOVLW END_MEM_PROG_H MOVWF ENDERECO_HIGH MOVLW END_MEM_PROG_L MOVWF ENDERECO_LOW ; CARREGA ENDERECO ONDE O DADO SER SALVO

MOVF

VALOR_PROG_HIGH,W

MOVWF DADO_HIGH_00 MOVF VALOR_PROG_LOW,W ; CARREGA DADO A SER SALVO ; EM DADO_HIGH_00 E DADO_LOW_00 CALL FLASH_PROGRAM_WRITE ; CHAMA ROTINA DE GRAVAO

MOVWF DADO_LOW_00

GRAVA_MEMORIA_DADOS MOVLW END_MEM_DADO MOVWF ENDERECO_LOW MOVF VALOR_DADOS,W ; CARREGA DADO A SER SALVO EM DADO_LOW_00 ; CARREGA ENDERECO ONDE O DADO SER SALVO

MOVWF DADO_LOW_00

CALL

DATA_EEPROM_WRITE

; CHAMA ROTINA DE GRAVAO

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

;************************************** ;* FIM DO PROGRAMA *

;************************************** END ; FIM DO PROGRAMA

Conectando o PIC 16F877A - Recursos Avanados

239
Dicas e comentrios
Para a definio das posies de memria serem gravadas, tanto para dados quanto para programa, foram definidas trs constantes no sistema com as seguintes inicializaes: END_MEM_DADOS = 10h: Grava a informao na memria de dados na posio 10h; END_MEM_PROG_H = 08h e END_MEM_PROG_L = 00h: Grava a informao na memria de programa na posio 0800h. Para o uso das memrias foram criadas quatro rotinas, j que elas trabalham com quatro variveis, todas elas definidas no banco 0:

Rotina

Funo L um byte da memria de dados.

Variveis (Bank0) 0 endereo deve ser passado em ENDERECO_LOW. 0 dado lido ser retornado em DADO_LOW. 0 endereo deve ser passado em ENDEREO_LOW e o dado a ser escrito em DADO_LOW. 0 endereo deve ser passado em ENDERECO_HIGH e ENDERECO_LOW. 0 dado lido ser retornado em DADO_HIGH e DADO_LOW 0 endereo deve ser passado em ENDERECO_HIGH e ENDERECO_LOW e o dado a ser escrito em DADO_HIGH e DADO_LOW

DATA_EEPROM_READ

DATA_EEPROM_WRITE

Escreve um byte na memria de dados.

FLASH_PROGRAM_READ

L uma word (14 bits) da memria de programa.

FLASH_PROGRAM_WRITE

Escreve uma word (14 bits) na memria de programa.

Exerccios propostos
Agora que o exemplo j foi estudado e esclarecido, aproveite para gerar novos problemas e solues, seguindo os exerccios propostos: 1. Crie um sistema no qual do lado esquerdo voc continua informando o dado 2 para a E PROM, no centro voc escolhe a posio, de O a 255, e do lado direito informada o tipo de operao: E para escrita e L para leitura. O boto S1 continua alterando entre os parmetros a serem ajustados e os botes S2 e S3 alteram o parmetro atual. O boto S4 efetua a operao: escreve na posio de memria especificada o valor ajustado ou leitura da posio especificada para indicao do valor encontrado. Repita o exerccio anterior para a memria FLASH. Crie um programa que copie internamente todo o cdigo para outra posio, como por exemplo na pgina 1. Depois, utilize o gravador para ler a memria de programa e verificar se a operao foi executada com sucesso.

2. 3.

Conectando o PIC 16F877A - Recursos Avanados

240

Conectando o PIC

11
Comunicao Serial 1 - SPI e 12C
Introduo
Neste captulo comearemos o estudo de um assunto muito procurado pelos profissionais atuais: a comunicao serial. Dissemos que estaremos comeando o estudo porque o PIC possui tantos recursos voltados a ele que utilizaremos dois captulos para complet-lo. Nesta primeira parte, estudaremos dois tipos distintos de 2 comunicao serial, denominados SPI e I C. Esses protocolos podero ser utilizados para a comunicao do PIC com outros microcontroladores, com memrias externas, drives de LCD, conversores, sensores e uma infinidade de outros perifricos. Os dois protocolos mencionados (SPI e I C) fazem parte de um sistema comum do PIC denominado MSSP (Master Synchronous Serial Port). Como esse sistema comum, ele compartilha os mesmos recursos (pinos, hardware internos e registradores) entre os dois casos. Por isso s podemos utilizar um sistema de cada vez. Eles sero estudados separadamente. Comecemos, ento, conhecendo as diferenas e semelhanas bsicas entre eles: SPI Foi criado pela Motorola e seu nome significa: Serial Peripherall Interface Opera em modo Master e Slave Comunicao sncrona (com Clock)
A comunicao feita por trs vias:
2

PC Foi criado pela Philips e seu nome significa: Inter-lntegrade Circuit Opera em modo Master e Slave Comunicao sncrona (com Clock)
A comunicao feita por duas vias:

Clock (SCK) Data In (SDI) Data Out (SDO) No enderevel 8 bits de dados

Clock (SCL) Data In/Out(SDA) Enderevel (7 ou 10 bits) 8 bits de dados

Teoria e recursos do PIC para SPI


Antes de mais nada precisamos saber alguns conceitos bsicos sobre a comunicao serial sncrona. Como o prprio nome diz, essa comunicao exige uma via de sincronismo entre os dois componentes envolvidos (receptor e transmissor) para que haja a marcao do momento exato da

Conectando o PIC 16F877A - Recursos Avanados

241
transmisso/recepo de cada bit. Isso feito atravs do clock, que nada mais que uma onda quadrada para sincronizar o sistema. Acontece que s pode existir um clock, e por isso no podemos deixar ambos os lados da comunicao responsveis por ele. Para resolver esse problema foi criado o conceito de Master e Slave. O componente denominado Master (Mestre) ser responsvel pelo controle da comunicao, gerando o clock de sincronismo. Do outro lado, o componente ser denominado Slave (Escravo) e ficar sempre aguardando o clock enviado pelo mestre. Como a SPI no permite o endereamento, a comunicao s pode ser feita entre dois pontos, sendo um deles o Master e o outro o Slave. Como observado na tabela comparativa apresentada anteriormente, neste modo de comunicao a ligao entre os componentes deve ser feita atravs de trs vias: Clock: Trata-se da via de clock, que pode ser uma entrada (Slave) ou sada (Mastei). O SPI aceita os quatro tipos de clocks diferentes especificados para o padro SPI. A descrio e a configurao desses tipos ser vista posteriormente. No PIO 16F877A chamado de SCK e est localizado no pino 18 (RC3); Data In: Trata-se da entrada de dados, ou seja, a via de recepo. No PIC 16F877A chamada de SDI e est localizada no pino 23 (RC4); Data Out: Trata-se da sada de dados, ou seja, a via de transmisso. No PIC 16F877A chamada de SDO e est localizada no pino 24 (RC5); O prximo diagrama mostra a ligao entre dois componentes, que podem, por exemplo ser dois PICs:

O PIC do lado esquerdo o Master e, por isso, responsvel pela gerao do clock. Seu pino SCK deve ser configurado como sada. J do lado direito o PIC definido como Slave, ficando o pino de clock configurado como entrada. Atravs do diagrama podemos tambm comear a entender melhor o funcionamento interno do SR. Esse protocolo de comunicao trabalha com um registrador interno (no acessvel) denominado SSPSR. Esse registrador do tipo rotativo (Shift Registei). A cada ciclo do clock, um bit lido da porta SDI escrito nesse registrador, entrando pelo bit menos significativo e rotacionando todos os bits para a Conectando o PIC 16F877A - Recursos Avanados

242
esquerda. Ao mesmo tempo, o bit mais significativo enviado para a porta SDO. Por isso, enquanto estamos recebendo um byte estamos tambm transmitindo outro. O registrador SSPBUF o responsvel pelo valor a ser transmitido e tambm pelo byte recebido.

A comunicao funciona ento da seguinte maneira: 1. Quem manda na comunicao o Master. Por isso, um valor qualquer escrito no registrador SSPBUF deste PIC. O valor ento movido para o registrador SSPSR. Em seguida oito pulsos so gerados na sada de clock SCK (cada pulso transmite 1 bit). Ao trmino dos oito pulsos o valor que estava no SSPSRMaster trocado com o valor que estava SSPSRslave. Tanto de um lado quanto do outro o valor de SSPSR ento movido novamente para o registrador SSPBUF. Tambm de ambos os lados flags so ativados para informar ao sistema o fim da comunicao. Os dados podem ento ser acessados novamente em SSPBUF.

2. 3.

4.

5.

6.

7. Bem simples no mesmo? Desta forma, a comunicao feita sempre em sentido duplo, ao mesmo tempo. Desta forma, trs tipos diferentes de situaes podem acontecer: Master envia dado vlido / Slave envia dado no-vlido: Neste caso o Master est enviando algum dado para o Slave; porm no interessa a informao que enviada pelo Slave neste mesmo momento. muito comum quando o Master est fazendo uma pergunta ao Slave, que ter de ser processada antes da resposta ser transmitida de volta. Neste caso, o dado recebido pelo Master ao final da transmisso deve ser descartado. Master envia dado no vlido / Slave envia dado vlido: Este caso complementar ao anterior. Depois que o Master efetuou uma pergunta e o Slave a processou, uma resposta dever ser retornada. Acontece que como o Master quem manda no clock, ele precisar disparar uma nova transmisso para poder receber o dado do Slave. Master envia dado vlido / Slave envia dado vlido: Pode ser o caso mais raro, mas usado para aumento da velocidade. Por exemplo: o Master faz uma pergunta e ao mesmo tempo recebe a resposta da pergunta anterior.
Obviamente, apesar do sistema de comunicao ser de transmisso e recepo ao mesmo tempo, nem sempre isso necessrio. Caso a comunicao seja em um s sentido, a via de transmisso do Slave (SDO) pode ser desativada configurando-se esse pino como entrada, a recepo do Masfer (SDI) sem uso. Existe tambm um outro pino denominado /SS (RA5) que pode ser usado do lado Slave. Na maioria 3os casos, este pino opcional e serve como um sinal de Chip Select. Sua funo muito simples, quando este pino est em nvel baixo (0), o sistema de comunicao funciona normalmente, com o pino SDO funcionando como sada de dados a cada pulso do clock. No entanto, se este pino for colocado em nvel alto (1), o sistema de comunicao desligado e o pino SDO fica flutuante. Com este recurso podemos montar uma rede de comunicao com um Master e vrios Slaves, desde que o Master controle individualmente os pinos /SS de cada um dos Slaves. Este controle ter de ser implementado manualmente no software e deve garantir que somente um Slave est ativado de cada vez, evitando conflitos nas sadas SDO.

Conectando o PIC 16F877A - Recursos Avanados

243
Quando configurado para Master, o pino /SS opera como um I/O normal (RA5).

Vejamos agora como configurar corretamente o sistema para efetuar uma transmisso. A primeira coisa a ser feita diz respeito configurao correta dos pinos, como entradas ou sadas: Pino SDI Configurao
Este pino configurado automaticamente pelo sistema como entrada.

SDO Este pino deve ser configurado manualmente como sada atravs do TRISC. SCK /SS
Este pino deve ser configurado como sada no Master e entrada do Slave, atravs do TRISC. Quando habilitado no Slave, deve ser configurado manualmente como entrada.

Depois devemos configurar a comunicao como sendo Slave ou Master. Existe mais de uma opo para cada tipo, devendo ser configuradas em SSPCON<SSPM3:SSPM0>:

SSPM3: SSPMO 0000 0001 0010 0011 0100 0101

Descrio SPI Master, com clock = Fosc / 4 SPI Master, com clock = Fosc / 1 6 SPI Master, com clock= Fosc / 64 SPI Master, com clock = TMR2 / 2 SPI Slave, com /SS habilitado SPI Slave, com /SS desabilitado.
2

Obs: As demais opes de configuraes dizem respeitos aos outros modos (I C).

As quatro primeiras opes dizem respeito escolha do modo Master, cada uma com uma freqncia diferente para o clock. Nas trs primeiras, o clock uma diviso (4,16 ou 64) da freqncia do oscilador do prprio PIC. Com isso, podemos deduzir que na freqncia mxima de 20 MHz nossa taxa de transmisso de 5,OMbps. Na outra opo, o clock gerado com base na metade do TMR2. Assim, a base de tempo ser PR2 / 2. O postscale no usado para este caso. Conectando o PIC 16F877A - Recursos Avanados

244
As duas ltimas opes devem ser escolhidas quando estamos configurando um PIC em modo Slave. Neste caso devemos escolher entre trabalhar ou no com o pino /SS. Mais para a frente ser comentado um caso em que a ativao deste pino obrigatria. Outra configurao ajusta a condio de recebimento. Assim, o sistema pode efetuar a leitura da porta SDI em dois pontos distintos, conforme o valor imposto em SSPSTAT<SMP>:

SMP 0 1

Descrio A recepo feita na borda do meio do perodo. Pode ser usada tanto no Master quanto no Slave. A recepo feita na borda do final do perodo. S pode ser usada no Master.

O prximo passo diz respeito escolha da forma de onda do clock. O padro SPI disponibiliza quatro opes que podem ser ajustadas em dois bits distinto, SSPCON<CKP> e SSPSTAT<CKE>: CKP 0 1 Descrio Clock normalmente em nvel baixo (0) Clock normalmente em nvel alto (1)

CKE 0 1

Descrio Pulso do Clock no comeo do periodo Pulso do Clock no final do periodo

Graficamente fica muito mais fcil percebermos as diferenas entre os quatro modos resultantes da combinao desses 2 bits:

Para o Master no existe limitao quanto ao uso de qualquer um dos quatro tipos. Para o Slave, a questo um pouco mais complicada. Como os pinos de clock esto diretamente ligados, ento o valor padro da via (nvel alto ou baixo) deve ser o mesmo. Desta forma o valor de CKP para o Slave deve ser obrigatoriamente o mesmo adotado para o Master. Conectando o PIC 16F877A - Recursos Avanados

245
O outro problema est em relao transmisso/recepo do dado pelo Slave. Para o Master, o primeiro bit (o mais significativo) colocado em SDO logo depois do comeo do perodo, permanecendo l at o final do mesmo. Desta forma, podemos considerar que o bit transmitido no meio do perodo. Como ele sabe o momento exato de incio do perodo, fica fcil tambm controlar a leitura da entrada SDI (no comeo ou no fim). Para o Slave entretanto, um problema acontece quando CKE=1, pois no h como ele saber o incio do perodo uma vez que no existe nenhuma borda neste ponto. Por esse motivo, para utilizarmos o Slave com CKE=1, obrigatoriamente teremos que habilitar o pino/SS. Quando o pino de /SS for colocado em nvel baixo, o primeiro bit colocado em SDO (at este momento ele estava flutuante) e o sistema fica aguardando o clock para dar continuidade na transmisso. Quanto recepo, como o S/ave s pode operar com leitura no meio do perodo (SMP=0), a entrada SDI ser lida logo na primeira borda do clock. Para ligar a comunicao SPI, basta ativar o sistema SSP atravs do bit SSPCON<SSPEN>: SSPEN 0 1 Desabilita a comunicao. Habilita a comunicao. Neste momento, os pinos SCK, SDO, SDI e em alguns casos o /SS, deixam de operar como l/Os convencionais. Descrio

Por ltimo, basta escrever o dado que se deseja transmitir no registrador SSPBUF. Se isso for feito no Master, a transmisso ser iniciada imediatamente aps a escrita. Para o Slave, o sistema ficar aguardando o clock. No trmino dos oito pulsos do clock, o dado ter sido enviado do Master para o Slave e vice-versa, como j explicado. Os registradores SSPBUF sero, ento, atualizados e o flag SSPSTAT<BF> indicar que o buffer est cheio: BF 0 1 Descrio Recebimento em operao. SSPBUF est vazio. Recebimento terminado. SSPBUF carregado.

Esse bit limpo automaticamente toda vez que o registrador SSPBUF lido, indicando que c programa j processou a informao recebida. Neste mesmo momento o bit da interrupo PIR1<SSPIF> ativado. A interrupo s acontecer no caso das suas chaves estarem ligadas. Caso seja escrito outro valor em SSPBUF antes do trmino da transmisso/recepo, ele ser ignorado, no afetando a operao. Entretanto, um bit ser setado informando uma coliso de informaes. Este bit denominado SSPCON<WCOL> e deve ser limpo manualmente pelo programa. Por outro lado, caso o Slave receba um novo valor antes do SSPBUF ser lido (BF=1), este novo valor ser perdido e o flag de overflow ser ativado (SSPCON<SSPOV>=1). Este bit tambm deve ser limpe manualmente. Para o Master este flag no possui funo. Quanto ao modo SLEEP, o resultado diferente quando aplicado ao Master ou ao Slave. No case do Master, a comunicao ser completamente interrompida, pois no possvel a gerao do clock sem o oscilador estar funcionando. Por outro lado, para o Slave, a comunicao continuar funcionando e o PIC poder acordar caso a interrupo de SSP esteja ligada.

Conectando o PIC 16F877A - Recursos Avanados

246
Resumo dos registradores associados a SPI Endereo 0Bh... OCh 8Ch 94h 14h 13h Nome INTCON PIR1 PIE1 SSPSTAT SSPCON SSPBUF Bit 7 GIE PSPPIF PSPIE SMP WCOL Bit 6 PEIE ADIF ADIE CKE SSPOV Bit 5 T0IE RCIF Bit 4 INTE TXIF Bit 3 RBIE SSPIF Bit 2 T0IF CCP1IF Bit1 INTF TMR2IF TMR2IE UA SSPM1 Bit0 RBIF TMR1IF TMR1IE BF SSPM0

RCIE TXIE SSPIE CCP1IE D/A P S R/W SSPEN CKP SSPM3 SSPM2 Buffer de transmisso/recepo

No usado para essa finalidade. Para obter mais informaes, consulte apndice A

Teoria para I2C


O padro de comunicao I C possui caractersticas bem diferentes do SPI. Isso o torna muito mais poderoso, mas, em contrapartida, muito mais complexo tambm. Vejamos, ento, suas principais caractersticas Este protocolo continua com o conceito de Master/Slave, entretanto ele permite o endereamento de diversos pontos da rede por meio das prprias vias de comunicao. Com isso podemos ter um Master com diversos Slaves sem necessitarmos de pinos de controle adicionais. Na verdade, possvel tambm a estruturao de uma rede com diversos Mestres; A comunicao feita somente em duas vias: Clock e Data. Como tambm se trata de uma comunicao sncrona, a via de clock continua sendo indispensvel. Quanto aos dados, eles transitam em uma nica via, tanto para a transmisso quanto para a recepo; Tanto o Master quanto o Slave podem transmitir e receber dados, mas o controle sempre do Master, Para evitar conflitos na via de dados (SDA), os pinos so chaveados como entrada ou sada (impe somente o nvel baixo, forando o GND), conforme a necessidade imposta pelo protocolo. Por esse fato, um resistor de pull-up necessrio, sendo recomendado valores de 10k a 1k. Os valores mais baixos (at 1k) podem ser necessrios para velocidades muito elevadas ou uma rede com muitos perifricos; O clock (SCL) continua sendo totalmente controlado pelo Mestre. Acontece que, nesse protocolo, pelo compartilhamento de uma nica via de dados e pela possibilidade de mais de um Mestre, o clock necessrio para a resposta do Escravo deve ser dado no momento correto, evitando conflitos no processamento da informao. Para que isso seja possvel, a via de clock tambm alterada como entrada e sada (impe somente o nvel baixo, forando o GND) durante a transmisso, ficando em determinados momentos em um estado flutuante. Por isso, necessrio que esta linha possua um resistor de pull-up para evitar esse estado flutuante e no gerar problemas no protocolo. Este resistor deve ser de 10 k a 1k, adotando-se os valores mais baixo quando a velocidade de transferncia maior. O detalhamento deste funcionamento ser visto mais frente; Fica claro, ento, que o valor padro tanto para SCL quanto para SDA o nvel alto(1), com esses pinos em alta impedncia (entradas). Aproveitamos para comentar tambm que os bits so lidos sempre da borda de descida do SCL; Conectando o PIC 16F877A - Recursos Avanados
2

247
Alm desse protocolo permitir a especificao do endereo, existem dois modos diferentes para que isso seja feito: 7 bits ou 10 bits. No primeiro caso possvel acessar at 128 endereos diferentes. Para o segundo caso, este nmero eleva-se para 1024 endereos. Com essas explicaes bsicas, podemos concluir que na comunicao existem quatro situaes distintas do protocolo que teremos de conhecer: Transmisso do Master/Recepo do Slave, com endereo de 7 bits; Recepo do Master/Transmisso do Slave, com endereo de 7 bits; Transmisso do Master/Recepo do Slave, com endereo de 10 bits; Recepo do Master/Transmisso do Slave, com endereo de 10 bits. Nas prximas pginas sero mostradas quatro cartas de tempo completas, para cada uma das situaes apresentadas. Antes, porm, vamos conhecer alguns outros pontos importantes deste protocolo que aparecero nos diagramas mencionados.

Condio de Start
Trata-se de uma condio especial entre as vias SDA e SCL para informar rede que uma transmisso ir comear. Essa condio controlada pelo Mestre e todos os Escravos podem ficar prontos, esperando um dado ser transmitido. Em rede de Mltiplos Mestres, essa condio serve tambm para informar aos demais Mestres que a linha est ocupada. Essa condio atingida respeitando-se o seguinte diagrama: em que TBRG o tempo equivalente a um pulso de clock.

Condio de Stop
Outro estado especial dos pinos SDA e SCL, com efeito contrrio condio de Start, pois informa a toda a rede que a transmisso terminou, ficando a mesma disponvel. Uma condio de Start obriga uma posterior condio de Stop, para que o sistema no fique travado.

Conectando o PIC 16F877A - Recursos Avanados

248

Condio de Re-Start
uma condio muito semelhante a de Start, mas que pode ser executada antes do Stop. Isso ser necessrio, por exemplo, para a implementao da comunicao com endereo de 10 bits ou nos casos em que precisamos enviar novamente o primeiro byte antes de finalizarmos a comunicao atravs de um Stop.

Condio de Acknowledge (ACK)


Na verdade, isso uma resposta dada pelo Mestre ou pelo Escravo, no lugar do 9 bit, informando se o dado foi corretamente recebido ou no. Um acknowledge alto (1) representa um erro, enquanto um acknowledge baixo (0) representa OK. No final de uma transmisso de dados do Escravo para o Mestre, isto , aps o ltimo byte, o Mestre deve sempre responder ACK=1.

Conectando o PIC 16F877A - Recursos Avanados

249
Transmisso de endereo
Independentemente da informao a ser transmitida (endereo de 7 bits, endereo de 10 bits ou dados de 8 bits), a comunicao sempre feita em pacotes de 8 bits e mais um retorno de acknowledge. Desta forma, para cada informao transmitida so necessrios nove pulsos no clock. O ltimo bit do primeiro byte no faz parte da informao, pois utilizado como um flag de marcao para escrita (Wwrite) ou leitura (R-Read). Quando o Mestre deseja enviar dados ao escravo, esse bit recebe o valor O (zero). Quando ele deseja receber um valor do Escravo, ele comea perguntando com este bit em 1 (um). E por isso que o endereo s comporta 7 bits: so exatamente os sete que sobraram nesse mesmo byte. Para o endereamento de 10 bits, ser necessria a transmisso inicial de 2 bytes s para o endereo. No primeiro byte, o bit menos significativo continua vlido como R/W. Dos outros 7 bits, entretanto, somente dois sero considerados como a parte alta do endereo. Trata-se dos bits 2 e 1. Os bits de 7 a 3 devem ser escritos com o valor 11110. Aps a transmisso do primeiro byte, SDA transformado em entrada para checar o acknowledge ao ser dado o 9 pulso do clock. Se a resposta for afirmativa termos ACK=0. Para a gerao de um pulso no clock, o nvel baixo conseguido impondo-se o aterramento do pino SCL (como se ele fosse uma sada). Em seguida, para o nvel alto, desliga-se o aterramento e o nvel conseguido pelo pull-up da linha. Durante todo o tempo do pulso, o pino SCL deve ser monitorado pelo Mestre e, caso ele desa, porque algum Escravo est pedindo uma pausa no processo. O tempo do clock , ento, paralisado e o Mestre s volta a responder quando a linha de SCL estiver liberada. Quando o clock estiver liberado, o Mestre ir iniciar a transmisso do segundo byte de endereo. Neste segundo byte esto os 8 bits menos significativos que faltam para completar o endereo de 10 bits. Ao trmino, um novo ACK ser aguardado e conferido.

Transmisso de dados
Depois do trmino da transferncia da parte relacionada ao endereo, um dos dois lados (Mestre ou Escravo) dever transmitir um ou mais bytes de dados. Caso seja o Escravo que esteja transmitindo para o Mestre, para finalizar a comunicao o Mestre deve responder um ACK=1 ao trmino do ltimo byte recebido, para s depois enviar uma condio de Stop. Isso se faz necessrio para que o Escravo seja informado de que o Mestre no mais deseja receber nenhum dado, evitando conflitos quando a condio de Stop for gerada. Nesta condio o Escravo deve ter sua comunicao paralisada e resetada, ficando no aguardo de uma nova condio de Start. Com isso o protocolo fica mais robusto, evitando erros na contagem do nmero de bytes enviados.

Pausas
Sempre que algum mdulo Slave (ou at outro Master) necessitar de uma pausa na comunicao, por exemplo, para processar a informao recebida, ela ser conseguida mantendo-se a linha de clock em nvel baixo, isto , em zero.

Diagramas de tempo
Os diagramas apresentados nas pginas seguintes demonstram graficamente 2 o protocolo 1 C para os quatro casos possveis j comentados:

Conectando o PIC 16F877A - Recursos Avanados

250
Transmisso do Master/Recepo do Slave, com endereo de 7 bits; Recepo do Master/Transmisso do Slave, com endereo de 7 bits; Transmisso do Master/Recepo do Slave, com endereo de 10 bits; Recepo do Master/Transmisso do Slave, com endereo de 10 bits. Em cada um deles so mostradas as informaes que trafegam pelas vias de Dados e de Clock. Alm disso, acima e abaixo dos desenhos das formas de onda existem tambm barras que representam qual dos dois lados est controlando a via. So duas barras para cada pino (SDA e SCL), uma representando o lado do Master e a outra o lado do Slave. Quando a barra est cinza significa que o pino est configurado como entrada e quando a barra est branca porque o pino est impondo o nvel 0 (baixo). Desta forma fica mais fcil visualizarmos o sentido de trfego da informao: Master para Slave; Slave para Master. Observando essas barras para o pino de clock (SCL) podemos ver claramente quando o Slave fora pausas na comunicao, impondo o nvel baixo (zero) nesta via.

Conectando o PIC 16F877A - Recursos Avanados

251

Conectando o PIC 16F877A - Recursos Avanados

252

Conectando o PIC 16F877A - Recursos Avanados

253
Recursos do PIC para I2C
Agora que as formas gerais do protocolo j esto explicadas, vamos ver como ativar e utilizar esse recurso no PIC 16F877A. Antes de mais nada, vamos explicar melhor como o PIC controla os pinos SCL e SDA. Como j foi dito na teoria do I2C, para que o protocolo funcione corretamente, evitando conflitos na linha, cada um dos mdulos ligados rede deve somente impor nvel baixo (0), sendo o nvel alto imposto pelos resistores de pull-up. O hardware interno do PIC respeita essas condies. Para isso, entretanto, necessrio que ambos os pinos (SCL e SDA) sejam configurados inicialmente como entrada atravs de TRISC, para que os mesmos fiquem em alta impedncia, possibilitando que o controle da I2C possa forar o nvel baixo quando necessrio. A imposio do GND na linha feita por intermdio de um transistor interno do tipo N. Este fato possibilita a checagem de coliso de dados na linha SDA, que ser explicada posteriormente. Caso um desses pinos, por exemplo o SCL, seja configurado como sada em nvel alto, o sistema poder continuar funcionando, pois quando a I2C no estiver impondo zero, a prpria porta impor 1 Isso no gerar problemas internos para o PIC, mas poder gerar problemas de conflito na linha, case seja utilizado mais de um Master ou caso algum Slave solicite uma pausa atravs da linha de clock. Para facilitar o entendimento, dividiremos essas explicaes em duas partes: uma dedicada ao Slave e outra ao Master.

Modo Slave
Inicie sempre configurando os pinos SCL e SDA como entrada por meio do TRISC. Para configurarmos um PIC para trabalhar em modo Slave, devemos ajustar os bits o= SSPCON<SSPM3:SSPMO>: SSPM3: SSPM0 2 0110 I C Slave, endereo de 7 bits. 0111 I C Slave, endereo de 10 bits.
2 2

Descrio

Obs: As demais opes de configurao dizem respeitos aos outros modos (SPI e I C Master). Depois necessrio tambm ajustar o bit SSPSTAT<SMP> que, neste caso, serve para habilitar ura sistema interno de tratamento das bordas quando operando em freqncia de 400 kHz: SMP 0 1 Descrio Tratamento desabilitado. Tratamento habilitado, quando usando 400kHz.

O bit SSPSTAT<CKE> serve para configurar o tipo de Smith Trigger utilizado nos pinos SCL e SDA. CKE 0 1 Descrio Entradas conforme especificaes I C. Entradas conforme especificaes SMBUS.
2

Conectando o PIC 16F877A - Recursos Avanados

254
Por ltimo necessrio ainda habilitar o sistema de comunicao atravs do bit SSPCON<SSPEN>:

SSPEN 0 1 Desabilita a comunicao.

Descrio

Habilita a comunicao. Neste momento os pinos SCL e SDA deixam de operar como l/Os convencionais.

Feito isso, vejamos quais tarefas sero feitas automaticamente e quais devero ser implementadas pelo programa. Trataremos separadamente os possveis casos de transferncia de informaes.

Recepo para endereamento de 7 bits


1. Tanto SCL quanto SDA esto em sua configurao padro, isto , como entradas. A linha receber ento uma condio de Start 2. A condio de Start reconhecida e o bit SSPSTAT<S> setado; porm nenhuma interrupo acontece. 3. O sistema aguardar, ento, um byte com os 7-bits de endereo e mais o bit R/W=0, com oito pulsos de clock. Teremos SSPSTAT<R/W>=0. Como o byte recebido equivalente a um endereo, ento SSPSTAT<D/A>=0. 4. Neste momento, o endereo recebido comparado automaticamente com o registrador SSPADD. Caso no seja o mesmo, a comunicao do lado Slave resetada (ACK=1) e o mesmo ficar aguardando um novo Start. Caso o endereo seja idntico, o bit SSPSTAT<BF> setado, informando que um valor foi transferido para o buffer (SSPBUF), o pino SDA transformado automaticamente em sada com nvel baixo (ACK=0) e fica aguardando o 9 pulso de clock. Logo depois SDA liberado, tornando-se novamente entrada. Neste momento tambm o flag PIR1<SSPIF> setado e a interrupo pode acontecer (se as chaves estiverem corretamente ligadas). importante que a interrupo acontea para que seja feita uma leitura do SSPBUF, forando novamente BF=0. 5. O sistema aguardar ento um byte de dado, com oito novos pulsos de clock. Como agora o byte recebido equivalente a um dado, ento SSPSTAT<D/A>=1. Neste momento, tambm teremos BF=1 e o dado ser colocado em SSPBUF. 6. Mais uma vez o pino SDA impe um nvel baixo para responder ACK=0 no 9 pulso do clock. SDA volta em seguida condio de entrada. 7. Uma nova interrupo acontece (SSPIF=1) para que o dado recebido possa ser tratado. 8. Novos bytes de dados podem continuar sendo recebidos at que uma condio de Stop seja imposta na linha. Neste momento, a condio ser reconhecida, setando o bit SSPSTAT<P> e finalizando a comunicao. A interrupo no gerada. 9. Caso seja recebido uma condio de Re-Start (entre um Start e um Stop), o Slave ficar esperando um novo byte de endereo, com o R/W, e no mais um byte de dados. Devido ao buffer duplo de recepo, isto , o dado entra em SSPSR e depois colocado em SSPBUF, a informao recebida pode ento ser lida mesmo durante o recebimento do prximo byte. Depois que lemos SSPBUF, o flag BF limpo automaticamente. Entretanto, caso o SSPBUF no seja lido antes da nova recepo terminar, o dado mais novo ser perdido (SSPBUF no atualizado) e o bit SSPCON<SSPOV> ser setado, indicando um overflow. SSPOV deve ser limpo manualmente pelo

Conectando o PIC 16F877A - Recursos Avanados

255
programa. Dependendo das condies de BF e SSPOV, a resposta automtica do acknowledge pode ser negativa (ACK=1). BF 0 1 1 0
(Nota)

SSPOV 0 0 1 1
(Nota)

Atualiza SSPBUF Sim No No Sim

ACK 0(Ok) 1 (Erro) 1 (Erro) 1 (Erro)

Interrupo SSPIF=1 Sim Sim Sim Sim

Nota: Esta condio representa um erro de programao, pois o SSPBUF foi limpo e o bit de SSPOV no.

Transmisso para endereamento de 7-bits


1. Tanto SCL quanto SDA esto em sua configurao padro, isto , como entradas. A linha receber, ento, uma condio de Start. A condio de Start reconhecida e o bit SSPSTAT<S> setado; porm nenhuma interrupo acontece. O sistema aguardar ento um byte com os 7-bits de endereo e mais o bit R/W=1, com oito pulsos de clock. Teremos SSPSTAT<R/W>=1. Como o byte recebido equivalente a um endereo, ento SSPSTAT<D/A>=0. O endereo recebido comparado automaticamente com o registrador SSPADD. Caso no seja o mesmo, a comunicao do lado Slave resetada (ACK=1) e o mesmo ficar aguardando um novo Start. Caso o endereo seja idntico, o pino SDA transformado automaticamente em sada com nvel baixo (ACK=0) e o sistema aguarda o 9 pulso de clock. Logo depois SDA transformado novamente em entrada. O sistema automaticamente altera SSPCON<CKP>=0, desabilitando o clock (pausa). Isso feito impondo-se nvel baixo (0) em SCL (sada). O flag PIR1<SSPIF> , ento, setado e a interrupo pode acontecer (se as chaves estiverem corretamente ligadas). importante que a interrupo acontea para que seja escrito o valor a ser transmitido em SSPBUF, o que ir fazer com que BF=1. Depois do buffer atualizado, para que a comunicao proceda, basta impor CKP=1. Neste momento, SCL ser novamente liberado (entrada). O clock ser liberado e o byte existente em SSPBUF ser enviado nos prximos oito pulsos. Ao trmino teremos BF=0. Mais uma vez o pino SDA fica aguardando um ACK no 9 pulso do clock. Caso seja recebido um ACK=1 porque a comunicao ser encerrada, sendo aguardada, ento, uma condio de Stop. Neste momento a condio ser reconhecida, setando-se o bit SSPSTAT<P> e finalizando-se a comunicao. A interrupo no gerada. Caso ACK=0, o sistema volta ao item 5 para que um novo byte de dado seja transmitido.

2.

3.

4.

5.

6.

7.

8.

9.

10. Durante a transferncia de dados no pode acontecer uma situao de ReStart. Para reiniciar completamente o sistema necessrio terminar a transferncia com um ACK=1 por parte do Master, seguido de um Stop. S ento uma nova condio de Start poder ser gerada.

Conectando o PIC 16F877A - Recursos Avanados

256
Caso tente-se escrever um valor em SSPBUF enquanto uma transmisso est em progresso (BF=1) o valor de SSPBUF no ser atualizado e o bit SSPCON<WCOL> ser selado, indicando uma coliso na escrita. Este bit deve ser limpo manualmente pelo programador.

Recepo para endereamento de 10 bits


1. Tanto SCL quanto SDA esto em sua configurao padro, isto , como entradas. A linha receber, ento, uma condio de Start. A condio de Start reconhecida e o bit SSPSTAT<S> selado; porm nenhuma interrupo acontece. O sistema aguardar ento um byte com os 2-bits de endereo (A9:A8) e mais o bit R/W=0, com oito pulsos de clock. Teremos, ento, SSPSTAT<R/W>=0. Como o byte recebido equivalente a um endereo, teremos tambm SSPSTAT<D/A>=0.

2.

3.

4. Neste momento o endereo recebido comparado automaticamente com o registrador SSPADD. Caso no seja o mesmo, a comunicao do lado Slave resetada (ACK=1) e o mesmo ficar aguardando um novo Start. Caso esta parte do endereo esteja correta, o bit SSPSTAT<BF> selado, informando que um valor foi transferido para o buffer (SSPBUF) e teremos SSPSTAT<UA>=1, indicando que o endereo deve ser atualizado. O pino SDA transformado automaticamente em sada com nvel baixo (ACK=0) e fica aguardando o 9 pulso de clock. Logo depois, SDA transformado novamente em entrada. Neste momento, o flag PIR1<SSPIF> setado e a interrupo pode acontecer (se as chaves estiverem corretamente ligadas). importante que a interrupo acontea para que seja feita uma leitura do SSPBUF, forando novamente BF=0. O registrador SSPADD deve, ento, ser atualizado com a parte baixa do endereo (A7:A0), o que forar automaticamente UA=0. Depois do ACK e at o momento em que o SSPADD atualizado, o Slave trava a comunicao (pausa) impondo um nvel baixo (0) em SCL. Este controle totalmente automtico.

5.

Ser aguardado, ento, um byte com a segunda parte do endereo (A7:A0), para os prximos oito pulsos do clock. Como o byte recebido ainda equivalente a um endereo, continuamos com SSPSTAT<D/A>=0. Todo o processo descrito para o item 4 ser ento repetido. No final, o sistema entra em nova pausa at que SSPADD seja novamente atualizado com a parte alta do endereo (A9:A8). O sistema aguardar ento um byte de dado, com mais oito pulsos de clock. Como o byte recebido equivalente a um dado, ento SSPSTAT<D/A>=1. Neste momento tambm teremos BF=1 e o dado ser colocado em SSPBUF. O pino SDA transformado automaticamente em sada com nvel baixo (ACK-0) e o sistema aguarda o 9 pulso do clock. Logo depois SDA transformado novamente em entrada. Uma nova interrupo acontece (SSPIF=1) para que o dado recebido possa ser tratado.

6.

7.

8.

9.

10. Novos bytes de dados podem continuar sendo recebidos at que uma condio de Stop seja imposta na linha. Neste momento, a condio ser reconhecida, setando-se o bit SSPSTAT<P> e finalizando-se a comunicao. A interrupo no gerada. 11. Caso seja recebido uma condio de Re-Start (entre um Start e um Stop), o Slave ficar esperando um novo byte de endereo, com o bit de R/W e no mais um byte de dados. Conectando o PIC 16F877A - Recursos Avanados

257
Os comentrios feitos a respeito do buffer e dos flags BF e SSPOV para a comunicao de 7-bits tambm so vlidos aqui.

Transmisso para endereamento de 10 bits


1. Tanto SCL quanto SDA esto em sua configurao padro, isto , como entradas. A linha receber, ento, uma condio de Start. A condio de Start reconhecida e o bit SSPSTAT<S> selado; porm nenhuma interrupo acontece. O sistema aguardar ento um byte com os 2 bits de endereo (A9:A8) e mais o bit R/W=0, com oito pulsos de clock. Teremos, ento, SSPSTAT<R/W>=0. Como o byte recebido equivalente a um endereo, teremos tambm SSPSTAT<D/A>=0.

2.

3.

4. Neste momento, o endereo recebido comparado automaticamente com o registrador SSPADD. Caso no seja o mesmo, a comunicao do lado Slave resetada (ACK=1) e ficar aguardando um novo Start. Caso esta parte do endereo esteja correta, o bit SSPSTAT<BF> selado, informando que um valor foi transferido para o buffer (SSPBUF) e teremos SSPSTAT<UA>=1, indicando que o endereo deve ser atualizado. O pino SDA transformado automaticamente em sada com nvel baixo (ACK=0) enquanto aguarda o 9 pulso do clock. Logo depois SDA transformado novamente em entrada. Neste momento, o flag PIR1<SSPIF> selado e a interrupo pode acontecer (se as chaves estiverem corretamente ligadas). importante que a interrupo acontea para que seja feita uma leitura do SSPBUF, forando novamente BF=0. O registrador SSPADD deve, ento, ser atualizado com a parte baixa de endereo (A7:A0), o que forar automaticamente UA=0. Depois do ACK e at o momento em que o SSPADD atualizado, o Slave trava a comunicao (pausa) impondo um nvel baixo (0) em SCL. Esse controle totalmente automtico.

5.

Ser aguardado ento um byte com a segunda parte do endereo (A7:A0) nos prximos oito pulsos do clock. Como o byte recebido ainda equivalente a um endereo, continuamos com SSPSTAT<D/A>=0. Todo o processo descrito para o item 4 ser repetido. No final o sistema entra em pausa at que SSPADD seja novamente atualizado com a parte alta do endereo (A9:A8). A linha fornecer, ento, uma condio de Re-Start, informando que o prximo byte novamente uma informao de controle. Ser aguardado, ento, outro byte com a parte alta do endereo e com R/W=1, para os prximos oito pulsos do clock. Como o byte recebido ainda equivalente a um endereo, continuamos com SSPSTAT<D/A>=0. O valor recebido ser colocado em SSPBUF e BF=1. O pino SDA transformado automaticamente em sada com nvel baixo (ACK=0), enquanto o sistema aguarda o 9 pulso do clock. Logo depois, SDA transformado novamente em entrada.

6.

7.

8.

9.

10. O sistema automaticamente altera SSPCON<CKP>=0, desabilitando o clock (pausa). Isso feito transformando SCL em sada com nvel baixo (0). 11. 0 flag PIR1<SSPIF> , ento, selado e a interrupo pode acontecer (se as chave estiverem corretamente ligadas). importante que a interrupo acontea para que SSPBUF seja lide. forando BF=0 novamente. Depois devemos escrever o valor a ser transmitido em SSPBUF, c que ir fazer com que BF=1. Conectando o PIC 16F877A - Recursos Avanados

258
12. Depois do buffer atualizado, para que a comunicao proceda, basta impor CKP=1. Neste momento, SCL ser novamente liberado. 13. O clock ser liberado e o byte existente em SSPBUF ser enviado nos prximos oito pulsos. Ao trmino teremos BF=0. 14. Mais uma vez o pino SDA fica aguardando um ACK no 9- pulso do clock. Caso seja recebido um ACK=1 porque a comunicao ser encerrada, sendo aguardada ento uma condio de Stop. Neste momento, a condio ser reconhecida, setando-se o bit SSPSTAT<P> e finalizando-se a comunicao. A interrupo no gerada. Caso ACK=0, o sistema volta ao item 5 para que um novo byte de dado seja transmitido. 15. Durante a transferncia de dados no pode acontecer uma nova situao de Re-Start, Para reiniciar completamente o sistema necessrio terminar a transferncia com um ACK=1 por parte do Master, seguido de um Stop. S ento uma nova condio de Start poder ser gerada. A condio de coliso (WCOL) descrita na comunicao de 7-bits tambm valida para a de 10-bits.

Tratamento da interrupo SSP


Como s existe uma interrupo de porta serial (SSP) e diversas condies, os bits adicionais desta porta devem ser checados para sabermos exatamente que atitude deve ser tomada. Veja algumas condies: BF 1 UA X D/A X SSPOV X Situao
Sempre que a interrupo acontecer BF=1 , porque alguma informao foi colocada em SSPBUF. Para o caso da transmisso, este flag pode ser checado para sabermos se o processo j terminou, evitando uma coliso (WCOL). Foi recebido um endereo. Como o endereo checado automaticamente, a interrupo deve somente ler SSPBUF para limpar BF. Somente quando configurada comunicao em 10 bits. A interrupo dever atualizar o endereo, primeiro com o valor baixo e da segunda vez com o valor alto. Esta situao s acontece para 7 bits ou quando recebido o segundo byte de controle para a transmisso quando operando em 10 bits, onde tambm teremos R/W=1 . Significa que a ltima informao recebida foi perdida, pois o SSPBUF no havia sido limpo.

Endereamento global
O Slave possui ainda um ltimo recurso, que podemos chamar de endereo global. Isso significa que o endereo O (zero) poder ser aceito automaticamente por todos os PICs. Desta forma, cada unidade da rede possui um endereo especfico (SSPADD) e um endereo global (Zero). Para habilitar o uso de endereo global em um mdulo Slave, basta ativar o bit SSPCON2<GCEN>: GCEN 0 1 Descrio Endereo global (Zero) Endereo global (Zero) habilitado. desabilitado.

Conectando o PIC 16F877A - Recursos Avanados

259
Quando o endereo global inserido na rede, todos os mdulos S/ave iro receber a informao e todos aqueles com GCEN devero responder com um ACK. Isso nos lembra um comentrio muito importante. Quando ACK=0, o Slave coloca SDA como sada em nvel baixo. Porm, quando ACK=1. SDA continua como entrada e o nvel alto imposto pelo resistor de pull-up. Isso possibilita que diversos mdulos respondam ACKs diferentes, tendo sempre a preferncia o erro, ou seja, ACK=0. Com a habilitao do endereo global a interrupo ser gerada e o tratamento ou no das informaes ser uma escolha do programador. Resumo dos registradores associados a I C Slave
Endereo 0Bh OCh 8Ch 94h 14h 91h 13h 93H Nome INTCON PIR1 PIE1 SSPSTAT SSPCON SPCON2 SSPBUF SSPADD Bit 7 GIE PSPIF PSPIE SMP WCOL GCEN Bit 6 PEIE ADIF ADIE CKE SSPOV ACKST AT Bit 5 T0IE RCIF RCIE D/A SSPEN ACKDT Bit 4 INTE TXIF TXIE P CKP ACKEN Bit 3 RBIE SSPIF SSPIE S SSMPM3 RCEN Bit 2 T0IF CCP1IF CCP1IE R/W SSPM2 PEN Bit 1 INTF TMR2IF TMR2IE UA SSPM1 RSEN Bit 0 RBIF TMR1IF TMR1IE BF SSPM0 SEM
2

Buffer de transmisso/recepo Endereo (Parte alte ou parte baixa)

No usado para essa finalidade. Para obter mais informaes, consulte apndice A

Modo Master
O Master no diferencia automaticamente o tipo de comunicao em 7 ou 10bits, ele somente transmite e recebe informaes de 8-bits. Por isso, toda a lgica da comunicao deve ser feita per intermdio do programa. Internamente, o PIC possui controle de hardware para os seguintes eventos: *Gerar/Monitorar condio de Start; *Gerar/Monitorar condio de Stop; *Gerar/Monitorar Acknowledge; *Gerar/Monitorar o clock,

*Gerar/Monitorar condio de Re-Start, *Transmitir informao de 8-bits; *Gerar/Monitorar condio de Pausa; *Receber informao de 8-bits.

Inicie sempre configurando os pinos SCL e SDA como entrada atravs do TRISC. Para configurarmos um PIC para trabalhar em modo Master, devemos ajustar os bits * SSPCON<SSPM3:SSPM0>:

SSPM3 SSPM0
2

DESCRIO I C Master, controle por hardware com Clock=Fosc / (4x (SSPADD+1)) Reservado Reservado Reservado Reservado Reservado

1000 1001 1010 1011 1100 1101

Conectando o PIC 16F877A - Recursos Avanados

260

SSPM3: SSPMO 1110 1111 Reservado Reservado

Descrio

Obs: As demais opes de configurao dizem 2 respeitos aos outros modos (SPI e I C Slave).

Depois, necessrio tambm ajustar o bit SSPSTAT<SMP> que, neste caso, serve para habilitar um sistema interno de tratamento das bordas, quando operando em freqncia de 400 kHz: SMP Descrio 0 Tratamento desabilitado. 1 Tratamento habilitado, quando usando 400 kHz. O bit SSPSTAT<CKE> serve para configurar o tipo de Smith Trigger utilizado nos pinos SCL e SDA: CKE 0 1 Descrio Entradas conforme especificaes I C. Entradas conforme especificaes SMBUS.
2

A freqncia do clock deve ser configurada atravs do registrador SSPADD, respeitando-se a seguinte frmula:

As freqncias padronizadas para o protocolo I C so as de 100 kHz e 400 kHz. Com o PIC, entretanto, possvel configurar outras freqncias. O fato que todos os perifricos da rede devem estar aptos a responder na freqncia escolhida. Por isso, o recomendvel verificar a freqncia mais alta suportada pelos perifricos e escolher o valor mais prximo possvel dos padronizados. Por ltimo, necessrio ainda habilitar o sistema de comunicao atravs do bit SSPCON<SSPEN>: SSPSI 0 1 Descrio Desabilita a comunicao. Habilita a comunicao. Neste momento os pinos SCL e SDA deixam de operar como l/Os convencionais

Feito isso, vejamos que tarefas sero feitas automaticamente e quais devero ser implementadas pelo programa. Trataremos separadamente os possveis casos de transferncia de informaes.

Transmisso para endereamento de 7 bits


1. Tanto SCL quanto SDA esto em sua configurao padro, isto , como entradas.

Conectando o PIC 16F877A - Recursos Avanados

261
2. Deve ser imposta uma condio de Start na linha. Para isso, basta ativar o bit SSPCON2<SEN>. A condio de Sfarf ser, ento, gerada automaticamente. Ao trmino do Start, o flag da interrupo ser ativado (SSPIF=1) e SEN=0. Deve-se, ento, escrever em SSPBUF o endereo do perifrico com o qual desejamos nos comunicar. O endereo deve ser escrito nos bits de 7 a 1. O bit O deve ser considerado como o valor R/W=0. Automaticamente, logo aps a escrita no registrador SSPBUF, teremos SSPSTAT<BF>=1, SSPSTAT<R/W>=1 e o byte ser transmitido atravs de oito pulsos gerados em SCL. No trmino da transmisso teremos novamente BF=0. O pino SDA aguarda um ACK (deve ser 0) no Q- pulso do clock. O valor recebido armazenado no bit SSPCON2<ACKSTAT>. O valor de ACK no checado automaticamente. Neste momento, R/W=0 e SSPIF=1, podendo gerar uma nova interrupo. O dado a ser transmitido , ento, colocado em SSPBUF. Teremos BF=1 e R/W=1. Mais uma vez teremos a transmisso do byte atravs de oito pulsos em SCL, a partir de momento em que nenhum perifrico esteja solicitando uma pausa. No trmino BF=0. Novamente o pino SDA aguarda um ACK (deve ser 0) no 9s pulso do clock. O valor recebido e armazenado no bit SSPCON2<ACKSTAT>. O valor de ACK no checado automaticamente.

3.

4.

5.

6. 7.

8.

9.

10. Neste momento R/W=0 e SSPIF=1, podendo gerar outra interrupo. 11. Se um novo byte deve ser transmitido, o processo reiniciado no item 7. Para interromper a transmisso, uma condio de Stop deve ser gerada. Isso conseguido por intermdio do bit SSPCON2<PEN>=1. 12. No final da condio de Stop teremos automaticamente PEN=0 e SSPIF=1.

Recepo para endereamento de 7 bits


1. Tanto SCL quanto SDA esto em sua configurao padro, isto , como entradas. Deve ser imposta uma condio de Start na unha. Para isso, basta ativar o bit SSPCON2<SEN>. A condio de Start ser, ento, gerada automaticamente. Ao trmino do Start, o flag da interrupo ser ativado (SSPIF=1) e SEN=0. Deve-se, ento escrever em SSPBUF o endereo do perifrico com o qual desejamos nos comunicar. O endereo deve ser escrito nos bits de 7 a 1. O bit 0 deve ser considerado como o valor R/W=1. Automaticamente, logo aps a escrita no registrador SSPBUF, teremos SSPSTAT<BF>=1. SSPSTAT<R/W>=1 e o byte ser transmitido atravs de oito pulsos gerados em SCL. No trmino da transmisso teremos novamente BF=0. O pino SDA aguarda um ACK (deve ser 0) no 99 pulso do clock. O valor recebido armazenado no bit SSPCON2<ACKSTAT>. O valor de ACK no checado automaticamente. Neste momento, R/W=0 e SSPIF=1, podendo gerar uma nova interrupo. Conectando o PIC 16F877A - Recursos Avanados

2.

3.

4.

5.

6.

262

7. 8.

O Master deve, ento, ser colocado em modo de recepo, ajustando-se SSPCON2<RCEN>=1. Assim que a linha de clock no estiver em pausa, ser aguardado um byte de dados, para os prximos oito pulsos do clock. Como o byte recebido equivalente a um dado, teremos SSPSTAT<D/A>=1. O valor recebido ser colocado em SSPBUF e BF=1. Neste momento, RCEN=0 (automaticamente) desligando-se o modo de recepo. Tambm teremos SSPIF=1, gerando uma nova interrupo.

9.

10. Se um novo byte deve ser recebido, ento o Master dever responder ACK=0. Caso seja o ltimo byte desejado, ento ACK=1. Para responder o ACK, o valor desejado deve ser colocado no bit SSPCON2<ACKDT>. Liga-se a gerao do sinal de ACK atravs de SSPCON2<ACKEN>=1. 11. Ao trmino do ACK teremos ACKEN=0 e SSPIF=1, gerando-se outra interrupo. Caso tenha sido respondido ACK=0, ento o processo deve retornar ao item 5 para que um novo byte seja recebido. Se ACK=1, o processo deve ser finalizado atravs de uma condio de Stop que ser gerada com SSPCON2<PEN>. 12. No final da condio de Stop teremos automaticamente PEN=0 e SSPIF=1.

Existem duas situaes que podem gerar uma transmisso: O Master efetua uma pergunta e deseja uma resposta: Neste caso, primeiramente ser feita uma recepo pelo Slave (pergunta) e depois uma transmisso (resposta). Entre a pergunta e a resposta pode ser gerada uma condio de Re-Start, no sendo necessrio liberar a linha (Stop). 2 Um exemplo disso so as memrias E PROM externas. Primeiro devemos informar qual endereo desejamos acessar para que depois ela responda o valor contido no endereo em questo. O Master s deseja uma resposta: Em casos de Slaves mais "burros" provvel que somente com seu endereo j seja possvel responder corretamente. Por exemplo, para um mdulo de teclado, basta que ele transmita o nmero da tecla pressionada, no precisando processar perguntas diferentes.

Transmisso para endereamento de 10 bits


1. Tanto SCL quanto SDA esto em sua configurao padro, isto , como entradas. Deve ser imposta uma condio de Start na linha. Para isso, basta ativar o bit SSPCON2<SEN>. A condio de Start ser, ento, gerada automaticamente. Ao trmino do Start, o flag da interrupo ser ativado (SSPIF=1) e SEN=0. Deve-se, ento, escrever em SSPBUF a parte alta do endereo do perifrico com o qual desejamos nos comunicar. Os 2 bits do endereo (A9:A8) devem ser escritos nos bits de 2 e 1. O bit 0 deve ser considerado como o valor R/W=0. Os demais bits (7:3) devem conter os valores 11110. Automaticamente, logo aps a escrita no registrador SSPBUF, teremos SSPSTAT<BF>=1,SSPSTAT<R/W>=1 e o byte ser transmitido atravs de oito pulsos gerados em SCL. No trmino da transmisso teremos novamente BF=0. Conectando o PIC 16F877A - Recursos Avanados

2.

3.

4.

263
5. O pino SDA aguarda um ACK (deve ser 0) no 9 pulso do clock. O valor recebido armazenado no bit SSPCON2<ACKSTAT>. O valor de ACK no checado automaticamente. Neste momento, R/W=0 e SSPIF=1, podendo gerar uma nova interrupo. A segunda parte do endereo (A7:A0) , ento, escrita em SSPBUF. Automaticamente, logo aps a escrita no registrador SSPBUF, teremos SSPSTAT<BF>=1. SSPSTAT<R/W>=1 e o byte ser transmitido atravs de oito pulsos gerados em SCL. No trmino da transmisso teremos novamente BF=0. O pino SDA aguarda um ACK (deve ser 0) no 9e pulso do clock. O valor recebido armazenado no bit SSPCON2<ACKSTAT>. O valor de ACK no checado automaticamente.

6. 7. 8.

9.

10. Neste momento, R/W=0 e SSPIF=1, podendo gerar uma nova interrupo. 11. O dado a ser transmitido , ento, colocado em SSPBUF. Teremos BF=1 e R/W=1. 12. Mais uma vez teremos a transmisso do byte atravs de oito pulsos em SCL, a partir de momento em que nenhum perifrico esteja solicitando uma pausa. No trmino BF=0; 13. Novamente o pino SDA aguarda um ACK (deve ser 0) no 99 pulso do clock. O valor recebido armazenado no bit SSPCON2<ACKSTAT>. O valor de ACK no checado automaticamente. 14. Neste momento, R/W=0 e SSPIF=1, podendo gerar outra interrupo. 15. Se um novo byte deve ser transmitido, o processo reiniciado no item 11. Para interromper a transmisso, uma condio de Stop deve ser gerada. Isso conseguido por intermdio do br. SSPCON2<PEN>=1. 16. No final da condio de Stop teremos automaticamente PEN=0 e SSPIF=1.

Recepo para endereamento de 10 bits


1. Tanto SCL quanto SDA esto em sua configurao padro, isto , como entradas. Deve ser imposta uma condio de Start na linha. Para isso, basta ativar o bit SSPCON2<SEN>. A condio de Start ser, ento, gerada automaticamente.
Ao trmino do Start, o flag da interrupo ser ativado (SSPIF=1) e SEN=0. Deve-se, ento escrever em SSPBUF a parte alta do endereo do perifrico com o qual desejamos nos comunicar. Os 2 bits do endereo (A9:A8) devem ser escritos nos bits de 2 e 1. O bit 0 deve ser considerado como o valor R/W=0. Os demais bits (7:3) devem conter os valores 11110.

2.

3.

4. Automaticamente, logo aps a escrita no registrador SSPBUF, teremos SSPSTAT<BF>=1, SSPSTAT<R/W>=1 e o byte ser transmitido atravs de oito pulsos gerados em SCL. No trmino da transmisso teremos novamente BF=0.

5.

O pino SDA aguarda um ACK (deve ser 0) no 99 pulso do clock. O valor recebido armazenado no bit SSPCON2<ACKSTAT>. O valor de ACK no checado automaticamente. Neste momento, R/W=0 e SSPIF=1, podendo gerar uma nova interrupo. A segunda parte do endereo (A7:AO) , ento, escrita em SSPBUF. Conectando o PIC 16F877A - Recursos Avanados

6. 7.

264

8.

Automaticamente, logo aps a escrita no registrador SSPBUF, teremos SSPSTAT<BF>=1, SSPSTAT<R/W>=1 e o byte ser transmitido atravs de oito pulsos gerados em SCL. No trmino da transmisso teremos novamente BF=0. O pino SDA aguarda um ACK (deve ser 0) no 9 pulso do clock. O valor recebido armazenado no bit SSPCON2<ACKSTAT>. O valor de ACK no checado automaticamente.

9.

10. Neste momento, R/W=0 e SSPIF=1, podendo gerar uma nova interrupo. 11. Deve ser gerada ento uma condio de fle-Start. Para isso, basta ativar o bit SSPCON2<RSEN>=1. 12. Ao trmino do Re-Start, o flag da interrupo ser ativado (SSPIF=1) e RSEN=0. 13. Mais uma vez devemos colocar em SSPBUF o valor 11110, seguido dos bits A9:A8 e o ltimo bit como R/W=1. Teremos BF=1 e R/W=1. 14. Teremos novamente a transmisso do byte atravs de oito pulsos em SCL, a partir do momento em que nenhum perifrico esteja solicitando uma pausa. No trmino BF=0. 15. Novamente o pino SDA aguarda um ACK (deve ser 0) no 9 pulso do clock. O valor recebido armazenado no bit SSPCON2<ACKSTAT>. O valor de ACK no checado automaticamente. 16. Neste momento, R/W=0 e SSPIF=1, podendo gerar outra interrupo. 17. O Master deve, ento, ser colocado em modo de recepo, ajustando-se SSPCON2<RCEN>=1. 18. Assim que a linha de clock no estiver em pausa, ser aguardado um byte de dados para os prximos oito pulsos do clock. Como o byte recebido equivalente a um dado, teremos SSPSTAT<D/A>=1. O valor recebido ser colocado em SSPBUF e BF=1. 19. Neste momento, RCEN=0 (automaticamente) desligando-se o modo de recepo. Tambm teremos SSPIF=1, gerando uma nova interrupo. 20. Se um novo byte deve ser recebido, ento o Master dever responder ACK=0. Caso seja o ltimo byte desejado, ento ACK=1. Para responder o ACK, o valor desejado deve ser colocado no bit SSPCON2<ACKDT>. Liga-se a gerao do sinal de ACK atravs de SSPCON2<ACKEN>=1. 21. Ao trmino do ACK teremos ACKEN=0 e SSPIF=1, gerando-se outra interrupo. Caso tenha sido respondido ACK=0, ento o processo deve retornar ao item 13 para que um novo byte seja recebido. Se ACK=1, o processo deve ser finalizado por intermdio de uma condio de Stop que ser gerada com SSPCON2<PEN>. 22. No final da condio de Stop teremos automaticamente PEN=0 e SSPIF=1.

Outras consideraes
Existem outros bits e flags envolvidos com o Mas/erque no foram comentados at o momento. Como um sistema pode possuir mais de um Master, as condies de Start e Conectando o PIC 16F877A - Recursos Avanados

265
Stop geradas na linha acarretaro na ativao de SSPIF, podendo gerar uma interrupo em qualquer Master. Os flags SSPSTAT<S> e SSPSTAT<P> informam, respectivamente, as condies de Start e Stop. Desta forma possvel que outros Masters percebam quando a linha est ou no ocupada. Aqui valem tambm os comentrios para os flags SSPCON<WCOL> e SSPCON<SSPOV> que indicam, respectivamente, uma escrita invlida (na hora errada) em SSPBUF e o recebimento de um novo byte sem a leitura do byte anterior. As condies de Start, Stop, Re-Start e ACK no podem ser geradas fora dos momentos corretos, quando o modo de comunicao no est em stand-by. A situao de stand-by acontece sempre que o hardware da I2C acaba o controle de um evento qualquer.

Conectando o PIC 16F877A - Recursos Avanados

266
Deteco de coliso na linha (Bus colision)
Outro recurso que o Master possui est relacionado coliso de informaes na linha de dados (SDA). Vejamos como isso funciona. Para que o PIC possa impor o nvel baixo da linha (normalmente ns consideramos uma condio de sada) existe um transistor interno conectando esse pino ao GND. Quando essa conexo est feita, a linha realmente est em nvel baixo e no h o que monitorar. No outro caso, entretanto, quando esse transistor est em aberto, o pino considerado uma entrada e o nvel alto imposto pelo resistor de pull-up (externo). Nesta situao, o PIC monitora a linha. Caso seja necessrio transmitir um bit em ' (nvel alto / transistor aberto) e a linha esteja em zero, porque algum outro ponto da rede est em conflito de comunicao. Quando isso acontecer, o bit PIR2<BCLIF> ser selado, e se PIE2<BCLIE>=1 a interrupo ser gerada. Teremos ainda o reset do sistema de comunicao, voltando ao estado de stand-by. As colises podem acontecer durante a transmisso de dados e as condies de Start, Stop, Re-Start e ACK. Resumo dos registradores associados a I2C Master
Endereo 0Bh... OCh 8Ch 94h 14h 91h 13h 93h Nome INTCON PIR1 PIE1 SSPSTAT SSPCON SSPCON2 SSPBUF SSPADD Bit7 GIE PSPIF PSPIE SMP WCOL GCEN Bit6 PEIE ADIF ADIE CKE SSPOV ACKSTAT Bit5 T0IE RCIF Bit4 INTE TXIF Bit3 RBIE SSPIF Bit2 T0IF CCP1IF Bit1 INTF TMR2IF TMR2IE UA SSPM1 RSEN Bit0 RBIF TMR1IF TMR1IE BF SSPM0 SEN

RCIE TXIE SSPIE CCP1IE D/A P S R/W SSPEN CKP SSPM3 SSPM2 ACKDT ACKEN RCEN PEN Buffer de transmisso/recepo Ajuste da frequncia

No usado para essa finalidade. Para obter mais informaes, consulte apndice A

Lgica do exemplo
Nosso exemplo para este captulo usar somente uma parte da teoria 2 apresentada. Faremos uso x protocolo I C, operando como Master, para comunicao 2 com uma memria E PROM externa. A memria em questo a 24C04, a mesma indicada no esquema do apndice F. Implementamos, ento, um sistema muito simples que mostra um valor no LCD, podendo o mesmo ser alterado atravs de dois botes (S1 e S2). Esse valor apresentado em hexadecimal e pode varar de 00 a FF. Atravs do boto S3 salvamos o valor atual em uma posio fixa da memria. O valor pode, ento, ser novamente alterado atravs dos botes. Para recuperar o valor salvo anteriormente, basta pressionar o boto S4. Essa memria trabalha com o protocolo I C de 7 bits. No entanto, ela distorce um pouco e interpretao desse protocolo. Para que ela funcione, devemos respeitar o seguinte: O endereo (posio dentro da memria) onde queremos escrever foi dividido em 2 bytes ENDERECO_HIGH (P10:P8) e ENDERECO_LOW (P7:P0), pois essa memria possui 0,5 Kbyte
2

Conectando o PIC 16F877A - Recursos Avanados

267
disponvel e, portanto, mais de 8 bits so necessrios para enderear toda a memria. Assim sendo, para escrever um byte nessa memria devemos primeiramente enviar a posio (endereo interno) e depois o dado. Esse tipo de memria no aceita endereamento na rede, isto , aquele endereamento suportado pelo protocolo I2C. Por isso, ela substitui o byte de endereamento por outro chamado de controle. O byte de controle composto por: 1 0 1 0 P10 P9 P8 R/W

Onde P10:P8 a parte alta da posio onde desejamos escrever dentro da memria e R/W o flag que indica se estaremos efetuando uma operao de escrita (R/W=0) ou leitura (R/W=1). No caso dessa memria, s usado o bit P8 (512 bytes > 9 bits). O segundo byte enviado (byte de dado no protocolo I C) equivalente ao complemento do endereo, isto , sua parte baixa: P7 P6 P5 P4 P3 P2 P1 P0
2

Desta forma, teremos operaes diferenciadas para a escrita e leitura da E2PROM externa.

Conectando o PIC 16F877A - Recursos Avanados

268

Esquema eltrico

Conectando o PIC 16F877A - Recursos Avanados

269

Conectando o PIC 16F877A - Recursos Avanados

270

Conectando o PIC 16F877A - Recursos Avanados

271

Conectando o PIC 16F877A - Recursos Avanados

272

Conectando o PIC 16F877A - Recursos Avanados

273

Conectando o PIC 16F877A - Recursos Avanados

274
;************************************** ;* ;* ;* ;* ;* ;************************************** ; * VERSO : 2.0 ;* DATA : 24/02/2003 ;************************************** * * CONECTANDO O PIC - RECURSOS AVANADOS EXEMPLO 8 * NICOLS CSAR LAVINIA e DAVID JOS DE SOUZA * * * *

;************************************** ;* DESCRIO GERAL *

;************************************** ; ESTE EXEMPLO FOI ELABORADO PARA EXPLICAR O FUNCIONAMENTO DA LEITURA/ESCRITA ; NA MEMRIA E2PROM SERIAL EXTERNA, UTILIZANDO O MASTER I2C. ; ;************************************** ;* CONFIGURAES PARA GRAVAO *

;**************************************

__CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_ON & _XT_OSC

;************************************** ;* DEFINIO DAS VARIVEIS *

;************************************** ; ESTE BLOCO DE VARIVEIS EST LOCALIZADO LOGO NO INCIO DO BANCO 0

CBLOCK 0X20

; POSIO INICIAL DA RAM

FILTRO_BOTOES TEMPO_TURBO

; FILTRO PARA RUIDOS ; TEMPORIZADOR P/ TURBO DAS TECLAS

TEMPO1

Conectando o PIC 16F877A - Recursos Avanados

275
TEMPO0 ; CONTADORES P/ DELAY

FLAG

; FLAG DE USO GERAL

AUX

; REGISTRADOR AUXILIAR DE USO GERAL

ENDERECO_HIGH ENDERECO_LOW

; REGISTRADORES DE ENDEREO PARA ; ACESSO MEMRIA EEPROM SERIAL EXTERNA ; MAPEADOS NO BANCO 0 DA RAM

BUFFER EEPROM SERIAL

; REGISTRADOR PARA LEITURA/GRAVAO NA

; EXTERNA

VALOR_DADOS EXTERNA

; REGISTRADOR DE DADO PARA EEPROM SERIAL

; MAPEADO NO BANCO 0 DA RAM ENDC

;************************************** ;* DEFINIO DAS VARIVEIS INTERNAS DO PIC *

;************************************** ; O ARQUIVO DE DEFINIES DO PIC UTILIZADO DEVE SER REFERENCIADO PARA QUE ; OS NOMES DEFINIDOS PELA MICROCHIP POSSAM SER UTILIZADOS, SEM A NECESSIDADE ; DE REDIGITAO.

#INCLUDE <P16F877A.INC>

; MICROCONTROLADOR UTILIZADO

;************************************** ;* DEFINIO DOS BANCOS DE RAM *

;************************************** ; OS PSEUDOS-COMANDOS "BANK0" E "BANK1", AQUI DEFINIDOS, AJUDAM A COMUTAR ; ENTRE OS BANCOS DE MEMRIA.

#DEFINE BANK1 #DEFINE BANK0

BSF BCF

STATUS,RP0 STATUS,RP0

; SELECIONA BANK1 DA MEMORIA RAM ; SELECIONA BANK0 DA MEMORIA RAM

Conectando o PIC 16F877A - Recursos Avanados

276

;************************************** ;* CONSTANTES INTERNAS *

;************************************** ; A DEFINIO DE CONSTANTES FACILITA A PROGRAMAO E A MANUTENO.

FILTRO_TECLA

EQU

.200

; FILTRO P/ EVITAR RUIDOS DOS BOTES

TURBO_TECLA

EQU

.60

; TEMPORIZADOR P/ TURBO DAS TECLAS

END_EEPROM_H EQU END_EEPROM_L EQU

0X00 0X00

; ENDEREO P/ LEITURA E GRAVAO ; NA MEMRIA EEPROM SERIAL

;************************************** ;* DECLARAO DOS FLAGs DE SOFTWARE *

;************************************** ; A DEFINIO DE FLAGs AJUDA NA PROGRAMAO E ECONOMIZA MEMRIA RAM.

#DEFINE F_ERRO

FLAG,0

; 1 --> ERRO NA LEITURA DA EEPROM SERIAL

;************************************** ;* ENTRADAS *

;************************************** ; AS ENTRADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE.

#DEFINE BOTAO_0

PORTB,0

; ESTADO DO BOTO 0 ; 1 -> LIBERADO ; 0 -> PRESSIONADO

#DEFINE BOTAO_1

PORTB,1

; ESTADO DO BOTO 1 ; 1 -> LIBERADO ; 0 -> PRESSIONADO

#DEFINE BOTAO_2

PORTB,2

; ESTADO DO BOTO 2

Conectando o PIC 16F877A - Recursos Avanados

277
; 1 -> LIBERADO ; 0 -> PRESSIONADO

#DEFINE BOTAO_3

PORTB,3

; ESTADO DO BOTO 3 ; 1 -> LIBERADO ; 0 -> PRESSIONADO

;************************************** ;* SADAS *

;************************************** ; AS SADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE.

#DEFINE DISPLAY

PORTD

; BARRAMENTO DE DADOS DO DISPLAY

#DEFINE RS

PORTE,0

; INDICA P/ O DISPLAY UM DADO OU COMANDO ; 1 -> DADO ; 0 -> COMANDO

#DEFINE ENABLE

PORTE,1

; SINAL DE ENABLE P/ DISPLAY ; ATIVO NA BORDA DE DESCIDA

#DEFINE SCL

PORTC,3

; VIA DE CLOCK DA EEPROM ; I/O DEVE ESTAR COMO SADA

;************************************** ;* ENTRADAS/SADAS *

;**************************************

#DEFINE SDA

PORTC,4

; VIA DE DADOS BIDIRECIONAL DA EEPROM ; I/O DEVE INICIAR COMO ENTRADA

;************************************** ;* VETOR DE RESET DO MICROCONTROLADOR *

;**************************************

Conectando o PIC 16F877A - Recursos Avanados

278
; POSIO INICIAL PARA EXECUO DO PROGRAMA

ORG GOTO

0X0000 CONFIG

; ENDEREO DO VETOR DE RESET ; PULA PARA CONFIG DEVIDO A REGIO ; DESTINADA AS ROTINAS SEGUINTES

;************************************** ;* ROTINA DE DELAY (DE 1MS AT 256MS) *

;************************************** ; ESTA UMA ROTINA DE DELAY VARIVEL, COM DURAO DE 1MS X O VALOR PASSADO ; EM WORK (W).

DELAY_MS MOVWF TEMPO1 MOVLW .250 MOVWF TEMPO0 ; CARREGA TEMPO0 (P/ CONTAR 1MS) ; CARREGA TEMPO1 (UNIDADES DE MS)

CLRWDT DECFSZ TEMPO0,F GOTO $-2

; LIMPA WDT (PERDE TEMPO) ; FIM DE TEMPO0 ? ; NO - VOLTA 2 INSTRUES ; SIM - PASSOU-SE 1MS

DECFSZ TEMPO1,F GOTO $-6

; FIM DE TEMPO1 ? ; NO - VOLTA 6 INSTRUES ; SIM

RETURN

; RETORNA

;************************************** ;* ROTINA DE ESCRITA DE UM CARACTER NO DISPLAY *

;************************************** ; ESTA ROTINA ENVIA UM CARACTER PARA O MDULO DE LCD. O CARACTER A SER ; ESCRITO DEVE SER COLOCADO EM WORK (W) ANTES DE CHAMAR A ROTINA.

ESCREVE MOVWF DISPLAY NOP ; ATUALIZA DISPLAY (PORTD) ; PERDE 1US PARA ESTABILIZAO

Conectando o PIC 16F877A - Recursos Avanados

279
BSF GOTO BCF ENABLE $+1 ENABLE ; ENVIA UM PULSO DE ENABLE AO DISPLAY ;. ;.

MOVLW .1 CALL RETURN DELAY_MS ; DELAY DE 1MS ; RETORNA

;************************************** ;* ROTINA DE ESCRITA LINHA 1 DO LCD *

;************************************** ; ESTA ROTINA ESCREVE A LINHA 1 DA TELA PRINCIPAL DO LCD, COM A FRASE: ; LINHA 1 - " MASTER I2C "

ATUALIZA_TELA_LINHA_1 BCF RS ; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 0 / COLUNA 3 ; SELECIONA O DISPLAY P/ DADOS

MOVLW 0X83 CALL BSF ESCREVE RS

; COMANDOS PARA ESCREVER AS ; LETRAS DE "MASTER I2C" MOVLW 'M' CALL ESCREVE

MOVLW 'A' CALL ESCREVE

MOVLW 'S' CALL ESCREVE

MOVLW 'T' CALL ESCREVE

MOVLW 'E' CALL ESCREVE

MOVLW 'R' CALL ESCREVE

MOVLW ' '

Conectando o PIC 16F877A - Recursos Avanados

280
CALL ESCREVE

MOVLW 'I' CALL ESCREVE

MOVLW '2' CALL ESCREVE

MOVLW 'C' CALL ESCREVE

RETURN

; RETORNA

;************************************** ;* ROTINA DE ESCRITA LINHA 2 DO LCD *

;************************************** ; ESTA ROTINA ESCREVE A LINHA 2 DA TELA PRINCIPAL DO LCD. ; A ROTINA LEVA EM CONTA A VARIVEL VALOR_DADOS PARA FORMAR A LINHA 2.

ATUALIZA_TELA_LINHA_2 BCF RS ; SELECIONA O DISPLAY P/ COMANDO ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 6

MOVLW 0XC6 CALL ESCREVE

BSF

RS

; SELECIONA O DISPLAY P/ DADOS

SWAPF VALOR_DADOS,W ANDLW B'00001111' MOVWF AUX

; INVERTE NIBLE DO VALOR_DADOS ; MASCARA BITS MAIS SIGNIFICATIVOS ; SALVA EM AUXILIAR

MOVLW 0X0A SUBWF AUX,W MOVLW 0X30 BTFSC STATUS,C ; AUX - 10d (ATUALIZA FLAG DE CARRY) ; CARREGA WORK COM 30h ; RESULTADO POSITIVO? ( UMA LETRA?) ; SIM - CARREGA WORK COM 37h ; NO - WORK FICA COM 30h (NMERO) ADDWF AUX,W ; SOMA O WORK AO AUXILIAR ; (CONVERSO ASCII)

MOVLW 0X37

Conectando o PIC 16F877A - Recursos Avanados

281
CALL ESCREVE ; ENVIA CARACTER AO DISPLAY LCD

MOVF

VALOR_DADOS,W

; CARREGA WORK COM VALOR_DADOS ; MASCARA BITS MAIS SIGNIFICATIVOS ; SALVA EM AUXILIAR

ANDLW B'00001111' MOVWF AUX

MOVLW 0X0A SUBWF AUX,W MOVLW 0X30 BTFSC STATUS,C ; AUX - 10d (ATUALIZA FLAG DE CARRY) ; CARREGA WORK COM 30h ; RESULTADO POSITIVO? ( UMA LETRA?) ; SIM - CARREGA WORK COM 37h ; NO - WORK FICA COM 30h (NMERO) ADDWF AUX,W ; SOMA O WORK AO AUXILIAR ; (CONVERSO ASCII) CALL ESCREVE ; ENVIA CARACTER AO DISPLAY LCD

MOVLW 0X37

MOVLW 'h' CALL RETURN ESCREVE ; ESCREVE "h" NO DISPLAY ; RETORNA

;************************************** ;* ROTINA DE CHECAGEM DE EVENTOS I2C LIBERADOS *

;************************************** ; ESTA ROTINA AGUARDA AT QUE TODOS OS EVENTOS DA I2C ESTEJAM LIBERADOS.

AGUARDA_I2C_LIVRE BANK1 BTFSC SSPSTAT,R_W GOTO MOVF $-1 SSPCON2,W ; MASCARA SSPCON2 (ATUALIZA FLAG ZERO) ; BITS DE EVENTOS LIBERADOS? ; NO - AGUARDA ; SIM - VOLTA P/ BANK0 ; RETORNA ; ALTERA P/ BANK1 ; EST OCORRENDO ALGUM EVENTO I2C? ; SIM, ESPERA TERMINAR

ANDLW B'00011111' BTFSS GOTO BANK0 RETURN STATUS,Z $-3

Conectando o PIC 16F877A - Recursos Avanados

282

;************************************** ;* ACK OUT *

;************************************** ; ESTA ROTINA ENVIA UM ACK OUT PARA O BARRAMENTO I2C.

ACK_OUT BANK1 BCF BSF BANK0 RETURN SSPCON2,ACKDT SSPCON2,ACKEN ; ALTERA P/ BANK1 ; CARREGA ACK ; TRANSMITE ; VOLTA P/ BANK0 ; RETORNA

;************************************** ;* NACK OUT *

;************************************** ; ESTA ROTINA ENVIA UM NACK OUT PARA O BARRAMENTO I2C.

NACK_OUT BANK1 BSF BSF BANK0 RETURN SSPCON2,ACKDT SSPCON2,ACKEN ; ALTERA P/ BANK1 ; CARREGA NACK ; TRANSMITE ; VOLTA P/ BANK0 ; RETORNA

;************************************** ;* ROTINA PARA TESTAR SE O ACK FOI RECEBIDO *

;************************************** ; ESTA ROTINA TESTA O BIT DE ACK RECEBIDO NO REGISTRADOR SSPCON2. PARA ; FACILITAR O RESTANTE DO SOFTWARE, A ROTINA COPIA ESTE FLAG NO FLAG F_ERRO ; PRESENTE NO BANCO 0 DA RAM, POIS O REGISTRADOR SSPCON2 ENCONTRA-SE NO BANK1.

TESTA_ACK BANK1 BTFSC SSPCON2,ACKSTAT ; ALTERA P/ BANK1 ; RECEBEU ACK ?

Conectando o PIC 16F877A - Recursos Avanados

283
GOTO RECEBEU_NACK ; NO - SINALIZA ERRO ; SIM BANK0 BCF RETURN F_ERRO ; VOLTA P/ BANK0 ; LIMPA FLAG DE ERRO ; RETORNA

RECEBEU_NACK BANK0 BSF RETURN F_ERRO ; VOLTA P/ BANK0 ; SETA FLAG P/ INDICAR ERRO ; RETORNA

;************************************** ;* LEITURA DA EEPROM SERIAL EXTERNA *

;************************************** ; ESTA ROTINA L A MEMRIA SERIAL EXTERNA. O ENDEREO DEVE SER PASSADO PELAS ; VARIVEIS ENDERECO_HIGH E ENDERECO_LOW. O VALOR LIDO RETORNADO EM BUFFER. ; CASO ALGUM ERRO DE LEITURA OCORRA, A ROTINA DESVIA P/ I2C_ERRO.

I2C_EEPROM_READ BANK1 BSF BANK0 CALL AGUARDA_I2C_LIVRE SSPCON2,SEN ; ALTERA P/ BANK1 ; INICIA START BIT ; VOLTA P/ BANK0 ; AGUARDA FIM DO EVENTO

BCF RLF IORLW

STATUS,C ENDERECO_HIGH,W B'10100000'

; ZERA O CARRY ; ROTACIONA ENDERECO_HIGH ; JUNTA AO BYTE DE CONTROLE ; TRANSMITE CONTROLE + END_HIGH ; AGUARDA FIM DO EVENTO ; CHAMA ROTINA P/ TESTAR ACK ; OCORREU ERRO DE ACK ? ; SIM - PULA P/ I2C_ERRO ; NO

MOVWF SSPBUF CALL CALL BTFSC GOTO AGUARDA_I2C_LIVRE TESTA_ACK F_ERRO I2C_ERRO

MOVF

ENDERECO_LOW,W ; TRANSMITE ENDEREO BAIXO

MOVWF SSPBUF

Conectando o PIC 16F877A - Recursos Avanados

284
CALL CALL BTFSC GOTO AGUARDA_I2C_LIVRE TESTA_ACK F_ERRO I2C_ERRO ; AGUARDA FIM DO EVENTO ; CHAMA ROTINA P/ TESTAR ACK ; OCORREU ERRO DE ACK ? ; SIM - PULA P/ I2C_ERRO ; NO

BANK1 BSF BANK0 CALL AGUARDA_I2C_LIVRE SSPCON2,RSEN

; ALTERA P/ BANK1 ; REINICIA START BIT ; VOLTA P/ BANK0 ; AGUARDA FIM DO EVENTO

RLF IORLW

ENDERECO_HIGH,W B'10100001'

; ROTACIONA ENDERECO_HIGH ; JUNTA AO BYTE DE CONTROLE ; TRANSMITE CONTROLE + END_HIGH ; AGUARDA FIM DO EVENTO ; CHAMA ROTINA P/ TESTAR ACK ; OCORREU ERRO DE ACK ? ; SIM - PULA P/ I2C_ERRO ; NO

MOVWF SSPBUF CALL CALL BTFSC GOTO AGUARDA_I2C_LIVRE TESTA_ACK F_ERRO I2C_ERRO

BANK1 BSF BANK0 CALL MOVF AGUARDA_I2C_LIVRE SSPBUF,W SSPCON2,RCEN

; ALTERA P/ BANK1 ; INICIA LEITURA DO BYTE ; VOLTA P/ BANK0 ; AGUARDA FIM DO EVENTO

MOVWF BUFFER CALL CALL NACK_OUT AGUARDA_I2C_LIVRE

; SALVA DADO EM BUFFER ; ENVIA NACK --> FIM ; AGUARDA FIM DO EVENTO

BANK1 BSF BANK0 CALL AGUARDA_I2C_LIVRE SSPCON2,PEN

; ALTERA P/ BANK1 ; INICIA STOP BIT ; VOLTA P/ BANK0 ; AGUARDA FIM DO EVENTO

RETURN

; RETORNA

Conectando o PIC 16F877A - Recursos Avanados

285

;************************************** ;* ESCRITA NA EEPROM SERIAL EXTERNA *

;************************************** ; ESTA ROTINA GRAVA UM DADO NA MEMRIA SERIAL EXTERNA. O ENDEREO DEVE SER ; PASSADO PELAS VARIVEIS ENDERECO_HIGH E ENDERECO_LOW. O VALOR A SER GRAVADO ; DEVE SER PASSADO EM BUFFER. ; CASO ALGUM ERRO DE GRAVAO OCORRA, A ROTINA DESVIA P/ I2C_ERRO.

I2C_EEPROM_WRITE BANK1 BSF BANK0 CALL AGUARDA_I2C_LIVRE SSPCON2,SEN ; ALTERA P/ BANK1 ; INICIA START BIT ; VOLTA P/ BANK0 ; AGUARDA FIM DO EVENTO

BCF RLF IORLW

STATUS,C ENDERECO_HIGH,W B'10100000'

; ZERA O CARRY ; ROTACIONA ENDERECO_HIGH ; JUNTA AO BYTE DE CONTROLE ; TRANSMITE CONTROLE + END_HIGH ; AGUARDA FIM DO EVENTO ; CHAMA ROTINA P/ TESTAR ACK ; OCORREU ERRO DE ACK ? ; SIM - PULA P/ I2C_ERRO ; NO

MOVWF SSPBUF CALL CALL BTFSC GOTO AGUARDA_I2C_LIVRE TESTA_ACK F_ERRO I2C_ERRO

MOVF

ENDERECO_LOW,W ; TRANSMITE ENDEREO BAIXO ; AGUARDA FIM DO EVENTO ; CHAMA ROTINA P/ TESTAR ACK ; OCORREU ERRO DE ACK ? ; SIM - PULA P/ I2C_ERRO ; NO

MOVWF SSPBUF CALL CALL BTFSC GOTO AGUARDA_I2C_LIVRE TESTA_ACK F_ERRO I2C_ERRO

MOVF

BUFFER,W ; GRAVA DADO ; AGUARDA FIM DO EVENTO ; CHAMA ROTINA P/ TESTAR ACK

MOVWF SSPBUF CALL CALL AGUARDA_I2C_LIVRE TESTA_ACK

Conectando o PIC 16F877A - Recursos Avanados

286
BTFSC GOTO F_ERRO I2C_ERRO ; OCORREU ERRO DE ACK ? ; SIM - PULA P/ I2C_ERRO ; NO BANK1 BSF BANK0 CALL RETURN AGUARDA_I2C_LIVRE SSPCON2,PEN ; ALTERA P/ BANK1 ; INICIA STOP BIT ; VOLTA P/ BANK0 ; AGUARDA FIM DO EVENTO ; RETORNA

;************************************** ;* ROTINA P/ SINALIZAR ERRO NA I2C *

;************************************** ; ESTA ROTINA SOMENTE EXECUTA CASO ALGUM ERRO DE LEITURA/GRAVAO OCORRA ; COM A MEMRIA SERIAL. ; A ROTINA ENVIA UM STOP BIT PARA FINALIZAR A COMUNICAO COM A MEMRIA ; SERIAL, ENVIA UMA MENSAGEM DE ERRO AO DISPLAY E APS 1s RETORNA TELA ; PRINCIPAL.

I2C_ERRO BANK1 BSF BANK0 SSPCON2,PEN ; ALTERA P/ BANK1 ; INICIA STOP BIT ; VOLTA P/ BANK0

BCF

RS

; SELECIONA O DISPLAY P/ COMANDO ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 6 ; SELECIONA O DISPLAY P/ DADOS

MOVLW 0XC6 CALL BSF ESCREVE RS

MOVLW 'E' CALL ESCREVE

MOVLW 'r' CALL ESCREVE

MOVLW 'r' CALL ESCREVE ; ESCREVE "Err" NO LCD

Conectando o PIC 16F877A - Recursos Avanados

287
MOVLW .250 CALL DELAY_MS

MOVLW .250 CALL DELAY_MS

MOVLW .250 CALL DELAY_MS

MOVLW .250 CALL DELAY_MS ; DELAY DE 1seg.

CALL RETURN

ATUALIZA_TELA_LINHA_2 ; ATUALIZA TELA PRINCIPAL ; RETORNA

;************************************** ;* CONFIGURAES INICIAIS DE HARDWARE E SOFTWARE *

;************************************** ; NESTA ROTINA SO INICIALIZADAS AS PORTAS DE I/O DO MICROCONTROLADOR E AS ; CONFIGURAES DOS REGISTRADORES ESPECIAIS (SFR). A ROTINA INICIALIZA AS ; VARIVEIS DE RAM E AGUARDA O ESTOURO DO WDT.

CONFIG CLRF CLRF CLRF CLRF CLRF PORTA PORTB PORTC PORTD PORTE ; GARANTE TODAS AS SADAS EM ZERO

BANK1

; SELECIONA BANCO 1 DA RAM

MOVLW B'11111111' MOVWF TRISA ; CONFIGURA I/O DO PORTA

MOVLW B'11111111' MOVWF TRISB ; CONFIGURA I/O DO PORTB

MOVLW B'11110101'

Conectando o PIC 16F877A - Recursos Avanados

288
MOVWF TRISC ; CONFIGURA I/O DO PORTC

MOVLW B'00000000' MOVWF TRISD ; CONFIGURA I/O DO PORTD

MOVLW B'00000100' MOVWF TRISE ; CONFIGURA I/O DO PORTE

MOVLW B'11011111' MOVWF OPTION_REG ; CONFIGURA OPTIONS ; PULL-UPs DESABILITADOS ; INTER. NA BORDA DE SUBIDA DO RB0 ; TIMER0 INCREM. PELO CICLO DE MQUINA ; WDT - 1:128 ; TIMER - 1:1

MOVLW B'00000000' MOVWF INTCON ; CONFIGURA INTERRUPES ; DESABILITADA TODAS AS INTERRUPES

MOVLW B'00000111' MOVWF ADCON1 ; CONFIGURA CONVERSOR A/D ; CONFIGURA PORTA E PORTE COMO I/O DIGITAL

MOVLW B'00001001' MOVWF SSPADD ; VELOCIDADE: 100KHz @ 4MHz

MOVLW B'10000000' MOVWF SSPSTAT KHz) ; DESABILITA SLEW-RATE CONTROL (100

BANK0

; SELECIONA BANCO 0 DA RAM

MOVLW B'00101000' MOVWF SSPCON ; HABILITA I2C - MASTER MODE

Conectando o PIC 16F877A - Recursos Avanados

289
; CONFIGURA PINOS COMO DA I2C

BSF

SCL

; INICIALIZA SCL EM 1

; AS INSTRUES A SEGUIR FAZEM COM QUE O PROGRAMA TRAVE QUANDO HOUVER UM ; RESET OU POWER-UP, MAS PASSE DIRETO SE O RESET FOR POR WDT. DESTA FORMA, ; SEMPRE QUE O PIC LIGADO, O PROGRAMA TRAVA, AGUARDA UM ESTOURO DE WDT ; E COMEA NOVAMENTE. ISTO EVITA PROBLEMAS NO START-UP DO PIC.

BTFSC GOTO

STATUS,NOT_TO $

; RESET POR ESTOURO DE WATCHDOG TIMER ? ; NO - AGUARDA ESTOURO DO WDT ; SIM

;************************************** ;* INICIALIZAO DA RAM *

;************************************** ; ESTA ROTINA IR LIMPAR TODA A RAM DO BANCO 0, INDO DE 0X20 A 0X7F

MOVLW 0X20 MOVWF FSR ; APONTA O ENDEREAMENTO INDIRETO PARA ; A PRIMEIRA POSIO DA RAM LIMPA_RAM CLRF INCF MOVF INDF FSR,F FSR,W ; COMPARA O PONTEIRO COM A LT. POS. +1 ; J LIMPOU TODAS AS POSIES? ; NO - LIMPA A PRXIMA POSIO ; SIM ; LIMPA A POSIO ; INCREMENTA O PONTEIRO P/ A PRX. POS.

XORLW 0X80 BTFSS GOTO STATUS,Z LIMPA_RAM

;************************************** ;* CONFIGURAES INICIAIS DO DISPLAY *

;************************************** ; ESTA ROTINA INICIALIZA O DISPLAY P/ COMUNICAO DE 8 VIAS, DISPLAY PARA 2 ; LINHAS, CURSOR APAGADO E DESLOCAMENTO DO CURSOR DIREITA.

Conectando o PIC 16F877A - Recursos Avanados

290

INICIALIZACAO_DISPLAY BCF RS ; SELECIONA O DISPLAY P/ COMANDOS ; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO

MOVLW 0X30 CALL ESCREVE

MOVLW .3 CALL DELAY_MS ; DELAY DE 3MS (EXIGIDO PELO DISPLAY)

MOVLW 0X30 CALL ESCREVE

; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO

MOVLW 0X30 CALL ESCREVE

; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO

MOVLW B'00111000' CALL ESCREVE

; ESCREVE COMANDO PARA ; INTERFACE DE 8 VIAS DE DADOS

MOVLW B'00000001' CALL ESCREVE

; ESCREVE COMANDO PARA ; LIMPAR TODO O DISPLAY

MOVLW .1 CALL DELAY_MS ; DELAY DE 1MS

MOVLW B'00001100' CALL ESCREVE

; ESCREVE COMANDO PARA ; LIGAR O DISPLAY SEM CURSOR

MOVLW B'00000110' CALL ESCREVE

; ESCREVE COMANDO PARA INCREM. ; AUTOMTICO DIREITA

BSF

RS

; SELECIONA O DISPLAY P/ DADOS

;************************************** ;* INICIALIZAO DA RAM *

;**************************************

Conectando o PIC 16F877A - Recursos Avanados

291
; ESTE TRECHO DO PROGRAMA L O DADOS DA MEMRIAS E2PROM EXTERNA E ; ATUALIZA A RAM.

LE_MEMORIA_EEPROM MOVLW END_EEPROM_H MOVWF ENDERECO_HIGH MOVLW END_EEPROM_L MOVWF ENDERECO_LOW ; CARREGA ENDEREO P/ LEITURA

CALL

I2C_EEPROM_READ

; CHAMA ROTINA P/ LER DADO

MOVF

BUFFER,W ; SALVA DADO LIDO EM VALOR_DADOS

MOVWF VALOR_DADOS

;************************************** ;* ROTINA DE ESCRITA DA TELA PRINCIPAL *

;************************************** ; ESTA ROTINA ESCREVE A TELA PRINCIPAL DO PROGRAMA, COM AS FRASES: ; LINHA 1 - " MASTER I2C " ; LINHA 2 - " xxh "

CALL

ATUALIZA_TELA_LINHA_1 ; ATUALIZA TELA LINHA 1 DO LCD

CALL

ATUALIZA_TELA_LINHA_2 ; ATUALIZA TELA LINHA 2 DO LCD

;************************************** ;* VARREDURA DOS BOTES *

;************************************** ; ESTA ROTINA VERIFICA SE ALGUM BOTO EST PRESSIONADO E CASO AFIRMATIVO ; DESVIA PARA O TRATAMENTO DO MESMO.

VARRE CLRWDT ; LIMPA WATCHDOG TIMER

; **************** VERIFICA ALGUM BOTO PRESSIONADO *************************

Conectando o PIC 16F877A - Recursos Avanados

292

VARRE_BOTOES BTFSS GOTO BOTAO_0 TRATA_BOTAO_0 ; O BOTO 0 ESTA PRESSIONADO ? ; SIM - PULA P/ TRATA_BOTAO_0 ; NO

BTFSS GOTO

BOTAO_1 TRATA_BOTAO_1

; O BOTO 1 ESTA PRESSIONADO ? ; SIM - PULA P/ TRATA_BOTAO_1 ; NO

BTFSS GOTO

BOTAO_2 TRATA_BOTAO_2

; O BOTO 2 ESTA PRESSIONADO ? ; SIM - PULA P/ TRATA_BOTAO_2 ; NO

BTFSS GOTO

BOTAO_3 TRATA_BOTAO_3

; O BOTO 3 ESTA PRESSIONADO ? ; SIM - PULA P/ TRATA_BOTAO_3 ; NO

; *************************** FILTRO P/ EVITAR RUIDOS ***********************

MOVLW FILTRO_TECLA MOVWF FILTRO_BOTOES

; CARREGA O VALOR DE FILTRO_TECLA ; SALVA EM FILTRO_BOTOES ; RECARREGA FILTRO P/ EVITAR RUIDOS ; NOS BOTES

MOVLW .1 MOVWF TEMPO_TURBO ; CARREGA TEMPO DO TURBO DAS TECLAS ; COM 1 - IGNORA O TURBO A PRIMEIRA ; VEZ QUE A TECLA PRESSIONADA

GOTO

VARRE

; VOLTA PARA VARRER TECLADO

;************************************** ;* TRATAMENTO DOS BOTES *

;************************************** ; NESTE TRECHO DO PROGRAMA ESTO TODOS OS TRATAMENTOS DOS BOTES

Conectando o PIC 16F877A - Recursos Avanados

293

; ************************* TRATAMENTO DO BOTO 0 ***************************

TRATA_BOTAO_0 DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO

DECFSZ TEMPO_TURBO,F GOTO VARRE

; FIM DO TEMPO DE TURBO ? ; NO - VOLTA P/ VARRE ; SIM

MOVLW TURBO_TECLA MOVWF TEMPO_TURBO ; RECARREGA TEMPORIZADOR DO TURBO ; DAS TECLAS

INCF

VALOR_DADOS,F

; INCREMENTA VALOR_DADOS

CALL

ATUALIZA_TELA_LINHA_2 ; CHAMA ROTINA P/ ATUALIZAR LCD

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

; ************************* TRATAMENTO DO BOTO 1 ***************************

TRATA_BOTAO_1 DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO

DECFSZ TEMPO_TURBO,F GOTO VARRE

; FIM DO TEMPO DE TURBO ? ; NO - VOLTA P/ VARRE ; SIM

MOVLW TURBO_TECLA MOVWF TEMPO_TURBO ; RECARREGA TEMPORIZADOR DO TURBO ; DAS TECLAS

Conectando o PIC 16F877A - Recursos Avanados

294
DECF VALOR_DADOS,F ; DECREMENTA VALOR_DADOS

CALL

ATUALIZA_TELA_LINHA_2 ; CHAMA ROTINA P/ ATUALIZAR LCD

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

; ************************* TRATAMENTO DO BOTO 2 ***************************

TRATA_BOTAO_2 MOVF BTFSC FILTRO_BOTOES,F STATUS,Z ; FILTRO J IGUAL A ZERO ? ; (FUNO JA FOI EXECUTADA?) GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO ; NO DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO

; ********TRECHO DO PROGRAMA PARA GRAVAR DADO DA RAM NA MEMRIA *************

GRAVA_MEMORIA_EEPROM MOVLW END_EEPROM_H MOVWF ENDERECO_HIGH MOVLW END_EEPROM_L MOVWF ENDERECO_LOW ; CARREGA ENDERECO ONDE O DADO SER SALVO ; END. -> 0x0000 ; PRIMEIRA POSIO DA EEPROM

MOVF

VALOR_DADOS,W ; CARREGA DADO A SER SALVO EM BUFFER

MOVWF BUFFER

CALL

I2C_EEPROM_WRITE

; CHAMA ROTINA DE GRAVAO

MOVLW .10 CALL DELAY_MS ; GARANTE TEMPO DE ESCRITA (10ms)

Conectando o PIC 16F877A - Recursos Avanados

295

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

; ************************* TRATAMENTO DO BOTO 3 ***************************

TRATA_BOTAO_3 MOVF BTFSC FILTRO_BOTOES,F STATUS,Z ; FILTRO J IGUAL A ZERO ? ; (FUNO JA FOI EXECUTADA?) GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO ; NO DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO

; ******** TRECHO DO PROGRAMA PARA LER DADO DA MEMRIA E ATUALIZAR RAM *************

LER_MEMORIA_EEPROM MOVLW END_EEPROM_H MOVWF ENDERECO_HIGH MOVLW END_EEPROM_L MOVWF ENDERECO_LOW ; CARREGA ENDEREO DE LEITURA ; END. -> 0x0000 ; PRIMEIRA POSIO DA EEPROM

CALL

I2C_EEPROM_READ

; CHAMA ROTINA DE LEITURA

BTFSC GOTO MOVF

F_ERRO $+3 BUFFER,W ; ATUALIZA RAM COM O VALOR LIDO

MOVWF VALOR_DADOS

CALL

ATUALIZA_TELA_LINHA_2 ; CHAMA ROTINA P/ ATUALIZAR LCD

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

Conectando o PIC 16F877A - Recursos Avanados

296

;************************************** ;* FIM DO PROGRAMA *

;**************************************

END

; FIM DO PROGRAMA

Conectando o PIC 16F877A - Recursos Avanados

297
Dicas e comentrios
As constantes END_EEPROM_H e END_EEPROM_L representam a posio a ser gravada/lida da memria externa. Este programa no utiliza as interrupes e possui uma rotina (AGUARDAJ2CJJVRE) para saber se o sistema est liberado para a prxima ao. Ele tambm testa o ACK e gera uma mensagem de erro, caso alguma coisa saia fora do padro.

Exerccios propostos
Agora que o exemplo j foi estudado e esclarecido, aproveite para gerar novos problemas e solues, seguindo os exerccios propostos: 1. Faa trs modificaes no primeiro exerccio proposto no captulo 10. Utilize a memria externa; Limite os dados mostrados no display entre 0x41 e 0x5A; Mostre os dados em ASCII, ou seja, entre A (0x41) e Z (0x5A). 2. Utilizando o exerccio anterior, grave na memria uma mensagem de at 16 caracteres. Depois, crie um programa que, ao ser inicializado, leia os 16 caracteres da memria e mostre a mensagem lida no LCD.

Conectando o PIC 16F877A - Recursos Avanados

298
Anotaes

_________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________

Conectando o PIC 16F877A - Recursos Avanados

299

Conectando o PIC

12
Comunicao Serial 2 - USART
Introduo
Esta a segunda parte sobre comunicao serial e veremos agora outro mdulo interno do PIC destinado a esse recurso. Trata-se da USART. A grande vantagem da separao dos recursos de comunicao em dois mdulos que eles so independentes, podendo ser utilizados simultaneamente. O nome USART significa Universal Synchronous Asynchronous Receiver Transmitter. Com um nome desse, o negcio parece um tanto complicado, no mesmo? Mas no complicado no. Acontece que esse um protocolo universal e possui dois modos distintos de trabalho: o sincronizado e o no-sincronizado. Mas vamos logo ao que interessa e tratemos de conhecer melhor este recurso.

Teoria
Como estvamos dizendo, a USART, que tambm conhecida como SCI (Serial Communications Interface), possui dois modos de funcionamento, vejamos as caractersticas de cada um deles:

Modo assncrono
A comunicao feita somente com duas vias; entretanto, como este modo no sincronizado, essas duas vias so utilizadas para dados. Uma delas para transmisso (TX) e a outra para recepo (RX). Isso possibilita que as informaes sejam enviadas e recebidas ao mesmo tempo, cada qual na sua via. Este recurso conhecido como Full Duplex. Esse modo o utilizado, por exemplo, na porta serial dos computadores, para implementar o padro RS-232, mas pode ser utilizado para acesso a outros sistemas tambm. Mas como possvel os dados serem transmitidos entre dois pontos se no h sincronismo entre eles? Quando estudamos a comunicao SSP, vimos que uma via era perdida exatamente para essa funo. Era definida como clock do sistema e servia para informar os dois lados (Master e Slave) do momento correto de transmisso de cada bit. Como aqui no h essa via, a sincronizao deve ser feita pela prpria via de dados. Isso ser conseguido atravs do Baud Rate ou velocidade de transmisso. Vejamos como funciona. Comecemos definindo exatamente o que o Baud Rate. Para que o sistema funcione, veremos que o tamanho dos dados (intervalo de cada bit) deve ser completamente padronizado, e ambos os lados devem estar ajustados para o mesmo valor. Como essa comunicao trabalha sempre com base nos Conectando o PIC 16F877A - Recursos Avanados

300
bits, essa velocidade normalmente indicada em bits por segundo, ou bps. Com ela somos capazes de calcular o tempo de durao de cada bit.

TBIT =1/BaudRate
Com isso, existe somente um sincronismo de tempo feito para a transmisso/recepo de cada byte. Esse sincronismo conseguido atravs do Start bit. Devemos entender tambm que ambas as vias devem ser tratadas igualmente, pois o TX de um lado deve estar conectado ao RX do outro, e vice-versa. Em ambos os lados, TX sempre sada e RX sempre entrada. Desta forma, quando falarmos de transmisso ou recepo, serve para qualquer uma das vias. As vias possuem seu estado padro como sendo o nvel alto. Temos, ento, uma situao de stand-by. Quando um lado inicia uma transmisso, ele fora seu TX para nvel baixo, mantendo-o assim pele tempo TBIT. Essa borda de descida reconhecida pelo outro lado (em RX) e suficiente para iniciar o processo de sincronizao para recebimento desse byte. Este pulso em nvel baixo chamado de Start Bit. Depois disso, os dois lados j sabem o que fazer. TX enviar ento os 8 bits de dados, todos eles com o mesmo tamanho do Start Bit. Como RX soube exatamente o momento de incio do Start Bit, ele deixa passar o tempo e depois coleta os 8 bits, pegando o dado mais ou menos no meio do tempo do bit (TBIT/2). Por ltimo, para garantir o processo, TX envia um Stop Bit, que nada mais que outro bit com valo fixo em 1, garantindo assim que a linha voltar ao seu estado padro e o sistema voltar ao stand-by ficando apto ao prximo dado. O lado RX deve considerar a leitura do Stop Bit para garantir que nenhum erro grosseiro acontea com a recepo. Caso o Stop Bit seja 0 (zero), pode ter acontecido um erro de temporizao, e no seu lugar foi lido o bit 8 ou, ento, o prximo Start. Repare tambm que o erro desse processo acumulativo. Por exemplo, caso o lado TX esteja cor sua velocidade no limite superior do erro, e o RX com a velocidade menor do que devia, cada bit ser lido mais perto do comeo do pulso. Como existem 10 bits ao total (Start + Dado + Stop), possvel que no final, acontea a leitura errada de um bit. Vejamos o processo graficamente:

Conectando o PIC 16F877A - Recursos Avanados

301
O primeiro caso de recepo est com a velocidade bem prxima velocidade do transmissor, e por isso no houve erro na recepo. J no outro caso a velocidade est mais lenta, e houve erro no ltimo bit e no Stop Bit. Por isso, importante o acerto e a preciso da velocidade em ambos os lados. Quanto maior o Baud Rate, mais crtica a situao. Observe tambm que a ordem de transmisso dos bits a inversa das comunicaes SSP. Aqui, o bit menos significativo enviado primeiro. Esse padro aceita tambm a comunicao com 9 bits, sendo que o bit adicional poder ser utilizado para dado, paridade ou endereamento. A paridade nada mais que uma confirmao matemtica dos 8 bits de dados. Somando-se a quantidade de bits em 1 (incluindo dados e paridade), o resultado correto deve ser um nmero par (quando utilizando paridade PAR) ou mpar (quando utilizando paridade MPAR). Quanto ao endereamento, respeita-se o seguinte critrio: 0 para dado e 1 para endereo. O importante que ambos os lados (TX e RX) estejam configurados para operar com a mesma quantidade de bits. A configurao mais comum a de 8 bits de dado (sem paridade) com 1 bit de Stop e normalmente chamada de padro 8N1. No caso de comunicaes padronizadas, o Baud Rate (BR) tambm obedece a valores pr--ajustados, tais como 300,1.200, 2.400, 9.600,19.200bps e muitos outros.

Modo sncrono
Este modo pode ser considerado como uma certa mistura entre os padres SPI e I C.
2

Assim como no modo assncrono, aqui tambm trabalhamos com somente duas vias, s que neste caso uma destinada ao clock (CK) e a outra aos dados (DT). Desta forma, os dados devem trafegar em uma nica via, impossibilitando a transmisso e recepo simultneas. o mesmo conceito utilizado no padro I2C. Essa comunicao chamada de Half Duplex e pode ser utilizada para a troca de dados com outros microcontroladores ou diversos perifricos existentes no mercado, tais como A/Ds, D/As, memrias, etc.

Quanto forma em que a informao trafega na linha, bem mais simples que o padro I2C, no possuindo o sistema de endereamento e parecendo-se mais com o formato SPI. Para cada pulso (borda de descida) transmitido um bit. Este modo tambm opera com Mestre e Escravo, sendo o clock sempre gerenciado pelo Mestre. Para o Mestre, a via CK sempre uma sada e para o Escravo ela sempre uma entrada. Quanto via de dados, ela muda constantemente de sentido, hora para a transmisso, hora para a recepo. Assim sendo, para qualquer uma das pontas, a via DT sada para a transmisso e entrada para recepo. O tempo de durao de um bit tambm define o Baud Rate, do mesmo modo descrito na comunicao assncrona. Neste caso, o nvel baixo (0) o padro para a via CK. Para a via DT, no existe um padro obrigatrio, pois ela no opera sem CK. Porm, recomendamos mant-la tambm em nvel baixo quando no est sendo usada. Observe que, neste padro, tambm o bit menos significativo (bit 0) enviado primeiro. Para o modo sncrono tambm aceita a comunicao com 9 bits e, neste caso, o Mestre sempre gerar pacotes de nove pulsos de clock. O importante que ambos os lados da comunicao (Mestre e Escravo) estejam configurados para operar com 9 bits. Conectando o PIC 16F877A - Recursos Avanados

302

Recursos do PIC
Vamos estudar agora como operar com a USART do PIC 16F877A. Para continuarmos com a mesma linha de raciocnio, dividiremos mais uma vez parte do assunto entre os dois modos de operao, mas antes podemos explicar a maioria dos conceitos que so compartilhados por ambos. Os pinos da comunicao (RC6/TX/CK) e (RC7/RX/DT) so os mesmos nos dois modos e so controlados diretamente pelo sistema da USART. Somente para evitarmos possveis conflitos, caso a USART seja desabilitada, recomendvel que ambos sejam ajustados como entrada atravs do TRISC. A definio entre os modos de operao feita atravs de TXSTA<SYNC>: SYNC 0 1 Descrio Modo Assncrono. Modo Sncrono.

O ajuste do Baud Rate (BR) feito por meio de um registrador denominado SPBRG e do bit TXSTA<BRGH>. A combinao desses parmetros e do modo de operao definem o clculo do BR:

BRGH 0 1 SYNC 0 1

Descrio Ajuste para baixa velocidade. Ajuste para alta velocidade. BRG=1 BR = Fosc/(16x(SPBRG+1)) No vlido

BRGH=0 BR = Fosc/(64x(SPBRG=1)) BR = Fosc/(4x(SPBRG=1))

Primeiramente observe que o ajuste de BRGH no tem efeito quando estamos trabalhando no modo sncrono. Neste caso, o tempo de cada bit (TBIT) ser mltiplo do tempo de ciclo de mquina (TCY). Para o menor ajuste possvel (SPBRG=0), teremos TBIT=TCY. Nesta situao, a parte alta do clock gerada nos subtempos Q4 e Q1, ficando Q2 e Q3 para a parte baixa. Conectando o PIC 16F877A - Recursos Avanados

303
Por exemplo, para uma Fosc de 4 MHz, teremos: BRMAX = 1.000.000bps BRMN = 3.906bps Para o modo sncrono, BRGH surte efeito alterando a frmula para o clculo de BR. Observe que, quando BRGH=0, tbit ser mltiplos de 64TCY. Isso diminui a velocidade mxima e aumenta o erro para nos aproximarmos das velocidades padronizadas. Para o segundo caso (BRGH=1), teremos um ajuste mais preciso, pois tbit ser mltiplos de 16TCY. Agora teremos um erro menor e um aumento da velocidade mxima. Por outro lado, perdemos na velocidade mnima. Peguemos o mesmo exemplo dado para o caso do modo sncrono (Fosc = 4 MHz), primeiro para BRGH=0: BRMX = 62.500bps BRMIN = 244bps E agora para BRGH=1: BRMX = 250.000bps BRMIN = 976bps Vamos, agora, calcular o valor de SPBRG para uma velocidade de 9.600bps, com cristal de 4 MHz e BRGH=0: BR = Fosc/(64x(SPBRG+1)) SPBRG = (Fosc/(64 x BR)) -1 SPBRG = (4.000.000 / (64 x 9.600)) -1 SPBRG = 5,510-> 5 Como houve um arredondamento, existir um erro que deve ser calculado: BR = 4.000.000 / (64 x (5+1)) BR = 10.416bps Erro = (10.416-9.600) / 9.600 Erro = 8,5% (muito elevado) Vejamos o mesmo caso para BRGH=1:

BR = Fosc/(16x(SPBRG+1)) SPBRG = (Fosc/(16xBR))-1 SPBRG = (4.000.000 / (16 x 9600)) -1

Conectando o PIC 16F877A - Recursos Avanados

304
SPBRG = 25,042 -> 25 BR = 4.000.000/(16 x (25+1)) BR = 9.615bps Erro = (9.615-9.600) / 9.600 Erro = 0,16% (muito bom!) Devido grande diferena de erro, devemos adotar o segundo clculo. Existem casos, principalmente quando BR elevado, que para melhorarmos a situao ser necessrio alterarmos o valor do oscilador (Fosc), tentando chegar em nmeros mais precisos. No esquea de que existe ainda a tolerncia de funcionamento do sistema de oscilao. O uso de cristais pode tambm ser obrigatrio para as velocidades mais altas. Para ativar o sistema da USART, configurando os pinos corretamente, devese ajustar o bit RCSTA<SPEN>:

SPEN 0 1

Descrio USART desabilitada. Pinos como l/Os convencionais. USART habilitada. Pinos controlados automaticamente.

A partir deste ponto o usurio deve escolher entre as operaes de transmisso e/ou recepo, mas, como elas so bem diferentes para os modos assncronos e sncronos, sero explicadas na diviso dos tpicos. Por enquanto, vejamos somente quais so e os bits que as controlam:

Operao Transmisso Recepo unitria Recepo contnua

Bit TXSTA<TXEN> RCSTA<SREN> RCSTA<CREN>

Observaes Ativa o sistema de transmisso de bytes. Ativa o sistema de recepo de somente 1 byte. Somente para modo sncrono. Ativa o sistema de recepo contnua.

O que devemos explicar, que ainda comum aos modos de operao, diz respeito ao dado que ser transmitido e/ou recebido. Primeiramente devemos optar pela comunicao com 8 ou 9 bits. Isso feito separadamente para a transmisso e para a recepo, atravs dos bits TXSTA<TX9> e RCSTA<RX9>: TX9 Descrio 0 Transmisso feita em 8 bits. 1 Transmisso feita em 9 bits.

RX9 0 1

Descrio Recepo feita em 8 bits. Recepo feita em 9 bits.

Conectando o PIC 16F877A - Recursos Avanados

305
Este 9 bit deve ser escrito em TXSTA<TX9D> para a transmisso e ser recebido em RCSTA<RX9D> do lado da recepo. O PIC no possui sistema automtico para implementao desse bit como sendo a paridade. Se o uso da paridade for necessria, essa implementao ter de ser feita atravs do software. Existe um auxlio para uso desse bit como endereamento, mas isso ser visto posteriormente. Quanto ao dado propriamente dito, para o caso da transmisso, ele deve ser escrito no registrador TXREG. Caso o sistema de transmisso esteja ligado, a simples escrita nesse registrador ir inici-la. Este dado ser, ento, transferido a um registrador interno denominado TSR (sem acesso pelo programa) para que seja enviado pela porta serial. Neste momento, TXREG fica vazio e liberado para uma nova escrita. Desta forma, o nosso buffer de sada duplo, podendo haver um byte em TXREG e outro em TSR. O segundo byte s ser passado de TXREG para TSR quando o ltimo bit (7 ou 8) do byte anterior for transmitido, deixando TSR vazio. Toda vez que o valor for passado de TXREG para TSR, o bit PIR1<TXIF> ser setado, podendo gerar a interrupo. O interessante que esse bit no precisa ser limpo manualmente como os demais flags de interrupo. Ele ser limpo automaticamente sempre que TXREG for escrito. Isso serve para sabermos quando TXREG est liberado para uma nova escrita. O problema que, se no desejamos transmitir nada, no escreveremos em TXREG e no limparemos TXIF. Isso ir travar o programa entrando sem parar na interrupo. A soluo, para este caso, desligar a interrupo ou mesmo a transmisso. O bit TXIF no pode ser utilizado para sabermos que uma transmisso j foi completada, pois, depois de TXREG ser colocado em TSR, o dado ainda precisar ser enviado pela porta serial. Para saber quando realmente a transmisso foi finalizada, devemos saber quando TSR est vazio. O bit TXSTA<TRMT> possui esta funo:

TRMF 1 0

Descrio Transmisso finalizada. TSR liberado. Transmisso em curso. TSR ocupado.

Para a recepo, o dado recebido primeiramente armazenado em um registrador interno no--acessvel (RSR). Quando esse registrador est completo, a informao ento passada para o registrador RCRG. O mais interessante que este registrador possui dois nveis de pilha, podendo ser escrito e lido duas vezes. Com isso nosso buffer de entrada triplo, podendo haver um dado sendo recebido em RSR e mais dois j recebidos em RCREG. O registrador RCREG trabalha com o sistema FIFO (First In/First Out), isto , o primeiro a ser recebido ser o primeiro a ser lido. Cada vez que o valor de RSR transferido para RCREG o bit PIR1<RCIF> setado, podendo gerar a interrupo. Como no caso da transmisso, esse bit limpo automaticamente pelo hardware sempre que RCREG estiver vazio. Isso significa que, se foram recebidos 2 bytes antes de ser efetuada uma conferncia, RCREG ter de ser lido duas vezes (pilha) para que o bit RCIF seja limpo. Caso o terceiro byte seja completado antes da leitura dos duas j existentes em RCREG, um erro de overflow ir acontecer e o bit RCSTA<OERR> ser setado. O 3 byte que se encontra em RSR ser perdido. Este bit deve ser limpo manualmente. Isso tambm pode ser conseguido desativando-se o modo de recepo. Para trabalhar com o 9 bit, necessrio que ele seja escrito (TX9D) antes do dado em TXREG, possibilitando a atualizao correta do TSR.

Conectando o PIC 16F877A - Recursos Avanados

306
O sistema de recepo checa tambm o Stop Bit, mas no toma nenhuma atitude automtica em caso de erro. A situao do Stop Bit armazenada em RCSTA<FERR>: FERR Descrio 0 1 0 Stop Bit foi recebido corretamente (Stop Bit = 1). 0 Stop Bit foi recebido errado (Stop Bit = 0).

Para que esse bit possa ser checado pelo programa, assim como o 99 (quando usado), uma leitura deve ser feita antes em RCREG para que os mesmos sejam atualizados. Por ltimo devemos comentar sobre o sistema de endereamento. Estes sistema s funciona quando ajustada a comunicao para 9 bits que controlado atravs do bit RCSTA<ADDEN>: ADDEN 0 1 Descrio Sistema de endereamento desativado. Sistema de endereamento ativado.

Quando esse sistema est ativo, o dado recebido s transferido de RSR para RCREG quando o { for 1, podendo ento gerar a interrupo. Caso seja recebido uma informao com o 9- em O, ela ser reconhecida como dado e ser descartada. Para que o processo funcione corretamente necessrio, ento, comearmos com o endereamento ativo para recebermos um endereo que ser tratado e comparado como o endereo da prpria unidade. O endereo ser o byte recebido, possibilitando 256 valores diferentes. Caso o endereo recebido corresponda unidade em questo, o sistema de endereamento deve ento ser desativado para que o prximo valor possa ser recebido como um dado vlido.

Vejamos agora as particularidades e observaes do roteiro de trabalho de cada modo.

Modo assncrono
Para o modo assncrono, quando habilitamos a USART atravs do bit RCSTA<SPEN>, o pino TX e transformado em sada com nvel alto (1) e o pino RX transformado em entrada. Para ativar o sistema de recepo, basta tornar RCSTA<CREN>=1. Para esse modo no possvel escolher o sistema de recepo unitria e, por isso, RCSTA<SREN> no possui funo. A partir deste momento cada byte recebido ser colocado em RCREG e a interrupo ser ativada atravs de RCIF. A lgica do sistema ser, ento, tratar das informaes recebidas. recomendv tambm a implementao da checagem do Stop Bit (FERR) e do estouro de recepo (OERR).
Para ativar o sistema de transmisso, basta tornar TXSTA<TXEN>=1. O importante lembrar de que os sistemas de transmisso e recepo so totalmente independentes (s compartilham o mesmo Baud Rate) e, por isso, cada um deles pode ser ativado e desativado, conforme a necessidade. Depois da ativao, basta escrever um valor em TXREG e o mesmo ser enviado automaticamente pela porta serial, com a gerao do Sfart B/f e do Stop B/f. O importante a checagem do bit TXIF para que o sistema no sobre escreva TXREG antes de TSR ser atualizado. Quando um dos sistemas desativado (Transmisso ou Recepo), o pino relacionado a ele e mantido como entrada.

Este modo no pode operar em SLEEP. Conectando o PIC 16F877A - Recursos Avanados

307

Resumo dos registradores associados USART Assncrona


Endereo 0Bh... OCh 8Ch 98h 18h 19h 1Ah 99h Nome INTCON PIR1 PIE1 TXSTA RCSTA TXREG RCREG SPBRG Bit 7 GIE PSPIF PSPIE CSRC SPEN Bit 6 PEIE ADIF ADIE TX9 RX9 Bit 5 T0IE RCIF RCIE TXEN SREN Bit 4 INTE TXIF Bit 3 RBIE SSPIF Bit 2 T0IF CCPIF CCP1IE BRGH FERR Bit 1 INTF TMR2IF TMR2IE TMRT OERR Bit 0 RBIF TMR1IF TMR1IE TX9D RX9D

TXIE SSPIE SYNC CREN ADDEN Buffer de transmisso Buffer de recepo Acerto do Baud Rate

No usado para essa finalidade. Para obter mais informaes, consulte apndice A

Modo sncrono
Para este modo existe mais um bit de configurao relacionado ao sistema Master/Slave. Trata-se do TXSTA<CSRC>:

CSRC 0 1

Descrio Slave (CK como entrada). Master (CK como sada).

Com essa seleo, o sistema configura corretamente o estado do pino de clock (CK). O estado do pino de dados (DT) ser varivel, conforme o sistema se encontre em recepo ou transmisso. Devemos, ento, escolher qual operao desejamos efetuar:

Operao Transmisso

Bit TXSTA<TXEN>

Observaes
O pino DT ser colocado como sada e o sistema est pronto para transmitir o dado escrito em TXREG. A escolha de um modo de recepo tem prioridade sobre este modo. pino DT colocado como entrada e o sistema de recepo de

Recepo unitria Recepco contnua

RCSTA<SREN> somente 1 byte ativado.


pino DT colocado como entrada e o sistema de recepo

RCSTA<CREN> contnua ativado.

Transmisso
No caso do Master, o sistema funciona de forma muito parecida com o descrito anteriormente para o modo assncrono, operando da mesma forma com TXREG, TXIF e TRMT. A nica diferena que, quando escrevemos algum dado em TXREG, o mesmo ser transmitido por DT, com pulsos sendo gerados em CK e sem a presena de Start ou Stop bit. CK pode gerar oito ou nove pulsos, dependendo do estado de TXSTA<TX9>. Ao trmino da transmisso, o sistema ficar em stand-by, aguardando um novo dado em TXREG. Conectando o PIC 16F877A - Recursos Avanados

308
Para o Slave, a diferena que, depois de escrevermos em TXREG, o sistema ficar aguardando os clocks enviados pelo Master.

Recepo
A recepo para o Master e para o Slave tambm idntica, exceto pela gerao do clock. Quando ativada uma operao de recepo, a operao de transmisso desligada imediatamente e o pino DT torna-se entrada. A recepo contnua manter a unidade recebendo dados at que o bit RCSTA<CREN> seja limpo manualmente. J a recepo unitria (RCSTA<SREN>=1) receber somente um byte e depois desliga--se (RCSTA<SREN>=0). Se por acaso forem ligados as duas maneiras de recepo, o modo contnuo ter prioridade. No modo contnuo, o clock no desativado, gerando pulsos constantes. Isso torna a operao nesse sistema mais difcil. Ao receber um dado, o mesmo ser enviado a RCREG e o flag PIR1<RCIF> ser ativado, podendo gerar a interrupo.

Operao em SLEEP
Somente as unidades S/aves do modo sncrono podem operar em SLEEP. Quando um dado recebido durante o SLEEP, ao final da recepo a informao transportada de RSR para RCREG, ativando o flag de interrupo PIR1<RCXIF>. [Deixando essa interrupo habilitada, o PIC ser acordado e o dado recebido poder ser tratado. Uma transmisso tambm possvel durante o SLEEP. O primeiro dado escrito em TXREG ser imediatamente escrito em TSR. O segundo byte (se houver) ser mantido em TXREG. O sistema . ento, colocado em SLEEP. Quando chegar o primeiro pacote de pulsos, o dado de TSR ser transmitido. Ao final, o segundo dado ser colocado em TSR e o flag TXIF ser setado. Se a interrupo estiver habilitada, o PIC acordar.

Resumo dos registradoras associados USART Sncrona Endereo 0Bh... OCh 8Ch 98h 18h 19h 1AH 99h Nome INTCON PIR1 PIE1 TXSTA RCSTA TXREG RCREG SPBRG Bit 7 GIE PSPIF PSPIE CSRC SPEN Bit 6 PEIE ADIF ADIE TX9 RX9 Bit 5 T0IE RCIF RCIE TXEN SREN Bit 4 INTE TXIF Bit 3 RBIE SSPIF Bit 2 T0IF CCP1IF Bit 1 INTF TMR2IF TMR2IE TMRT OERR Bit 0 RBIF TMR1IF TMR1IE TX9D RX9D

TXIE SSPIE CCP1IE SYNC BRGH CREN ADDEN FERR Buffer de transmisso Buffer de recepo Acerto do baud Rate

No usado para essa finalidade. Para obter mais informaes, consulte apndice A

Conectando o PIC 16F877A - Recursos Avanados

309
Lgica do exemplo
Neste exemplo implementaremos uma comunicao assncrona Full Duplex, isto , ativaremos tanto a transmisso quanto a recepo. Para tornar nosso sistema verstil e simples, montaremos um programa capaz de operar somente com o hardware proposto, ou interligando esta ao PC por meio do conector DB9 (RS-232). A transmisso ser feita lendo-se a tenso do potencimetro P2 atravs do A/D, limitando os valores entre O e 255 (8-bits) e enviando esse resultado para a porta serial e para o LCD. Desta forma, ser possvel visualizarmos o dado transmitido. Para facilitar ainda mais o usurio, mostraremos o valor em decimal (d) e em hexadecimal (h). A transmisso ser realizada no padro 8N1 com uma velocidade de 9.600bps. Quanto recepo, o valor obtido pela porta serial ser diretamente impresso no display de LCD, atravs do cdigo ASCII. Para que o sistema funcione sem o PC, basta interligar os pinos 2 e 3 do conector DB9. Isso far com que tudo que seja transmitido por TX seja imediatamente recebido em RX. Tanto a transmisso quanto a recepo so contnuas. Como a comunicao est regulada para 9.600bps e a placa opera em 4 MHz, o exemplo de clculo para j apresentado pode ser considerado.

Conectando o PIC 16F877A - Recursos Avanados

310

Esquema Eltrico

Conectando o PIC 16F877A - Recursos Avanados

311 Fluxograma

Conectando o PIC 16F877A - Recursos Avanados

312

Conectando o PIC 16F877A - Recursos Avanados

313
;************************************** ;* CONECTANDO O PIC - RECURSOS AVANADOS ;* EXEMPLO 9 * ;* * ;* NICOLS CSAR LAVINIA e DAVID JOS DE SOUZA ;* * ;************************************** ; * VERSO : 2.0 * ; * DATA : 24/02/2003 * ;**************************************

;************************************** ;* DESCRIO GERAL * ;************************************** ; ESTE EXEMPLO FOI ELABORADO PARA EXPLICAR O FUNCIONAMENTO DA USART DO PIC. ; O SOFTWARE CONVERTE O CANAL 1 DO CONVERSOR A/D (POTENCIMETRO P2) E MOSTRA ; NO DISPLAY O VALOR CONVERTIDO EM DECIMAL E HAXADECIMAL. ; ALM DE MOSTRAR O VALOR NO DISPLAY, O SOFTWARE TRANSMITE PELA USART O VALOR ; DA CONVERSO. OS VALORES RECEBIDOS PELA USART TAMBM SO MOSTRADOS NO LCD ; COMO CARACTERES ASCII. ; ;************************************** ;* CONFIGURAES PARA GRAVAO * ;************************************** __CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_ON & _XT_OSC ;************************************** ;* DEFINIO DAS VARIVEIS * ;************************************** ; ESTE BLOCO DE VARIVEIS EST LOCALIZADO LOGO NO INCIO DO BANCO 0 CBLOCK 0X20 ; POSIO INICIAL DA RAM TEMPO0 TEMPO1 ; TMEPORIZADORES P/ ROTINA DE DELAY AUX ; REGISTRADOR AUXILIAR DE USO GERAL UNIDADE ; ARMAZENA VALOR DA UNIDADE DEZENA ; ARMAZENA VALOR DA DEZENA CENTENA ; ARMAZENA VALOR DA CENTENA ENDC ;************************************** ;* DEFINIO DAS VARIVEIS INTERNAS DO PIC * ;************************************** ; O ARQUIVO DE DEFINIES DO PIC UTILIZADO DEVE SER REFERENCIADO PARA QUE ; OS NOMES DEFINIDOS PELA MICROCHIP POSSAM SER UTILIZADOS, SEM A NECESSIDADE ; DE REDIGITAO. #INCLUDE ;

<P16F877A.INC> MICROCONTROLADOR UTILIZADO

;************************************** ;* DEFINIO DOS BANCOS DE RAM * ;************************************** ; OS PSEUDOS-COMANDOS "BANK0" E "BANK1", AQUI DEFINIDOS, AJUDAM A COMUTAR ; ENTRE OS BANCOS DE MEMRIA. #DEFINE BANK1 BSF

Conectando o PIC 16F877A - Recursos Avanados

314
STATUS,RP0 ; SELECIONA BANK1 DA MEMORIA RAM #DEFINE BANK0 BCF STATUS,RP0 ; SELECIONA

BANK0 DA MEMORIA RAM ;************************************** ;* CONSTANTES INTERNAS * ;************************************** ; A DEFINIO DE CONSTANTES FACILITA A PROGRAMAO E A MANUTENO. ; ESTE PROGRAMA NO UTILIZA NENHUMA CONSTANTE. ;************************************** ;* DECLARAO DOS FLAGs DE SOFTWARE * ;************************************** ; A DEFINIO DE FLAGs AJUDA NA PROGRAMAO E ECONOMIZA MEMRIA RAM. ; ESTE PROGRAMA NO UTILIZA NENHUM FLAG DE USURIO ;************************************** ;* ENTRADAS * ;************************************** ; AS ENTRADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE. ; ; ; ; ; ; ESTE PROGRAMA UTILIZA UMA ENTRADA P/ O CONVERSOR A/D. ESTA ENTRADA NO PRECISA SER DECLARADA, POIS O SOFTWARE NUNCA FAZ REFERNCIA A ELA DE FORMA DIRETA, POIS O CANAL A/D A SER CONVERTIDO SELECIONADO NO REGISTRADOS ADCON0 DE FORMA BINRIA E NO ATRAVS DE DEFINES. PORM PARA FACILITAR O ENTENDIMENTO DO HARDWARE VAMOS DECLARAR ESTA ENTRADA NORMALMENTE. CAD_P2 PORTA,1 ; ENTRADA A/D

#DEFINE

P/ O POTENCIMETRO P2 ; ; ; ; ALM DA ENTRADA DO CONVERSOR A/D, TEMOS A ENTRADA DA USART (RECEPO). NOVAMENTE ESTA ENTRADA NO NECESSITA SER DECLARADA, PORM, PARA FACILITAR O ENTENDIMENTO DO HARDWARE VAMOS DECLARAR ESTA ENTRADA NORMALMENTE. RXUSART PORTC,7 ; ENTRADA DE

#DEFINE

RX DA USART ;************************************** ;* SADAS * ;************************************** ; AS SADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE. #DEFINE DISPLAY PORTD ; BARRAMENTO RS PORTE,0 ; INDICA P/ O ; 1 -> DADO ; 0 -> COMANDO #DEFINE ENABLE PORTE,1 ; SINAL DE ; ATIVO NA BORDA DE DESCIDA

DE DADOS DO DISPLAY #DEFINE

DISPLAY UM DADO OU COMANDO

ENABLE P/ DISPLAY

Conectando o PIC 16F877A - Recursos Avanados

315

; TEMOS TAMBM A SADA DE TX DA USART. ; NOVAMENTE ESTA SADA NO NECESSITA SER DECLARADA, PORM, PARA FACILITAR O ; ENTENDIMENTO DO HARDWARE VAMOS DECLARAR ESTA SADA NORMALMENTE. #DEFINE TXUSART PORTC,6 ; SADA DE TX

DA USART ;************************************** ;* VETOR DE RESET DO MICROCONTROLADOR ;************************************** ; POSIO INICIAL PARA EXECUO DO PROGRAMA

ORG ENDEREO DO VETOR DE RESET

0X0000 ;

GOTO CONFIG ; PULA PARA CONFIG DEVIDO A REGIO ; DESTINADA AS ROTINAS SEGUINTES ;************************************** ;* ROTINA DE DELAY (DE 1MS AT 256MS) * ;************************************** ; ESTA UMA ROTINA DE DELAY VARIVEL, COM DURAO DE 1MS X O VALOR PASSADO ; EM WORK (W). DELAY_MS MOVWF TEMPO1 ; CARREGA TEMPO1 (UNIDADES DE MS) MOVLW .250 MOVWF TEMPO0 ; CARREGA TEMPO0 (P/ CONTAR 1MS) CLRWDT ; LIMPA WDT (PERDE TEMPO) DECFSZ TEMPO0,F ; FIM DE TEMPO0 ? GOTO VOLTA 2 INSTRUES ; SIM - PASSOUSE 1MS DECFSZ TEMPO1,F ; FIM DE TEMPO1 ? GOTO VOLTA 6 INSTRUES ; SIM RETURN ; RETORNA ;************************************** ;* ROTINA DE ESCRITA DE UM CARACTER NO DISPLAY * ;************************************** ; ESTA ROTINA ENVIA UM CARACTER PARA O MDULO DE LCD. O CARACTER A SER ; ESCRITO DEVE SER COLOCADO EM WORK (W) ANTES DE CHAMAR A ROTINA. ESCREVE MOVWF $-6 ; NO $-2 ; NO -

Conectando o PIC 16F877A - Recursos Avanados

316
DISPLAY ; ATUALIZA DISPLAY (PORTD) NOP ; PERDE 1US PARA ESTABILIZAO BSF ENABLE ; ENVIA UM PULSO DE ENABLE AO DISPLAY GOTO BCF ENABLE ;. MOVLW .1 CALL DELAY_MS ; DELAY DE 1MS RETURN ; RETORNA ;************************************** ;* AJUSTE DECIMAL * ;* W [HEX] = CENTENA [DEC] : DEZENA [DEC] ; UNIDADE [DEC] * ;************************************** ; ESTA ROTINA RECEBE UM ARGUMENTO PASSADO PELO WORK E RETORNA NAS VARIVEIS ; CENTENA, DEZENA E UNIDADE O NMERO BCD CORRESPONDNTE AO PARMETRO PASSADO. AJUSTE_DECIMAL MOVWF AUX ; SALVA VALOR A CONVERTER EM AUX CLRF UNIDADE CLRF DEZENA CLRF CENTENA ; RESETA REGISTRADORES MOVF AUX,F BTFSC STATUS,Z ; VALOR A CONVERTER = 0 ? RETURN ; SIM RETORNA ; NO INCF UNIDADE,F ; INCREMENTA UNIDADE MOVF UNIDADE,W XORLW 0X0A BTFSS STATUS,Z ; UNIDADE = 10d ? GOTO $+3 ; NO ; SIM CLRF UNIDADE ; RESETA UNIDADE INCF DEZENA,F ; INCREMENTA $+1 ;.

Conectando o PIC 16F877A - Recursos Avanados

317
DEZENA MOVF DEZENA,W XORLW 0X0A BTFSS STATUS,Z ; DEZENA = 10d ? GOTO $+3 ; NO ; SIM CLRF DEZENA ; RESETA DEZENA INCF CENTENA,F ; INCREMENTA CENTENA DECFSZ AUX,F ; FIM DA CONVERSO ? GOTO VOLTA P/ CONTINUAR CONVERSO RETURN ; SIM ;************************************** ;* CONFIGURAES INICIAIS DE HARDWARE E SOFTWARE * ;************************************** ; NESTA ROTINA SO INICIALIZADAS AS PORTAS DE I/O DO MICROCONTROLADOR E AS ; CONFIGURAES DOS REGISTRADORES ESPECIAIS (SFR). A ROTINA INICIALIZA A ; MQUINA E AGUARDA O ESTOURO DO WDT. CONFIG CLRF GARANTE TODAS AS SADAS EM ZERO CLRF CLRF CLRF CLRF BANK1 ; SELECIONA BANCO 1 DA RAM MOVLW B'11111111' MOVWF TRISA ; CONFIGURA I/O DO PORTA MOVLW B'11111111' MOVWF TRISB ; CONFIGURA I/O DO PORTB MOVLW B'10111111' MOVWF TRISC ; CONFIGURA I/O DO PORTC MOVLW B'00000000' MOVWF TRISD ; CONFIGURA I/O DO PORTD MOVLW B'00000100' MOVWF TRISE PORTB PORTC PORTD PORTE PORTA ; $-.14 ; NO -

Conectando o PIC 16F877A - Recursos Avanados

318
; CONFIGURA I/O DO PORTE MOVLW B'11011011' MOVWF OPTION_REG ; CONFIGURA OPTIONS ; PULL-UPs DESABILITADOS ; INTER. NA BORDA DE SUBIDA DO RB0 ; TIMER0 INCREM. PELO CICLO DE MQUINA ; WDT - 1:8 ; TIMER - 1:1

MOVLW B'00000000' MOVWF INTCON ; CONFIGURA INTERRUPES ; DESABILITA TODAS AS INTERRUPES MOVLW B'00000100' MOVWF ADCON1 ; CONFIGURA CONVERSOR A/D ; RA0, RA1 E RA3 COMO ANALGICO ; RA2, RA4 E RA5 COMO I/O DIGITAL ; PORTE COMO I/O DIGITAL ; JUSTIFICADO ESQUERDA ; 8 BITS EM ADRESH E 2 BITS EM ADRESL ; Vref+ = VDD (+5V) ; Vref- = GND ( 0V) MOVLW B'00100100' MOVWF TXSTA ; CONFIGURA USART ; HABILITA TX ; MODO ASSINCRONO ; TRANSMISSO DE 8 BITS ; HIGH SPEED

Conectando o PIC 16F877A - Recursos Avanados

319
BAUD RATE MOVLW .25 MOVWF SPBRG ; ACERTA BAUD RATE -> 9600bps BANK0 ; SELECIONA BANCO 0 DA RAM MOVLW B'10010000' MOVWF RCSTA ; CONFIGURA USART ; HABILITA RX ; RECEPO DE 8 BITS ; RECEPO CONTNUA ; DESABILITA ADDRESS DETECT MOVLW B'01001001' MOVWF ADCON0 ; CONFIGURA CONVERSOR A/D ; VELOCIDADE > Fosc/8 ; CANAL 1 ; MDULO LIGADO ; ; ; ; AS INSTRUES A SEGUIR FAZEM COM QUE O PROGRAMA TRAVE QUANDO HOUVER UM RESET OU POWER-UP, MAS PASSE DIRETO SE O RESET FOR POR WDT. DESTA FORMA, SEMPRE QUE O PIC LIGADO, O PROGRAMA TRAVA, AGUARDA UM ESTOURO DE WDT E COMEA NOVAMENTE. ISTO EVITA PROBLEMAS NO START-UP DO PIC. BTFSC STATUS,NOT_TO ; RESET POR ESTOURO DE WATCHDOG TIMER ? GOTO AGUARDA ESTOURO DO WDT ; SIM ;************************************** ;* INICIALIZAO DA RAM * ;************************************** ; ESTA ROTINA IR LIMPAR TODA A RAM DO BANCO 0, INDO DE 0X20 A 0X7F MOVLW 0X20 MOVWF FSR ; APONTA O ENDEREAMENTO INDIRETO PARA ; A PRIMEIRA POSIO DA RAM LIMPA_RAM CLRF A POSIO INCF INCREMENTA O PONTEIRO P/ A PRX. POS. MOVF FSR,W FSR,F ; INDF ; LIMPA $ ; NO -

Conectando o PIC 16F877A - Recursos Avanados

320
XORLW COMPARA O PONTEIRO COM A LT. POS. +1 BTFSS STATUS,Z ; J LIMPOU TODAS AS POSIES? GOTO LIMPA_RAM ; NO - LIMPA A PRXIMA POSIO ; SIM ;************************************** ;* CONFIGURAES INICIAIS DO DISPLAY * ;************************************** ; ESTA ROTINA INICIALIZA O DISPLAY P/ COMUNICAO DE 8 VIAS, DISPLAY PARA 2 ; LINHAS, CURSOR APAGADO E DESLOCAMENTO DO CURSOR DIREITA. INICIALIZACAO_DISPLAY BCF SELECIONA O DISPLAY P/ COMANDOS MOVLW ESCREVE COMANDO 0X30 PARA CALL ESCREVE ; INICIALIZAO MOVLW .3 CALL DELAY_MS ; DELAY DE 3MS (EXIGIDO PELO DISPLAY) MOVLW ESCREVE COMANDO 0X30 PARA CALL ESCREVE ; INICIALIZAO MOVLW ESCREVE COMANDO 0X30 PARA CALL ESCREVE ; INICIALIZAO MOVLW B'00111000' ; ESCREVE COMANDO PARA CALL ESCREVE ; INTERFACE DE 8 VIAS DE DADOS MOVLW B'00000001' ; ESCREVE COMANDO PARA CALL ESCREVE ; LIMPAR TODO O DISPLAY MOVLW .1 CALL DELAY_MS ; DELAY DE 1MS MOVLW B'00001100' 0X30 ; 0X30 ; 0X30 ; RS ; 0X80 ;

Conectando o PIC 16F877A - Recursos Avanados

321
; ESCREVE COMANDO PARA CALL ESCREVE ; LIGAR O DISPLAY SEM CURSOR MOVLW B'00000110' ; ESCREVE COMANDO PARA INCREM. CALL ESCREVE ; AUTOMTICO DIREITA ;************************************** ;* ROTINA DE ESCRITA DA TELA PRINCIPAL * ;************************************** ; ESTA ROTINA ESCREVE A TELA PRINCIPAL DO PROGRAMA, COM AS FRASES: ; LINHA 1 - "USART:9600,8,n,1" ; LINHA 2 - "TX: d h RX: " MOVLW COMANDO PARA POSICIONAR O CURSOR CALL ESCREVE ; LINHA 0 / COLUNA 0 BSF SELECIONA O DISPLAY P/ DADOS ; COMANDOS PARA ESCREVER AS ; LETRAS DE "USART:9600,8,n,1" MOVLW 'U' CALL ESCREVE MOVLW 'S' CALL ESCREVE MOVLW 'A' CALL ESCREVE MOVLW 'R' CALL ESCREVE MOVLW 'T' CALL ESCREVE MOVLW ':' CALL ESCREVE MOVLW '9' CALL ESCREVE MOVLW '6' CALL ESCREVE MOVLW '0' CALL ESCREVE MOVLW '0' CALL ESCREVE MOVLW ',' CALL ESCREVE MOVLW '8' CALL ESCREVE MOVLW ',' RS ; 0X80 ;

Conectando o PIC 16F877A - Recursos Avanados

322
CALL ESCREVE MOVLW 'n' CALL ESCREVE MOVLW ',' CALL ESCREVE MOVLW '1' CALL ESCREVE BCF SELECIONA O DISPLAY P/ COMANDO MOVLW COMANDO PARA POSICIONAR O CURSOR CALL ESCREVE ; LINHA 1 / COLUNA 0 BSF SELECIONA O DISPLAY P/ DADOS ; COMANDOS PARA ESCREVER AS ; LETRAS DE "TX: d h RX: " MOVLW 'T' CALL ESCREVE MOVLW 'X' CALL ESCREVE MOVLW ':' CALL ESCREVE MOVLW '' CALL ESCREVE MOVLW '' CALL ESCREVE MOVLW '' CALL ESCREVE MOVLW 'd' CALL ESCREVE MOVLW '' CALL ESCREVE MOVLW '' CALL ESCREVE MOVLW '' CALL ESCREVE MOVLW 'h' CALL ESCREVE MOVLW '' CALL ESCREVE MOVLW 'R' CALL ESCREVE MOVLW 'X' CALL ESCREVE MOVLW ':' CALL ESCREVE RS ; 0XC0 ; RS ;

Conectando o PIC 16F877A - Recursos Avanados

323

;************************************** ;* LOOP PRINCIPAL * ;************************************** ; A ROTINA PRINCIPAL FICA AGUARDANDO O FINAL DA CONVERSO A/D E VERIFICANDO ; SE ALGUM DADO FOI RECEBIDO PELA USART BSF ADCON0,GO ; INICIA CONVERSO A/D ; EXECUTADA APENAS UMA VEZ LOOP CLRWDT ; LIMPA WATCHDOG TIMER BTFSS ADCON0,GO ; FIM DA CONVERSO ? GOTO FIM_CONVERSAO ; SIM ; NO BTFSC PIR1,RCIF ; RECEBEU ALGUM DADO NA SERIAL ? GOTO DADO_RECEBIDO ; SIM ; NO GOTO VOLTA P/ LOOP ;************************************** ;* MOSTRA A/D NO DISPLAY E TRANSMITE * ;************************************** ; ESTA ROTINA MOSTRA O VALOR DA CONVERSO A/D NO DISPLAY LCD TANTO EM DECIMAL ; COMO EM HEXADECIMAL. O VALOR DA CONVERSO TAMBM TRANSMITIDO PELA USART. ; AO FINAL, A ROTINA REQUISITA UMA NOVA CONVERSO A/D. FIM_CONVERSAO_AD ; ************* MOSTRA VALOR DA CONVERSO A/D EM DECIMAL ******************** MOVF ADRESH,W ; CARREGA WORK COM VALOR DO A/D CALL AJUSTE_DECIMA ; CHAMA BCF SELECIONA O DISPLAY P/ COMANDO MOVLW COMANDO PARA POSICIONAR O CURSOR CALL ESCREVE ; LINHA 1 / COLUNA 3 BSF SELECIONA O DISPLAY P/ DADOS MOVF RS ; 0XC3 ; RS ;

_AD

LOOP ;

L ROTINA DE AJUSTE DECIMAL

Conectando o PIC 16F877A - Recursos Avanados

324
CENTENA,W ADDLW 0X30 ; CONVERTE BCD DA CENTENA EM ASCII CALL ESCREVE ; ENVIA AO LCD MOVF DEZENA,W ADDLW 0X30 ; CONVERTE BCD DA DEZENA EM ASCII CALL ESCREVE ; ENVIA AO LCD MOVF UNIDADE,W ADDLW 0X30 ; CONVERTE BCD DA UNIDADE EM ASCII CALL ESCREVE ; ENVIA AO LCD ; ************* MOSTRA VALOR DA CONVERSO A/D EM HEXADECIMAL **************** BCF SELECIONA O DISPLAY P/ COMANDO MOVLW COMANDO PARA POSICIONAR O CURSOR CALL ESCREVE ; LINHA 1 / COLUNA 8 BSF SELECIONA O DISPLAY P/ DADOS SWAPF ADRESH,W ; INVERTE NIBLE DO ADRESH ANDLW B'00001111' ; MASCARA BITS MAIS SIGNIFICATIVOS MOVWF AUX ; SALVA EM AUXILIAR MOVLW 0X0A SUBWF AUX,W ; AUX 10d (ATUALIZA FLAG DE CARRY) MOVLW CARREGA WORK COM 30h BTFSC STATUS,C ; RESULTADO POSITIVO? ( UMA LETRA?) MOVLW CARREGA WORK COM 37h ; NO - WORK FICA COM 30h (NMERO) ADDWF AUX,W ; SOMA O WORK AO AUXILIAR ; (CONVERSO ASCII) 0X37 ; SIM 0X30 ; RS ; 0XC8 ; RS ;

Conectando o PIC 16F877A - Recursos Avanados

325
CALL ESCREVE ; ENVIA CARACTER AO DISPLAY LCD MOVF ADRESH,W ; CARREGA WORK COM ADRESH ANDLW B'00001111' ; MASCARA BITS MAIS SIGNIFICATIVOS MOVWF AUX ; SALVA EM AUXILIAR MOVLW 0X0A SUBWF AUX,W ; AUX 10d (ATUALIZA FLAG DE CARRY) MOVLW CARREGA WORK COM 30h BTFSC STATUS,C ; RESULTADO POSITIVO? ( UMA LETRA?) MOVLW CARREGA WORK COM 37h ; NO - WORK FICA COM 30h (NMERO) ADDWF AUX,W ; SOMA O WORK AO AUXILIAR ; (CONVERSO ASCII) CALL ESCREVE ; ENVIA CARACTER AO DISPLAY LCD ; ************* TRANSMITE VALOR DA CONVERSO A/D PELA USART ***************** MOVF ADRESH,W ; CARREGA WORK COM O VALOR DO A/D BANK1 ; ALTERA P/ BANCO 1 DA RAM BTFSS TXSTA,TRMT ; O BUFFER DE TX EST VAZIO ? GOTO AGUARDA ESVAZIAR BANK0 ; SIM VOLTA P/ BANCO 0 DA RAM MOVWF SALVA WORK EM TXREG (INICIA TX) ; *********************** INICIA UMA NOVA CONVERSO ************************* BSF ADCON0,GO ; PEDE UMA NOVA CONVERSO A/D GOTO LOOP ; TXREG ; $-1 ; NO 0X37 ; SIM 0X30 ;

Conectando o PIC 16F877A - Recursos Avanados

326
VOLTA PARA LOOP ;************************************** ;* ROTINA DE RECEPO DE DADOS NA USART * ;************************************** ; ESTA ROTINA EXECUTADA TODA VEZ QUE UM NOVO DADO RECEBIDO PELA USART. ; O DADO RECEBIDO MOSTRADO NO LCD (EM ASCII). DADO_RECEBIDO BCF SELECIONA O DISPLAY P/ COMANDO MOVLW 0XCF CALL ESCREVE BSF RS MOVF CALL RCREG,W ESCREVE RS ;

; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 15 ; SELECIONA O DISPLAY P/ DADOS ; CARREGA DADO RECEBIDO NO WORK ; ENVIA AO LCD ; AO LER O REGISTRADOR RCREG O BIT ; RCIF DA INTERRUPO LIMPO ; AUTOMATICAMENTE. ; VOLTA P/ LOOP PRINCIPAL

GOTO

LOOP

;************************************** ;* FIM DO PROGRAMA ;************************************** EN; FIM DO PROGRAMA

Conectando o PIC 16F877A - Recursos Avanados

327
Dicas e comentrios
A rotina de converso Hex >>> Decimal deste exemplo mais completa pois trabalha com trs dgitos (CENTENA, DEZENA e UNIDADE). Desta forma, ela pode converter todo o range do argumento de entrada (W) que vai de 0 a 255. O sistema de converso A/D o mesmo apresentado no captulo 7, onde utilizamos o conversor interno e s consideramos os 8 bits mais significativos. Com isso nosso valor j fica limitado a um byte. Devido simplicidade do sistema, no foi necessrio o uso das interrupes, deixando-as desabilitadas. Para o caso da recepo, o bit RCIF testado toda vez dentro do loop principal. Quanto a transmisso, sempre que um novo valor foi convertido, checamos se o buffer de sada est vazio para podermos escrever o novo valor.

Exerccios propostos
Agora que o exemplo j foi estudado e esclarecido, aproveite para gerar novos problemas e solues, seguindo os exerccios propostos: 1. Ative o uso da interrupo de recebimento. Quanto transmisso, em vez de deix-la contnua, crie uma interrupo de timer como base de tempo. Por exemplo, transmita o valor atual convertido a cada 1 segundo. Crie um programa no PC (pode ser em Basic mesmo) que receba o valor convertido, efetue alguma operao e devolva outro valor. Por exemplo, divida o valor por 25, pegue a parte inteira e some 30h para imprimir no LCD um valor de 0 a 9. Mude a rotina de recepo e escrita no LCD para poder receber um nmero de 0 a 50 e mostr-lo como 0.0 a 5.0. Altere o programa do PC para evetuar a regra de trs necessria para converter um valor de 0 a 255 para 0 a 50. Com isso voc voltou ao multmetro do Exemplo 4, s que com as contas de multiplicao e diviso no mais sendo feitas no PIC. Como voc ainda tem os dados sendo enviados ao PC, possvel plot-los como se fosse um miniosciloscpio.

2.

3.

Conectando o PIC 16F877A - Recursos Avanados

328

Conectando o PIC

13
Outras Caractersticas

Introduo
Este captulo destinado apresentao de alguns recursos ou sistemas que no foram abordados no decorrer dos captulos anteriores. Estes assuntos sero divididos em tpicos para faciltar a didtica e a compreenso.

Comunicao paralela (PSP)


O sistema de comunicao paralela em 8-bits do PIC 16F877A muito simples, e por isso nem mereceu um captulo dedicado a ele. Sua primeira limitao que ele s trabalha em modo S/ave, isto , controlado por alguma outra unidade. Por isso, esse sistema recebe o nome de PSP (Parallel Slave Port). O controle da ativao da PSP encontra-se em TRISE<PSPMODE>: PSPMODE 0 1 Descrio PSP desativada. Pinos como l/Os convencionais. PSP ativada. Pinos controlados internamente.

Os pinos utilizados pela porta paralela so: Pino Descrio

RD7... RD0 Barramento de dados (8-bits). Ser lido/escrito diretamente nos latchets do PORTD. RE0/RD RE1/WR RE2/CS Efetua uma leitura (Read). Configurado como entrada. Efetua uma escrita (Write). Configurado como entrada. Ativa/Desativa a PSP externamente. Configurado como entrada.

Conectando o PIC 16F877A - Recursos Avanados

329
Apesar do controle interno da porta paralela, os pinos /RD, /WR e /CS devem ser configurado; anteriormente com entrada (TRISE) e com funcionamento digital (desligar o A/D nesses pinos). O PORTD possui dois Latches, um para a sada e outro para a entrada. Por causa disso, o estado do TRISD no considerado. Na figura seguinte, pode-se visualizar o hardware interno do PIC para o PORTD quando configurado para a PSP.

I/Os protegidos por diodos para VDD e Vss

O pino /CS funciona como um Chip Select, e a porta somente operar quando esse pino estiver em nvel baixo (0). Quando ele est em nvel alto (1), os pinos do PORTD ficam como entrada, o latch de entrada no alterado e nenhuma interrupo gerada. /CS 0 1 Descrio PSP ativada externamente. PSP desativada externamente.

Para uma operao de escrita, o Mestre dever manter /CS=0 e /WR=0. Neste caso, o latch de entrada ser atualizado para todo o barramento de dados (8bits). O bit PIR1<PSPIF> selado e a interrupo ativada (se as chaves estiverem corretamente ligadas). O bit TRISE<IBF> tambm = ativado, indicando que existe um dado recebido em PORTD. Este bit ser limpo automaticamente quando PORTD for lido. Caso seja efetuada uma nova operao de escrita sem o sistema ter lido : PORTD anteriormente, temos ainda IBF=1 e, ento, um erro de overflow ocorrer, sendo o mesmo indicado atravs do bit TRISE<IBOV>=1. Neste caso, o dado anterior ter sido perdido. O bit IBOV deve ser limpo manualmente pelo programa.

/WR Descrio 0 Operao de escrita. 1 Situao normal.

Conectando o PIC 16F877A - Recursos Avanados

330

IBF Descrio 0 Nenhum dado novo escrito no latch de entrada 1 Um novo dado foi escrito no latch de entrada. Aconteceu uma operao de escrita. IBOV Descrio 0 Sem erro de overflow. 1 Houve um erro de overflow.

Uma operao de leitura ser feita atravs da situao /CS=0 e /RD=0. Todo o PORTD ser transformado em sada e o valor previamente escrito no registrador PORTD (latch de sada) ser imposto ao barramento. Aqui a interrupo tambm pode acontecer, pois o flag PIR1<PSPIF> selado. Sempre que algum dado escrito no registrador PORTD (latch de sada), teremos TRISE<OBF>=1. Aps uma operao de leitura da porta paralela, esse bit limpo automaticamente.

/RD 0 1 OBF 0 1

Descrio Operao de leitura. Situao normal. Descrio

Aconteceu uma operao de leitura. Aconteceu uma escrita interna no latch de sada.

Os pinos /WR e /RD precisam receber somente um pulso para ativar as operaes de escrita e leitura. O tempo mnimo desse pulso de (1 / Fosc), mas recomendamos a utilizao de TCY. O tempo mximo indefinido e depende da lgica do sistema. Caso /CS no precise ser controlado pelo Master (s existe um Slave no barramento), ento este pino pode ser diretamente aterrado.

Watchdog Timer (WDT)


O Watchdog Timer uma espcie de temporizador que, de tempos em tempos, reseta o microcontrolador. muito utilizado para evitar que o sistema trave, seja por algum tipo de falha ou porque o programa entrou em um loop infinito. Para que o PIC no seja resetado, o contador do WDT deve ser periodicamente zerado. Essa funo to importante que existe uma instruo especialmente criada para isso (CLRWDT). O contador do WDT independente do ciclo de mquina do PIC. Existe dentro da pastilha um circuito oscilador tipo RC que incrementa o contador do WDT, de forma que ele trabalha independentemente do oscilador do PIC. Isso significa que o WDT continua operando mesmo em modo SLEEP. O perodo de estouro do WDT de aproximadamente 18ms. Esse tempo pode ser aumentado, setando-se o bit OPTION_REG<PSA> e ajustando-se o valor do prescaler nos bits OPTION REG<PS2:PS0>. Os bits STATUS</TO> e STATUS</PD> sero selados sempre que a instruo CLRWDT for executada. O bit /TO ser zerado sempre que ocorrer o estouro do Watchdog Timer.

Conectando o PIC 16F877A - Recursos Avanados

331
O ideal que apenas uma instruo CLRWDT seja utilizada no software todo. Por isso, geralmente, essa instruo encontrada apenas no loop principal do programa. Dependendo da aplicao, em algumas rotinas de delay tambm se faz necessrio o uso da instruo CLRWDT, apesar disso no ser muito aconselhvel. No existe controle por software para ligar ou desligar o contador do WDT. Ele somente pode ser habilitado no momento da gravao do microcontrolador. Quando ele est ligado, o consumo maior, devido ao funcionamento do circuito RC.

Resumo dos registradores associados ao Watchdog Timer


Endereo 03h... 81h... Nome STATUS OPTION_REG Bit 7 IRP /RBPU Bit 6 RP1 INTEDG Bit 5 RP0 T0CS Bit 4 /TO T0SE Bit 3 /PD PSA Bit 2 Z PS2 Bit 1 DC PS1 Bit 0 C PS0

No usado para essa finalidade. Para obter mais informaes, consulte apndice A

Power-on Reset (POR)


Um pulso de Power-on Reset gerado internamente no PIC sempre que a borda de subida do VDD for detectada, ou seja, somente na energizao do microcontrolador. O POR utilizado para garantir que o microcontrolador opere corretamente e no sofra problemas durante a energizao. Esse pulso dispara o temporizador do Power-up Timer, caso este esteja habilitado. Quando um POR ocorre, o bit PCON</POR> limpo (zero).

Power-up Timer (PWRT)


O Power-up Timer um temporizador utilizado para garantir que o microcontrolador somente comece a operar depois que a fonte de alimentao estiver estabilizada. O PWRT faz com que o PIC permanea em estado de reset durante um intervalo de 72ms. Esse tempo contabilizado aps o pulso do POR e pode variar em funo da pastilha e da temperatura. O PWRT opera com um circuito oscilador RC interno dedicado que somente pode ser habilitado no mometo da gravao do PIC. Deve obrigatoriamente estar habilitado caso se deseje utilizar o Bronw-out Reset.

Oscilator Start-up Timer (OST)


O Oscilator Start-up Timer fornece um delay de 1.024 ciclos do cristal (ou do oscilador ligado ao pino OSC1) aps o final do PWRT para iniciar a execuo do software. importante para garantir que o oscilador j esteja operando e estvel quando o software comear a ser executado. O Oscilator Start-up Timer habilitado automaticamente quando o PIC estiver utilizando osciladores do tipo LP, XT ou HS e seu delay (1.024 ciclos do oscilador) ser gerado sempre em trs diferentes situaes: na energizao (POR), aps um Bronw-out Reset e aps um wake-up ("acordar") do modo SLEEP.

Conectando o PIC 16F877A - Recursos Avanados

332
Brown-out Reset (BOR)
O Brown-out Reset fora um reset do PIC sempre que a tenso de alimentao cair abaixo de 4V (tpico) durante um intervalo de tempo maior que 100s (tpico). Caso a queda de tenso seja durante um intervalo de tempo menor que 100s, o reset no ser gerado. A durao do reset de 72ms (lembra do PWRT?) e, enquanto a tenso de alimentao no for superior aos 4V, esse temporizador no ser inicializado. Quando um BOR ocorre, o bit PCON</BOR> limpo (zero). Para o PIC 16F877A o valor do BOR fixo e no pode ser alterado (alguns modelos permitem valores programveis), alm de somente poder ser habilitado na gravao do microcontrolador.

SLEEP (Power-down Mode)


O PIC entra em SLEEP (Power-down Mode) sempre que a instruo SLEEP for executada. Neste modo de operao, o oscilador desligado, os pinos de l/Os mantm o estado anterior instruo SLEEP e o WDT resetado embora continue operando. Para minizimar o consumo, deve-se desligar o conversor A/D, desabilitar clocks externos, colocar todos os pinos em entrada e desligar os pull-ups do PORTB. Para casos extremos, deve-se levar em conta tambm o uso do Watchdog Timer (o circuito oscilador RC permanece consumindo), Power-up Timer (tambm utiliza um oscilador RC) e Brown-out Reset. Para que o PIC volte a operar e "acorde" da situao de SLEEP existem trs formas: por meio de um reset externo na entrada /MCLR; pelo estouro do WDT, se habilitado; ou pelo evento de alguma interrupo. Um reset externo na entrada /MCLR causar o reset do PIC (PC=0x0000). Todas as outras situaes so consideradas uma continuao do programa e causaro um wake-up na linha seguinte instruo SLEEP. Os bits STATUS</TO:/PD> podero ser testados para descobrir a causa do reset. /TO
0 1

Descrio
Indica que ocorreu um estouro do ocorreu um Power-up ou foram executadas as instrues CLRWDT ou SLEEP. Indica que WDT.

/PD Descrio 0 Indica que a instruo SLEEP foi executada. 1 Indica que ocorreu um Power-up ou foi executada a instruo CLRWDT. Quando a instruo SLEEP for executada, a prxima instruo (PC+1) j estar sendo processada (lembre-se do conceito do Pipeline). Para que o PIC "acorde" por um evento de interrupo, a chave individual da interrupo deve estar ligada. Ao "acordar" nessa situao, existem duas posibilidades. Se o bit GIE estiver desabilitado, o programa continuar a ser executado no ponto seguinte instruo SLEEP. Se o bit GIE estiver habilitado, a instruo seguinte instruo SLEEP ser processada e, em seguida, o PC ser desviado para o endereo 0x0004 (vetor de interrupo). Por esse motivo recomendado que logo aps a instruo SLEEP seja adicionado um NOP. Conectando o PIC 16F877A - Recursos Avanados

333
Se a chave geral de interrupes (GIE=0) estiver desabilitada e caso nenhuma interrupo habilitada individualmente tenha ocorrido, ao ser executada a instruo SLEEP duas situaes podem ocorrer: Se o evento da interrupo ocorrer antes da execuo da instruo SLEEP, a instruo SLEEP ser executada como um NOP. Entretanto, o WDT no ser resetado, o bit /TO no ser selado e o bit /PD no ser limpo. Se o evento da interrupo ocorrer durante ou aps a execuo da instruo SLEEP, a instruo ser executada normalmente, porm o microcontrolador imediatamente "acordar" do SLEEP. Neste caso, o WDT ser resetado, o bit /TO ser setado e o bit /PD ser limpo. Desta maneira, no adianta testar esses bits antes da execuo da instruo SLEEP, pois os mesmos podem ser alterados enquanto a instruo est sendo executada. Para saber se a instruo foi corretamente executada, deve-se testar o bit /PD. Se ele estiver setado, a instruo foi executada como um NOP. Quanto ao WDT, recomenda-se executar um CLRWDT antes da instruo SLEEP.

Controle de Resets
Como pode ser observado, o PIC16F877A apresenta diversas formas de reset. A combinao de alguns bits/flags especiais podem nos informar precisamente qual dessas formas ocorreu. Vejamos a tabela seguinte: /POR 0 0 0 1 1 1 1 1 /BOR x x x 0 1 1 1 1 /TO 1 0 x 1 0 0 u 1 /PD 1 x 0 1 1 0 u 0 Causa Ocorreu um Power-on Reset. No pode ocorrer. /TO setado em POR. No pode ocorrer. /PD setado em POR. Ocorreu um Brown-out Reset (BOR). Ocorreu um WDT Reset. Ocorreu um WDT Wake-up (acordou). Ocorreu um MCRL Reset durante operao normal. Ocorreu um MCRL Reset durante SLEEP ou acordou SLEEP por interrupo.

Resumo dos registradoras associados aos Resets. Endereo 03h 8Eh Nome STATUS PCON Bit 7 IRP Bit 6 RP1 Bit 5 RP0 Bit 4 /TO Bit 3 /PD Bit 2 Z Bit 1 DC /POR Bit 0 C /BOR

No usado para essa finalidade. Para obter mais informaes, consulte apndice A

Oscilador
O PIC 16F877A pode operar com quatro tipos diferentes de osciladores: LP - Cristal de baixa potncia XT - Cristal / Ressonador HS - Cristal / Ressonador de alta freqncia RC - Oscilador RC Conectando o PIC 16F877A - Recursos Avanados

334
Junto ao cristal ou ressonador devem ser colocados dois capacitores cermicos para terra. Porm, alguns modelos de ressonadores j incorporam esses capacitores internamente. Como regra geral, podemos dizer que ressonadores de trs pinos j possuem os capacitores. O tipo de cristal deve ser configurado antes do PIC ser gravado. A tabela a seguir mostra o tipo de configurao do oscilador em funo da freqncia de trabalho, alm do valor sugerido para os capacitores. Tipo de Oscilador Freqncia do Cristal 32 kHz 200 kHz 200 kHz 1 MHz 4MHz 4 MHz 8 MHz 20 MHz Capacitor 33pF 15pF 47 - 68pF 15pF 15pF 15pF 15-33pF 15-33pF

LP XT

HS

Para o caso do ressonador deve ser seguida a seguinte tabela: 'Tipo de Oscilador Freqncia do Ressonador Capacitor XT 455 kHz 2 MHz 4 MHz HS 8 MHz 16 MHz 68-100pF 15-68pF 15-68pF 10-68pF 10-22pF

Para aplicaes onde a preciso no critica, pode-se recorrer ao oscilador tipo RC. Recomenda-se utilizar resistor entre 3k e 100K. O capacitor deve ser maior do que 20pF. A freqncia de trabalho do oscilador RC depende da tenso de alimentao e da temperatura ambiente. Por exemplo: com um resistor de 4,7K, um capacitor de 100pF e uma temperatura de 25C, o PIC dever trabalhar prximo a 1 MHz. O data sheet apresenta grficos auxiliares para clculo do RC.

Conectando o PIC 16F877A - Recursos Avanados

335
Sistema de proteo do cdigo (Code Protection)
Depois que seu sistema estiver pronto e um prottipo e/ou produto for entregue a terceiros, muito importante que essa opo seja ativada, pois ela impedir que qualquer pessoa consiga ter acesso ao programa gravado no PIO. Para o PIC 16F877A, que do tipo regravvel (FLASH), o sistema de proteo impedir a leitura, mas no a regravao. Entretanto, toda vez que uma nova gravao for feita quando o code protection estava ativado, primeiramente toda a memria de programa ser limpa, evitando assim que qualquer tipo de alterao indevida seja efetuada no software. Esse sistema de proteo interno ao PIC, no dependendo dos programas externos utilizados para a gravao/leitura. Isso garante a eficincia do mesmo. Durante a configurao da gravao, existem diversas opes para proteo da memria de programa, considerando uma proteo total ou parcial.

Registradores de identificao (IDs)


O PIC possui quatro registradores especiais que se encontram nos endereos de 0x2000 a 0x2003 e no podem ser acessados diretamente pelo programa. Entretanto, esses registradores podem ser lidos e escritos por meio do sistema de gravao. Podemos utiliz-los, por exemplo, para a identificao da verso do programa gravado. A grande vantagem dos Ids que podem ser lidos mesmo quando o Code Protection est ativado, possibilitando a rastreabilidade do software em casos de problemas futuros. Entretanto, esses 4 bytes so mais limitados do que parecem, pois s devem ser utilizados os 4 bits menos significativos de cada um. Desta forma, apesar de 4 bytes, s possumos 16 bits disponveis. O valor a ser gravado nos Ids pode ser escolhido diretamente durante as configuraes de gravao O sistema do MpLab possui incremento automtico para a gerao de nmero de srie.

Sistema de emulao In-Circuit (Debugger Mode)


O PIC 16F877A, assim como muitos outros modelos FLASH mais recentes (isso uma tendncia da Microchip), possui um sistema interno para operar com debugadores de baixo custo. Quando essa funo est habilitada (atravs das configuraes de gravao), alguns recursos do PIC so perdidos:

Pinos de l/Os Pilha (Stack)


Memria de programa

RB6 e RB7 no operam mais como l/Os convencionais. Perde-se 1 nvel da pilha para o sistema de emulao. 0 endereo 0000h deve possuir um NOP. No podem ser utilizadas as ltimas 100h words.

Memria de dados

No podem ser utilizados os endereos 0x070 (0x0F0, 0x1 70 e 0x1 F0) e de 0x1 EB a 0x1 EF.

Alm dessas precaues, seu sistema deve ainda disponibilizar um sistema de interligao (conector) para um emulador externo. A prpria Microchip possui uma famlia de emuladores para operar com o sistema In-Circuit Debugger Mode chamado MpLab ICD. A conexo entre o ICD e o PIC ser feita por cinco vias: MCLFWPP, VDD, Vss, RB6 e RB7. Mais detalhes sobre esse sistema podem ser adquiridos atravs da documentao do MpLab ICD.

Conectando o PIC 16F877A - Recursos Avanados

336
Proteo de escrita interna da FLASH
Esse sistema conhecido como Flash Program Memory Write Enable e serve para proteger a E2PROM interna, impedindo eventuais escritas.

Gravao In-Circuit (ICSP)


O PIC 16F877A, assim como a maioria dos modelos da Microchip, possuim a possibilidade de ser gravado diretamente nos circuitos, isto , j montados na placa final. Essa gravao conhecida como in-circuit e pode possibilitar muito ganho de produtividade. Como a gravao feita de forma serial, utilizando-se somente cinco pinos, possvel a instalao de um soquete na placa para introduzir os sinais necessrios gravao. Obviamente uma srie de cuidados especiais no projeto do hardware devem ser tomados, a fim de que as condies de gravao no prejudiquem os demais circuitos na placa. Est completamente fora do objetivo deste livro entrar nos detalhes do protocolo de gravao (a Microchip possui um data sheet especfico para isso), mas um exemplo de aplicao a prpria placa McLab2, que possui um conector para gravao in-circuit por meio dos gravadores McFlash ou McPIus (Mosaico). Como pode ser observado no esquema eltrico dessa placa, os pinos necessrios gravao so: Vdd: Alimentao convencional do PIC (5V). VSS:GND. MCRL/Vpp: Tenso de programao. Para que o PIC entre em modo de programao, a tenso nesse pino deve ser elevada a aproximadamente 13V. Por isso, o resto do circuito ligado a ele deve ser protegido. RB6: Clock da comunicao serial imposto pelo gravador. RB7: Dados da comunicao serial, que podem ser impostos pelo gravador (escrita) ou pelo prprio PIC (leitura).

Gravao em baixa tenso (Low Voltage Programming)


Alm do sistema de gravao in-circuit descrito anteriormente, o PIC 16F877A possui um segundo modo de gravao. No sistema convencional pudemos observar que a gravao s pode ser efetuada por intermdio da presena de uma tenso especial em torno de 13V. Isso impossibilita a gravao em nvel TTL Com o sistema de gravao em baixa tenso (LVP), o PIC pode ser colocado em modo de programao com apenas 5V. Isso torna possvel, por exemplo, que um PIC seja diretamente gravado por outro PIC. O nico problema que, para poder utilizar o LVP, o pino RB3 perdido como I/O convencional. Por isso, a habilitao desse sistema feita por meio das configuraes de gravao.

Conectando o PIC 16F877A - Recursos Avanados

337
Anotaes

_________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________

Conectando o PIC 16F877A - Recursos Avanados

338

Conectando o PIC

14
Implementando um Sistema de Medio de Temperatura
Introduo
Parabns, voc chegou ao final do nosso estudo. Isso significa que a batalha foi ganha. No deve ter sido muito fcil, mas esperamos que tambm no tenha sido to difcil. O fato que agora voc possui muito mais conhecimento do que quando comeou, e esse conhecimento ser capaz de lan-lo a um desafio muito maior, o desenvolvimento de projetos cada vez mais complexos. A batalha foi ganha, mas a luta est apenas comeando. Para ajudar nessa nova jornada, vamos apresentar a soluo de um pequeno problema, utilizando os recursos da placa do Apndice F (McLab2) que no foram vistos nos captulos anteriores. A partir de agora, montaremos um pequeno sistema de medio de temperatura.

O sistema
O monitoramento da temperatura um dos problemas mais clssicos enfrentado pela maioria dos projetistas. Como nossa placa possui um sensor de temperatura (diodo) e dois atuadores: aquecimento (resistncia) e resfriamento (ventilador), nada melhor do que implementarmos um sistema capaz de obter a temperatura atual para mostr-la no LCD.

O sensor de temperatura
Para podermos obter a temperatura ambiente, usaremos um diodo. Como o diodo um componente que apresenta uma queda de tenso sobre ele proporcional temperatura do mesmo, estaremos monitorando a tenso para encontrarmos a temperatura. Para isso, nosso circuito eletrnico faz uso de um diodo de sinal convencional (1N4148) ligado a um amplificador e a uma porta analgica do PIC. Ligamos ao amplificador tambm um potencimetro para podermos alterar o off-set da curva, ajustando assim a temperatura com uma referncia externa. Internamente, o sistema trabalhar com uma converso A/D de 8 bits, gerando 256 possveis valores de tenso para o diodo. Para cada valor obtido, teremos uma temperatura relacionada. A rotina TABELA_TEMP, que se encontra no final do cdigo apresentado neste captulo, efetuar a converso entre a tenso lida (unidades de A/D) e a temperatura real. Nada mais que uma tabela de converso/linearizao.

Conectando o PIC 16F877A - Recursos Avanados

339
Essa tabela foi construda com base na curva de resposta do diodo utilizado em funo da temperatura. Caso seja construdo um sensor de temperatura com outro tipo de componente que gere uma tenso varivel, basta refazer a tabela de converso. Uma vez convertida, a temperatura , ento, mostrada no LCD, na unidade de C (lado direito).

O aquecimento
Possibilitaremos que o usurio aumente a temperatura sobre o diodo por meio do controle manual da resistncia existente na placa. Faremos isso por intermdio de um dos PWMs do PIC, que se encontra ligado ao resistor. Por Intermdio dos botes S1 e S2 poderemos aumentar e diminuir o duty cycle do PWM, variando de 0 a 100%. Mantendo-se os botes pressionados, o incremento/decremento ser automtico. O valor atual para o aquecimento ser mostrado no LCD (lado esquerdo).

O resfriamento
Inversamente ao aquecimento, possibilitaremos tambm o resfriamento do sistema por meio do ventilador, que controlado pelo outro canal de PWM do PIC. Obviamente s seremos capazes de obter temperaturas levemente abaixo do valor ambiente, mas nossa inteno podermos criar variveis diferentes de aquecimento e resfriamento. Controlaremos o ventilador pelo duty cycle do PWM, mas, para o sistema ficar um pouco mais completo, mostraremos no LCD (centro) o valor da rotao do motor, em RPS (rotaes por segundo). Isso ser feito atravs do sensor ptico que se encontra instalado na base das hlices do ventilador. Os botes S3 e S4 so usados para aumentar e diminuir o duty cycle do PWM, variando de 0 a 100%. Mantendo-se os botes pressionados, o incremento/decremento ser automtico. Cada vez que uma das ps da hlice passa em frente ao sensor ptico, um pulso transmitido ao PIC. Como esse sinal est ligado ao pino RC1, utilizamos o TMR1 com incremento externo para contabilizar a quantidade de pulsos gerados. A cada segundo (base de tempo gerada pela interrupo de TMR2), o total de pulsos transferido para a varivel CONT_VENT. Antes de mostrarmos o valor correto no LCD, devemos dividir o total de pulsos durante 1 segundo (CONT_VENT) pelo nmero de paletas (pulsos por volta). Neste caso CONT_VENT ser dividido por sete.

Comunicao serial
O sistema possibilita ainda que maiores implementaes sejam feitas com o tratamento externo da temperatura, pois os valores obtidos so enviados automaticamente pela porta serial, a cada segundo. Com isso, possvel criarmos um pequeno programa de computador capaz de plotar essa temperatura no decorrer do tempo. Os dados tambm podem ser armazenados para clculos ou consultas futuras. Use a imaginao. Os dados so transmitidos pela USART por meio do conector DB-9, respeitando-se o padro RS-232 com 8N1 e baud rate de 9.600bps. A cada um segundo transmitido um byte com o valor da temperatura j convertido para C.

Conectando o PIC 16F877A - Recursos Avanados

340
Consideraes gerais
Ambos os PWMs so controlados pelo TMR2, que est regulado para 1 ms. Por isso, o perodo dos 2 PWMs de 1ms, ou seja, eles operam a 1 kHz. O postscale do TMR2 foi regulado em 1:10, gerando uma interrupo a cada 10ms. Utilizamos um contador auxiliar (TEMP0_1S) para contabilizarmos cem interrupes, gerando a base de tempo de um segundo. Essa base utilizada para capturar a rotao do ventilador, efetuar uma converso de temperatura e transmitir dados pela USART. Esquema eltrico

Esquema eltrico

Conectando o PIC 16F877A - Recursos Avanados

341

Conectando o PIC 16F877A - Recursos Avanados

342

Fluxograma

Conectando o PIC 16F877A - Recursos Avanados

343

Conectando o PIC 16F877A - Recursos Avanados

344

Conectando o PIC 16F877A - Recursos Avanados

345

Conectando o PIC 16F877A - Recursos Avanados

346
;************************************** ;* ;* ;* ;* ;* ;************************************** ; * VERSO : 3.0 ;* DATA : 24/02/2003 ;************************************** * * CONECTANDO O PIC - RECURSOS AVANADOS EXEMPLO 10 * NICOLS CSAR LAVINIA e DAVID JOS DE SOUZA * * * *

;************************************** ;* DESCRIO GERAL *

;************************************** ; ESTE EXEMPLO FOI ELABORADO PARA EXPLICAR O FUNCIONAMENTO DO TMR1 COMO ; CONTADOR, UTILIZADO NA PLACA MCLAB2 PARA CONTAR AS ROTAES DO VENTILADOR. ; O SOFTWARE CONVERTE O CANAL 0 DO CONVERSOR A/D (SENSOR DE TEMPERATURA). ; DOIS PWMs FORAM UTILIZADOS, UM PARA MODULAR A RESISTNCIA DE AQUECIMENTO ; E OUTRO PARA A VELOCIDADE DO VENTILADOR. ; COM AS TECLAS S1 E S2 PODE-SE VARIAR O PWM DO AQUECEDOR E COM AS TECLAS ; S3 E S4 O PWM DO VENTILADOR. ; NO LCD SO MOSTRADOS OS VALORES DO PWM DO AQUECEDOR, O NMERO DE ROTAES ; POR SEGUNDO DO VENTILADOR E A TEMPERATURA DO DIODO J CONVERTIDA EM GRAUS ; CELSIUS. ALM DISSO, O VALOR ATUAL DA TEMPERATURA DO DIODO TRANSMITIDO ; PERIODICAMENTE ATRAVS DA USART. ; ;************************************** ;* CONFIGURAES PARA GRAVAO *

;**************************************

__CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_ON & _XT_OSC

;************************************** ;* DEFINIO DAS VARIVEIS *

Conectando o PIC 16F877A - Recursos Avanados

347
;************************************** ; ESTE BLOCO DE VARIVEIS EST LOCALIZADO LOGO NO INCIO DO BANCO 0

CBLOCK 0X20

; POSIO INICIAL DA RAM

TEMPO0 TEMPO1 ; TMEPORIZADORES P/ ROTINA DE DELAY

AUX

; REGISTRADOR AUXILIAR DE USO GERAL

UNIDADE DEZENA CENTENA

; ARMAZENA VALOR DA UNIDADE ; ARMAZENA VALOR DA DEZENA ; ARMAZENA VALOR DA CENTENA

INTENSIDADE_VENT INTENSIDADE_AQUE

; INTENSIDADE DO VENTILADOR ; INTENSIDADE DO AQUECEDOR

ACCaHI ACCaLO

; ACUMULADOR a DE 16 BITS UTILIZADO ; NA ROTINA DE DIVISO

ACCbHI ACCbLO

; ACUMULADOR b DE 16 BITS UTILIZADO ; NA ROTINA DE DIVISO

ACCcHI ACCcLO

; ACUMULADOR c DE 16 BITS UTILIZADO ; NA ROTINA DE DIVISO

ACCdHI ACCdLO

; ACUMULADOR d DE 16 BITS UTILIZADO ; NA ROTINA DE DIVISO

temp

; CONTADOR TEMPORRIO UTILIZADO ; NA ROTINA DE DIVISO

H_byte L_byte

; ACUMULADOR DE 16 BITS UTILIZADO ; P/ RETORNAR O VALOR DA ROTINA ; DE MULTIPLICAO

Conectando o PIC 16F877A - Recursos Avanados

348

mulplr mulcnd

; OPERADOR P/ ROTINA DE MUTIPLICAO ; OPERADOR P/ ROTINA DE MUTIPLICAO

TEMPERATURA TEMP_CELSIUS

; TEMPERATURA DO DIODO EM UNIDADES DE A/D ; TEMPERATURA DO DIODO J CONVERTIDO ; PARA GRAUS CELSIUS

FILTRO_BOTOES TEMPO_TURBO

; FILTRO P/ DEBOUNCE DOS BOTOES ; TEMPORIZADOR P/ TUBO DO TECLADO

TEMPO_1S

; TEMPORIZADOR DE 1 SEGUNDO

CONT_VENT_HIGH CONT_VENT_LOW VENTILADOR ; CONTADORES PARA ROTAO DO

FLAG

; FLAG DE USO GERAL

WORK_TEMP STATUS_TEMP PCLATH_TEMP FSR_TEMP ; REGISTRADORES UTILIZADOS P/ SALVAR ; O CONTEXTO DURANTE AS INTERRUPES ENDC

;************************************** ;* DEFINIO DAS VARIVEIS INTERNAS DO PIC *

;************************************** ; O ARQUIVO DE DEFINIES DO PIC UTILIZADO DEVE SER REFERENCIADO PARA QUE ; OS NOMES DEFINIDOS PELA MICROCHIP POSSAM SER UTILIZADOS, SEM A NECESSIDADE ; DE REDIGITAO.

#INCLUDE <P16F877A.INC>

; MICROCONTROLADOR UTILIZADO

Conectando o PIC 16F877A - Recursos Avanados

349
;************************************** ;* DEFINIO DOS BANCOS DE RAM *

;************************************** ; OS PSEUDOS-COMANDOS "BANK0" E "BANK1", AQUI DEFINIDOS, AJUDAM A COMUTAR ; ENTRE OS BANCOS DE MEMRIA.

#DEFINE BANK1 #DEFINE BANK0

BSF BCF

STATUS,RP0 STATUS,RP0

; SELECIONA BANK1 DA MEMORIA RAM ; SELECIONA BANK0 DA MEMORIA RAM

;************************************** ;* CONSTANTES INTERNAS *

;************************************** ; A DEFINIO DE CONSTANTES FACILITA A PROGRAMAO E A MANUTENO.

FILTRO_TECLA

EQU

.200

; FILTRO P/ EVITAR RUIDOS DOS BOTES

TURBO_TECLA

EQU

.70

; TEMPERIZADOR P/ TURBO DO TECLADO

;************************************** ;* DECLARAO DOS FLAGs DE SOFTWARE *

;************************************** ; A DEFINIO DE FLAGs AJUDA NA PROGRAMAO E ECONOMIZA MEMRIA RAM.

#DEFINE MOSTRA_RPS

FLAG,0

; FLAG PARA MOSTRAR A ROTAO NO LCD ; 1 -> DEVE MOSTRAR A ROTAO ; 0 -> NAO DEVE MOSTRAR A ROTAO

#DEFINE MOSTRA_TEMP

FLAG,1

; FLAG PARA MOSTRAR A TEMPERATURA NO LCD ; 1 -> DEVE MOSTRAR A TEMPERATURA ; 0 -> NAO DEVE MOSTRAR A TEMPERATURA

;************************************** ;* ENTRADAS *

;************************************** ; AS ENTRADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E

Conectando o PIC 16F877A - Recursos Avanados

350
; FUTURAS ALTERAES DO HARDWARE.

#DEFINE BOTAO_0

PORTB,0

; ESTADO DO BOTO 0 ; 1 -> LIBERADO ; 0 -> PRESSIONADO

#DEFINE BOTAO_1

PORTB,1

; ESTADO DO BOTO 1 ; 1 -> LIBERADO ; 0 -> PRESSIONADO

#DEFINE BOTAO_2

PORTB,2

; ESTADO DO BOTO 2 ; 1 -> LIBERADO ; 0 -> PRESSIONADO

#DEFINE BOTAO_3

PORTB,3

; ESTADO DO BOTO 3 ; 1 -> LIBERADO ; 0 -> PRESSIONADO

; ESTE PROGRAMA UTILIZA UMA ENTRADA P/ O CONVERSOR A/D. ; ESTA ENTRADA NO PRECISA SER DECLARADA, POIS O SOFTWARE NUNCA FAZ ; REFERNCIA A ELA DE FORMA DIRETA, POIS O CANAL A/D A SER CONVERTIDO ; SELECIONADO NO REGISTRADOS ADCON0 DE FORMA BINRIA E NO ATRAVS DE ; DEFINES. PORM PARA FACILITAR O ENTENDIMENTO DO HARDWARE VAMOS DECLARAR ; ESTA ENTRADA NORMALMENTE.

#DEFINE CAD_TEMP

PORTA,0

; ENTRADA A/D PARA TEMPERATURA

; ALM DA ENTRADA DO CONVERSOR A/D, TEMOS A ENTRADA DA USART (RECEPO). ; NOVAMENTE ESTA ENTRADA NO NECESSITA SER DECLARADA, PORM, PARA ; FACILITAR O ENTENDIMENTO DO HARDWARE VAMOS DECLARAR ESTA ENTRADA ; NORMALMENTE.

#DEFINE RXUSART

PORTC,7

; ENTRADA DE RX DA USART

;**************************************

Conectando o PIC 16F877A - Recursos Avanados

351
;* SADAS *

;************************************** ; AS SADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE.

#DEFINE DISPLAY

PORTD

; BARRAMENTO DE DADOS DO DISPLAY

#DEFINE RS

PORTE,0

; INDICA P/ O DISPLAY UM DADO OU COMANDO ; 1 -> DADO ; 0 -> COMANDO

#DEFINE ENABLE

PORTE,1

; SINAL DE ENABLE P/ DISPLAY ; ATIVO NA BORDA DE DESCIDA

; TEMOS TAMBM AS SADAS DE TX DA USART, PWM1 E PWM2. ; PARA FACILITAR O ENTENDIMENTO DO HARDWARE VAMOS DECLARAR ESTAS SADAS ; NORMALMENTE APESAR DE NO SEREM UTILIZADAS.

#DEFINE TXUSART

PORTC,6

; SADA DE TX DA USART

#DEFINE VENTILADOR

PORTC,1

; SADA P/ VENTILADOR

#DEFINE AQUECEDOR

PORTC,2

; SADA P/ AQUECEDOR

;************************************** ;* VETOR DE RESET DO MICROCONTROLADOR *

;************************************** ; POSIO INICIAL PARA EXECUO DO PROGRAMA

ORG GOTO

0X0000 CONFIG

; ENDEREO DO VETOR DE RESET ; PULA PARA CONFIG DEVIDO A REGIO ; DESTINADA AS ROTINAS SEGUINTES

;************************************** ;* VETOR DE INTERRUPO *

Conectando o PIC 16F877A - Recursos Avanados

352
;************************************** ; POSIO DE DESVIO DO PROGRAMA QUANDO UMA INTERRUPO ACONTECE

ORG

0X0004

; ENDEREO DO VETOR DE INTERRUPO

; MUITO IMPORTANTE QUE OS REGISTRADORES PRIORITRIOS AO FUNCIONAMENTO DA ; MQUINA, E QUE PODEM SER ALTERADOS TANTO DENTRO QUANTO FORA DAS INTS SEJAM ; SALVOS EM REGISTRADORES TEMPORRIOS PARA PODEREM SER POSTERIORMENTE ; RECUPERADOS.

SALVA_CONTEXTO MOVWF WORK_TEMP SWAPF STATUS,W MOVWF STATUS_TEMP MOVF FSR,W ; SALVA REGISTRADOR FSR ; SALVA REGISTRADOR DE TRABALHO E ; DE STATUS DURANTE O TRATAMENTO ; DA INTERRUPO.

MOVWF FSR_TEMP MOVF PCLATH,W

MOVWF PCLATH_TEMP

; SALVA REGISTRADOR PCLATH

CLRF

PCLATH

; LIMPA REGISTRADOR PCLATH ; (SELECIONA PGINA 0)

CLRF

STATUS

; LIMPA REGISTRADOR STATUS ; (SELECIONA BANCO 0)

;************************************** ;* TRATAMENTO DA INTERRUPO DE TIMER 2 *

;************************************** ; A INTERRUPO DE TMR2 UTILIZADA PARA FORNECER A BASE DE TEMPO PARA AS ; MEDIDAS DAS ROTAES POR SEGUNDO DO VENTILADOR E DA TEMPERATURA DO DIODO. ; ALM DISSO, ELA SETA OS FLAGS PARA QUE ESTES SEJAM ATUALIZADOS NO LCD. ; O TMR2 EST CONFIGURADO PARA POSTSCALE DE 1:10 E PORTANTO A CADA 10ms A ; INTERRUPO GERADA. ; O CONVERSOR A/D LIDO A CADA INTERRUPO, OU SEJA, A CADA 10ms. ; A CADA 100 INTERRUPES, OU SEJA, A CADA 1 SEGUNDO, O VALOR DO CONTADOR DO ; TMR1 SALVO NA VARIVEL CONT_VENT (HIGH E LOW), DESTA FORMA, O VALOR DE

Conectando o PIC 16F877A - Recursos Avanados

353
; CONT_VENT O NMERO DE ROTAES DO VENTILADOR POR SEGUNDO. NA VERDADE ESTE ; VALOR ENCONTRA-SE MULTIPLICADO PELO NMERO DE PALHETAS DO VENTILADOR.

INT_TMR2 BCF PIR1,TMR2IF ; LIMPA FLAG DA INTERRUPO

DECFSZ TEMPO_1S,F GOTO INT_TMR2_2

; FIM DO 1 SEGUNDO ? ; NO - PULA P/ INT_TMR2_2 ; SIM

MOVLW .100 MOVWF TEMPO_1S ; RECARREGA TEMPORIZADOR DE 1 SEGUNDO

BCF

T1CON,TMR1ON

; PARALIZA CONTADOR DO TMR1

MOVF

TMR1H,W

MOVWF CONT_VENT_HIGH MOVF TMR1L,W ; SALVA VALOR DO TMR1 EM CONT_VENT

MOVWF CONT_VENT_LOW

CLRF CLRF

TMR1H TMR1L ; RESETA CONTADORES

BSF

T1CON,TMR1ON

; LIBERA CONTADORES DO TMR1

BSF

MOSTRA_RPS

; SETA FLAG P/ MOSTRAR VALOR ; DAS RPS DO VENTILADOR

INT_TMR2_2 MOVF ADRESH,W ; SALVA VALOR DA CONVERSO A/D ; NA VARIVEL TEMPERATURA BSF ADCON0,GO ; INICIA UMA NOVA CONVERSO

MOVWF TEMPERATURA

BSF

MOSTRA_TEMP

; SETA FLAG P/ ATUALIZAR VALOR ; DA TEMPERATURA NO LCD

Conectando o PIC 16F877A - Recursos Avanados

354

;************************************** ;* SADA DA INTERRUPO *

;************************************** ; ANTES DE SAIR DA INTERRUPO, O CONTEXTO SALVO NO INCIO DEVE SER ; RECUPERADO PARA QUE O PROGRAMA NO SOFRA ALTERAES INDESEJADAS.

SAI_INT MOVF PCLATH_TEMP,W ; RECUPERA REG. PCLATH (PAGINAO)

MOVWF PCLATH MOVF FSR_TEMP,W

MOVWF FSR SWAPF STATUS_TEMP,W MOVWF STATUS SWAPF WORK_TEMP,F SWAPF WORK_TEMP,W RETFIE

; RECUPERA REG. FSR (END. INDIRETO)

; RECUPERA REG. STATUS

; RECUPERA REG. WORK ; RETORNA DA INTERRUPO (HABILITA GIE)

;************************************** ;* ROTINA DE DIVISO *

;************************************** ;**************************************************************************** ; Double Precision Division

;**************************************************************************** ; Division : ACCb(16 bits) / ACCa(16 bits) -> ACCb(16 bits) with ; ; ; ; ; ; Remainder in ACCc (16 bits) (a) Load the Denominator in location ACCaHI & ACCaLO ( 16 bits ) (b) Load the Numerator in location ACCbHI & ACCbLO ( 16 bits ) (c) CALL D_divF (d) The 16 bit result is in location ACCbHI & ACCbLO (e) The 16 bit Remainder is in locations ACCcHI & ACCcLO

;****************************************************************************

D_divF MOVLW .16

Conectando o PIC 16F877A - Recursos Avanados

355
MOVWF temp ; CARREGA CONTADOR PARA DIVISO

MOVF

ACCbHI,W

MOVWF ACCdHI MOVF ACCbLO,W ; SALVA ACCb EM ACCd

MOVWF ACCdLO

CLRF CLRF

ACCbHI ACCbLO ; LIMPA ACCb

CLRF CLRF

ACCcHI ACCcLO ; LIMPA ACCc

DIV BCF RLF RLF RLF RLF MOVF STATUS,C ACCdLO,F ACCdHI,F ACCcLO,F ACCcHI,F ACCaHI,W ;check if a>c

SUBWF ACCcHI,W BTFSS GOTO MOVF STATUS,Z NOCHK ACCaLO,W

SUBWF ACCcLO,W NOCHK BTFSS GOTO MOVF STATUS,C NOGO ACCaLO,W

;if msb equal then check lsb

;carry set if c>a

;c-a into c

SUBWF ACCcLO,F BTFSS DECF MOVF STATUS,C ACCcHI,F ACCaHI,W

SUBWF ACCcHI,F BSF STATUS,C ;shift a 1 into b (result)

Conectando o PIC 16F877A - Recursos Avanados

356
NOGO RLF RLF ACCbLO,F ACCbHI,F

DECFSZ temp,F GOTO DIV

; FIM DA DIVISO ? ; NO - VOLTA P/ DIV ; SIM

RETURN

; RETORNA

;************************************** ;* ROTINA DE MULTIPLICAO *

;************************************** ;**************************************************************************** ; ; 8x8 Software Multiplier ( Fast Version : Straight Line Code )

;**************************************************************************** ; ; The 16 bit result is stored in 2 bytes ; Before calling the subroutine " mpy ", the multiplier should ; be loaded in location " mulplr ", and the multiplicand in ; " mulcnd " . The 16 bit result is stored in locations ; H_byte & L_byte. ; ; ; ; Performance : Program Memory : 37 locations # of cycles : 38

Scratch RAM : 0 locations

;*******************************************************************

; ******************************************** ; Define a macro for adding & right shifting ; ********************************************

mult

MACRO bit

; Begin macro

Conectando o PIC 16F877A - Recursos Avanados

357
BTFSC mulplr,bit ADDWF H_byte,F RRF RRF H_byte,F L_byte,F

ENDM

; End of macro

; ***************************** ; Begin Multiplier Routine ; *****************************

mpy_F CLRF CLRF MOVF BCF H_byte L_byte mulcnd,W STATUS,C ; move the multiplicand to W reg. ; Clear carry bit in the status Reg.

mult mult mult mult mult mult mult mult

0 1 2 3 4 5 6 7

RETURN

; RETORNA

;************************************** ;* ROTINA DE DELAY (DE 1MS AT 256MS) *

;************************************** ; ESTA UMA ROTINA DE DELAY VARIVEL, COM DURAO DE 1MS X O VALOR PASSADO ; EM WORK (W).

DELAY_MS

Conectando o PIC 16F877A - Recursos Avanados

358
MOVWF TEMPO1 MOVLW .250 MOVWF TEMPO0 ; CARREGA TEMPO0 (P/ CONTAR 1MS) ; CARREGA TEMPO1 (UNIDADES DE MS)

CLRWDT DECFSZ TEMPO0,F GOTO $-2

; LIMPA WDT (PERDE TEMPO) ; FIM DE TEMPO0 ? ; NO - VOLTA 2 INSTRUES ; SIM - PASSOU-SE 1MS

DECFSZ TEMPO1,F GOTO $-6

; FIM DE TEMPO1 ? ; NO - VOLTA 6 INSTRUES ; SIM

RETURN

; RETORNA

;************************************** ;* ROTINA DE ESCRITA DE UM CARACTER NO DISPLAY *

;************************************** ; ESTA ROTINA ENVIA UM CARACTER PARA O MDULO DE LCD. O CARACTER A SER ; ESCRITO DEVE SER COLOCADO EM WORK (W) ANTES DE CHAMAR A ROTINA.

ESCREVE MOVWF DISPLAY NOP BSF GOTO BCF ENABLE $+1 ENABLE ; ATUALIZA DISPLAY (PORTD) ; PERDE 1US PARA ESTABILIZAO ; ENVIA UM PULSO DE ENABLE AO DISPLAY ;. ;.

MOVLW .1 CALL RETURN DELAY_MS ; DELAY DE 1MS ; RETORNA

;************************************** ;* ;* AJUSTE DECIMAL * *

W [HEX] = CENTENA [DEC] : DEZENA [DEC] ; UNIDADE [DEC]

;************************************** ; ESTA ROTINA RECEBE UM ARGUMENTO PASSADO PELO WORK E RETORNA NAS VARIVEIS

Conectando o PIC 16F877A - Recursos Avanados

359
; CENTENA, DEZENA E UNIDADE O NMERO BCD CORRESPONDNTE AO PARMETRO PASSADO.

AJUSTE_DECIMAL MOVWF AUX ; SALVA VALOR A CONVERTER EM AUX

CLRF CLRF CLRF

UNIDADE DEZENA CENTENA ; RESETA REGISTRADORES

MOVF BTFSC RETURN

AUX,F STATUS,Z ; VALOR A CONVERTER = 0 ? ; SIM - RETORNA ; NO

INCF

UNIDADE,F

; INCREMENTA UNIDADE

MOVF

UNIDADE,W

XORLW 0X0A BTFSS GOTO STATUS,Z $+3 ; UNIDADE = 10d ? ; NO ; SIM CLRF INCF UNIDADE DEZENA,F ; RESETA UNIDADE ; INCREMENTA DEZENA

MOVF

DEZENA,W

XORLW 0X0A BTFSS GOTO STATUS,Z $+3 ; DEZENA = 10d ? ; NO ; SIM CLRF INCF DEZENA CENTENA,F ; RESETA DEZENA ; INCREMENTA CENTENA

DECFSZ AUX,F GOTO RETURN $-.14

; FIM DA CONVERSO ? ; NO - VOLTA P/ CONTINUAR CONVERSO ; SIM

Conectando o PIC 16F877A - Recursos Avanados

360
;************************************** ;* ROTINA PARA MOSTRAR A ROTAO DO VENTILADOR NO LCD *

;************************************** ; ESTA ROTINA ATUALIZA O VALOR DAS ROTAES POR SEGUNDO DO VENTILADOR NO LCD.

MOSTRA_RPS_LCD BCF MOSTRA_RPS ; LIMPA FLAG DE ATUALIZAO DA RPS

BCF

RS

; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 7 ; SELECIONA O DISPLAY P/ DADOS

MOVLW 0XC7 CALL BSF ESCREVE RS

MOVF

CONT_VENT_HIGH,W

MOVWF ACCbHI MOVF CONT_VENT_LOW,W ; CARREGA ACCb COM VALOR DO CONTADOR

MOVWF ACCbLO

CLRF

ACCaHI

MOVLW .7 MOVWF ACCaLO ; CARREGA ACCa COM NMERO DE PALHETAS ; DO VENTILADOR

CALL

D_divF

; CHAMA ROTINA DE DIVISO

MOVF CALL

ACCbLO,W AJUSTE_DECIMAL ; FAZ O AJUSTE DECIMAL DO RESULTADO ; (ROTAES POR SEGUNDO)

MOVF

CENTENA,W ; CONVERTE CENTENA EM ASCII ; ESCREVE VALOR NO LCD

ADDLW 0X30 CALL ESCREVE

MOVF

DEZENA,W ; CONVERTE DEZENA EM ASCII ; ESCREVE VALOR NO LCD

ADDLW 0X30 CALL ESCREVE

Conectando o PIC 16F877A - Recursos Avanados

361

MOVF

UNIDADE,W ; CONVERTE UNIDADE EM ASCII ; ESCREVE VALOR NO LCD

ADDLW 0X30 CALL ESCREVE

RETURN

; RETORNA

;************************************** ;* ROTINA PARA MOSTRAR A TEMPERATURA NO LCD *

;************************************** ; ESTA ROTINA CONSULTA UMA TABELA P/ CONVERTER O VALOR DO CANAL A/D DO SENSOR ; DE TEMPERATURA EM GRAUS CELSIUS, MOSTRA ESTE NO LCD E TRANSMITE PELA USART.

MOSTRA_TEMP_LCD BCF MOSTRA_TEMP ; LIMPA FLAG DE ATUALIZAO DA TEMP.

CALL

TABELA_TEMPERATURA

; CONVERTE A/D EM GRAUS CELSIUS ; SALVA VALOR EM TEMP_CELSIUS ; FAZ O AJUSTE DECIMAL

MOVWF TEMP_CELSIUS CALL AJUSTE_DECIMAL

BCF

RS

; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 11 ; SELECIONA O DISPLAY P/ DADOS

MOVLW 0XCB CALL BSF ESCREVE RS

MOVF

CENTENA,W ; CONVERTE CENTENA EM ASCII ; ESCREVE VALOR NO LCD

ADDLW 0X30 CALL ESCREVE

MOVF

DEZENA,W ; CONVERTE DEZENA EM ASCII ; ESCREVE VALOR NO LCD

ADDLW 0X30 CALL ESCREVE

MOVF

UNIDADE,W ; CONVERTE UNIDADE EM ASCII

ADDLW 0X30

Conectando o PIC 16F877A - Recursos Avanados

362
CALL ESCREVE ; ESCREVE VALOR NO LCD

MOVF BANK1 BTFSS GOTO BANK0

TEMP_CELSIUS,W

; CARREGA EM WORK A TEMPERATURA ; ALTERA P/ BANCO 1 DA RAM

TXSTA,TRMT $-1

; O BUFFER DE TX EST VAZIO ? ; NO - AGUARDA ESVAZIAR ; SIM - VOLTA P/ BANCO 0 DA RAM ; CARREGA TXREG COM O VALOR DO WORK ; TRANSMITE A TEMPERATURA EM GRAUS ; CELSIUS PELA USART

MOVWF TXREG

RETURN

; RETORNA

;************************************** ;* CONFIGURAES INICIAIS DE HARDWARE E SOFTWARE *

;************************************** ; NESTA ROTINA SO INICIALIZADAS AS PORTAS DE I/O DO MICROCONTROLADOR E AS ; CONFIGURAES DOS REGISTRADORES ESPECIAIS (SFR). A ROTINA INICIALIZA A ; MQUINA E AGUARDA O ESTOURO DO WDT.

CONFIG CLRF CLRF CLRF CLRF CLRF PORTA PORTB PORTC PORTD PORTE ; GARANTE TODAS AS SADAS EM ZERO

BANK1

; SELECIONA BANCO 1 DA RAM

MOVLW B'11111111' MOVWF TRISA ; CONFIGURA I/O DO PORTA

MOVLW B'11111111' MOVWF TRISB ; CONFIGURA I/O DO PORTB

MOVLW B'10111001'

Conectando o PIC 16F877A - Recursos Avanados

363
MOVWF TRISC ; CONFIGURA I/O DO PORTC

MOVLW B'00000000' MOVWF TRISD ; CONFIGURA I/O DO PORTD

MOVLW B'00000100' MOVWF TRISE ; CONFIGURA I/O DO PORTE

MOVLW B'11011011' MOVWF OPTION_REG ; CONFIGURA OPTIONS ; PULL-UPs DESABILITADOS ; INTER. NA BORDA DE SUBIDA DO RB0 ; TIMER0 INCREM. PELO CICLO DE MQUINA ; WDT - 1:8 ; TIMER - 1:1

MOVLW B'01000000' MOVWF INTCON ; CONFIGURA INTERRUPES ; HABILITA INTER. DE PERIFRICOS

MOVLW B'00000010' MOVWF PIE1

; CONFIGURA INTER. DE PERIFRICOS ; HABILITA A INTERRUPO DE TMR2

MOVLW B'00000100' MOVWF ADCON1 ; CONFIGURA CONVERSOR A/D ; RA0, RA1 E RA3 COMO ANALGICO ; RA2, RA4 E RA5 COMO I/O DIGITAL ; PORTE COMO I/O DIGITAL ; JUSTIFICADO ESQUERDA ; 8 BITS EM ADRESH E 2 BITS EM ADRESL ; Vref+ = VDD (+5V) ; Vref- = GND ( 0V)

MOVLW B'00100100'

Conectando o PIC 16F877A - Recursos Avanados

364
MOVWF TXSTA ; CONFIGURA USART ; HABILITA TX ; MODO ASSINCRONO ; TRANSMISSO DE 8 BITS ; HIGH SPEED BAUD RATE MOVLW .25 MOVWF SPBRG ; ACERTA BAUD RATE -> 9600bps

MOVLW .249 MOVWF PR2 ; CONFIGURA PERODO DO PWM ; T=((PR2)+1)*4*Tosc*TMR2 Prescale ; T=((249)+1)*4*250ns*4 ; T=1,000ms -> 1.000Hz = 1KHz

BANK0

; SELECIONA BANCO 0 DA RAM

MOVLW B'10010000' MOVWF RCSTA ; CONFIGURA USART ; HABILITA RX ; RECEPO DE 8 BITS ; RECEPO CONTNUA ; DESABILITA ADDRESS DETECT

MOVLW B'01000001' MOVWF ADCON0 ; CONFIGURA CONVERSOR A/D ; VELOCIDADE -> Fosc/8 ; CANAL 0 ; MDULO LIGADO

CLRF CLRF

TMR1L TMR1H ; ZERA CONTADOR DO TMR1

MOVLW B'00000111' MOVWF T1CON ; CONFIGURA TMR1 ; PRESCALE DE 1:1

Conectando o PIC 16F877A - Recursos Avanados

365
; TMR1 INCREM. PELO PINO T1CKI (RC0) ; NO SINCRONIZADO COM CLOCK INTERNO ; CONTADOR HABILITADO

MOVLW B'01001101' MOVWF T2CON ; CONFIGURA TMR2 ; TMR2 HABILITADO ; POSTSCALE 1:10 ; PRESCALE 1:4

CLRF

CCPR2L

; ZERA PWM DO CCP2 (RC1 - VENTILADOR)

MOVLW B'00001111' MOVWF CCP2CON ; CONFIGURA CCP2 P/ PWM

CLRF

CCPR1L

; ZERA PWM DO CCP1 (RC2 - AQUECEDOR)

MOVLW B'00001111' MOVWF CCP1CON ; CONFIGURA CCP1 P/ PWM

; AS INSTRUES A SEGUIR FAZEM COM QUE O PROGRAMA TRAVE QUANDO HOUVER UM ; RESET OU POWER-UP, MAS PASSE DIRETO SE O RESET FOR POR WDT. DESTA FORMA, ; SEMPRE QUE O PIC LIGADO, O PROGRAMA TRAVA, AGUARDA UM ESTOURO DE WDT ; E COMEA NOVAMENTE. ISTO EVITA PROBLEMAS NO START-UP DO PIC.

BTFSC GOTO

STATUS,NOT_TO $

; RESET POR ESTOURO DE WATCHDOG TIMER ? ; NO - AGUARDA ESTOURO DO WDT ; SIM

;************************************** ;* INICIALIZAO DA RAM *

;************************************** ; ESTA ROTINA IR LIMPAR TODA A RAM DO BANCO 0, INDO DE 0X20 A 0X7F

MOVLW 0X20

Conectando o PIC 16F877A - Recursos Avanados

366
MOVWF FSR ; APONTA O ENDEREAMENTO INDIRETO PARA ; A PRIMEIRA POSIO DA RAM LIMPA_RAM CLRF INCF MOVF INDF FSR,F FSR,W ; COMPARA O PONTEIRO COM A LT. POS. +1 ; J LIMPOU TODAS AS POSIES? ; NO - LIMPA A PRXIMA POSIO ; SIM ; LIMPA A POSIO ; INCREMENTA O PONTEIRO P/ A PRX. POS.

XORLW 0X80 BTFSS GOTO STATUS,Z LIMPA_RAM

;************************************** ;* CONFIGURAES INICIAIS DO DISPLAY *

;************************************** ; ESTA ROTINA INICIALIZA O DISPLAY P/ COMUNICAO DE 8 VIAS, DISPLAY PARA 2 ; LINHAS, CURSOR APAGADO E DESLOCAMENTO DO CURSOR DIREITA.

INICIALIZACAO_DISPLAY BCF RS ; SELECIONA O DISPLAY P/ COMANDOS

MOVLW 0X30 CALL ESCREVE

; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO

MOVLW .3 CALL DELAY_MS ; DELAY DE 3MS (EXIGIDO PELO DISPLAY)

MOVLW 0X30 CALL ESCREVE

; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO

MOVLW 0X30 CALL ESCREVE

; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO

MOVLW B'00111000' CALL ESCREVE

; ESCREVE COMANDO PARA ; INTERFACE DE 8 VIAS DE DADOS

Conectando o PIC 16F877A - Recursos Avanados

367
MOVLW B'00000001' CALL ESCREVE ; ESCREVE COMANDO PARA ; LIMPAR TODO O DISPLAY

MOVLW .1 CALL DELAY_MS ; DELAY DE 1MS

MOVLW B'00001100' CALL ESCREVE

; ESCREVE COMANDO PARA ; LIGAR O DISPLAY SEM CURSOR

MOVLW B'00000110' CALL ESCREVE

; ESCREVE COMANDO PARA INCREM. ; AUTOMTICO DIREITA

;************************************** ;* ROTINA DE ESCRITA DA TELA PRINCIPAL *

;************************************** ; ESTA ROTINA ESCREVE A TELA PRINCIPAL DO PROGRAMA, COM AS FRASES: ; LINHA 1 - "AQUEC. RPS TEMP." ; LINHA 2 - " 000% 000 000C"

MOVLW 0X80 CALL BSF ESCREVE RS

; COMANDO PARA POSICIONAR O CURSOR ; LINHA 0 / COLUNA 0 ; SELECIONA O DISPLAY P/ DADOS ; COMANDOS PARA ESCREVER AS ; LETRAS DE "AQUEC. RPS TEMP."

MOVLW 'A' CALL ESCREVE

MOVLW 'Q' CALL ESCREVE

MOVLW 'U' CALL ESCREVE

MOVLW 'E' CALL ESCREVE

MOVLW 'C' CALL ESCREVE

MOVLW '.'

Conectando o PIC 16F877A - Recursos Avanados

368
CALL ESCREVE

MOVLW ' ' CALL ESCREVE

MOVLW 'R' CALL ESCREVE

MOVLW 'P' CALL ESCREVE

MOVLW 'S' CALL ESCREVE

MOVLW ' ' CALL ESCREVE

MOVLW 'T' CALL ESCREVE

MOVLW 'E' CALL ESCREVE

MOVLW 'M' CALL ESCREVE

MOVLW 'P' CALL ESCREVE

MOVLW '.' CALL ESCREVE

BCF

RS

; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 1 ; SELECIONA O DISPLAY P/ DADOS ; COMANDOS PARA ESCREVER AS ; LETRAS DE "000%"

MOVLW 0XC1 CALL BSF ESCREVE RS

MOVLW '0' CALL ESCREVE

MOVLW '0' CALL ESCREVE

MOVLW '0' CALL ESCREVE

MOVLW '%'

Conectando o PIC 16F877A - Recursos Avanados

369
CALL ESCREVE

BCF

RS

; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 7 ; SELECIONA O DISPLAY P/ DADOS ; COMANDOS PARA ESCREVER AS ; LETRAS DE "000"

MOVLW 0XC7 CALL BSF ESCREVE RS

MOVLW '0' CALL ESCREVE

MOVLW '0' CALL ESCREVE

MOVLW '0' CALL ESCREVE

BCF

RS

; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 7 ; SELECIONA O DISPLAY P/ DADOS ; COMANDOS PARA ESCREVER AS ; LETRAS DE "000C"

MOVLW 0XCB CALL BSF ESCREVE RS

MOVLW '0' CALL ESCREVE

MOVLW '0' CALL ESCREVE

MOVLW '0' CALL ESCREVE

MOVLW 0XDF CALL ESCREVE

MOVLW 'C' CALL ESCREVE

;************************************** ;* LOOP PRINCIPAL *

Conectando o PIC 16F877A - Recursos Avanados

370
;************************************** ; A ROTINA PRINCIPAL FICA AGUARDANDO O MOMENTO DE ESCREVER O VALOR DAS ; ROTAES DO VENTILADOR E A TEMPERATURA NO LCD ALM DE VARRER O TECLADO ; PARA MANIPULAR O VALOR DO PWM.

BSF

ADCON0,GO

; INICIA CONVERSO A/D ; EXECUTADA APENAS UMA VEZ

BSF

INTCON,GIE

; HABILITA FLAG GLOBAL DAS ; INTERRUPES

VARRE CLRWDT ; LIMPA WATCHDOG TIMER

BTFSC CALL

MOSTRA_RPS MOSTRA_RPS_LCD

; DEVE MOSTRAR RPS NO LCD ? ; SIM - CHAMA ROTINA P/ ATUALIZAR RPS ; NO

BTFSC CALL

MOSTRA_TEMP MOSTRA_TEMP_LCD

; DEVE MOSTRAR A TEMP. NO LCD ? ; SIM - CHAMA ROTINA P/ ATUALIZAR TEMP. ; NO

BTFSS GOTO

BOTAO_0 TRATA_BOTAO_0

; O BOTO 0 EST PRESSIONADO ? ; SIM - PULA P/ TRATA_BOTAO_0 ; NO

BTFSS GOTO

BOTAO_1 TRATA_BOTAO_1

; O BOTO 1 EST PRESSIONADO ? ; SIM - PULA P/ TRATA_BOTAO_1 ; NO

BTFSS GOTO

BOTAO_2 TRATA_BOTAO_2

; O BOTO 2 EST PRESSIONADO ? ; SIM - PULA P/ TRATA_BOTAO_2 ; NO

BTFSS GOTO

BOTAO_3 TRATA_BOTAO_3

; O BOTO 3 EST PRESSIONADO ? ; SIM - PULA P/ TRATA_BOTAO_3 ; NO

MOVLW FILTRO_TECLA MOVWF FILTRO_BOTOES

; CARREGA NO WORK O VALOR DE FILTRO_TECLA ; SALVA EM FILTRO_BOTOES

Conectando o PIC 16F877A - Recursos Avanados

371
; RECARREGA FILTRO P/ EVITAR RUIDOS MOVLW .1 MOVWF TEMPO_TURBO ; CARREGA TEMPO DO TURBO DAS TECLAS ; COM 1 - IGNORA O TURBO A PRIMEIRA ; VEZ QUE A TECLA PRESSIONADA

GOTO

VARRE

; VOLTA PARA VARRER TECLADO

;************************************** ;* TRATAMENTO DOS BOTES *

;**************************************

; ************************* TRATAMENTO DO BOTO 0 ***************************

TRATA_BOTAO_0 DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO

DECFSZ TEMPO_TURBO,F GOTO VARRE

; FIM DO TEMPO DE TURBO ? ; NO - VOLTA P/ VARRE ; SIM

MOVLW TURBO_TECLA MOVWF TEMPO_TURBO ; RECARREGA TEMPORIZADOR DO TURBO ; DAS TECLAS

MOVLW .100 XORWF INTENSIDADE_AQUE,W BTFSS INCF STATUS,Z INTENSIDADE_AQUE,F ; PODE INCREMENTAR PWM DO AQUECEDOR ? ; SIM - INCREMENTA INTENSIDADE_AQUE ; NO

MOVF

INTENSIDADE_AQUE,W

; CARREGA INTENSIDADE_AQUE NO WORK ; CARREGA WORK EM mulplr

MOVWF mulplr

Conectando o PIC 16F877A - Recursos Avanados

372
MOVLW .10 MOVWF mulcnd ; CARREGA 10d EM mulcnd

CALL

mpy_F

; CHAMA ROTINA DE MULTIPLICAO

SWAPF L_byte,W ANDLW B'00110000' IORLW RRF RRF RRF B'00001111' H_byte,F L_byte,F H_byte,F

MOVWF CCP1CON RRF L_byte,W ; ATUALIZA REGISTRADORES DO DUTY CYCLE ; DO MDULO CCP1 - PWM DO AQUECEDOR

MOVWF CCPR1L

MOVF CALL

INTENSIDADE_AQUE,W AJUSTE_DECIMAL

; FAZ O AJUSTE DECIMAL DA INTENSIDADE ; DO PWM DO AQUECEDOR

BCF

RS

; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 1 ; SELECIONA O DISPLAY P/ DADOS

MOVLW 0XC1 CALL BSF ESCREVE RS

MOVF

CENTENA,W ; FAZ AJUSTE ASCII DA CENTENA ; ESCREVE VALOR NO LCD

ADDLW 0X30 CALL ESCREVE

MOVF

DEZENA,W ; FAZ AJUSTE ASCII DA DEZENA ; ESCREVE VALOR NO LCD

ADDLW 0X30 CALL ESCREVE

MOVF

UNIDADE,W ; FAZ AJUSTE ASCII DA UNIDADE ; ESCREVE VALOR NO LCD

ADDLW 0X30 CALL ESCREVE

Conectando o PIC 16F877A - Recursos Avanados

373

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

; ************************* TRATAMENTO DO BOTO 1 ***************************

TRATA_BOTAO_1 DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO

DECFSZ TEMPO_TURBO,F GOTO VARRE

; FIM DO TEMPO DE TURBO ? ; NO - VOLTA P/ VARRE ; SIM

MOVLW TURBO_TECLA MOVWF TEMPO_TURBO ; RECARREGA TEMPORIZADOR DO TURBO ; DAS TECLAS

MOVF BTFSS DECF

INTENSIDADE_AQUE,F STATUS,Z INTENSIDADE_AQUE,F ; PODE DECREMENTAR PWM DO AQUECEDOR ? ; SIM - DECREMENTA INTENSIDADE_AQUE ; NO

MOVF

INTENSIDADE_AQUE,W

; CARREGA INTENSIDADE_AQUE NO WORK ; CARREGA WORK EM mulplr

MOVWF mulplr

MOVLW .10 MOVWF mulcnd ; CARREGA 10d EM mulcnd

CALL

mpy_F

; CHAMA ROTINA DE MULTIPLICAO

SWAPF L_byte,W ANDLW B'00110000' IORLW RRF RRF B'00001111' H_byte,F L_byte,F

Conectando o PIC 16F877A - Recursos Avanados

374
RRF H_byte,F

MOVWF CCP1CON RRF L_byte,W ; ATUALIZA REGISTRADORES DO DUTY CYCLE ; DO MDULO CCP1 - PWM DO AQUECEDOR

MOVWF CCPR1L

MOVF CALL

INTENSIDADE_AQUE,W AJUSTE_DECIMAL

; FAZ O AJUSTE DECIMAL DA INTENSIDADE ; DO PWM DO AQUECEDOR

BCF

RS

; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 1 ; SELECIONA O DISPLAY P/ DADOS

MOVLW 0XC1 CALL BSF ESCREVE RS

MOVF

CENTENA,W ; FAZ AJUSTE ASCII DA CENTENA ; ESCREVE VALOR NO LCD

ADDLW 0X30 CALL ESCREVE

MOVF

DEZENA,W ; FAZ AJUSTE ASCII DA DEZENA ; ESCREVE VALOR NO LCD

ADDLW 0X30 CALL ESCREVE

MOVF

UNIDADE,W ; FAZ AJUSTE ASCII DA UNIDADE ; ESCREVE VALOR NO LCD

ADDLW 0X30 CALL ESCREVE

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

; ************************* TRATAMENTO DO BOTO 2 ***************************

TRATA_BOTAO_2 DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO

Conectando o PIC 16F877A - Recursos Avanados

375
DECFSZ TEMPO_TURBO,F GOTO VARRE ; FIM DO TEMPO DE TURBO ? ; NO - VOLTA P/ VARRE ; SIM MOVLW TURBO_TECLA MOVWF TEMPO_TURBO ; RECARREGA TEMPORIZADOR DO TURBO ; DAS TECLAS MOVLW .100 XORWF INTENSIDADE_VENT,W BTFSS INCF STATUS,Z INTENSIDADE_VENT,F ; PODE INCREMENTAR PWM DO VENTILADOR ? ; SIM - INCREMENTA INTENSIDADE_VENT ; NO

MOVF

INTENSIDADE_VENT,W

; CARREGA INTENSIDADE_VENT NO WORK ; CARREGA WORK EM mulplr

MOVWF mulplr

MOVLW .10 MOVWF mulcnd ; CARREGA 10d EM mulcnd

CALL

mpy_F

; CHAMA ROTINA DE MULTIPLICAO

SWAPF L_byte,W ANDLW B'00110000' IORLW RRF RRF RRF B'00001111' H_byte,F L_byte,F H_byte,F

MOVWF CCP2CON RRF L_byte,W ; ATUALIZA REGISTRADORES DO DUTY CYCLE ; DO MDULO CCP2 - PWM DO VENTILADOR

MOVWF CCPR2L

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTES

; ************************* TRATAMENTO DO BOTO 3 ***************************

Conectando o PIC 16F877A - Recursos Avanados

376
TRATA_BOTAO_3 DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO

DECFSZ TEMPO_TURBO,F GOTO VARRE

; FIM DO TEMPO DE TURBO ? ; NO - VOLTA P/ VARRE ; SIM

MOVLW TURBO_TECLA MOVWF TEMPO_TURBO ; RECARREGA TEMPORIZADOR DO TURBO ; DAS TECLAS

MOVF BTFSS DECF

INTENSIDADE_VENT,F STATUS,Z INTENSIDADE_VENT,F ; PODE DECREMENTAR PWM DO VENTILADOR ? ; SIM - DECREMENTA INTENSIDADE_VENT ; NO

MOVF

INTENSIDADE_VENT,W

; CARREGA INTENSIDADE_VENT NO WORK ; CARREGA WORK EM mulplr

MOVWF mulplr

MOVLW .10 MOVWF mulcnd ; CARREGA 50d EM mulcnd

CALL

mpy_F

; CHAMA ROTINA DE MULTIPLICAO

SWAPF L_byte,W ANDLW B'00110000' IORLW RRF RRF RRF B'00001111' H_byte,F L_byte,F H_byte,F

MOVWF CCP2CON RRF L_byte,W ; ATUALIZA REGISTRADORES DO DUTY CYCLE ; DO MDULO CCP2 - PWM DO VENTILADOR

MOVWF CCPR2L

Conectando o PIC 16F877A - Recursos Avanados

377

GOTO

VARRE

; VOLTA P/ VARREDURA DOS BOTOES

;************************************** ;* TABELAS DE CONVERSAO P/ TEMPERATURA DO DIODO *

;**************************************

ORG RADIX

0X200 DEC

; POSICIONA O INICIO DA TABELA EM 0X400 ; CONFIGURA RADIX EM DECIMAL

TABELA_TEMPERATURA MOVLW HIGH TABELA_TEMP MOVWF PCLATH MOVLW LOW TABELA_TEMP ADDWF TEMPERATURA,W BTFSC INCF STATUS,C PCLATH,F ; ACERTA VALOR DO PCLATH ; CARREGA NO WORK PARTE BAIXA DO PC ; SOMA AO DESLOCAMENTO (TEMPERATURA) ; HOUVE ESTOURO ? ; SIM - INCREMENTA PCLATH (PARTE ALTA DO PC) ; MOVE WORK P/ PCL ; PROVOCA UM SALTO

MOVWF PCL

TABELA_TEMP DT DT DT DT 000,000,000,000,000,000,000,000,000,000,000,000,000,000,010,000 ;15 000,000,000,000,000,000,000,000,000,000,000,000,000,000,001,001 ;31 002,002,003,003,004,004,005,005,006,006,007,007,008,008,009,009 ;47 010,010,011,011,012,012,013,013,014,014,015,015,016,016,017,017 ;63

DT DT DT DT

018,018,019,019,020,020,021,021,022,022,023,023,023,024,024,025 ;79 025,026,026,027,027,028,028,029,029,030,030,031,031,032,032,033 ;95 033,034,034,035,035,036,036,037,037,038,038,039,039,040,040,041 ;111 041,042,042,043,043,044,044,045,045,046,046,047,047,048,048,049 ;127

DT DT DT DT

049,050,050,051,051,052,052,053,053,054,054,055,055,056,056,057 ;143 057,058,058,059,059,060,060,061,061,062,062,063,063,064,064,065 ;159 065,066,066,067,067,068,068,069,069,070,070,071,071,072,072,073 ;175 073,074,074,075,075,076,076,077,077,078,078,079,079,080,080,081 ;191

Conectando o PIC 16F877A - Recursos Avanados

378

DT DT DT DT

081,082,082,083,083,084,084,085,085,086,086,087,087,088,088,089 ;207 089,090,090,091,091,092,092,093,093,094,094,095,095,096,096,097 ;223 097,098,098,099,099,100,100,101,101,102,102,103,103,104,104,104 ;239 105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,112 ;255

;************************************** ;* FIM DO PROGRAMA *

;**************************************

END

; FIM DO PROGRAMA

Conectando o PIC 16F877A - Recursos Avanados

379

Conectando o PIC

A
Detalhamento dos Registradores Especiais (SFRs)
Introduo
Este apndice destina-se a apresentar um detalhamento de todos os registradores especiais (SFRs) disponveis no PIC 16F877A, para auxili-lo na programao dos seus sistemas. Para efeito de padronizao, cada bit dentro destes registradores receber um nome, sendo tambm especificado se este bit pode ser lido (R-Read) e/ou escrito (W-Write). Caso o bit no esteja implementado (U-unimplemented) ser lido com zero. Agrupamento e localizao Gerais
STATUS............................................................................................................................................. OPTION_REG.................................................................................................................................... PCON ................................................................................................................................................. PCLePCLATH ................................................................................................................................... FSReolNDF ..................................................................................................................................... 303 304 305 305 305

Portas
PORTAeTRISA ................................................................................................................................. PORTBeTRISB ................................................................................................................................. PORTCeTRISC ................................................................................................................................. PORTDeTRISD ................................................................................................................................. PORTEeTRISE ................................................................................................................................. 306 306 306 307 307

Timers
TMRO................................................................................................................................................. T1CON,TMR1LeTMR1H ................................................................................................................... T2CON, TMR2 e PR2......................................................................................................................... 308 308 309

Interrupes
INTCON .............................................................................................................................................. PIE1 .................................................................................................................................................... PIR1.................................................................................................................................................... PIE2.................................................................................................................................................... PIR2................................................................................................................................................... 310 311 312 313 313

Conversor A/D
ADCONO............................................................................................................................................. ADCON1 ............................................................................................................................................. 314 315

Conectando o PIC 16F877A - Recursos Avanados

380
ADRESLeADRESH............................................................................................................................ 315

Compare / Capture / PWM


CCP1CON.......................................................................................................................................... CCPR1LeCCPR1H ............................................................................................................................ CCP2CON .......................................................................................................................................... CCPR2LeCCPR2H ............................................................................................................................ 316 316 317 317

E PROM
EECON1 e EECON2 ........................................................................................................................... EEADReEEADRH ............................................................................................................................. EEDATAeEEDATH ............................................................................................................................ 318 318 319

SSP
SSPCON............................................................................................................................................ SSPCON2........................................................................................................................................... SSPSTAT ........................................................................................................................................... SSPADD ............................................................................................................................................. SSPBUF ............................................................................................................................................. USART TXSTA................................................................................................................................................ RCSTA ............................................................................................................................................... TXREGeRCREG ............................................................................................................................... SPBRG ............................................................................................................................................... 322 323 324 325 320 321 321 322 322

Comparadores
CMCON .............................................................................................................................................. 324 CVRCON ............................................................................................................................................ 326

Conectando o PIC 16F877A - Recursos Avanados

381

STATUS
Registrador: STATUS Endereos: 03h, 103h, 183h Bit 7 Bit 6 Bit5 Bit 4 Bit 3 Bit 2 Bit1 R/W R/W R/W R R R/W R/W IRP RP1 RP0 /TO /PD Z DC Condio en Powef-On Reset (PQR) 0 0 0 1 1 X X IRP:

Bit0 R/W C X

Seletor de banco de memria de dados usado para endereamento indireto: 0 = Banco O e 1 (OOh - FFh). 1 =Banco2e3(100h-1FFh).

RP1 RPO:

Seletor de banco de memria de dados usado para endereamento direto: 00 = Banco O (OOh - 7Fh). 01 = Banco 1 (80h - FFh). 10 = Banco2(100h-17Fh). 11 = Banco3(180h-1FFh). Indicao de Time-out: 0 = Indica que ocorreu um estouro do WatchDog (WDT). 1 = Indica que ocorreu um power-up ou foram executadas instrues CLRWDT ou SLEEP. Indicao Power-down: 0= Indica que a instruo SLEEP foi executada. 1= Indica que ocorreu um power-up ou foi executada a instruo CLRWDT. Indicao de Zero: 0= Indica que o resultado da ltima operao (lgica ou aritmtica) no resultou em zero. 1= Indica que o resultado da ltima operao (lgica ou aritmtica) resultou em zero. Digit Carry/borrow. 0= A ltima operao da ULA no ocasionou um estouro de dgito. 1= A ltima operao da ULA ocasionou um estouro (carry) entre o bit 3 e 4, isto , o resultado ultrapassou os 4 bits menos significativos. Utilizado quando se trabalha com nmeros de 4 bits. Carry/borrow. 0= A ltima operao da ULA no ocasionou um estouro (carry). 1= A ltima operao da ULA ocasionou um estouro (carry) no bit mais significativo, isto , o resultado ultrapassou os 8 bits disponveis.

/TO:

/PD:

Z:

DC:

C:

Conectando o PIC 16F877A - Recursos Avanados

382

OPTION_REG
Registrador:OPTION_REG Bit 7 R/W /RBPU Bit 6 R/W INTEDG Bit 5 R/W T0CS Bit 4 R/W TOSE Bit 3 R/W PSA Endreos: 81h e 181h Bit 2 R/W PS2 Bit 1 R/W PS1 Bit0 R/W PS0

Condio em Power-On Reset (POR) 1 /RBPU: 1 1 1 1 1 1 1

Habilita pull-ups internos para o PORTB: 0 = Pull-ups habilitados para todos os pinos do PORTB configurados como sada. 1 = Pull-ups desabilitados. Configurao da borda que gerar a interrupo externa no RB0: 0 = A interrupo ocorrer na borda de descida. 1 = A interrupo ocorrer na borda de subida. Configurao do incremento para o TMR0: 0 = TMR0 ser incrementado internamente pelo clockda mquina. 1 = TMR0 ser incrementado externamente pela mudana no pino RA4/TOCKI. Configurao da borda que incrementar o TMR0 no pino RA4/TOCKI, quando TOCS=1: 0 = 0 incremento ocorrer na borda de subida de RA4/TOCKI. 1 = O incremento ocorrer na borda de descida de RA4/TOCKI. Configurao de aplicao do prescaler: 0 = 0 prescaler ser aplicado ao TMR0. 1 = O prescaler ser aplicado ao WDT.

INTEDG:

TOCS:

TOSE:

PSA:

PS2 PS1 PS0:

Configurao de valor de prescaler: PS 2/1/0 TMRO WDT 000 1:21:1 000 1:41:2 010 1:81:4 011 1:16 1:8 100 1:32 1:16 101 1:64 1:32 110 1:128 1:64 111 1:256 1:128

Conectando o PIC 16F877A - Recursos Avanados

383 PCON

Bit 7 U 0 /POR:

Registrador PCON Endereos: 8EH Bit 6 Bit5 Bit 4 Bit 3 Bit 2 Bit 1 U U U U U R/W /POR Condio em Power-On Reset (POR) 0 0 0 0 0 0 Indicao de Power-On Reset (energizao): 0 = Ocorreu um Power-On Reset. 1 = No ocorreu um Power-On Reset. Indicao de Brown-Out Reset (queda de energia): 0= No ocorreu um Brown-Out Reset. 1= Ocorreu um Brown-Out Reset.

Bit 0 R/W /BOR 1

/BOR:

PCL e PCLATH
Registrador: PCL Bit 6 Bit 5 R/W R/W Endereos: 02h, 82h, 102h, 182h Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W R/W R/W R/W R/W Parte baixa do PC Condio em Power-On Reset (POR) 0 0 0 0 0 0 Endereos: 0Ah, 8Ah, 10Ah e 18Ah Bit 4 R/W Bit 3 R/W Bit 2 R/W Parte alta do PC 0 0 0 0 Bit 1 R/W Bit 0 R/W

Bit 7 R/W

Registrador:PCLATH Bit 7 U Bit 6 U Bit 5 U 0

Condio em Power-On Reset (P0R)

FSR e o INDF
Registrador: FSR Endereos: 04h, 84h, 104h e 184h Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W R/W R/W R/W R/W R/W R/W Ponteiro para endereamento indireto Condio em Power-On Reset (POR) x x x x x x x Registrador: lNDF Endereos: 00h, 80h,100h e 180h

Bit 7 R/W

Valor apontado pelo FSR (endereamento indireto - no um registrador implementado)

Condio em Power-On Reset (POR) 0 0 0 0

Conectando o PIC 16F877A - Recursos Avanados

384

PORTA e TRISA
Registrador: PORTA Endereos: 05h Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 U R/W R/W R/W R/W R/W RA5 RA4 RA3 RA2 RA1 Condio em Power-On Reset (POR) 0 X 0 0 0

Bit 7 U -

Bit 0 R/W RA0 0

Bit 7 U -

Registrador: TRISA Endereos: 85h Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 U R/W R/W R/W R/W R/W R/W Ref. RA5 Ref. RA4 Ref. RA3 Ref. RA2 Ref. RA1 Ref. RA0 Condio em Power-On reset (POR) 1 1 1 1 1 1

PORTB e TRISB
Regstrador: PORTB Endereos: 06h e 106h Bit 6 BitS Bit 4 Bit 3 Bit 2 Bit 1 R/W R/W R/W R/W R/W R/W RB6 RB5 RB4 RB3 RB2 RB1 Condio em Power-On Reset (POR) X X X X X X

Bit 7 R/W RB7 X

Bit 0 R/W RB0 X

Registrador: TRISB Endereos: 06h e106h Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W R/W R/W R/W R/W R/W R/W R/W Ref. RB7 Ref. RB6 Ref. RB5 Ref. RB4 Ref. RB3 Ref. RB2 Ref. RB1 Ref. RB0 Condio em Power-On Reset (POR) 1 1 1 1 l 1 1 1 1

PORTC e TRISC
Registidor: PORTC Endereos: 07h Bit 6 BitS Bit 4 Bit 3 Bit 2 Bit 1 R/W R/W R/W R/W R/W R/W RC6 RC5 RC4 RC3 RC2 RC1 Condio em Power-On Reset (POR) X X X X X X Registrador: TRlSC Endereos:87h

Bit 7 RW RC7 X

Bit 0 R/W RC0 X

Bit 7 Bit 6 BitS Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W R/W R/W R/W R/W R/W R/W R/W Ref. RC7 Ref. RC6 Ref. RC5 Ref. RC4 Ref. RC3 Ref. RC2 Ref. RC1 Ref. RC0 Condio em Power-On Reset (POR) 1 1 1 1 1 1 1 1 Conectando o PIC 16F877A - Recursos Avanados

385

PORTD e TRISD
Registrador: PORTD Bit 6 Bit 5 Bit 4 Bit 3 R/W R/W R/W R/W RD6 RD5 RD4 RD3 Condio em Power On-Reset X X X X Endereos: 08h Bit 2 Bit 1 R/W R/W RD2 RD1 X X

Bit 7 R/W RD7 X

Bit 0 R/W RD0 X

Registrador: TRISD Endereos: 88h Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 R/W R/W R/W R/W R/W R/W R/W Ref. RD7 Ref. RD6 Ref. RD5 Ref. RD4 Ref. RD3 Ref. RD2 Ref. RD1 Ref. RDO Condio em Power-On Reset (POR) 1 1 1 1 1 1 1 1

Bit 0 R/W

PORTE e TRISE
Registrador: PORTE Endereos: 09h Bit 6 BitS Bit 4 Bit 5 Bit 2 U U U U R/W RE2 Condio em Power-On ResetPOR) X Registrado: TRISE Bit 7 R IBF 0 Bit 6 R OBF 0

Bit 7 U -

Bit 1 R/W RE1 X

Bit 0 R/W RE0 X

Endereos: 89h Bit 1 R/W Ref. RE1 1 Bit 0 R/W Ref. RE0 1

BitS Bit 4 Bit 5 Bit 2 R/W R/W U R/W IBOV PSPMOD Ref. RE2 Condio emEPower-On Reset (POR) 0 0 1

IBF:

Indicao de buffer de entrada da porta paralela (PSP): 0 = 0 buffer de entrada esta vazio. 1 = Uma palavra foi recebida e est aguardando para ser lida. Indicao de buffer de sada da porta paralela (PSP): 1 = 0 buffer de sada foi lido. 0 = Existe uma palavra no lida no buffer de sada. Indicao de Overflow no buffer de entrada: 1 = No houve Overflow. 0 = Uma nova palavra chegou sem que a anterior tivesse sido lida do buffer. (este bit deve ser limpo por software) Modo de operao dos pinos da porta paralela (PSP): 1 = PSP desabiltada. Pinos como l/Os convencionais. 0 = PSP habilitada. Pinos controlados internamente pelo sistema.

OBF:

IBOV:

PSPMODE:

Conectando o PIC 16F877A - Recursos Avanados

386

TMR0
Registrados TMRO Bit 6 Bit 5 R/W R/W Endereos: 01h e 101h Bit 4 Bit 3 Bit 2 Bit 1 R/W R/W R/W R/W Contador TMR0 de 8 bits Condio em Power-On Reset (POR) X X X X X

Bit 7 R/W

Bit 0 R/W

T1CON,TMR1L e TMR1H
Registrador: T1CON Endereos: 10h Bit 6 Bit 5 Bit 4 BitS Bit 2 Bit 1 U R/W R/W R/W R/W R/W T1CKPS T1CKPS T10SCE /T1SYNC TMR1CS TMR1ON Condio emOPower-On N Reset (POR) 1 0 0 0 0 0 0

Bit 7 U 0

Bit 0 R/W

T1CKPS1 T1CKPS0:

Ajuste do prescale do Timer 1: 00 = prescale de1:1. 01 = prescale de 1:2. 10 = presca/ede 1:4. 11 = prescale de 1:8 Habilitao do sistema de oscilao externa para os pinos T1OSO e T1OSI: 0 = Oscilador desabilitado. Caso exista um cristal externo, o sistema desligado. 1 = Habilita o oscilador externo. Controle do sincronismo interno. Quando TMR1 CS=0 este bit ignorado: 0 = Sistema de sincronismo ligado. 1 = Sistema de sincronismo desligado (modo assncrono). Seleo da origem do clock para Timer 1: 0 = Clock interno (Fosc/4) 1 = Clock externo no pino T10SO/T1CKI. Habilitao do Timer 1: 0 = Timer 1 desabilitado. Paralisa o contador do Timer 1. 1 = Timer 1 habilitado. Registradte: TMR1L Endereos: 0Eh Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit1 R/W R/W R/W R/W R/W R/W Contador TMR1 de 16 bits - Parte Baixa Condio em Power On-Reset (POR) X X X X X X

T1OSCEN:

/T1SYNC:

TMR1CS:

TMR1ON:

Bit 7 R/W

Bit 0 R/W

Conectando o PIC 16F877A - Recursos Avanados

387
Registrador: TMR1H Endereos: 0Fh Bit 6 Bit5 Bit 4 Bit 3 Bit 2 Bit 1 R/W R/W R/W R/W R/W R/W Contador TMR1 de 16 bits - Parte Alta Condio em Power On-Reset (POR) X X X X X X

Bit 7 R/W

Bit 0 R/W

T2CON,TMR2ePR2

Bit 7 U
-

Registrador:T2CON Bit 6 Bit 5 R/W R/W


TOUTPS3 TOUTPS2

Bit 4 R/W
TOUTPS1

Endereos: 12h Bit 3 Bit 2 R/W R/W


TOUTP O TRM20N

Bit 1 R/W
T2CKPS1

Bit 0 R/W
T2CKPSO

Condio em Power-On Reset (POR) 0 0 0 0

TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0

Ajuste do postscale: 000= postscale de 1:1 001= postscale de 1:2 010= postscale de 1:3 0011= postscale de 1:4 0100 = postscale de 1:5 0101= postscale de 1:6 0110 = postscale de 1:7 0111= postscale de 1:8

1000 = postscale de 1:9


1001 = postscale de 1:10 1010 = postscale de 1:11 1011= postscaLe de 1:12 1100 = postscale de 1:13 1101= postscale de 1:14 1110 = postscale de 1:15 1111= postscale de 1:16

TMR20N:

Habilitao do Timer 2: 0 = Timer 2 desabilitado. Paralisa o contador do Timer 2. 1 = Timer 2 habilitado.

T2CKPS1 T2CKPS0:

Ajuste do prescale: 00 = presca/ede1:1 01 = prescale de 1:4 10 = presca/ede1:16 11 =presca/ede1:16 Registrador: TMR2 Bit 6 Bit5 R/W R/W Endereos: 11h Bit 4 Bit 3 Bit 2 Bit 1 R/W R/W R/W R/W Contador TMR2 de 8 bits Condio em Power-On Reset (POR) 0 0 0 0 0

Bit 7 R/W

Bit 0 R/W

Conectando o PIC 16F877A - Recursos Avanados

388
Registrador: PR2 Endereos: 92h Bit 6 Bit5 Bit 4 Bit3 Bit 2 Bit 1 R/W R/W R/W R/W R/W R/W Limite superior para contagem do TMR2 Condio em Power-On Reset (POR) 1 1 1 1 1 1

Bit 7 R/W

Bit0 R/W

INTCON

Bit 7 R/W GIE 0 GIE:

Registrador: INTCON Endereos: 0Bh, 8Bh, 10Bh e 18Bh Bit 6 Bit 5 Bit 4 Bit3 Bit 2 Bit1 Bit 0 R/W R/W R/W R/W R/W R/W R/W PEIE T0IE INTE RBIE T0IF INTF RBIF Condio em Power-On Reset (POR) 0 0 0 0 0 0 X

Habilitao geral das interrupes (chave geral): 0 = Nenhuma interrupo ser tratada. 1 = As interrupes habilitadas individualmente sero tratadas. Habilitao das interrupes de perifricos (chave geral p/ perifricos): 0 = As interrupes de perifricos no sero tratadas. 1 = As interrupes de perifricos habilitadas individualmente sero tratadas. Habilitao da interrupo de estouro de TMR0 (chave individual): 0 = Interrupo de TMR0 desabilitada. 1 = Interrupo de TMR0 habilitada. Habilitao da interrupo externa no pino RB0 (chave individual): 0 = Interrupo externa desabilitada. 1 = Interrupo externa habilitada. Habilitao da interrupo por mudana de estado no pinos RB4 a RB7 (chave individual): 0 = Interrupo por mudana de estado desabilitada. 1 = Interrupo por mudana de estado habilitada. Identificao de estouro do TMR0: 0 = No ocorreu estouro do TMR0. 1 = Ocorreu estouro do TMRO (este bit deve ser limpo por software). Identificao da interrupo externa no pino RB0: 0 = No ocorreu evento da interrupo. 1 = Ocorreu evento da interrupo (este bit deve ser limpo por software). Identificao da interrupo por mudana de estado nos pinos RB4 a RB7: 0 = No ocorreu evento da interrupo. 1 = Ocorreu evento da interrupo (este bit deve ser limpo por software).

PEIE:

TOIE:

INTE:

RBIE:

TOIF:

INTF:

RBIF:

Conectando o PIC 16F877A - Recursos Avanados

389

PIE1
Registrador: PIE1 Endereos: 8Ch Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 R/W R/W R/W R/W R/W ADIE RCIE TXIE SSPIE CCP1IE Condio em Power-On Reset (POR) 0 0 0 0 0

Bit 7 R/W PSPIE 0 PSPIE:

Bit1 R/W TMR2IE 0

Bit 0 R/W TMR1IE 0

Habilitao da interrupo da porta paralela (chave individual): 0 = Interrupo da porta paralela desabilitada. 1 = Interrupo da porta paralela habilitada. Habilitao da interrupo do conversor A/D (chave individual): 0 = Interrupo do conversor A/D desabilitada. 1 = Interrupo do conversor A/D habilitada. Habilitao da interrupo de recepo da USART (chave individual): 0 = Interrupo de recepo da USART desabilitada. 1 = Interrupo de recepo da USART habilitada. Habilitao da interrupo de transmisso da USART (chave individual): 0 = Interrupo de transmisso da USART desabilitada. 1 = Interrupo de transmisso da USART habilitada. Habilitao da interrupo da porta serial SSP (chave individual): 0 = Interrupo da porta serial SSP desabilitada. 1 = Interrupo da porta serial SSP habilitada. Habilitao da interrupo do mdulo CCP1 (chave individual): 0 = Interrupo de CCP1 desabilitada. 1 = Interrupo de CCP1 habilitada. Habilitao da interrupo do Timer 2 (chave individual): 0 = Interrupo de Timer 2 desabilitada. 1 = Interrupo de Timer 2 habilitada. Habilitao da interrupo de estouro do Timer 1 (chave individual): 0 = Interrupo de Timer 1 desabilitada. 1 = Interrupo de Timer 1 habilitada.

ADIE:

RCIE:

TXIE:

SSPIE:

CCP1IE:

TMR2IE:

TMR1IE:

Conectando o PIC 16F877A - Recursos Avanados

390

PIR1
Registrador: PIE1 Endereos: 0Ch Bit 6 Bit5 Bit 4 Bit 3 Bit 2 Bit1 R/W R R R/W R/W R/W ADIF RCIF TXIF SSPIF CCP1IF TMR2IF Condio em Power-On Reset (POR) 0 0 0 0 0 0

Bit 7 R/W PSPIE 0 PSPIF:

Bit 0 R/W TMR1IF 0

Identificao da interrupo da porta paralela (chave individual): 0 = No ocorreu evento de leitura/escrita na porta paralela. 1 = Ocorreu evento de leitura/escrita na porta paralela (este bit deve ser limpo por software). Identificao da interrupo do conversor A/D (chave individual): 0 = Converso A/D no foi completada. 1 = Converso A/D foi completada. Identificao da interrupo de recepo da USART (chave individual): 0 = Bufferde recepo da USART est vazio. 1 = Bufferde recepo da USART est cheio. Identificao da interrupo de transmisso da USART (chave individual): 0 = Bufere transmisso da USART est cheio. 1 = Bufferde transmisso da USART est vazio. Identificao da interrupo da porta serial SSP (chave individual): 0 = No ocorreu condio de interrupo no mdulo SSP. 1 = Ocorreu condio de interrupo no mdulo SSP (este bit deve ser limpo por software). Identificao da interrupo do mdulo CCP1 (chave individual): 0 = No ocorreu condio de interrupo no mdulo CCP1. 1 = Ocorreu condio de interrupo no mdulo CCP1 (este bit deve ser limpo por software). Identificao da interrupo de Timer 2 (chave individual): 0 =No ocorreu evento da interrupo de Timer 2. 0 = Ocorreu evento da interrupo de Timer 2 (este bit deve ser limpo por software). Identificao da interrupo de estouro do Timer 1 (chave individual): 0 = No ocorreu estouro do Timer 1. 1 = Ocorreu estouro do Timer 1 (este bit deve ser limpo por software).

ADIF:

RCIF:

TXIF:

SSPIF:

CCP1IF:

TMR2IF:

1=TMR1IF:

Conectando o PIC 16F877A - Recursos Avanados

391

PIE2
Registrador: PIE Endereos: 8Dh Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 R/W U R/W R/W u U EEIE BCLIE Condio em Power-On Reset (POR) 0 0 0 0 0 0 Habilitao da interrupo de fim de escrita na E PROM (chave individual): 2 0 = Interrupo de fim de escrita na E PROM desabilitada. 2 1 = Interrupo de fim de escrita na E PROM habilitada. Habilitao da interrupo de coliso na linha I C (chave individual): 2 0 = Interrupo de coliso na linha I C desabilitada. 2 1 = Interrupo de coliso na linha I C habilitada. Habilitao da interrupo do mdulo CCP2 (chave individual): 0 = Interrupo de CCP2 desabilitada. 1= Interrupo de CCP2 habilitada. O bit 6 reservado deve ser mantido sempre em 0.
2 2

Bit 7 U 0 EEIE:

Bit 0 R/W CCP2IE 0

BCLIE:

CCP2IE:

Obs:

PIR2
Registrador: PIR2 Bit 6 Bit 5 R/W U 0 0 Endereo: 8Dh Bit 4 Bit 3 Bit 2 Bit 1 R/W R/W U U EEIF BCLIF Condio em Power-On Reset (POR) 0 0 0 0
2

Bit7 U 0 EEIF:

Bit 0 R/W CCP2IF 0

Identificao da interrupo de fim de escrita na E PROM (chave individual): 2 0 = Operao de escrita na E PROM no foi completada e nova escrita no pode ser iniciada. 2 1 = Operao de escrita na E PROM foi completada (este bit deve ser limpo por software). Identificao da interrupo de coliso na linha I C (chave individual): 2 0 = No ocorreu coliso na linha I C. 2 1= Ocorreu coliso na linha I C. Identificao da interrupo do mdulo CCP2 (chave individual): 0 = No ocorreu condio de interrupo no mdulo CCP2 1 = Ocorreu condio de interrupo no mdulo CCP2 (este bit deve ser limpo por software). O bit 6 reservado deve ser mantido sempre em 0.
2

BCLIF:

CCP2IF:

Obs:

Conectando o PIC 16F877A - Recursos Avanados

392

ADCON0
Registrador: ADCON0 Endereo:1Fh Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 R/W R/W R/W R/W R/W U ADCS0 CHS2 CHS1 CHS0 GO/DONE Condio em Power-On Reset (POR) 0 0 0 0 0 0

Bit 7 R/W ADCS1 0 ADCS1 ADCS0:

Bit 0 R/W ADON 0

Especificao do clock para o conversor A/D: 00 = Fosc / 2 01 =Fosc/ 8 10 = Fosc/ 32 11 = FRC. Usado oscilador RC interno, especfico para o conversor A/D.

CHS2 CHS1 CHS0:

Seleo do canal para converso: 000 = Canal0 001 = Canal1(RA1/AN1) 010 = Canal2(RA2/AN2) 011 = Canal3(RA3/AN3) 100 = Canal4(RA5/AN4) 101 = Canal5(REO/AN5) 110 = Canal6(RE1/AN6) 111 = Canal7(RE2/AN7) Situao da converso A/D. Vlido somente quando ADON=1: 0 = Converso no sendo efetuada. Este bit limpo automaticamente quando a converso termina. 1 = Converso em andamento. Este bit deve ser selado para iniciar a converso. Ativa/Desativa o sistema de converso A/D: 0 = Conversor desativado para economizar energia. 1 = Conversor ativado.

GO/DONE:

ADON:

Conectando o PIC 16F877A - Recursos Avanados

393

ADCON1

Registrador: ADCON1 Bit 7 R/W ADFM 0 ADFM: Bit 6 U -

Endereos: 9Fh

Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 U U R/W R/W R/W R/W PCFG3 PCFG2 PCFG1 PCFG0 Condio em Power-On Reset (POR) 0 0 0 0 0 0 0 0 Justificao para o resultado da converso A/D de 10-bits: 1 = Justificado direita. Os 6 bits mais significativos de ADRESH so lidos em 0 (zero). 0 = Justificado esquerda. Os 6 bits menos significativos de ADRESL so lidos em 0 (zero).

PCFG3, PCFG2, PCFG1 PCFG0: Configurao dos pinos analgicos / digitais e as tenses de referncia: PCFG3 AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 PCFG0 RE2 RE1 RE0 RA5 RA3 Anal. Ext. O0000 A A A A A A A A VDD Vss 8 0 RA2 RA1 RA0 Vref+ Vref- Canais Ref. 0001 A A A A VREF+ A A A RA3 Vss 7 1 0010 D D D A A A A A VDD Vss 5 0 0011 D D D A VREF+ A A A RA3 Vss 4 1 0100 D D D D A D A A VDD Vss 3 0 0101 D D D D VREF+ D A A RA3 Vss 2 1 0110 D D D D D D D D VDD Vss 0 0 0111 D D D D D D D D VDD Vss 0 0 1000 A A A A VREF+ VREF+ A A RA3 RA2 6 2 1001 D D A A A A A A VDD Vss 6 0 1010 D D A A VREF+ A A A RA3 Vss 5 1 1011 D D A A VREF+ VREFA A RA3 RA2 4 2 1100 D D D A VREF+ VREFA A RA3 RA2 3 2 1101 D D D D VREF+ VREFA A RA3 RA2 2 2 1110 D D D D D D D A VDD Vss 1 0 1111 D D D D VREF+ VREFD A RA3 RA2 1 2
Pinos configurados como analgicos. A=Analgico / D=Digital

ADRESL e ADRESH
Registrados: ADRESH Endereos: 1Eh Resultado da converso A/D - Parte Alta Condio em Power-On Reset (POR) X X X X X X X X X Registrador: ADRESL Endereos: 9Eh Resultado da converso A/D - Parte Baixa Condio em Power-On Reset (POR) X X X X X X

X X

Conectando o PIC 16F877A - Recursos Avanados

394

CCP1CON
Registrador: CCP1CON Endereos: 17h Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 U R/W R/W R/W R/W R/W R/W CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0 Condio em Power-On Reset (POR) 0 0 0 0 0 0 0

Bit 7 U 0 CCP1X CCP1Y:

Parte baixa do PWM de 10 bits. A parte alta fica em CCPR1L. Vlido somente quando em PWM.

CCP1M3 CCP1M2 CCP1M1 CCP1M0:

Seleo do modo CCP1 - Compare/Capture/PWM: 0000 = Modo desligado. 0100 = Capture ligado para borda de descida com prescale de 1:1. 0101 = Capture ligado para borda de subida com prescale de 1:1. 0110= Capture ligado para borda de subida com prescale de 1:4. 0111= Capture ligado para borda de subida com prescale de 1:16. 1000= Compare ligado. Pino de sada (RC2) ser setado (1) quando o compare ocorrer. 1001= Compare ligado. Pino de sada (RC2) ser zerado (0) quando o compare ocorrer. 1010= Compare ligado. Pino de sada (RC2) no ser afetado. 1011= Compare ligado. Pino de sada (RC2) no ser afetado. TMR1 ser resetado. 1100 = PWM ligado 1101= PWM ligado 1110= PWM ligado 1111= PWM ligado

CCPR1L e CCPR1H

Registrador: CCPR1H Endereos: 16h Registrador do CCP1 - Parte Alta Condio em Power-On Reset (POR) X X X X X X Registrador: CCP1L Endereos: 15h Registrador do CCP1 - Parte Baixa Condio em Power-On Reset (POR) X X X X X X

Conectando o PIC 16F877A - Recursos Avanados

395

CCP2CON
Registrador: CCP2CON Endereos: 1Dh Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit1 U R/W R/W R/W R/W r/w CCP2X CCP2Y CCP2M3 CCP2M2 CCP2M1 Condio em Power-On Reset (POR) 0 0 0 0 0 0

Bit 7 U 0 CCP2X CCP2Y: PWM. CCP2M3 CCP2M2 CCP2M1 CCP2M0:

Bit 0 R/W CCP2M0 0

Parte baixa do PWM de 10 bits. A parte alta fica em CCPR2L. Vlido somente quando em

Seleo do modo CCP2 - Compare/Capture/PWM: 0000 = Modo desligado. 0100 = Capture ligado para borda de descida com presca/e de 1:1. 0101= Capture ligado para borda de subida com presca/e de 1:1. 0110 = Capture ligado para borda de subida com presca/e de 1:4. 0111= Capture ligado para borda de subida com presca/e de 1:16. 1000= Compare ligado. Pino de sada (RC1) ser setado (1) quando o compare ocorrer. 1001= Compare ligado. Pino de sada (RC1) ser zerado (0) quando o compare ocorrer. 1010= Compare ligado. Pino de sada (RC1) no ser afetado. 1011= Compare ligado. Pino de sada (RC1) no ser afetado. TMR1 ser resetado. Uma converso A/D ser iniciada. 1100= PWM ligado 1101= PWM ligado 1110 = PWM ligado 1111= PWM ligado

CCPR2L e CCPR2H

Registrador: CCPR2H Endereos: 1Ch Registrador do CCP2 - Parte Alta Condio em Power-On Reset (POR) X X X X X X Registrador: CCPR2L Endereos: 1Bh Registrador do CCP2 - Parte Baixa Condio em Power-On Reset (POR) X X X X X X

Conectando o PIC 16F877A - Recursos Avanados

396

EECON1 e EECON2
Registrador: EECON1 Endereos: 18Ch Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 U U U R/W R/W R/W WRERR WREN WR Condio em Power-On Reset (POR) 0 0 0 X 0 0 Seleo do acesso da E PROM: 0 = Acessa a memria de dados. 1 = Acessa a memria de programa. Identificao de erro durante a escrita na E PROM: 0 = No ocorreu erro, a escrita foi completada. 1= Em erro ocorreu por uma escrita no terminada (um reset pode ter ocorrido). Habilitao de escrita na E PROM (bit de segurana): 2 0 = No habilita a escrita na E PROM. 2 1 = Habilita a escrita na E PROM. Ciclo de escrita na E PROM: 0 = Este bit ser zerado pelo hardware quando o ciclo de escrita terminar, (no pode ser zerado por software). 1 = Inicia o ciclo de escrita (deve ser setado por software). Ciclo de leitura da E PROM: 0 = Este bit ser zerado pelo hardware quando o ciclo de leitura terminar, (no pode ser zerado por software) 1 = Inicia o ciclo de leitura (deve ser setado por software).
2 2 2 2 2

Bit 7 R/W EEPGD X EEPGD:

Bit 0 R/W RD 0

WRERR:

WREN:

WR:

RD:

Registrador: EECON2
2

Endereos: 18Dh

Registardor de proteo para escrita na E PROM (no um registrador implementado)

Condio em Power-On Reset (POR) -

EEADR e EEADRH
Registrador: EEADR Endereos: 10Dh 2 Registrador de endereo da E PROM - Parte Baixa Condio em Power-On Reset (POR) X X X X X X Registrador: EEADRH Bit 6 Bit 5 U U -

Bit 7 U -

Endereos: 10Fh Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W R/W R/W R/W R/W 2 Registrador de endereo da E PROM - Parte Alta (s para memria de programa) Condio em Power-On Reset (POR) X X X X X X

Conectando o PIC 16F877A - Recursos Avanados

397

EEDATA e EEDATH
Registrador: EEDATA Endereos: 10Ch 2 Registrador de dado da E PROM - Parte Baixa Condio em Power-On Reset (POR) X X X X X X X Registrador: EEDATH Bit 6 Bit 5 U U X

Bit 7 U X

Endereos: l0Eh Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W R/W R/W R/W R/W Registrador de dado da E2PROM - Parte Alta (s para memria de programa) Condio em Power-On Reset (POR) X X X X X X

SSPCON
Registrador: SSPCON Endereos: 14h Bit 6 BitS Bit 4 Bit 3 Bit 2 Bit 1 R/W R/W R/W R/W R/W R/W SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 Condio em Power-On Reset (POR) 0 0 0 0 0 0

Bit 7 R/W WCOL 0 WCOL:

Bit 0 R/W SSPM0 0

Coliso na escrita do registrador SSPBUF: Master: 0 = Sem coliso. 1 = Ocorreu uma escrita em momento indevido. Slave: 0 = Sem coliso. 1 = Ocorreu uma escrita enquanto ainda estava transmitindo (deve ser limpo em software). Erro de Overflow na recepo: 0 = Sem erro. 1 = Um novo byte foi recebido antes do registrador SSPBUF ser lido (deve ser limpo em software). Habilitao da posta SSP: SPl: 0 = SSP desabilitada. Pinos SCK, SDO, SDI e /SS como l/Os convencionais. 1 = SSP habilitada. Pinos SCK, SDO, SDI e /SS controlados internamente. 2 I C: 0 = SSP desabilitada. Pinos SCL e SDA como l/Os convencionais. 1 = SSP habilitada. Pinos SCL e SDA controlados internamente. Controle do Clock SPl: 0 = Clock padro em nvel alto (1). 1 = Clock padro em nvel baixo (0). 2 I C Slave: O = Clock habilitado.
1 = Clock travado (Pausa). Pino SCL mantido em nvel baixo (0).

SSPOV:

SSPEN:

CKP:

I C Masfer Sem uso

Conectando o PIC 16F877A - Recursos Avanados

398
SSPM3 SSPM2 SSPM1 SSPM0:

Seleo do modo de trabalho da porta SSP: 0000 = SPI Master. Clock= Fosc/ 4. 0001 = SPI Master. Clock= Fosc/16. 0010 = SPI Master. Clock= Fosc/ 64. 0011 = SPI Master. Clock = TMR2 / 2. 0100 = SPI Slave. Pino /SS habilitado. 0101 = SPI Slave. Pino /SS desabilitado (pode ser usado como I/O). 2 0110 = I C Slave. Endereamento de 7-bits. 2 0111 = I C Slave. Endereamento de 10-bits. 1000 = PC Master. Clock = Fosc/ (4 x (SSPADD+1)) Outros = Reservados

SSPCON2
Registrador : SSPCON2 Bit 7 R/W GCEN 0 GCEN: Bit 6 R/W ACKSTA 0 Bit 5 R/W ACKDT Bit 4 R/W ACKEN Enderteos: 91h Bit 3 R/W RCEN Bit 2 R/W PEN Bit 1 R/W RSEN 0
2

Bit 0 R/W SEN 0

Condio em Power-On Reset (POR) 0 0 0 0

Habilitao do endereo global (somente para I C Slave): 0 = Endereo global desativado. 1 = Endereo global ativado. Quando recebido endereo 0 (zero) o Slave aceita como e endereo vlido. Valor recebido como ACK aps a transmisso de um dado (somente 2 para I C Master}: 0 = ACK recebido do Slave. 1 = ACK no recebido do Slave. Valor a ser respondido como ACK aps uma recepo (somente para 2 I C Master): 0 = Continua recebendo mais bytes do Slave. 1 = O Slave deve parar de transmitir dados para o Master. Gera uma condio de acknowledge com o valor de ACKDT (somente 2 para I C Master) 0 = No gera condio ou condio j finalizada. 1 = Inicia condio e indica condio ainda em execuo. Limpo automaticamente pelo hardware. Ativa o sistema de recepo de dados (somente para I C Master}: 0 = Master no pode receber dados. 1 = Master pronto para receber dados do Slave. Gera uma condio de Stop na linha (somente para I C Master): 0= No gera condio ou condio j finalizada. 1= Inicia condio e indica condio ainda em execuo. Limpo automaticamente pelo hardware.
2 2

ACKSTAT:

ACKDT:

ACKEN:

RCEN:

PEN:

Conectando o PIC 16F877A - Recursos Avanados

399
RSEN: Gera uma condio de Re-Star na linha (somente para I C Mastei): 0 = No gera condio ou condio j finalizada. 1 = Inicia condio e indica condio ainda em execuo. Limpo automaticamente pelo hardware. Gera uma condio de Start na linha (somente para I C Master): 0 = No gera condio ou condio j finalizada. 1 = Inicia condio e indica condio ainda em execuo. Limpo automaticamente pelo hardware.
2 2

SEN:

SSPSTAT
Resistrador: SSPSTAT Endereos: 94h Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 R/W R R R R R CKE D/A P S R/W UA Condio em Power-On Reset (POR) 0 0 0 0 0 0

Bit 7 R/W SMP 0 SMP:

Bit 0 R BF 0

Sistema de amostragem de dados: SPI: 0 = A recep. feita na borda do meio do perodo. Modo obrigatrio para Slave. 1 = A recepo feita na borda do fim do perodo. Pode ser usado no Master. PC: 2 I C 0 = Habilita controle de sinal para alta velocidade (400 kHz). 1 = Desabilita controle de sinal para alta velocidade (100 kHz). Sistema de amostragem de dados: SPI: 0 = Pulso do clock no incio do perodo. 1 = Pulso do clock no final do perodo. 2 2 I C: 0 = Entradas conforme especificaes I C. 1 = Entradas conforme especificaes SMBUS. Indicao de Dados ou Endereo (somente para I C): 0 = ltimo byte recebido ou transmitido foi um endereo. 1 = ltimo byte recebido ou transmitido foi um dado. Indicao de Sfop (somente para I C): 0 = No ocorreu uma condio de Stop. 1 = Ocorreu uma condio de Sfop. Limpo quando SSP desabilitada. Indicao de S/ar (somente para I C): 1 = No ocorreu uma condio de Sfart. 0 = Ocorreu uma condio de Sfart. Limpo quando SSP desabilitada. Indicao de Leitura/Escrita (somente para I C): Slave: 0 = Escrita. 1 = Leitura. Master. 0 = Nenhuma transmisso em progresso. 1 = Trans. em progresso. Limpo automaticamente pelo hardware no final. Indicao de atualizao de endereo (somente para I C com 10 bits): 0 = No precisa atualizar o endereo. 1 = Deve atualizar o endereo (parte alta ou parte baixa) para nova comparao. Conectando o PIC 16F877A - Recursos Avanados
2 2 2 2 2

CKE:

D/A:

P:

S:

R/W:

UA:

400
BF: Indicao de Buffer cheio: Recebe: 0 = Recepo ainda no foi completada. Buffer SSPBUF vazio. 1 = Recepo terminada. Buf7er SSPBUF cheio. 2 Transmite (I C): 0 = Transmisso terminada. Buffer SSPBUF vazio. 1= Transmisso em progresso. Buffer SSPBUF ainda cheio.

SSPADD
Registrador: SSPADD Endereos: 93h Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 R/W R/W R/W R/W R/W Endereo da unidade para PC (parte alta le parte baixa) R/W Condio em Power-On Reset (POR) 0 0 0 0 0 0

Bit7 R/W

Bit0 R/W

SSPBUF
Registrador: SSPBUB Endereos: 13h Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 R/W R/W R/W R/W R/W Buffer para recepo e transmisso Condio em Power-On Reset (POR) X X X X X X X

Bit7 R/W

Bit0 R/W

X X

TXSTA
Registrador: TXSTA Endereos: 98h Bit 6 Bit5 Bit 4 Bits Bit 2 Bit 1 R/W R/W R/W U R/W R TX9 TXEN SYNC BRGH TRMT Condio em Power-On Reset (POR) 0 0 0 0 0 1 Seleo entre Master/Slave (somente modo Sncrono): 0 = Slave. 1 = Master. Habilitao da comunicao em 9 bits para a transmisso: 0 = Transmisso em 8 bits. 1 = Transmisso em 9 bits. Habilitao da transmisso: 0 = Transmisso desabilitada. 1 = Transmisso habilitada. No modo sncrono, a recepo tem prioridade sobre este bit. Conectando o PIC 16F877A - Recursos Avanados

Bit 7 R/W CSRC 0 CSRC:

Bit 0 R/W TX9D 0

TX9:

TXEN:

401
SYNC: Seleo entre modo Assncrono/Sncrono: 0 = Assncrono. 1 = Sncrono. Seleo para Baud Rate (somente modo Assncrono): 0 = Baud Rate baixo. 1 = Baud Rate alto. Situao do registrador interno de transmisso (TSR): 0 = TSR cheio. 1 = TSR vazio. Valor a ser transmitido como 99 bit. Pode ser usado como paridade ou endereamento.

BRGH:

TRMT:

TX9D:

RCSTA
Registrador: RCSTA Bit 7 R/W SPEN 0 SPEN: Bit 6 R/W RX9 0 Endereos:18h Bit5 Bit 4 Bit 3 Bit 2 R/W R/W R/W R SREN CREN ADDEN FERR Condio em Power-On Reset (POR) 0 0 0 0 Bit 1 R OERR 0 Bit 0 R RX9D X

Habilitao da USART: 0 = USART desabilitada. 1 = USART habilitada. Habilitao da comunicao em 9 bits para a recepo: 0 = Recepo em 8 bits. 1 = Recepo em 9 bits. Habilitao da recepo unitria (somente para modo Sncrono em Master): 0 = Recepo unitria desabilitada. 1 = Recepo unitria habilitada. Depois de receber um dado, desligase automaticamente. Habilitao da recepo contnua: 0 = Recepo contnua desabilitada. 1 = Recepo contnua habilitada. Habilitao do sistema de endereamento (somente modo Assncrono de 9 bits): 0 = Desabilita sistema de endereamento. 1 = Habilita sistema de endereamento. Erro de Stop bit (somente modo Assncrono): 0 = No ocorreu erro. Stop bit = 1. 1 = Ocorreu um erro. Stop bit = O (deve ser atualizado lendo o registrador RCREG e recebendo o prximo dado vlido). Erro de muitos bytes recebidos sem nenhuma leitura: 0 = No houve problemas de estouro do limite. 1 = Estouro do limite de 3 bytes recebidos antes da leitura de RCREG (para limpar deve-se zerarobit CREN).

RX9:

SREN:

CREN:

ADDEN:

FERR:

OERR:

RX9D: Valor recebido no 99 bit. Pode ser usado como paridade ou endereamento. Conectando o PIC 16F877A - Recursos Avanados

402

TXREG e RCREG
RegistradoR: TXREG Endereos: 19h Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 R/W R/W R/W R/W R/W R/W Buffer para transmisso Condio em Power-On Reset (POR) 0 0 0 0 0 0

Bit 7 R/W

Bit 0 R/W

Registrador: RCREG Bit 7 Bit 6 R/W R/W

0 SPBRG

Endereos: 1Ah Bit 4 Bit 3 Bit 2 R/W R/W R/W Buffer para recepo Condio em Power-On Reset (POR) 0 0 0 Bit5 R/W

Bit 1 R/W

Bit 0 R/W

Bit 7 R/W

Registrador: SPBRG Bit 6 Bit 5 R/W R/W

0 CMCON

Endereos: 99h Bit 4 Bit 3 Bit 2 Bit 1 R/W R/W R/W R/W Ajuste do Baud Rate Condio em Power-On Reset (POR) 0 0 0 0 0

Bit 0 R/W

Bit 7 R C20UT 0 C20UT:

Reqistrador: CMCON Endereos: 9Ch Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 R R/W R/W R/W R/W R/W C10UT C2INV C1INV CIS CM2 CM1 Condio em Power-On Reset (POR) 0 0 0 0 1 1 Valor da sada do comparador 2: Normal (C2INV=0): 0 = C2VIN+<C2VIN1=C2VIN+>C2VINInversa (C2INV=1): 0 = C2VIN+>C2VIN1=C2VIN+<C2VIN-

Bit 0 R/W CMO 1

C1OUT:

Valor da sada do comparador 1: Normal (C1INV=0): 0 = C1 VIN+<C1VIN1 = C1 VlN+>C1VlN-

Conectando o PIC 16F877A - Recursos Avanados

403
Inversa (C1INV=1): 0 = C1 VIN+>C1 VIN1 = C1 VlN+<C1 VlNC2INV: Tipo de sada do comparador 2: 0 = Normal. 1 = Inversa. Tipo de sada do comparador 1: 0 = Normal. 1 = Inversa. Chave seletora de entrada do comparador: Quando CM2:CMO = 001 0 = RA0 conectado a C1 VIN-. 1 = RA3 conectado a C1 VIN. QuandoCM2:CMO = 010 0 = RA0 conectado a C1 VIN-. RA1 conectado a C2 VIN-. 1= RA3 conectado a C1 vin-. RA2 conectado a C2 VIN-.

C1INV:

CIS:

CM2 CM1 CM0: Configura a pinagem dos corriparadores (modo de operao):

Conectando o PIC 16F877A - Recursos Avanados

404

CVRCON
Registrador: CVRCON Bit 7 Bit 6 Bit 5 R/W R/W R/W CVREN CVRON CVRR 0 CVREN: 0 0 Endereos: 9Dh Bit 2 Bit 1 R/W R/W CVR2 CVR1 0 0

Bit 4 U 0

Bit 3 R/W CVR3 0

Bit 0 R/W CVR0 0

Condio em Power-On Reset (POR)

Energizao do sistema de tenso de referncia: 0 = Circuito de vref desenergizado. 1 = Circuito de vref energizado. Habilitao da sada de vref: 0 = Tenso de referncia desligada. 1 = Tenso de referncia ligada ao pino RA2. Seleo do range de operao do sistema de vref: 0 = Range baixo. 1 = Range alto.

CVRON:

CVRR:

CVR3 CVR2 CVR1 CVRO:

Seleo do valor da tenso de vref: Se CVRR = 1: VREF=(VR/24) * VDD Se CVRR = 0: VREF =1/4 * VDD+ (VR/32) * VDD

Conectando o PIC 16F877A - Recursos Avanados

405

CCP1CON, CCPR1L e CCPR1H

Bit 7 U 0

Registrador: CCP1CON Endereos: 17h Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 U R/W R/W R/W R/W R/W CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 Condio em Power on Reset POR) 0 0 0 0 0 0

Bit 0 R/W CCP1M0 0

CCP1X CCP1Y:

Parte baixa do PWM de 10 bits. A parte alta fica em CCPR1L. Vlido somente quando em PWM.

CCP1M3 CCP1M2 CCP1M1 CCP1M0:

Seleo do modo CCP1 - Compare/Capture/PWM: 0000 = Modo desligado. 0100 = Capture ligado para borda de descida com presca/erde 1:1. 0101 = Capture ligado para borda de subida com prescaterde 1:1. 0110 = Capture ligado para borda de subida com presca/erde 1:4. 0111 = Capture ligado para borda de subida com presca/erde 1:16. 1000 = Compare ligado. Pino de sada (RB3) ser setado (1) quando o compare ocorrer. 1001 = Compare ligado. Pino de sada (RB3) ser zerado (0) quando compare ocorrer. 1010 = Compare ligado. Pino de sada (RB3) no ser afetado. 1011 = Compare ligado. Pino de sada (RB3) no ser afetado. TMR1 ser resetado. 1100 = PWM ligado. 1101 = PWM ligado. 1110 = PWM ligado. 1111 = PWM ligado. Registrador: CCPR1L Endereos: 15h Bit 6 Bit 3 Bit 4 Bit 3 Bit 2 Bit1 R/W R/W R/W R/W R/W R/W Registrador de controle do CCP1 - Parte baixa Condio em Power-Onf Reset (POR) X X X X X X

Bit 7 R/W X

Bit 0 R/W X

Bit 7 R/W

Registrador. CCPR1H Endereos; 16h Bit 6 Bit 3 Bit 4 Bit 3 Bit 2 Bit1 R/W R/W R/W R/W R/W R/W Registrador de controle do CCP1 - Parte alta Condio em Power-On Reset (POR) X X X X X X

Bit 0 R/W

Conectando o PIC 16F877A - Recursos Avanados

406
Resumo e condies aps reset
Hex Nome Bit 7

Bit6

BitS

Bit 4

Bit 3 BANK 0

Bit 2

Bit 1

Bit 0

Power-on Outros

Resets ---- ---xxxx xxxx uuuu uuuu 0000 0000

00

INDF

Valor apontado pelo FSR (endereamento indireto - no um registro

01 TMR0 02 03 04 PCL
STATUS

Contador TMR0 de 8 bits Parte baixa do PC (8 bits menos significativos) IRP RB7 RP1 RP0 RA5 RC5 RD5 /T0 RA4 RB4 RC4 RD4 /PD RA3 RB3 RC3 RD3 Z RA2 RB2 RC2 RD2 RE2 T0IF DC RA1 RB1 RC1 RD1 RE1 INTF C RA0 RB0 RC0 RD0 RE0 Ponteiro para endereamento indireto RB6 RB5
implementado)

---- ----

0000 0000

0001 1xxx 000q quuu xxxx xxxx uuuu uuuu --0x xxxx ---u uuuu

FSR

05 PORTA 06 PORTB

xxxx xxxx uuuu uuuu xxxx xxxx uuuu uuuu xxxx xxxx uuuu uuuu ---- -xxxx uuuu uuuu ---0 0000 ---0 0000

07 PORTC RC7 RC5 08 PORTD RD7 RD6 09 PORTE 0A 0C 0D 0E 10


PCLATH

Parte alta do PC (5 bits mais significativos)

0B INTCON PIR1 PIR2 TMR1L


T1CON

GIE PEIE -

T0IE INTE RBIE


TXIF

RBIF 0000 000x 0000 000u


0000 0000 0000 0000 -r--0 0--0 -r-0 0-0CCP2IF

PSPIF ADIF RCIF

SSPIF CCP1IF

TMR2IF TMR1IF

EEIF

BCLIF

Contador TMR1 de 16-bits (parte baixa) Contador TMR1 de 16-bits (parte alta)
T1CXP T1CKPS S1 0 T10SCE /T1SYNC TMR1CS TMR10N N

xxxx xxxx uuuu uuuu xxxx xxxx uuuu uuuu --00 0000 - -uu uuuu 0000 0000 0000 0000 -000 0000 -000 0000
O

0F TMR1H 11 TMR2 12 T2CON 13 14


SSPBUF

Contador TMR2 de 8-bits TOUT TOUTPS TOUTPS TOUTPS TMR20N T2CKPS T2CKPS PS3 2 1 O 1 SSPO V

Buffer de recepo/transmisso da porta serial SSP


SSPEN CKP

xxxx xxxx uuuu uuuu

SSPCON WCOL

SSPM3 SSPM2 SSPM1 SSPMO 0000 0000 0000 0000 xxxx xxxx uuuu uuuu xxxx xxxx uuuu uuuu

15 CCPR1L 16 CCPR1H 17 18 19 1A
CCP1CON

Registrador do CCP1 (parte baixa) Registrador do CCP1 (parte alta) -

CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0 --00 0000 --00 0000

RCSTA SPEN TXREG


RCREG

RX9 SREN CREN ADDEN FERR OERR RX9D 0000 000X 0000 000X Buffer de trasmisso para a USART Buffer de recepo para a USART Registrador do CCP2 (parte baixa) Registrador do CCP2 (parte alta)
0000 0000 0000 0000 0000 0000 0000 0000

1B CCPR2L 1C CCPR2H 1D
CCP2CON

xxxx xxxx uuuu uuuu xxxx xxxx uuuu uuuu --00 0000 --00 0000 xxxx xxxx uuuu uuuu ADON 0000 00-0 0000 00-0

ADC S1

ADCSO

CCP2X CCP2Y

CCP2M3 CCP2M2 CCP2M1 CCP2M0

1E ADRESH 1F ADCONO

Resultado da converso A/D (parte alta)


CHS2 CHS1 CHSO GO/DON
E

Conectando o PIC 16F877A - Recursos Avanados

407

Hex Nome

Bit 7

Bit 6

BitS Bit 4

Bit 3 BANK1

Bit 2

Bit 1

Bit 0

Power-on Outros

Resets 80 81 82 84 85 86 87 88 89 INDF
OPTION_RE G

Valor apontado pelo FSR (endereamento indireto - no um registro /RBPU INTEDG TOCS TOSE PSA implementado)

---- ---1111 1111 0000 0000 1111 1111 0000 0000

PS2

PS1

PS0

PCL FSR TRISA TRISB TRISC TRISD TRISE

Parte baixa do PC (8 bits menos significativos) RP1 RPO /TO /PD Z DC C Ponteiro para endereamento indireto

---- ----

83 STATUS IRP

0001 1xxx

xxxx xxxx RA0 RB0 RC0 RD0 RE0


--- 1 1111 1111 1111 1111 1111 1111 1111

uuuu uuuu ---1 1111 1111 1111 1111 1111 1111 1111

RB7 RC7 RD7 IBF PSPIE

RB6 RC6 RD6 -

RB5 RC5 RD5 -

RA4 RB4 RC4 RD4

RA3 RA2 RA1 RB3 RB2 RB1 RC3 RC2 RC1 RD3 RD2 RD1 RE2 RE1 T0IF
E

OBF IBOV PSPMO


DE PEIE T0IE INTE RBIE -

8A PCLATH 8C 8D 8E 8F 90 PIE1 PIE2 PCON -

Parte alta do PC (5 bits mais significativos) 0000 000x

0000 000u 0000 000u 0000 0000 -r-0 0-0-

8B INTCON GIE

INTF
E

RBIF

0000 000x

ADIE RCIE TXIE SSPIE CCP1I TMR2I TMR1IE 0000 0000 EEIE BCLIE CCP2IE

-r-- 0--0 ---- ----qg -

/POR /BOR

---- --uu 0000 0000

No implementado No lmplementado
ACKST ACKDT ACKEN RCEN PEN RSEN AT SEN

91 SSPCON2 GCEN 92 PR2

0000 0000

Limite superior para contagem doTMR2 Registrador de endereo para I C CKE D/A P S R/W
2

1111 1111 1111 1111 000- oooo oooo 0000

93 SSPADD 94 SSPSTAT SMP 95 96 97 99 9A 9B -

UA

BF

No imptemenlado No implementado No implementado


TX9 TXEN SYNC BRGH TRMT TX9D

oooo oooooooo oooo 0000 oooo oooo oooo oooo 0000 oooo 0000 -010 0000 -010

98 TXSTA CSRC SPBRG -

Registrador de ajuste do Baud Rate da USART Nolmptementado No implementado


C10UT C2INV C1INV -

9C CMCON C20UT 9D CVRCON CVRE


N

CIS

CM2

CM1 CM0

0000 0111 0000 0111 000- 0000 uuuu uuuu 0--- 0000

CVROE CVRR

CVR3 CVR2 CVR1

CVR0 000- 0000


xxxx xxxx 0--- 00-0

9E ADRESL 9F
ADCON1 ADFM

Resultado da converso A/D (parte baixa)


PCFG 3 PCFG PCFG1 PCFG0 2

Conectando o PIC 16F877A - Recursos Avanados

408

Hex Nome

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3 BANK 2

BIT 2 BIT 1

Bit 0

Power-on

Outros Resets ---- ----

100 101

IDEF TMR0

Valor apontado pelo FSR (endereamento indireto - no um

Contador TMRO de 8 bits Parte baixa do PC (8 bits menos significativos) RP1 RP0 /TO /PD Z DC Ponteiro para endereamento indireto RB1
registro implementado)

102 PCL 103 STATUS IRP 104 FSR 105 106 107 PORTB -

xxxx xxxx uuuu uuuu ---- 0000 0000 ---- 0000 0000 C
0001 Ixxx 000q quuu xxxx xxxx uuuu uuuu -

No Implementado RB7 RB6 RB5 RB4 RB3 RB2 RBO No Implementado No Implementado No Implementado -

RB0

xxxx xxxx uuuu uuuu

108 109 10A PCLATH

Parte alta do PC (5 bits mais significativos)

0000 0000 ---0 0000

10B INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x 0000 000u 2 RBIF 10 EEDATA Dado para escrita/leitura na E PROM (parte baixa) xxxx xxxx uuuu uuuu 2 C 10 EEADR Endereo para escrita/leitura na E PROM (parte baixa) xxxx xxxx uuuu uuuu 2 xxxx xxxx uuuu uuuu D 10E EEDATH Dado para escrita/leitura na E PROM xxxx xxxx uuuu uuuu (parte alta) 10F EEADRH Endereo para escrita/leitura na 2
E PROM (parte alta)

Hex

Nome

Bit 7 Bit 6

Bit 5

Bit 4 Bit 3 Bit 2 BIT 1 Bit 0 BANK3

Power-on

Outros Resets ---- ----

180 181

INDF
OPTION_RE G

Valor apontado pelo FSR (endereamento indIreto - no um /RBPU INTED

PSA

PS2

PS1

PS0 C

1111 1111 1111 1111 0000 0000 0000 0000 0001 Ixxx 0000 quuu xxxx xxxx uuuu uuuu

182 PCL 183 STATUS IRP 184 FSR 185 186 187 188 189

TRISB -

Parte baixa do PC (8 bits menos significativos) G T0CS /TO RP1 RP0 T0SE /PD Z DC Ponteiro para endereamento indireto No implementado RB7 RB6 RB5 RB4 RB3 RB2 RB1 RBO No Implementado No implementado No implementado GIE

registro implementado)

---- ----

RB0 ---0 0000 0000000X

---0 0000 0000 000u

1111 1111 11111111

18A PCLATH 18B INTCON

Parte alta do PC (5 bits mais significativos) PEIE T0IE INTE RBIE T0IF INTF RBIF -

18C EECON1 EEPG 18D EECON2 18E 18F


D

WRE WRE WR RD RR N 2 RD Registrador de segurana para escrita na E PROM (no um registrador implementado)

0000 0000 0000 0000

---- ----

----- ----

Reservado, manter sempre zerado Reservado, manter sempre zerado

0000 0000 0000 0000 0000 0000 0000 0000

Legenda: x = desconhecido, u = no modificado, q = depende de outras condies, 1 = um, 0 = zero.

Conectando o PIC 16F877A - Recursos Avanados

409

Conectando o PIC

B
Set de Instrues Completo (14 bits)
ADDLW Soma uma literal ao W __________________________________________ Sintaxe: Descrio: Limites: Operao: Statusafet.: Encoding: ADDLW k

O valor da literal passada no argumento k somado ao valor de W e o resultado armazenado no prprio W. 0 k 255 (W) + (k) (W) C,DC,Z

11
Palavras: Ciclos: Exemplo:

111x kkkk kkkk

1 1 ADDLW 0x15 Antes da instruo: W= 0x10 Aps a instruo: W= 0x25

ADDWF Soma entre W e o registrador F ____________________________________________ Sintaxe: Descrio: Limites: Operao: Status afet.: Encoding: ADDWF f,d

O valor de W somado ao valor do registrador f e o resultado armazenado no lugar definido por d. 0 f 127 d=0 (W) ou d=1 (f) (W) + (f) (d) C,DC,Z

00
Palavras: Ciclos: Exemplo:

0111 dfff

ffff

1 1 ADDWF

FSR.W

Antes da instruo: W= 0x17 FSR= 0xC2 Aps a instruo: W= 0xD9 FSR= 0xC2 Conectando o PIC 16F877A - Recursos Avanados

410
ANDLW Operao "E" entre uma literal e W ____________________________________________ Sintaxe: Descrio: Limites: Operao: Statusafet.: Encoding: ANDLW k

Executa um "E" lgico entre o valor da literal passado no argumento k e o valor de W. O resultado armazenado no prprio W. O k 255 (W) .AND. (k) (W) Z

11
Palavras: Ciclos: Exemplo: 1 1

1001 kkkk kkkk

ANDLW 0x5F Antes da instruo: W= 0xA3 Aps a instruo: W= 0x03

ANDWF Operao "E" entre W e F __________________________________________ Sintaxe: Descrio: Limites: ANDWF f,d

Executa um "E" lgico entre o valor de W e o valor do registrador f. O resultado armazenado no lugar definido por d. 0 f 127 d=0 (W) ou d=1 (f) (W) .AND. (f) (d) Z

Operao: Statusafet.: Encoding:

00
Palavras: Ciclos: Exemplo: 1 1

0101 dfff

ffff

ANDWF FSR.F Antes da instruo: W= 0x17 FSR = OxC2 Aps a instruo: W= 0x17 FSR = 0x02

Conectando o PIC 16F877A - Recursos Avanados

411
BCF Limpa um bit do registrador F _______________________________________ Sintaxe: Descrio: Limites: Operao: Status afet.: Encoding: BCF f,b

O bit de nmero b do registrador f ser zerado (clear). 0 f 127 0 b 7 0 (f,b) Nenhum

01
Palavras: Ciclos: Exemplo:

00bb bfff

ffff

1 1 BCF FLAG.5 Antes da instruo: FLAG= B'111111111 Aps a instruo: FLAG= B11011111'

BTFSC Testa o bit de f, pula se zero _________________________________________ Sintaxe: Descrio: BTFSC f,b Se o bit b do registrador f for 1, ento a prxima linha ser executada. Caso ele seja O, a prxima linha ser pulada. Neste caso, a instruo leva 2 ciclos. 0 f 127 0 b7 pula se (f,b) = 0 Nenhum

Limites: Operao: Status afet.: Encoding:

01
Palavras: Ciclos: Exemplo: 1 1 ou 2

10bb bfff

ffff

BTFSC GOTO GOTO

LED APAGA_LED ACENDE_LED

Antes da instruo: PC= Linha 1 Aps a instruo: Se LED = 1 PC = Linha 2 Se LED = 0 PC = Linha 3

Conectando o PIC 16F877A - Recursos Avanados

412
BSF Seta um bit do registrador F ________________________________________ Sintaxe: Descrio: Limites: BSF f,b

O bit de nmero b do registrador f ser selado (set). 0 f 127 0 b7 1 (f,b) Nenhum

Operao: Statusafet.: Encoding:

11
Palavras: Ciclos: Exemplo: 1 1

01bb bfff

ffff

BSF FLAG.5 Antes da instruo: FLAG= B'00000000' Aps a instruo: FLAG= B'00100000'

BTFSS Testa o bit de f, pula se um ___________________________________________ Sintaxe: Descrio: BTFSS f,b Se o bit b do registrador f for O, ento a prxima linha ser executada. aso ele seja 1, a prxima linha ser pulada. Neste caso, a instruo leva 2 ciclos. 0 t 127 0 b7 pula se (f,b) = 1 Nenhum

Limites: Operao: Statusafet.: Encoding:

01
Palavras: Ciclos: Exemplo:

11bb bfff ffff

1 1 ou 2 BTFSS LED GOTO ACENDEJ.ED GOTO APAGA_LED Antes da instruo: PC= Linha 1 Aps a instruo: Se LED = 0 PC = Linha 2 Se LED = 1 PC = Linha 3

Conectando o PIC 16F877A - Recursos Avanados

413
CALL Chama uma subrotma ___________________________________________ Sintaxe: Descrio: CALL k Chama a subrotina representada por k, que um endereo da memria de programao mas normalmente representado por um nome (label). Antes do desvio, o endereo de retorno (PC+1) armazenado na pilha. 0 k 2047 (PC) + 1 TOS (k) (PC, 10:0) (PCLATH,4:3) (PC,12:11) Nenhum

Limites: Operao:

Status afet.: Encoding:

10
Palavras: Ciclos: Exemplo: 1 2

0kkkk kkkk kkkk

CALL DELAY Antes da instruo: PC = Linha 1 Aps a instruo: PC = DELAY

CLRF Limpa o registrador F ____________________________________________ Sintaxe: Descrio: Limites: Operao: Statusafet.: Encoding: CLRF f Limpa o valor do registrador f e o bit Z setado. 0 f 127 0 (f) 1Z Z

00
Palavras: Ciclos: Exemplo: 1 1

0001 1fff ffff

CLRF FLAG Antes da instruo: FLAG= B11111111' Aps a instruo: FLAG =B'00000000' Z= 1

Conectando o PIC 16F877A - Recursos Avanados

414
CLRW Limpa o registrador W ___________________________________________ Sintaxe: Descrio: Limites: Operao: CLRW Limpa o valor do registrador W e o bit Z selado. Nenhum 0 (W) 1 Z Z

Status afet.: Encoding

00
Palavras: Ciclos: Exemplo: 1 1

0001 0000 0011

CLRW Antes da instruo: W= B'111111111 Aps a instruo: W= B00000000' Z= 1

CLRWDT Limpa o Watchdog Timer __________________________________________ Sintaxe: Descrio: CLRWDT Limpa o valor do contador WDT, rese-tando o valor do contador de prescaler. Os bits /TO e /PD so setados. Nenhum 0 (WDT) 0 WDT prescaler 1 /TO 1 /PD /TO,/PD

Limites: Operao:

Statusafet.: Encoding:

00
Palavras: Ciclos: Exemplo: 1 1

0000 0110 0100

CLRWDT Antes da instruo: WDT cont. = ? WDT ps = ? Aps a instruo: WDT cont. = 0 WDTp = 0 /T0 = 1 /PD = 1 Conectando o PIC 16F877A - Recursos Avanados

415
COMF Complemento de F ___________________________________________ Sintaxe: Descrio: Limites: COMF f,d

Calcula o complemento do registrador f. O resultado armazenado no lugar definido por d. 0 f 127 d=0 (W) ou d=1 (f) (f) (d) Z

Operao: Status afet.: Encoding:

00
Palavras: Ciclos: Exemplo: 1 1

1001 dfff

ffff

COMF REG1,F Antes da instruo: REG1 = Aps a instruo: REG1=

0x13 OxEC

DECF Decrementa o registrador F __________________________________________ Sintaxe: Descrio: Limites: DECF f,d

Decrementa uma unidade do valor do registrador f. O resultado armazenado no lugar definido por d. 0 f 127 d=0 (W) ou d=1 (f) (f) -1 (d) Z

Operao: Statusafet.: Encoding:

00 0011 dfff ffff


Palavras: Ciclos: 1 Exemplo: DECF CNT.F Antes da instruo: CNT = Z= Aps a instruo: CNT= Z= 1

0x01 O 0x00 1

Conectando o PIC 16F877A - Recursos Avanados

416
DECFSZ Decrementa F, pulando se zero ____________________________________________ Sintaxe: Descrio: DECFSZ f,d

Decrementa uma unidade do valor do registrador f. O resultado armazenado no lugar definido por d. Se o resultado da operao for zero, a linha seguinte pulada. Quando isto acontece, a instruo ocupa dois ciclos. 0 f 127 d=0 (W) ou d=1 (f) (f) -1 (d) Pula a prxima linha se resultar em 0 Nenhum

Limites: Operao:

Status afet.: Encoding:

00
Palavras: Ciclos: Exemplo: 1 1 ou 2

1011 dfff ffff

DECFSZ CNT.F GOTO CONTINUA GOTO ACABOU Antes da instruo: PC= Linha 1 Aps a instruo: Se CNT-1# 0 PC = Linha 2 Se CNT-1 = 0 PC = Linha 3 CNT = CNT-1

GOTO Desvia para um outro endereo _____________________________________________ Sintaxe: Descrio: GOTO k Desvia para um outro ponto representado por k, que um endereo da memria de programao mas normalmente representado por um nome (label). 0 k 2047 (k) (PC, 10:0) (PCLATH,4:3) (PC,12:11) Nenhum

Limites: Operao: Status afet.: Encoding:

10
Palavras: 1

1kkk kkkk kkkk

Ciclos: 2 Exemplo: GOTO CONTINUA Antes da instruo: PC= Linha 1 Aps a instruo: PC= CONTINUA Conectando o PIC 16F877A - Recursos Avanados

417

INCF Incrementa o registrador F ____________________________________________ Sintaxe: Descrio: Limites: INCF f,d

Incrementa uma unidade no valor do registrador f. O resultado armazenado no lugar definido por d. 0 f 127 d=0 (W) ou d=1 (f) (f) +1 (d) Z

Operao: Status afet.: Encoding:

00
Palavras: Ciclos: Exemplo: 1 1

1010 dfff

ffff

INCF CNT, F Antes da instruo: CNT = Z= Aps a instruo: CNT = FSR =

0xFF 0 0x00 Z

Conectando o PIC 16F877A - Recursos Avanados

418
INCFSZ Incrementa F, pulando se zero _____________________________________________ Sintaxe: Descrio: INCFSZ f,d

Incrementa uma unidade no valor do registrador f. O resultado armazenado no lugar definido por d. Se o resultado da operao for zero, a linha seguinte pulada. Quando isto acontece, a instruo ocupa dois ciclos. 0 f 127 d=0 (W) ou d=1 (f) (f) +1 (d) Pula a prxima linha se resultar em 0 Nenhum

Limites:

Operao:

Status afet.: Encoding:

00
Palavras: Ciclos: Exemplo: 1 1 ou 2

1111 dfff ffff

INCFSZ CNT.F GOTO CONTINUA GOTO ACABOU Antes da instruo: PC = Linha 1 Aps a instruo: Se CNT+1 # 0 PC = Linha 2 Se CNT+1 = 0 PC = Linha 3 CNT = CNT+1

IORLW Operao "OU" entre urna literal e W ______________________________________________ Sintaxe: Descrio: Limites: Operao: Status afet.: Encoding: IORLW k Executa um "OU" lgico entre o valor da literal passado no argumento k e o valor de W. O resultado armazenado no prprio W. 0 k 255 (W) .OR. (k) (W) Z

11
Palavras: Ciclos: Exemplo:

1000 kkkk kkkk

1 1 IORLW 0x35 Antes da instruo: W= 0x9A Aps a instruo: W= 0xBF Conectando o PIC 16F877A - Recursos Avanados

419
IORWF Operao "OU" entre W e F ____________________________________________ Sintaxe: Descrio: Limites: IORWF f,d

Executa um "OU" lgico entre o valor de W e o valor do registrador f. O resultado armazenado no lugar definido por d. 0 f 127 d=0 (W) ou d=1 (f) (W) .OR. (f) (d) Z

Operao: Status afet.: Encoding:

00
Palavras: Ciclos: Exemplo: 1 1

0100 dfff

ffff

IORWF Antes da instruo: REG= W= Aps a instruo: REG= W=

REG,W 0x13 0x91 0x13 0x93

Conectando o PIC 16F877A - Recursos Avanados

420
MOVLW Move uma literal para W ___________________________________________ Sintaxe: Descrio: Limites: Operao: Status afet.: Encodinq: MOVLW k

Move o valor de uma literal para o registrador W. 0 k 255 (k) (W) Nenhum

11
Palavras: Ciclos: Exemplo: 1 1

00xx kkkk kkkk

MOVLW 0x5A Antes da instruo: W= ? Aps a instruo: W= 0x5A Move o valor de F para o destino d

MOVF

____________________________________________ Sintaxe: Descrio: Limites: MOVF f,d

Move o valor do registrador f para o local determinado pelo destino d. 0 f 127 d=0 (W) ou d=1 (f) (f) (d) Z

Operao: Status afet.: Encoding:

00
Palavras: Ciclos: Exemplo: 1 1

1000 dfff

ffff

MOVF FSR,W Antes da instruo: W= ? Aps a instruo: W= FSR

Conectando o PIC 16F877A - Recursos Avanados

421
MOVWF Move o valor de W para F ____________________________________________ Sintaxe: Descrio: Limites: Operao: Status afet.: Encoding: MOVWF f

Move o valor do registrador W para o registrador f. 0 f 127 (W) (f) Nenhum

00
Palavras: Ciclos: Exemplo:

0000 1fff ffff

1 1 MOVWF Antes da instruo: OPTION= W= Aps a instruo: OPTION= W=

OPTION 0xFF 0x4F 0x4F 0x4F

NOP No executa nada _______________________________________________ Sintaxe: Descrio: NOP Esta instruo e usada somente para perder tempo, pois ela no executa operao nenhuma. Nenhum Nenhuma Nenhum

Limites: Operao: Status afet.: Encoding:

00
Palavras: Ciclos: Exemplo: 1 1 NOP

0000 0000 0000

Conectando o PIC 16F877A - Recursos Avanados

422
RETFIE Retorna da interrupo ____________________________________________ Sintaxe: Descrio: Limites: 1-+GIE Status afet.: Encoding: RETIFIE Retorna da interrupo, recuperando o ltimo endereo da pilha e selando obitGIE. Nenhum Operao: TOS (PC)

Nenhum

00
Palavras: Ciclos: Exemplo: 1 2

0000 0000 1001

RETFIE Aps a instruo: PC= TOS GIE= 1

RETLW Retorna com uma literal em W ______________________________________________ Sintaxe: Descrio: Limites: RETLWk Retorna de uma subrotina, recuperando o ltimo endereo da pilha, e colocando o valor passado por k em W. 0 k 255 Operao: TOS (PC) Nenhum (k) (W)

Status afet.: Encoding:

11
Palavras: Exemplo:

01xx kkkk kkkk


2

1 Ciclos:

RETLW0x50 Aps a instruo: PC = TOS W= 0x50

Conectando o PIC 16F877A - Recursos Avanados

423
RETURN Retorna de uma subrotina _____________________________________________ Sintaxe: Descrio: Limites: Operao: Status afet.: Encoding: RETURN Retorna de uma subrotina, recuperando o ltimo endereo da pilha. Nenhum TOS (PC) Nenhum

00
Palavras: Ciclos: Exemplo: 1 2

0000 0000 1000

RETURN Aps a instruo: PC = TOS

RLF Rotaciona F um bit para a esquerda ___________________________________________

Sintaxe: Descrio:

RLF

f,d

Rotaciona o registrador f um bit para a esquerda. O valor de carry colocado no bit O, e depois o valor do bit 7 colocado em carry. O resultado armazenado no lugar definido por d. 0 f 127 d=0 (W) ou d=1 (f) Conforme descrio. C

Limites:

Operao: Status afet.: Encoding:

00
Palavras: Ciclos: Exemplo: 1 1

1101 dfff

ffff

RLF REG1.F Antes da instruo: C= 0 REG1= 11100110 Aps a instruo: C= 1 REG1= 11001100

Conectando o PIC 16F877A - Recursos Avanados

424
RRF Rotaciona F um bit para a direita _________________________________________ Sintaxe: Descrio: RRF f,d

Rotaciona o registrador f um bit para a direita. O valor de carry colocado no bit 7, e depois o valor do bit O colocado em carry. O resultado armazenado no lugar definido por d. 0 f 127 d=0 (W) ou d=1 (F) Conforme descrio. C

Limites:

Operao: Status afet.: Encoding:

00
Palavras: Ciclos: 1 Exemplo: 1

1100 dfff

ffff

RRF REG1.F Antes da instruo: C= 0 REG1=11100110 Aps a instruo: C= 0 REG1= 01110011

SLEEP Entra em modo sleep __________________________________________ Sintaxe: Descrio: Limites: Operao: SLEEP Coloca o microcontrolador em modo sleep. Nenhum 0 WDT 0 WDT prescaler 1 /TO 0 WPD /TO, /PD

Status afet.: Encoding:

00
Palavras: Ciclos: Exemplo: 1 1

0000 0110 0011

SLEEP

Conectando o PIC 16F877A - Recursos Avanados

425
SUBLW Subtrao entre uma literal e W _____________________________________________ Sintaxe: Descrio: Limites: Operao: Status afet.: Encoding: SUBLW k

Subtrai o valor de W da constante passada por k. O resultado armazenado no prprio W. 0 k 255 (k) - (W) (W) C, PC, Z

11
Palavras: Ciclos: Exemplo 1: 1 1

110x kkkk kkkk

SUBLW Antes da instruo: W= C= Aps a instruo: W= C= SUBLW 0x02 Antes da instruo: W= 2 C= ? Aps a instruo: W= 0 C= 1 (zero)

0x02 1 ? 1 1 (positivo)

Exemplo2:

Exemplo3:

SUBLW 0x02 Antes da instruo: W= 3 C= ? Aps a instruo: W= 255 C= 0 (negativo)

Conectando o PIC 16F877A - Recursos Avanados

426
SUBWF Subtrao entre W e F __________________________________________ Sintaxe: Descrio: Limites: Operao: Statusafet.: Encoding: SUBWF f,d Subtrai do registrado f o valor de W. O resultado armazenado no lugar definido por d. 0 f 127 d=0 (W) ou d=1 (f) (f) - (W) (d) C, PC, Z

00
Palavras: Ciclos: Exemplo 1: 1 1

0010 dfff

ffff

Exemplo2:

Exemplo3:

SUBWF Antes da instruo: REG= W= C= Aps a instruo: REG= W= C= SUBLW REG.F Antes da instruo: REG= W= C= Aps a instruo: REG= W= C= SUBLW REG.F Antes da instruo: REG= W= C= Aps a instruo: REG = W= C=

REG.F 3 2 ? 1 2 1 (positivo)

2 2 ? 0 2 1 (zero)

1 2 ? 255 2 0 (neg.)

SWAPF Inverso do registrador F ____________________________________________ Sintaxe: Descrio: Limites: Operao: Status afet.: SWAPF f,d Inverte a parte alta (bits de 4 a 7) com a parte baixa (bits de O a 3) do registrador f. O resultado armazenado no lugar definido por d. 0 f 127 d=0 (W) ou d=1 (f) (f,3:0) (d,7:4) (f,7:4) (d,3:0) Nenhum Conectando o PIC 16F877A - Recursos Avanados

427

Encoding:

00
Palavras: Ciclos: Exemplo: 1 1

1110 dfff

ffff

SWAPF REG.F Antes da instruo: REG = 0xA5 Aps a instruo: REG = 0x5A

XORLW Operao "OU exclusivo" entre k-W ______________________________________________ Sintaxe: Descrio: Limites: Operao: Status afet.: Encoding: XORLW k

Executa um "OU" lgico exclusivo entre o valor da literal passado no argumento k e o valor de W. O resultado armazenado no prprio W. 0 k 255 (W) .XOR. (k) (W) Z

11
Palavras: Ciclos: Exemplo: 1 1

1010 kkkk kkkk

XORLW 0xAF Antes da instruo: W= OxB5 Aps a instruo: W= Ox1A

XORWF

Operao "OU" exclus. entre W eF

_____________________________________________________________________ Sintaxe: Descrio: XORWF f,d Executa um "OU" lgico exclusivo entre o valor de W e o valor do registrador f. O resultado armazenado no lugar definido por d. 0 f 127 d=0 (W) ou d=1 (f) Conectando o PIC 16F877A - Recursos Avanados

Limites:

428

Operao: Statusafet.: Encoding:

(W) .XOR. (f) (d) Z

00
Palavras: Ciclos: Exemplo: 1 1

0110 dfff

ffff

XORWF Antes da instruo: W= REG = Aps a instruo: W= REG =

REG,F

0xB5 0xAF

0xB5 0x1 A

Conectando o PIC 16F877A - Recursos Avanados

429
Anotaes

_________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________

Conectando o PIC 16F877A - Recursos Avanados

430

Conectando o PIC

c
Diretrizes da Linguagem MPASM

As diretrizes apresentadas neste apndice so vlidas para todos os PIC (12, 14 e 16 bits), exeto para a famlia 18. ___BADRAM - Configura regies da RAM no disponveis _____________________________________________________________________ Sintaxe ___BADRAM <expr>[-<expr>[,<expr>-[<expr>] ] ] Descrio Utilizado para determinar blocos de memria RAM que no podem ser utilizados pelo microcontrolador. Os valores de <expr> devem estar sempre dentro do limite imposto pela diretriz maxram. Caso o programa tente utilizar um endereo englobado por estes limites, uma mensagem de erro ser gerada. O programador no precisa se preocupar com esta diretriz pois ela esta definida nos arquivos de INCLUDE fornecidos pela Microchip. Exemplo Veja exemplo de ___MAXRAM Veja tambm ___MAXRAM BANKISEL - Gera cdigo para acertar banco de memria (acesso indireto) _____________________________________________________________________ Sintaxe BANKISEL Descrio Esta diretriz utilizada para acertar automaticamente o banco de memria para acesso indireto. Na verdade, o compilador ir gerar o cdigo necessrio para acertar o banco. Para PICs de 14 bits, sero utilizadas instrues para setar ou limpar o bit IRP do registrador de STATUS. J para os PICs de 16 bits, as instrues MOVLB e MOVLR sero implementadas. O argumento <nome> representa a varivel com a qual se trabalhar e que deve servir de referncia para a seleo do banco. <nome>

Conectando o PIC 16F877A - Recursos Avanados

431
Exemplo MOVLW MOVWF BANKISEL ... MOVWF

VAR1 FSR VAR1 INDF

Veja Tambm PAGESEL, BANKSEL BANKSEL - Gera cdigo para acertar banco de memria (acesso direto) _____________________________________________________________________ Sintaxe BANKSEL Descrio Esta diretriz utilizada para acertar automaticamente o banco de memria para acesso direto. Na verdade, o compilador ir gerar o cdigo necessrio para acertar o banco. Para PICs de 12 bits, as instrues para acertar os bits do FSR sero inseridas no cdigo. Para PICs de 14 bits, sero utilizadas instrues para setar ou limpar os bits RPO e RP1 do registrador de STATUS. J para os PICs de 16 bits, as instrues MOVLB e MOVLR sero implementadas. Entretanto, se o PIC em uso contm somente um banco de RAM, nenhuma instruo adcional gerada. O argumento <nome> representa a varivel com a qual se trabalhar e que deve servir de referncia para a seleo do banco. Exemplo MOVLW .10 BANKSEL VAR1 MOVWF VAR1 Veja tambm PAGESEL, BANKISEL CBLOCK - Define um bloco de constantes _____________________________________________________________________ Sintaxe CBLOCK [<expr>] <nome> [:<incremento>] [,<nome> [:<incremento>] ] ENDC Descrio Define uma srie de constantes. O primeiro <nome> associado ao valor de <expr>. J o segundo, associado ao valor seguinte e assim sucessivamente. Caso no seja determinado o valor de <incremento>, a prxima constante receber o valor imediatamente seguinte, isto , incremento unitrio. Caso contrrio, a prxima constante receber o valor da constante anterior mais o <incremento>. A definio de constantes deve ser terminada pela diretriz ENDC. <nome>

Conectando o PIC 16F877A - Recursos Avanados

432
Exemplo CBLOCk 0X20 W_TEMP ;W_TEMP=0X2 O STATUS_TEMP ;STATUS_TEMP=0X21 TEMP1.TEMP2 ;TEMP1=0X22, TEMP2=0X23 END:O,END_H,END_L ;END=0X24, END_H=0X24, END_L=0X25 CDIGO:2 ;CODIGO=0X26 CONTA ;CONTA=0X28 ENDC Veja tambm ENDC CODE - Declara o incio de um bloco de programa _____________________________________________________________________ Sintaxe [<nomel>] CODE [<ROM enderece>) Descrio Usado para objetos. Serve para declarar o incio de um bloco de programa. Caso o argumento <nome> no seja definido, o bloco ser chamado CODE. O endereo inicial passado pelo argumento <rom endereo>. Se este no for especificado, o compilador assume o endereo zero. Exemplo RESETcode

H'01FF' goto

START

Veja tambm IDATA, UDATA, UDATAJDVR, UDATA_SHR, EXTERN, GLOBAL ___CONFIG - Configura os dados para gravao do microcontrolador _____________________________________________________________________ Sintaxe CONFIG Descrio Utilizado para configurar previamente os dados para a gravao do PIC. Para facilitar a vida do programador, a Microchip j definiu uma srie de smbolos para estas opes nos arquivos de INCLUDE de cada modelo de PIC. Basta dar uma conferida nestes arquivos para saber quais os smbolos pertinentes ao tipo de oscilador, WDT, etc. A <expr> deve ser montada pela juno destes smbolos atravs do operador & (AND). Exemplo CONFIG <expr>

_WDT_ON & _XT_OSC

& _CP_OFF

Veja tambm LIST, PROCESSOR, _IDLOCS

Conectando o PIC 16F877A - Recursos Avanados

433
CONSTANT - Define uma constante _____________________________________________________________________ Sintaxe CONSTANT <nome> = <expr> [,<nome> = <expr>] Descrio Define uma constante para ser utilizada nas expresses que sero interpretadas pelo compilador. Como o prprio nome diz, o valor determinado por <expr> associado de maneira definitiva ao <nome>, no podendo mais ser alterado no decorrer do programa. Exemplo CONSTANT TAM_NOME = 10 , TAM_CODIGO = 5 CONSTANT TAMJTOTAL = TAM_NOME + TAM_CODIGO Veja tambm SET, VARIABLE DA - Armazena uma string na memria de programa _____________________________________________________________________ Sintaxe DA <expr> [,<expr2>, ... <exprn>] Descrio Preenche a memria de programa (14 bits) com o cdigo ASCII reduzido (7 bits). Cada 2 caracteres da string so armazenados na mesma posio da memria de programa, sendo o primeiro na parte mais significativa e o segundo na menos significativa. Exemplo DA "abedef" Isto ir armazenar: 30E2 31E4 32E6 3380 na memria de programa. DA "12" , 0 Isto ir armazenar: 18B2 0000 na memria de programa. DATA - Preenche a memria com nmeros ou textos _____________________________________________________________________ Sintaxe DATA <expr>[,<expr>, . . . ,<expr>] DATA "texto"[,"texto", . . . ,"texto"] Descrio Preenche a memria de programa com o valor determinado por <expr> ou "texto", comeando na posio atual e avanando a quantidade posies necessrias para caber o dado. As expresses ou caracteres unitrios so colocados um em cada posio de memria. J os textos ASCII so arquivados com 2 caracteres para cada posio da memria, sendo o primeiro no byte-mais significativo. Se o texto possui um nmero mpar de caracteres, um zero escrito no ltimo byte.

Conectando o PIC 16F877A - Recursos Avanados

434
Exemplo DATA 1,2,CONTA DATA ' N' DATA "TEXTO DE EXEMPLO" Veja tambm DW, DB, DE, DT DB - Preenche a memria byte a byte _____________________________________________________________________ Sintaxe DB <expr>[,<expr>,...,<expr>] Descrio Preenche a memria de programa com o valor determinado por <expr>, comeando na posio atual e guardando os dados a cada byte, avanando a quantidade de posies necessrias para caber todas as <expr>. Exemplo DB

.1, 'T , 0x0f, CONTA, 's'

Veja tambm DATA, DW, DE, DT DE Preenche a memria EEPROM byte a byte _____________________________________________________________________ Sintaxe DE DE Descrio Preenche a memria E2PROM com o valor determinado por <expr> ou " texto", comeando na posio atual e guardando os dados a cada byte, avanando a quantidade de posies necessrias para caber todas as <expr>. No caso do " texto", cada caracter ser gravado em um byte. Caso esta diretriz seja utilizada para gravar dados na rea de programao, os bits mais significativos (acima do 7) sero zerados. Exemplo ORG H 2100 DE "Exemplo, V1.0" Veja tambm DATA, DW, DB, DT #DEFINE - Define uma substituio de texto _____________________________________________________________________ Sintaxe #DEFINE <nome> [<texto>] <expr>[ ,<expr>, . . . ,<expr>] "texto"[ , "texto", . . . ,"texto"]

;aponta para o incio da EEPROM

Conectando o PIC 16F877A - Recursos Avanados

435
Descrio
Esta diretriz define uma substituio de texto. Sempre que o compilador encontrar <nome>, ele ser substitudo pelo <texto> associado a ele. Ao contrrio da diretriz EQU, que s pode associar valores, est diretriz pode associar qualquer coisa ao nome, inclusive um comando ou o endereo de um bit. Smbolos criados desta maneira no podem ser monitorados pelas ferramentas do MPLab (simulador). Definindo um nome sem um <texto> associado, ele poder ser usado com a diretriz IFDEF.

Exemplo #DEFINE #DEFINE #DEFINE LED PORTA, 0 LED_ON BSF LED LED_OFF BCF LED

Veja tambm IFDEF, IFNDEF,#UNDEFINE DT - Preenche a memria com uma tabela _____________________________________________________________________ Sintaxe DT <expr> [<expr>,. . . ,<expr>] DT "texto" Descrio Preenche a memria de programa com uma srie de instrues RETLW, uma para cada <expr> ou caracter do "texto", comeando na posio atual e avanando a quantidade posies necessrias para caber todas as instrues. Exemplo DT DT Veja tambm DATA, DE, DB, DW DW - Preenche a memria palavra a palavra _____________________________________________________________________ Sintaxe DW <expr>[,"texto", . . . ,<expr>] Descrio
Preenche a memria de programa com o valor determinado por <expr> ou texto , comeando na posio atual e avanando a quantidade posies necessrias para caber todos os dados. As expresses ou caracteres unitrios so colocados um em cada posio de memria. J os textos ASCII so arquivados com 2 caracteres para cada posio, sendo o primeiro no byte mais significativo. Se o texto possui um nmero mpar de caracteres, um zero escrito no ltimo byte.

"MOSAICO" VALOR1, VALOR2 , VALOR3

Exemplo DW 39,"MOSAICO" Veja tambm DATA,'DE, DB, DT Conectando o PIC 16F877A - Recursos Avanados

436

ELSE - Bloco alternativo para teste condicionais _____________________________________________________________________ Sintaxe ELSE Descrio Usado em conjunto com as diretrizes IF, IFDEF e IFNDEF para executar um bloco especfico no caso do teste condicional apresentar um resultado negativo. Exemplo Veja o exemplo de IF. Veja tambm IF, IFDEF, IFNDEF, ENDIF END - Fim do programa _____________________________________________________________________ Sintaxe END Descrio Usado para determinar o fim do programa. Esta diretriz obrigatria na ltima linha do cdigo fonte. Exemplo INICIO . (corpo do programa) . END ENDC - Finaliza um bloco de constantes _____________________________________________________________________ Sintaxe ENDC Descrio Finaliza o bloco de constantes iniciado por CBLOCK. Exemplo Veja o exemplo de CBLOCK. Veja tambm CBLOCK ENDIF - Fim dos blocos de teste condicional _____________________________________________________________________ Sintaxe ENDIF' Conectando o PIC 16F877A - Recursos Avanados

437

Descrio Usado em conjunto com as diretrizes IF, IFDEF, IFNDEF e ELSE para finalizar os blocos de cdigos que sero executados de acordo com os testes condicionais. Exemplo Veja o exemplo de IF.' Veja tambm IF, IFDEF, IFNDEF, ELSE ENDM - Finaliza o bloco de uma macro _____________________________________________________________________ Sintaxe ENDM Descrio Finaliza o bloco de uma macro. Exemplo Veja o exemplo de MACRO. Veja tambm EXITM, MACRO ENDW - Fim do bloco de loop _____________________________________________________________________ Sintaxe ENDW Descrio Usado em conjunto com a diretriz WHILE para finalizar o bloco de cdigos que ser repetido enquanto o teste de WHILE for verdadeiro. Exemplo Veja o exemplo de WHILE. Veja tambm WHILE EQU - Define uma substituio Sintaxe <nome> EQU <expr> Descrio O <nome> ser substitudo pelo valor determinado por <expr> sempre que for encontrado. Este conceito totalmente similar ao de constantes. Exemplo TEMPO

EQU .4

Conectando o PIC 16F877A - Recursos Avanados

438
Veja tambm SET, CONSTANT ERROR - Gera uma mensagem de erro _____________________________________________________________________ Sintaxe ERROR "<texto" Descrio Gera uma mensagem de erro, que ser mostrada como um erro no relatrio gerado durante a compilao. O texto pode ter at 80 caracteres. Exemplo IFNDEF ENDIF Veja tambm MESSG ERRORLEVEL - Determina o nvel de gerao das mensagens _____________________________________________________________________ Sintaxe ERRORLEVELO/1/2/+/- <msg_num> Descrio
Determina que tipo de mensagens devem ser mostradas durante a compilao: Nvel"O que ser mostrado"'0"Mensagens, alertas e erros (tudo).1 "Alertas e erros.'"2"Somente erros.'"+<msg_num>"Habilita a mensagem de nmero <meg_num>." -<msg_num>" inibe a mensagem de nmero <meg_num>."' Observao Os nmeros das mensagens, alertas e erros podem ser encontrados no apndice C do manual do compilador MPASM. Nas verses mais novas do MPLab, esta diretriz pode ter seu nvel acertado e gravado no arquivo de projeto.

___PIC16F84 ERROR "ATENO: o PIC escolhido no o 16F84"

Exemplo ERRORLEVELl, -202 Veja tambm LIST EXITM Fora a sada de uma macro _____________________________________________________________________ Sintaxe EXITM Descrio Fora a sada de uma macro. Seus efeitos so similares aos da diretriz ENDM. Exemplo Veja o exemplo de MACRO. Conectando o PIC 16F877A - Recursos Avanados

439
Veja tambm ENDM, MACRO EXPAND - Expande o cdigo das Macros _____________________________________________________________________ Sintaxe EXPAND Descrio Determina que todas as macros encontradas aps ela sero expandidas na listagem do LST. Veja tambm LIST, NOEXPAND, MACRO EXTERN Declara smbolos definidos externamente _____________________________________________________________________ Sintaxe EXTERN Descrio Usado para objetos. Declara smbolos que sero utilizados no cdigo corrente mas que so definidos como GLOBAL em outros mdulos. Esta diretriz deve ser aplicada antes dos smbolos serem utilizados no cdigo corrente. Mais de um smbolo pode ser definido na mesma linha, atravs dos argumentos <nome>. Exemplo EXTERN TESTE ... CALL TESTE Veja tambm TEXT, IDATA, UDATA, UDATA_OVR, UDATA_SHR, GLOBAL FILL Preenche a memria com um valor ou instruo _____________________________________________________________________ Sintaxe FILL <expr>,<num> Descrio Preenche a memria de programa com o valor determinado por <expr>, comeando na posio atual e avanando <num> posies. A <expr> pode tambm ser uma instruo do assembler, mas neste caso deve ser colocadas entre parnteses. Exemplo FILL 0X1009,5 FILL (NOP),CONTA NOP Veja tambm ORG, DATA, DW <nome> [, <nome>]

;Preenche 5 posies com o valor 0x1009 ;Preenche CONTA posies com a instr.

Conectando o PIC 16F877A - Recursos Avanados

440
GLOBAL - Declara smbolos que podem ser usados externamente _____________________________________________________________________ Sintaxe GLOBAL <nome> [, <nome>] Descrio Usado com objetos. Declara os smbolos que sero definidos no mdulo corrente mas que podero ser exportados para outros mdulos. Esta diretriz pode ser utilizada antes ou depois da definio do smbolo. Mais de um smbolo podem ser declarados na mesma linha atravs dos argumentos <nome>. Exemplo UDATA VAR1 RES VAR2 RES GLOBAL

.l .1 VAR1, VAR2

CODE SOMATRES GLOBAL SOMATRES ADDLW . 3 RETURN Veja tambm TEXT, IDATA, UDATA, UDATA_OVR, UDATA_SHR, EXTERN IDATA Declara uma seo de dados j inicializados _____________________________________________________________________ Sintaxe [<nome>] IDATA [<RAM enderece] Descrio Usado com objetos. Declara o incio de uma seo de dados inicializados. Se o argumento <nome> no for especificado, a seo ser chamada de IDATA. O endereo inicial para os dados definido por <ram endereo, ou ser adotado o valor zero caso este argumento no seja especificado. Nenhum cdigo ser gerado nesta seo. O linker ir gerar uma tabela de entrada para cada byte especificado. O usurio dever ento definir a inicializao apropriada. Esta diretriz no est disponvel para PICs de 12 bits. Exemplo IDAT LIMITEL LIMITEH GANHODW FLAGS DW TEXTODB Veja tambm TEXT, UDATA, UDATA_OVR, UDATA_SHR, EXTERN, GLOBAL ___IDLOCS - Especifica os dados para gravao do IP _____________________________________________________________________ Sintaxe Conectando o PIC 16F877A - Recursos Avanados

DW .0 DW .300 .5 .0 MOSAICO

441
IDLOCS <expr> Descrio Utilizado para especificar previamente os dados que sero gravados nas 4 posies de ID. Exemplo ___IDLOCS

H'1234'

Veja tambm LIST, PROCESSOR,

CONFIG

IF - Teste condicional de uma expresso _____________________________________________________________________ Sintaxe IF Descrio <expr>

Testa se a expresso definida por <expr> verdadeira ou falsa. Caso ela seja verdadeira, ento o cdigo existente entre esta diretriz e a ENDIF ser executado. Caso contrrio, ele ser pulado, podendo ainda ser executa o bloco relacionado a diretriz ELSE, caso ela exista.

Exemplo CONTA = 5 . . IF CONTA > 3 . (rotina especfica para CONTA > 3) . ELSE . (rotina especfica para CONTA ^ 3) . ENDIF Veja tambm ENDIF, ELSE IFDEF - Teste condicional de existncia de um smbolo _____________________________________________________________________ Sintaxe IFDEF <nome> Descrio Testa se o smbolo especificado por <nome> j foi definido (diretriz #DEFINE, sem o argumento <texto>). Caso o smbolo j tenha sido definido, ento o cdigo existente entre esta diretriz e a ENDIF ser executado. Caso contrrio, ele ser pulado, podendo ser executado o bloco associado a diretriz ELSE, caso ela exista. Exemplo #DEFINE . . IFDEF

TESTE

TESTE

Conectando o PIC 16F877A - Recursos Avanados

442
. (rotina que ser executada para teste) ENDIF Veja tambm IFNDEF, tfDEFINE, tfUNDEFINE, ENDIF, ELSE IFNDEF - Teste condicional de no existncia de um smbolo _____________________________________________________________________ Sintaxe IFNDEF <nome>

Descrio Testa se o smbolo especificado por <nome> no foi definido. Caso o smbolo no tenha sido definido, ento o cdigo existente entre esta diretriz e a ENDIF ser executado. Caso contrrio, ele ser pulado, podendo ser executado o bloco associado a diretriz ELSE, caso ela exista. Exemplo #UNDEFINE TESTE ;garante a no definio de TESTE . . IFNDEF TESTE . (rotina que ser executada fora do teste) . ENDIF Veja tambm IFNDEF, #DEFINE, tfUNDEFINE, ENDIF, ELSE INCLUDE - Inclui ao programa um arquivo de definies _____________________________________________________________________ Sintaxe INCLUDE <nome_do_arquivo> INCLUDE "nome_do_arquivo"

Descrio Usado geralmente no incio do programa, para incluir definies especificadas em arquivos auxiliares. Estes arquivos, com mesma formatao que os cdigos fonte, possuem no entanto somente definies, variveis, constantes e similares, para facilitar a vida do programador. Junto com o MPLab, a Microchip fornece vrios destes arquivos, com a extenso .INC, um para cada tipo de PIC. Se o path for especificado em nome_do_arquivo, ento o arquivo ser procurado somente neste diretrio. Caso contrrio, a ordem de procura ser a seguinte: diretrio atual, diretrio dos arquivos de cdigo fonte e diretrio do MPASM. Exemplo INCLUDE INCLUDE

"C:\MOSAICO\MOSAICO.INC" <PIC16F84.INC>

LIST - Opes para a listagem do programa _____________________________________________________________________ Sintaxe LIST [<opo>, <opo>] Conectando o PIC 16F877A - Recursos Avanados

443

Descrio Configura uma srie de opes que sero utilizadas para a criao da listagem de programa (arquivo com extenso 1ST). As opes possveis encontram-se na tabela seguinte: Opo b=nnn c=nnn f=<formato> free fixed mm=ON/OFF n=nnn p=<tipo> r=<radix> st=ON/OFF t=ON/OFF w=0/l/2 x=ON/OFF Padro 8 132 Descrio Espaos para tabulaes. Quantidade de colunas.

INHX8 Formato do arquivo de sada. Pode ser INHX32, M INHX8M ou INHX8S. fixed fixed On 60 Nenhu m Hex On Off 0 On Utiliza formato livre. Utiliza formato fixo. Mostra o mapa da memria no arquivo de listagem. Nmero de linhas por pgina. Modelo de PIC (por exemplo: PIC16F84) Radix utilizado: HEX, DEC ou OCT. Mostra a tabela de smbolos no arquivo de listagem. Trunca linhas muito grandes. Escolhe o nvel de mensagens (vide ERRORLEVEL). Expande ou no as macros no arquivo de listagem.

Observao _____________________________________________________________________ Os valores destas opes so representados sempre em decimal. Exemplo LIST p=PIC16F84, r=DEC, c=80 Veja tambm NOLIST, PROCESSOR, RADIX, ERRORLEVEL, EXPAND, NOEXPAND LOCAL - Define uma varivel local para uma macro _____________________________________________________________________ Sintaxe LOCAL<nome>, [<nome>] Descrio Declara variveis que sero utilizadas somente dentro da MACRO. Mesmo que esta varivel possua o mesmo <nome> de uma outra j definida no corpo do programa, ela ser tratada como uma varivel totalmente nova, no afetando o valor da outra anteriormente definida. Exemplo COMP SET .10 LARG SET . 20 . . TESTE MACRO

TAMANHO

Conectando o PIC 16F877A - Recursos Avanados

444
LOCALCOMP, LARG ; AS CONFLITOS COMP SET .30 LARG SET .50 ENDM VARIVEIS LOCAIS NC GERAM

;COMP=10 Veja tambm ENDM, MACRO

E LARG=20

MACRO Define uma Macro ____________________________________________________________________________ Sintaxe <nome> MACRO [<argl>, ..., <argx>] Descrio Uma macro uma seqncia de instrues que pode ser inserida no seu cdigo com uma simples referncia ao nome dela. Por isso, normalmente as macros so utilizadas para economizar digitao de funes muito utilizadas, e podem ser definidas em arquivos do tipo INCLUDE. Uma macro pode chamar outra macro de dentro dela. Os argumentos passados a macro sero substitudos no corpo do cdigo. Para terminar uma macro necessrio a diretriz ENDM. No entanto ela pode ser finalizada quando encontrada a diretriz EXITM. Variveis utilizadas somente dentro das macros podem ser definidas como LOCAL. Maiores informaes sobre este poderoso recurso podem ser obtidas no captulo 4 do manual do MPASM. Exemplo ;(Definio) TESTE MACRO REG IF REG == l EXITM ELSE ERRO "REGISTRADOR ERRADO" ENDIF ENDM ;(Utilizao) TESTE TEMP Veja tambm ENDM, EXITM, LOCAL, IF, ELSE, ENDIF, WHILE, ENDW __MAXRAM - Configura o tamanho mximo da RAM ____________________________________________________________________________ Sintaxe ___MAXRAM <expr> Descrio Utilizado para configurar o tamanho mximo da RAM para o PIC que est sendo utilizado. A <expr> determina o ltimo endereo de RAM disponvel. O programador no precisa se preocupar com esta diretriz pois ela esta definida nos arquivos de INCLUDE fornecidos pela Microchip.

Conectando o PIC16F877A - Recursos Avanados

445
Exemplo ;(para PIC 16F84) MAXRAM H'CF' BADRAMH'07', H'50'-H'7F', Veja tambm _BADRAM MESSG - Gera uma mensagem definida pelo usurio ____________________________________________________________________________ Sintaxe MESSG "texto" Descrio Gera uma mensagem, que ser mostrada no relatrio gerado durante a compilao. O texto pode ter at 80 caracteres. Exemplo IFNDEF

H'87'

___PIC16F84 MESSG "ATENO: o PIC escolhido no o 16F84" ENDIF

Veja tambm ERROR NOEXPAND - No expande o cdigo das Macros ____________________________________________________________________________ Sintaxe NOEXPAND Descrio Determina que todas as macros encontradas aps esta diretriz no sero expandidas na listagem do programa (1ST). Veja tambm LIST, EXPAND, MACRO NOLIST - Desliga a gerao do arquivo de listagem ______________________________________________________________________ Sintaxe NOLIST Descrio Inibe a gerao automtica do arquivo de listagem (1ST). Veja tambm LIST

Conectando o PIC16F877A - Recursos Avanados

446
ORG - Acerta ponto da memria de programao ____________________________________________________________________________ Sintaxe [<nome>] ORG <expr>

Descrio Usado para determinar o ponto da memria de programao onde a prxima instruo ser escrita. Se nenhuma diretriz ORG for colocada no programa, ento ele comear a ser escrito na posio 0x00. Caso <nome> seja especificado, ento o valor de <expr> ser associado a ele. Exemplo END_10RG 0x10 END_20RG END_1

+ 0x10

PAGE - Insere uma quebra de pgina ____________________________________________________________________________ Sintaxe PAGE Descrio Insere uma quebra de pgina na gerao do arquivo de listagem do programa (1ST). Veja tambm LIST, TITLE, SUBTITLE, SPACE PAGESEL - Seleciona a pgina de programao ____________________________________________________________________________ Sintaxe PAGESEL <nome>

Descrio Esta diretriz utilizada para acertar automaticamente a pgina de memria de programao. Na verdade, o compilador ir gerar o cdigo necessrio para acertar a pgina. Para PICs de 12 bits, as instrues para acertar os bits do STATUS sero inseridas no cdigo. Para PICs de 14 e 16 bits, sero utilizadas as instrues MOVLW e MOVWF para acertar o valor de PCLATH. Entretanto, se o PIC em uso contm somente uma pgina de programao, nenhuma instruo adcional gerada. O argumento <nome> representa a rotina com a qual se trabalhar, e deve ser definida antes do uso desta diretriz. Exemplo PAGESEL GOTODEST GOTO GOTODEST Veja tambm BANKSEL, BANKISEL PROCESSOR Determina o tipo de PIC utilizado ____________________________________________________________________________ Sintaxe PROCESSOR <tipo>

Conectando o PIC16F877A - Recursos Avanados

447

Descrio Determina o tipo de PIC que ser utilizado. Nas verses mais novas do MPLab, esta diretriz no mais necessria pois este valor acertado e gravado no arquivo de projeto. Exemplo PROCESSOR Veja tambm LIST RADIX Determina o RADIX padro ____________________________________________________________________________ Sintaxe RADIX<tip0> Descrio Determina o tipo padro a ser considerado a todos os nmeros encontrados no programa, quando no devidamente especificados. O valor de <tipo> pode ser: HEX, DEC ou OCT. Lembre-se que independentemente do RADIX padro, qualquer nmero pode ser acertado atravs das pr--definies:

PIC16F84

Radix Decimal Hexadecimal Octadecimal Binrio ASCII

Formato 1 D'xx' H'xx' 0'xx' B'xxxxxxxx' A'x'

Formato 2 .x 0Xxx

'x'

Observao ____________________________________________________________________________ Recomendamos que as pre-definies apresentadas acima sejam sempre utilizadas, para evitar problemas caso algum altere o valor do radix em seus programas. Nas verses mais novas do MPLab, esta diretriz no mais necessria pois este valor acertado e gravado no arquivo de projeto. Exemplo RADIX DEC Veja tambm LIST RS - Reserva memria ____________________________________________________________________________ Sintaxe [<nome>] RES <tamanho>

Conectando o PIC16F877A - Recursos Avanados

448
Descrio Reserva memria de programa de dados para uso posterior. O bloco ir comear na posio atual e ter o tamanho especificado pelo argumento <tamanho>. A definio de <nome> poder ser usada para referenciar-se ao incio do bloco. Exemplo BUFFER RS 64 ;Reserva 64 palavras

Veja tambm ORG, FILL SET - Define uma varivel ____________________________________________________________________________ Sintaxe <nome> SET <expr> Descrio Define uma varivel para ser utilizada nas expresses que sero interpretadas pelo compilador. Como o prprio nome diz, o valor determinado por <expr> ser associado ao <nome>, podendo ser alterado no decorrer do programa. Exemplo COMP SET LARG SET ALTURA REA SET VOL SET Veja tambm EQU, VARIABLE SPACE - Insere linhas em branco ____________________________________________________________________________ Sintaxe SPACE <expr> Descrio Insere <expr> nmero de linhas em branco na gerao do arquivo de listagem do programa (.LST). Exemplo SPACE3 .10 .2O SET .15 COMP * LARG REA * ALTURA

; insere 3 linhas em branco

Veja tambm LIST, TITLE, SUBTITLE, SPACE, PAGE SUBTITLE - Determina o subttulo do programa ____________________________________________________________________________ Sintaxe SUBTITLE "<texto>"

Conectando o PIC16F877A - Recursos Avanados

449
Descrio O <texto> pode ter at 60 caracteres e ser utilizado como segunda linha no cabealho de toda pgina no arquivo de listagem do programa (1ST). Exemplo SUBTITLE " Desenvolvido pela MOSAICO ENGENHARIA" Veja tambm LIST, TITLE TULE - Determina o ttulo do programa ____________________________________________________________________________ Sintaxe TITLE "<texto>" Descrio O <texto> pode ter at 60 caracteres e ser utilizado no cabealho de toda pgina no arquivo de listagem do programa (1ST). Exemplo TITLE"Programa de exemplo" Veja tambm LIST, SUBTITLE UDATA - Declara o incio de uma seo de dados no inicializados ____________________________________________________________________________ Sintaxe [<nome>] UDATA [<RAM endereo>] Descrio Usado com objetos. Declara o incio de uma seo de dados no inicializados. Se o argumento <nome> no for especificado, a seo ser chamada de UDATA. O endereo inicial para os dados definido por <ram endereo>, ou ser adotado o valor zero caso este argumento no seja especificado. Nenhum cdigo ser gerado nesta seo. A diretriz RS deve ser usada para reservar espao para os dados. Exemplo UDATA VAR1 RS . l DOUBLE RS

.2

Veja tambm TEXT, IDATA, UDATA_OVR, UDATA_SHR, EXTERN, GLOBAL UDATA_OVR - Declara o incio de uma seo de dados sobrecarregados ____________________________________________________________________________ Sintaxe [<nome>] UDATA_OVR [<RAM endereo>]

Conectando o PIC16F877A - Recursos Avanados

450
Descrio Usado com objetos. Declara o incio de uma seo de dados no inicializados. Se o argumento <nome> no for especificado, a seo ser chamada de UDATAJDVR. O endereo inicial para os dados definido por <ram endereo, ou ser adotado o valor zero caso este argumento no seja especificado. O espao declarado nesta seo pode ser sobrecarregado por outras sees deste tipo que possuam o mesmo nome, Isto ideal para declarar variveis temporrias que devem ocupar o mesmo espao na memria. Nenhum cdigo ser gerado nesta seo. A diretriz RS deve ser usada para reservar espao para os dados. Exemplo TEMPS UDATA_OVR TEMP1 RS . l TEMP2 RS . l TEMP2 RS . l TEMPS UDATA_OVR LONGTEMP1 RS .2 LONGTEMP2 RS .2 Veja tambm TEXT, IDATA, UDATA, EXTERN, GLOBAL, UDATA_SHR UDATA_SHR - Declara o incio de uma seo de dados compartilhados ____________________________________________________________________________ Sintaxe [<nome>] UDATA_SHR Descrio Usado com objetos. Declara o incio de uma seo de dados compartilhados e no inicializados. Se o argumento <nome> no for especificado, a seo ser chamada de UDATA_SHR. O endereo inicial para os dados definido por <ram endereo, ou ser adotado o valor zero caso este argumento no seja especificado. Os dados declarados nesta seo podem ser acessados de qualquer banco da RAM. Isto ideal para declarar variveis que so utilizadas em rotinas que trabalham com mais de um banco. Nenhum cdigo ser gerado nesta seo. A diretriz RS deve ser usada para reservar espao para os dados. Exemplo TEMPS UDATA_SHR TEMP1 RS . l TEMP2 RS . l TEMP2 RS . l Veja tambm TEXT, IDATA, UDATA, EXTERN, GLOBAL, UDATA_SHR UNDEFINE - Elimina uma substituio de texto ____________________________________________________________________________ Sintaxe #UNDEFINE <nome> Descrio Elimina definio anteriormente criada pela diretriz tfDEFINE. Conectando o PIC16F877A - Recursos Avanados [<RAM endereo]

451
Exemplo #DEFINE LED PORTA,0 . . . #UNDEFINE LED Veja tambm IFDEF, IFNDEF,#DEFINE VARIABLE - Define uma varivel ____________________________________________________________________________ Sintaxe VARIABLE <nome> [= <expr> ,<nome> = <expr>] Descrio Define uma varivel para ser utilizada nas expresses que sero interpretadas pelo compilador. Esta diretriz, totalmente similar a diretriz SET, com a diferena de que a varivel no precisa ser inicializada no momento da sua definio. Como o prprio nome diz, o valor determinado por <expr> ser associado ao <nome>, podendo ser alterado no decorrer do programa. Exemplo VARIABLE I, CONTA = 5 . . I = 0 WHILE I < CONTA I += l ENDW Veja tambm SET, CONSTANT WHILE - Loop enquanto a expresso for verdadeira __________________________________________________________________________ Sintaxe WHILE<expr> . . . ENDW Descrio Enquanto o teste da <expr> resultar em verdadeiro, o bloco definido entre esta diretriz e a ENDW ser executado. Caso contrrio ele ser pulado. Lembre-se que o valor O (zero) ser considerado falso, enquanto qualquer outro nmero ser considerado verdadeiro. O bloco poder ter no mximo 100 linhas e poder ser repetido at 256 vezes. Exemplo VARIABLE I CONSTANT CONTA = 5 Conectando o PIC16F877A - Recursos Avanados

452

. 1 = 0 WHILE I < CONTA (bloco que ser repetido 5 vezes) I += l ENDW Veja tambm ENDW

Conectando o PIC16F877A - Recursos Avanados

453

Anotaes

______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________
Conectando o PIC16F877A - Recursos Avanados

454

Conectando o PIC

D
Instrues Especiais
A tabela abaixo mostra vrias instrues especiais aceitas pelo compilador para facilitar a digitao do programa. Estas instrues no fazem parte do set de instrues, pois na verdade o compilador ir substitu--las pelas instrues equivalentes. Entretanto, muitos programadores utilizam-se delas na hora de escrever seus programas e por isso bom conhec-las para possibilitar o entendimento e manuteno de sistemas escritos por terceiros. A tabela mostra ainda os bits de STATUS afetados pela operao.

Instruo ADDCF f,d

Descrio Se houve carry, incrementa o registrador f, guardando o resultado em d. Se houve digit carry, incrementa o registrador f, guardando o resultado em d. Pula (branch) para a posio definida por k. Pula (branch) para a posio definida por k, caso tenha ocorrido um carry. Pula (branch) para a posio definida por k, caso tenha ocorrido um digit carry. Pula (branch) para a posio definida por k, caso no tenha ocorrido um carry. Pula (branch) para a posio definida por k, caso no tenha ocorrido um digit carry. Pula (branch) para a posio definida por k, caso no tenha ocorrido um zero. Pula (branch) para a posio definida por k, caso tenha ocorrido um zero. Limpa o bit de carry. Limpa o bit de digit carry. Limpa o bit de zero. k Chamada de rotina (k) distante. Acerta o PCLATH (bits 3 e 4) automaticamente.

Instrues Equivalentes BTFSC INCF BTFSC INCF GOTO BTFSC GOTO BTFSC GOTO BTFSS GOTO BTFSS GOTO BTFSS GOTO BTFSC GOTO BCF BCF BCF BCF/BSF BCF/BSF CALL STATUS , C f,d STATUS, DC ,d k STATUS , C k STATUS, DC k STATUS, C k STATUS, DC k STATUS, Z k STATUS, Z k STATUS , C STATUS , DC STATUS , Z PCLATH, 3 PCLATH, 4 k

Status Z Z

ADDDCF f , d B BC BDC BNC BNDC BNZ BZ CLRC CLRDC CLRZ LCALL k k k k k k k

c DC Z

Conectando o PIC16F877A - Recursos Avanados

455
instruo LGOTO k MOVFW f NEGF SETC SETDC SETZ SKPC SKPDC SKPNC SKPNDC SKPNZ SKPZ SUBCF f,d f,d Descrio Desvio de programa (k) distante. Acerta o PCLATH (bits 3 e 4) automaticamente. Move o valor do registrador f para W. Acerta o valor do resultado negativo de uma conta. Seta o bit de carry. Seta o bit de digit carry. Seta o bit de zero. Pula a prxima linha se houve um carry. Pula a prxima linha se houve um digit carry. Pula a prxima linha se no houve um carry. Pula a prxima linha se no houve um digit carry. Pula a prxima linha se no houve um zero. Pula a prxima linha se houve um zero. Se houve carry, decrementa o registrador f, guardando o resultado em d. Se houve digit carry, decrementa o registrador f, guardando o resultado em d. Testa o registrador f para saber se zero. Instrues Equivalentes BCF/BSF BCF/BSF GOTO MOVF COMF INCF BSF BSF BSF BTFSS BTFSS BTFSC BTFSC BTFSC BTFSS BTFSC DECF BTFSC DECF MOVF PCLATH, 3 PCLATH, 4 k f,W f,F f,d STATUS,C STATUS, DC STATUS , Z STATUS, C STATUS , DC STATUS, C STATUS , DC STATUS , Z STATUS, Z STATUS, C f,d STATUS , DC f,d f,F z z z Z Z C DC Z Status

SUBDCF f , d TSTF f

Conectando o PIC16F877A - Recursos Avanados

456

Conectando o PIC

E
Operadores do Compilador
Operado Descrio r Nmero da atual linha de programa (PC). $ ( Abertura de parentesis. ) ! high low upper * / % + << << >= > < <= == != & | && II Fechamento de parentesis. NO lgico. Negativo. Complemento. Byte alto de um smbolo de dois bytes. Byte baixo de um smbolo de dois bytes. Byte superior de um smbolo de trs bytes. Multiplicao. Diviso. Resto da diviso. Soma. Subtrao. Rotao para a esquerda. Rotao para a direita. Maior ou igual. ^Maior que. Menor que. Menor ou igual. Igual a. Diferente de (NO igual). Operao E (AND) bit a bit. Operao OU exclusivo (XOR) bit a bit. Operao OU inclusive (IOR) bit a bit. E lgico (AND). OU lgico (OR). Exemplo GOTO $ + 3 1 + (R * 4) (COMPR + 1) * 256 IF ! (A - B) -1 * COMPR FLAGS = -FLAGS MOVLW high CTR_TABELA MOVLW low CTR_TABELA MOVLW upper CTR_TABELA A = B * C A = B / C COMPR = TOTAL % 16 TOTAL = VALOR * 8 + 1 TOTAL = VALOR - 10 VALOR = FLAGS << 1 VALOR = FLAGS >> 2 IF NDICE > NUM IF NDICE > NUM IF NDICE < NUM IF NDICE <= NUM IF NDICE == NUM IF NDICE != NUM FLAGS = FLAGS & MASCARA FLAGS = FLAGS MASCARA FLAGS = FLAGS | MASCARA IF (COMPR == 10) && (A > B) IF (COMPR == 10) | | (A ! = B)

Conectando o PIC16F877A - Recursos Avanados

457
Operador = += -= *_ /= %= <<= >>= &= |= = ++ -Varivel = valor. Varivel = ela mesma + valor. Varivel = ela mesma - valor. Varivel = ela mesma * valor. Varivel = ela mesma / valor. Varivel = resto da diviso dela mesma pelo valor. Varivel = ela mesma relacionada Varivel = ela mesma rotacionada direita. Varivel = ela mesma AND valor Varivel = ela mesma IOR valor Varivel = ela mesma XOR valor Varivel = ela mesma + 1 (incremento) Varivel = ela mesma - 1 (decremento) Descrio NDICE = 0 NDICE + = 1 NDICE -= 1 NDICE *= TOTAL NDICE /= TOTAL NDICE %= 16 NDICE <<= 3 NDICE >>= 2 NDICE &= MASCARA NDICE | = MASCARA NDICE = MASCARA NDICE ++ NDICE -Exemplo

Conectando o PIC16F877A - Recursos Avanados

458

Conectando o PIC

F
Esquema Eltrico da Placa Proposta (McLab2)
Sugerimos aqui um hardware para a realizao dos treinamentos e projetos presentes neste livro. Com o esquema eltrico apresentado nas prximas pginas, ser possvel a montagem de uma placa capaz de realizar todas as experincias deste livro e muitos outros experimentos com o PIC 16F877A (ou qualquer outro de 40 pinos). Sua placa possuir ento os seguintes recursos: Soquete para montagem do PIC de 40 pinos; 4 displays de 7 segmentos com controle por varredura; Display de cristal lquido (LCD) com 2 linhas e 16 colunas; 4 teclas e 4 Leds para entradas e sadas; Buzzer e jumpers; Memria E PROM serial externa do tipo 24C04 (ou outra similar); Comunicao RS-232; Conector para gravao In-Cricuit, Sensor de temperatura; Aquecedor via resistor de potncia; Miniventilador para resfriamento da resistncia ou experincias com sensor ptico; Sensor (transmissor e receptor) ptico do tipo infravermelho; Conector de expanso. Informamos que para facilitar ainda mais a sua vida, este esquema o mesmo de um produto denominado McLab2 (Mosaico), que pode ser facilmente encontrado no mercado, evitando que voc seja obrigado a montar o hardware proposto para poder executar todos os exerccios apresentados neste livro.
2

Conectando o PIC16F877A - Recursos Avanados

459

Conectando o PIC16F877A - Recursos Avanados

460

Conectando o PIC16F877A - Recursos Avanados

461

Anotaes

______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________

Conectando o PIC16F877A - Recursos Avanados

462
ndice Remissivo
/PD, 274 /To, 274 CKE, 207, 220 Clear, 41 Clock, 205 externo, 26 interno, 25 Compare, 34,151 Conversor analgico, 117 CREN, 255 Cristal,276 CS,50

A
A/D, 34, 117, 137 Acknowledge, 209 ACON0.125 ADCON1,47,50,125 ADDEN, 255 ADIE, 125 ADIF,37,125 ADON, 125 ADRESH,125

D
D/A, 220 DC161,159 Destino, 41 Dufy cyc/e, 156,282

B
BANKSEL.31 Baud Rate, 247, 255 BCLIE, 37 BF, 206, 220 Bit, 41 BRGH.255 Bronw-out, 274 Brown-out Reset, 275 Buzzer,58

E
E PROM, 27,33,175 EEADR.180 EEADRH, 180 EECON, 180 EEDATH, 180 EEIE, 37 EEIF, 180 EEPGD.33,180 Escravo, 202
2

C
CAD.117 CALL, 28, 29 Capture, 34,151,152 CCP, 34 CCP1CON.154 CCP11E.36 CCP2IE'37 CCPR1L, 159 CGRAM, 99

F
FERR, 255 File, 41 FLASH, 27,175,178

Conectando o PIC16F877A - Recursos Avanados

463
FSR, 31 Fu//Dup/ex,247

p
P, 220 Paralela, 271 Paridade, 249 PCF, 50 PCFGO, 47 PCFG1.47 PCFG2, 47 PCFG3,47 PEIE, 125,153,207, 255 PIE1.36,125 Pilha, 29 Pipeline, 27 PIR1.125.220 PQR, 274 PORTA, 23, 39, 45, 47 PORTB, 23, 39 PORTC, 23,39,48,153 PORTD, 24, 39 PORTE, 45 Postscale, 35, 54,158 Power-down Mode, 275 Prescaler, 35, 51,53,74,157 PSA, 52, 274 PSP, 34, 271 PSPMODE, 50 Pull-up, 47 PWM, 34,151,155,282 PWRT, 274

G
GIE,36,37,125,153,207 GO/DONE, 125 GOTO, 28

H
Ha/f Duptex, 249

|
PIC,,201,214 In-Circuit, 279 INDF,31 INTCON, 36,125,153,180, 207, 220, 2 Interrupes, 27

26, 255

L
Led 58 Literai 41

M
Mquina, 26 Master, 201,205,255 Memria de dados, 30 de programa, 27 MSSP, 34,201

R
R/W, 220 RAO, 47 RA1.47 RA2, 47 RA3, 47 RA4, 47 RA5, 47 RAM, 30

O
OERR.255 OPTION_REG, 47, 274 OPTION_REG<TOSE>:, 50 Oscilador, 276 Overow, 273

Conectando o PIC16F877A - Recursos Avanados

464
RB4, 34 RB5, 34 RB6, 34 RB7, 34 RC, 137 RC0, 48 RC1.48 RC2, 48 RC3, 48 RC4, 48 RC5, 48 RC6, 48 RC7, 48 RCIE, 36, 255 RCIF, 37 RCSTA, 255 RD.50,180 Registradoras especiais, 30 Reset, 55 Ressonador, 276 Re-Start, 209 RS-232, 282 RW,50 RX, 247 SSPIE, 36 SSPIF, 207 SSPMO, 220 SSPM1.207 SSPM2, 207 SSPOV, 220 SSPSTAT, 207, Start, 208 Start Bit, 248 STATUS, 274, 276 STATUS<IRP>, 31 STATUS<RP1:RP0>, 31 Stop, 208 Bit, 248

T
T0CKI, 50 T0CS, 47 T0IE, 52 T0IF, 36 T0SE, 52 Teste, 41 TMRO, 33, 50 TMR1.74 TMR1IE.37 TMR2IE Trigger, 46 TRISA.47,125 TRISC, 153 TRISE, 125 TX, 247 TX9D TXIE, 255 TXIF, 37, 255

S
Schmitt Trigger, 57 Set, 41 de instruo SFRs, 32 Skip, 41 Slave, 201,205,256 SLEEP, 153,159,254,274,275 SMP, 220 SPI, 34 SSPADD,220 SSPBUF, 206, 207, 220 SSPCON, 207, 220 SSPCON2, 220 SSPEN, 206

Conectando o PIC16F877A - Recursos Avanados

465
u USART, 282 V Vetor de Interrupo, 27 Vetor de Reset, 27 W Wake-up, 274 WCOL, 207, 220 WDT, 273 Work, 41 WR, 180 WREN, 180 WRERR, 180 Z Zero, 41

Conectando o PIC16F877A - Recursos Avanados

466
Referncias Bibliogrficas

SOUZA. D. J. Desbravando o PIC. So Paulo: rica, 2000. MICROCHIP Technology. DataSheet PIC16F877A. USA, 2001. _____. MPASM Assembler User's Guide. USA, 2001. _____. MPLAB User's Guide V6.22. USA, 2003. _____. Home page (Internet) e Technical Library (CD-ROM). USA, 2003. _____. Product Line Card. Catlogo.USA, 2003.

Conectando o PIC16F877A - Recursos Avanados

467
Marcas Registradas

Os nomes PIC, PICmicro, Microchip, In-Circuit Serial Programming, MpLab e MPASM so propriedades da Microchip Technology Inc. nos Estados Unidos e em outros pases. Todos os demais nomes registrados, marcas registradas, ou direitos de uso citados neste livro, pertencem aos respectivos proprietrios.

Conectando o PIC16F877A - Recursos Avanados

468

OUTROS LIVROS DA REA

( ......................

Microcontroladores

Conectando o PIC16F877A - Recursos Avanados

469

OUTROS LIVROS DA REA

( ......................

Microcontroladores

Conectando o PIC16F877A - Recursos Avanados

470

www.editoraerica.com.br

Conectando o PIC16F877A - Recursos Avanados

You might also like