Conectando o Pic PIC16F877A
Conectando o Pic PIC16F877A
Conectando o Pic PIC16F877A
Conectando o
PIC16F877A
Recursos Avanados
EDITORA AFILIADA
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
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
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: [email protected] 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: [email protected] 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: [email protected] Home page: www.future-active.com.br
6
Hitech Revendedor autorizado. Rua Branco de Moraes, 489 - So Paulo - SP Tel: (11) 5188-4000 Fax: (11) 5188-4191 E-mail: [email protected] 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
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
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.
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.
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
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.
15
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.
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>
17
Anotaes
__________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________
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
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/
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
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
I/O
TTL
33 34 35 36 37 38 39
RB7/PGD
40
I/O TT17ST(2)
15 16 17 18 23
ST ST ST ST ST
21
Nome do Pino RC5/SDO RC6/TX/CK Nm. Pino 24 25
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
19 20 21 22 27 28 29 30
(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).
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.
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
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:
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.
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.
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.
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.
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
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>.
29
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:
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.
31
Esta interrupo pode ser configurada para a borda de subida ou para a borda de descida.
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.
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
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.
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
Osciladores Sistemas de Resets (POR, PWRT e BOR) Watchdog Timer (WDT) SLEEP Code Protection Gravao In-circuit
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..............................
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,
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".
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.
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
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.
42
Conectando o PIC
1 PORT de 6 l/Os (PORTA); 3 PORTs de 8 l/Os (PORTB, PORTC e PORTD); 1 PORT de 3 l/Os (PORTE).
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.
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.
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.
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>.
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.
No usado para essa finalidade. Para obter mais informaes, consulte apndice A
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>
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
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.
No usado para essa finalidade. Para obter mais informaes, consulte pndice A
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
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.
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.
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>.
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>:
T2CKPS0 0 1 0 1
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.
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
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.
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).
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
57
58
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.
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.
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
;************************************** ;* 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
; LIMPA FLAG DA INTERRUPO ; BUZZER LIGADO? ; NO - ENTO LIGA ; SIM ; DESLIGA O BUZZER ; SAI DA INTERRUPO
BUZZER SAI_INT
;************************************** ;* 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
; ***************** 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
; 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
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
; 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
; 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
; 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
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
63
SWAPF MOVWF SWAPF SWAPF RETFIE STATUS_TEMP,W STATUS W_TEMP,F W_TEMP,W
;************************************** ;* 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
; CONFIGURA OPTIONS ; PULL-UPs DESABILITADOS ; INTER. NA BORDA DE SUBIDA DO RB0 ; TIMER0 INCREM. PELO CICLO DE MQUINA ; WDT - 1:128 ; TIMER - 1:1
64
MOVLW B'00000000' MOVWF PIE1 MOVLW B'00000111' MOVWF ADCON1 BANK0 MOVLW B'00001111' MOVWF T2CON ; ; ; ;
; CONFIGURA CONVERSOR A/D ; CONFIGURA PORTA E PORTE COMO I/O DIGITAL ; 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 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
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
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.
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
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.
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
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
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:
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.
71
Esquema eltrico
72
73
74
75
76
;************************************** ;* ;* ;* ;* ;* ;************************************** ; * VERSO : 2.0 ;* DATA : 24/02/2003 ;************************************** * * CONECTANDO O PIC - RECURSOS AVANADOS EXEMPLO 2 * NICOLS CSAR LAVINIA e DAVID JOS DE SOUZA * * * *
;************************************** ; 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
77
CBLOCK 0X20 ; POSIO INICIAL DA RAM
; (LSD)
FILTRO_BOTOES
TEMPO_TURBO
INDICE_VARRE_DISPLAY
DIVISOR_TMR1
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
; REGISTRADOR DE STATUS TEMPORRIO ; REGISTRADOR DE TRABALHO TEMPORRIO ; REG. DE ENDERECO INDIRETO TEMPORRIO ; REGISTRADOR DE PAGINAO TEMPORRIO
;************************************** ; 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.
78
#INCLUDE <P16F877A.INC>
;************************************** ; OS PSEUDOS-COMANDOS "BANK0" E "BANK1", AQUI DEFINIDOS, AJUDAM A COMUTAR ; ENTRE OS BANCOS DE MEMRIA.
STATUS,RP0 STATUS,RP0
FILTRO_TECLA TURBO_TECLA
EQU EQU
.200 .70
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)
;************************************** ;* ENTRADAS *
79
;************************************** ; AS ENTRADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE.
#DEFINE BT_UP
PORTB,1
#DEFINE BT_DOWN
PORTB,2
;************************************** ;* SADAS *
;************************************** ; AS SADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE.
; LED DE ESTADO DO TIMER ; (FUNCIONA TAMBM COMO FLAG) ; 1 -> TIMER CONTANDO ; 0 -> TIMER PARADO
#DEFINE MUX
PORTB
#DEFINE SEGMENTOS
PORTD
;**************************************
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
ORG
0X0004
; 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 PCLATH_TEMP
CLRF
PCLATH
CLRF
STATUS
;**************************************
81
; TESTA O FLAG DAS INTERRUPES PARA SABER PARA QUAL ROTINA DESVIAR.
BTFSS GOTO
INTCON,T0IF INT_TMR1
;************************************** ; 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.
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)
CLRF
SEGMENTOS
MOVF CALL
INDICE_VARRE_DISPLAY,W TABELA_MUX
82
IORWF MUX,F ; ATUALIZA MUX, SELECIONANDO O ; DISPLAYS CORRETO PARA O MOMENTO
GOTO
$+1
MOVF CALL
INDF,W
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
;************************************** ; 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.
83
MOVLW .2 MOVWF DIVISOR_TMR1 ; RECARREGA CONTADOR DE 1SEG.
CALL
DECREMENTA_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
;************************************** ; ANTES DE SAIR DA INTERRUPO, O CONTEXTO SALVO NO INCIO DEVE SER ; RECUPERADO PARA QUE O PROGRAMA NO SOFRA ALTERAES INDESEJADAS.
MOVWF FSR
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
;************************************** ; 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
;**************************************
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 UTILIZADA PARA INCREMENTAR O VALOR DOS REGISTRADORES UNIDADE, ; DEZENA, CENTENA E MILHAR, QUE SO OS CONTADORES DO TIMER. A CONTAGEM ; FEITA DIRETAMENTE EM BCD.
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
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 UTILIZADA PARA DECREMENTAR O VALOR DOS REGISTRADORES UNIDADE, ; DEZENA, CENTENA E MILHAR, QUE SO OS CONTADORES DO TIMER. A CONTAGEM ; FEITA DIRETAMENTE EM BCD.
MOVLW 0XFF XORWF UNIDADE,W BTFSS RETURN STATUS,Z ; UNIDADE = 0XFF ? ; NO - RETORNA ; SIM MOVLW .9 MOVWF UNIDADE ; CARREGA UNIDADE COM 9
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
;************************************** ; 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.
88
CONFIG CLRF CLRF CLRF CLRF CLRF PORTA PORTB PORTC PORTD PORTE ; GARANTE TODAS AS SADAS EM ZERO
BANK1
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
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
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 $
;************************************** ; 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
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.
BCF
ESTADO_TIMER
;************************************** ; A ROTINA PRINCIPAL FICA CHECANDO O ESTADO DOS BOTES. CASO ALGUM SEJA ; PRESSIONADO, A ROTINA DE TRATAMENTO DO BOTO CHAMADA.
BSF
INTCON,GIE
BTFSS GOTO
BT_UP TRATA_BT_UP
BTFSS GOTO
BT_DOWN TRATA_BT_DOWN
91
BTFSS GOTO
BT_START_STOP
; 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
;**************************************
TRATA_BT_UP BTFSC GOTO ESTADO_TIMER VARRE ; TIMER EST PARADO ? ; NO - VOLTA P/ VARRE ; SIM
MOVLW TURBO_TECLA
92
MOVWF TEMPO_TURBO ; RECARREGA TEMPORIZADOR DO TURBO ; DAS TECLAS
CALL
INCREMENTA_TIMER
GOTO
VARRE
TRATA_BT_DOWN BTFSC GOTO ESTADO_TIMER VARRE ; TIMER EST PARADO ? ; NO - VOLTA P/ VARRE ; SIM
CALL
DECREMENTA_TIMER
GOTO
VARRE
TRATA_BT_START_STOP MOVF BTFSC FILTRO_BOTOES,F STATUS,Z ; FILTRO J IGUAL A ZERO ? ; (FUNO J FOI EXECUTADA?)
93
GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO ; NO
BTFSS GOTO
ESTADO_TIMER LIGA_TIMER
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
94
MOVLW TMR1_HIGH MOVWF TMR1H MOVLW TMR1_LOW MOVWF TMR1L ; INICIALIZA CONTADORES
BSF
T1CON,TMR1ON
GOTO
VARRE
;**************************************
END
; FIM DO PROGRAMA
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.
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.
Neste LCD possumos 16 pinos para ligao do mesmo ao nosso projeto. A tabela seguinte identifica cada um desses pinos:
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
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.
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.
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
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.
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
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.
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.
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 -
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
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
102
Este comando possui 3 bits para a configurao da visualizao dos caracteres e do cursor:
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 -
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:
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.
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)
105
106
107
108
109
110
;************************************** ;* ;* ;* ;* ;* ;************************************** ; * VERSO : 2.0 ;* DATA : 24/02/2003 ;************************************** * * CONECTANDO O PIC - RECURSOS AVANADOS EXEMPLO 3 * NICOLS CSAR LAVINIA e DAVID JOS DE SOUZA * * * *
;************************************** ; 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
CBLOCK 0X20
111
TEMPO1 TEMPO0 ; CONTADORES P/ DELAY
FILTRO_BOTOES
FLAG
ENDC
;************************************** ; 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
;************************************** ; OS PSEUDOS-COMANDOS "BANK0" E "BANK1", AQUI DEFINIDOS, AJUDAM A COMUTAR ; ENTRE OS BANCOS DE MEMRIA.
STATUS,RP0 STATUS,RP0
FILTRO_TECLA
EQU
.200
;**************************************
112
;* DECLARAO DOS FLAGs DE SOFTWARE *
; 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
#DEFINE BOTAO_1
PORTB,1
#DEFINE BOTAO_2
PORTB,2
#DEFINE BOTAO_3
PORTB,3
;************************************** ;* SADAS *
113
; FUTURAS ALTERAES DO HARDWARE.
#DEFINE DISPLAY
PORTD
#DEFINE RS
PORTE,0
#DEFINE ENABLE
PORTE,1
ORG GOTO
0X0000 CONFIG
; ENDEREO DO VETOR DE RESET ; PULA PARA CONFIG DEVIDO A REGIO ; DESTINADA AS ROTINAS SEGUINTES
;************************************** ; 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)
; LIMPA WDT (PERDE TEMPO) ; FIM DE TEMPO0 ? ; NO - VOLTA 2 INSTRUES ; SIM - PASSOU-SE 1MS
114
DECFSZ TEMPO1,F GOTO $-6 ; FIM DE TEMPO1 ? ; NO - VOLTA 6 INSTRUES ; SIM RETURN ; RETORNA
;************************************** ; 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 ;. ;.
;************************************** ; 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
BCF
RS
MOVLW 0X01
115
CALL ESCREVE ; LIMPAR A TELA
; COMANDOS PARA ESCREVER AS ; LETRAS DE "MOSAICO ENG." MOVLW 'M' CALL ESCREVE
116
BCF RS ; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 0 ; SELECIONA O DISPLAY P/ DADOS
; COMANDOS PARA ESCREVER AS ; LETRAS DE "CURSO MODULO 2" MOVLW 'C' CALL ESCREVE
117
RETURN
;************************************** ; 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
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'00000111' MOVWF ADCON1 ; CONFIGURA CONVERSOR A/D ; CONFIGURA PORTA E PORTE COM I/O DIGITAL
BANK0
; 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 $
;************************************** ; 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
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.
BSF
TELA_PRINCIPAL
;************************************** ; ESTA ROTINA INICIALIZA O DISPLAY P/ COMUNICAO DE 8 VIAS, DISPLAY PARA 2 ; LINHAS, CURSOR APAGADO E DESLOCAMENTO DO CURSOR DIREITA.
MOVLW B'00000001'
120
CALL ESCREVE ; LIMPAR TODO O DISPLAY
BSF
RS
;************************************** ; A ROTINA PRINCIPAL FICA CHECANDO O ESTADO DOS BOTES. CASO ALGUM SEJA ; PRESSIONADO, A ROTINA DE TRATAMENTO DO BOTO CHAMADA.
BTFSS GOTO
BOTAO_0 TRATA_BOTAO_0
BTFSS GOTO
BOTAO_1 TRATA_BOTAO_1
BTFSS GOTO
BOTAO_2 TRATA_BOTAO_2
121
BTFSS GOTO BOTAO_3 TRATA_BOTAO_3 ; O BOTO 3 EST PRESSIONADO ? ; SIM - PULA P/ TRATA_BOTAO_3 ; NO
; CARREGA NO WORK O VALOR DE FILTRO_TECLA ; SALVA EM FILTRO_BOTOES ; RECARREGA FILTRO P/ EVITAR RUIDOS
BTFSS GOTO
TELA_PRINCIPAL VARRE
CALL GOTO
;**************************************
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
BCF
RS
MOVLW 0X01
122
CALL ESCREVE ; COMANDO P/ LIMPAR A TELA
; COMANDOS PARA ESCREVER AS ; LETRAS DE "TECLA 0" MOVLW 'T' CALL ESCREVE
BSF
TELA_PRINCIPAL
GOTO
VARRE
TRATA_BOTAO_1 MOVF BTFSC FILTRO_BOTOES,F STATUS,Z ; FILTRO J IGUAL A ZERO ? ; (FUNO J FOI EXECUTADA?)
123
GOTO VARRE ; SIM - VOLTA P/ VARREDURA DO TECLADO ; NO
BCF
RS
; COMANDOS PARA ESCREVER AS ; LETRAS DE "TECLA 1" MOVLW 'T' CALL ESCREVE
124
BSF
TELA_PRINCIPAL
GOTO
VARRE
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
BCF
RS
; COMANDOS PARA ESCREVER AS ; LETRAS DE "TECLA 2" MOVLW 'T' CALL ESCREVE
MOVLW 'E'
125
CALL ESCREVE
BSF
TELA_PRINCIPAL
GOTO
VARRE
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
BCF
RS
MOVLW .1
126
CALL DELAY_MS ; DELAY DE 1MS
; COMANDOS PARA ESCREVER AS ; LETRAS DE "TECLA 3" MOVLW 'T' CALL ESCREVE
BSF
TELA_PRINCIPAL
GOTO
VARRE
;**************************************
END
; FIM DO PROGRAMA
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.
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:
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).
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-
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
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)
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:
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
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.
ADCS1 0 0 1 1
ADCS0 0 1 0 1
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:
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.
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
Esquema eltrico
138
139
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
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
;************************************** ;* 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
142
; SIM - PASSOU-SE 1MS ; FIM DE TEMPO1 ? ; NO - VOLTA 6 INSTRUES ; SIM ; 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 NOP BSF GOTO BCF
; ATUALIZA DISPLAY (PORTD) ; PERDE 1US PARA ESTABILIZAO ; ENVIA UM PULSO DE ENABLE AO DISPLAY ;. ;.
;************************************** ;* 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
; UNIDADE = 10d ? ; NO ; SIM ; RESETA UNIDADE ; INCREMENTA DEZENA ; FIM DA CONVERSO ? ; NO - VOLTA P/ CONTINUAR CONVERSO ; SIM
;************************************** ;* 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
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
;************************************** ;* 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
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
; CONFIGURA OPTIONS ; PULL-UPs DESABILITADOS ; INTER. NA BORDA DE SUBIDA DO RB0 ; TIMER0 INCREM. PELO CICLO DE MQUINA ; WDT - 1:8 ; TIMER - 1:1
; 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
; 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
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
;************************************** ;* 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
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
; 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
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
* ; FIM DO PROGRAMA
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).
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.
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:
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:
152
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:
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
154 Fluxograma
155
156
;************************************** ;* ;* ;* ;* ;* ;************************************** ; * VERSO : 2.0 ;* DATA : 24/02/2003 ;************************************** * * CONECTANDO O PIC - RECURSOS AVANADOS EXEMPLO 5 * NICOLS CSAR LAVINIA e DAVID JOS DE SOUZA * * * *
;************************************** ; 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
CBLOCK 0X20
157
FILTRO_BOTOES
CONTADOR_AD
AUX
ENDC
;************************************** ; 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
;************************************** ; OS PSEUDOS-COMANDOS "BANK0" E "BANK1", AQUI DEFINIDOS, AJUDAM A COMUTAR ; ENTRE OS BANCOS DE MEMRIA.
STATUS,RP0 STATUS,RP0
FILTRO_TECLA
EQU
.200
;**************************************
158
;* DECLARAO DOS FLAGs DE SOFTWARE *
;************************************** ;* 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
#DEFINE RS
PORTE,0
#DEFINE ENABLE
PORTE,1
159
;************************************** ;* VETOR DE RESET DO MICROCONTROLADOR *
ORG GOTO
0X000 CONFIG
; ENDEREO DO VETOR DE RESET ; PULA PARA CONFIG DEVIDO A REGIO ; DESTINADA AS ROTINAS SEGUINTES
;************************************** ; 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)
; LIMPA WDT (PERDE TEMPO) ; FIM DE TEMPO0 ? ; NO - VOLTA 2 INSTRUES ; SIM - PASSOU-SE 1MS
RETURN
; RETORNA
;************************************** ; 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.
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 ;. ;.
;************************************** ; 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
161
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'00000111' MOVWF ADCON1 ; CONFIGURA CONVERSOR A/D ; CONFIGURA PORTA COM I/O DIGITAL
BANK0
; 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 $
;**************************************
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.
;************************************** ; ESTA ROTINA INICIALIZA O DISPLAY P/ COMUNICAO DE 8 VIAS, DISPLAY PARA 2 ; LINHAS, CURSOR APAGADO E DESLOCAMENTO DO CURSOR DIREITA.
MOVLW 0X30
163
CALL ESCREVE ; INICIALIZAO
;************************************** ; ESTA ROTINA ESCREVE A TELA PRINCIPAL DO PROGRAMA, COM AS FRASES: ; LINHA 1 - "A/D por RC (P2)" ; LINHA 2 - "T.CARGA: x50us"
BSF
RS
; SELECIONA O DISPLAY P/ DADOS ; COMANDOS PARA ESCREVER AS ; LETRAS DE "A/D por RC (P2)"
MOVLW 'D'
164
CALL ESCREVE
BCF
RS
BSF
RS
165
; LETRAS DE "T.CARGA: x50us" MOVLW 'T' CALL ESCREVE
;**************************************
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.
CLRF
CONTADOR_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
;************************************** ; 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).
167
LOOP_CAD NOP ; [1us]
; INCREM. CONTADOR E VERIFICA ESTOURO ; NO HOUVE ESTOURO - PULA 1 INSTRUO ; HOUVE ESTOURO - PULA P/ SATURAO
;************************************** ; 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).
MOSTRA_CONTADOR MOVLW 0XC9 CALL ESCREVE ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 9
BSF
RS
SWAPF CONTADOR_AD,W
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
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
;**************************************
END
; FIM DO PROGRAMA
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.
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.
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:
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
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.
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
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
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:
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.
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.
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.
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>:
Os PWMs no funcionam em modo SLEEP nem geram interrupes; porm, no se esquea de que a interrupo de Timer2 pode continuar acontecendo.
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
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
A fim de deixarmos nosso sistema mais interativo, utilizamos o LCD para mostrar o valor atua' ajustado para o PWM.
180
181
182
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
CBLOCK 0X20
FILTRO_BOTOES
184
ENDC
;************************************** ; 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
;************************************** ; OS PSEUDOS-COMANDOS "BANK0" E "BANK1", AQUI DEFINIDOS, AJUDAM A COMUTAR ; ENTRE OS BANCOS DE MEMRIA.
BSF BCF
STATUS,RP0 STATUS,RP0
FILTRO_TECLA
EQU
.200
185
;************************************** ;* ENTRADAS *
;************************************** ; AS ENTRADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE.
#DEFINE BOTAO_0
PORTB,0
#DEFINE BOTAO_1
PORTB,1
#DEFINE BOTAO_2
PORTB,2
#DEFINE BOTAO_3
PORTB,3
;************************************** ;* SADAS *
;************************************** ; AS SADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE.
#DEFINE DISPLAY
PORTD
#DEFINE RS
PORTE,0
186
; 0 -> COMANDO
#DEFINE ENABLE
PORTE,1
#DEFINE VENTILADOR
PORTC,1
ORG GOTO
0X0000 CONFIG
; ENDEREO DO VETOR DE RESET ; PULA PARA CONFIG DEVIDO A REGIO ; DESTINADA AS ROTINAS SEGUINTES
;************************************** ; 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)
; LIMPA WDT (PERDE TEMPO) ; FIM DE TEMPO0 ? ; NO - VOLTA 2 INSTRUES ; SIM - PASSOU-SE 1MS
187
; SIM RETURN ; RETORNA
;************************************** ; 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 ;. ;.
;************************************** ; 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
188
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'00000111' MOVWF ADCON1 ; CONFIGURA CONVERSOR A/D ; CONFIGURA PORTA E PORTE COMO I/O DIGITAL
189
; T=((255)+1)*4*250ns*16 ; T=4,096ms -> 244,14Hz
BANK0
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
; 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 $
;************************************** ; 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
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.
;************************************** ; ESTA ROTINA INICIALIZA O DISPLAY P/ COMUNICAO DE 8 VIAS, DISPLAY PARA 2 ; LINHAS, CURSOR APAGADO E DESLOCAMENTO DO CURSOR DIREITA.
191
;************************************** ; 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
192
CALL ESCREVE
BCF
RS
; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 3 ; SELECIONA O DISPLAY P/ DADOS
; COMANDOS PARA ESCREVER AS ; LETRAS DE " PWM: OFF " MOVLW 'P' CALL ESCREVE
193
MOVLW ' ' CALL ESCREVE
;************************************** ; ESTA ROTINA VERIFICA SE ALGUM BOTO EST PRESSIONADO E CASO AFIRMATIVO ; DESVIA PARA O TRATAMENTO DO MESMO.
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
BTFSS GOTO
BOTAO_2 TRATA_BOTAO_2
BTFSS GOTO
BOTAO_3 TRATA_BOTAO_3
194
; NO
; CARREGA O VALOR DE FILTRO_TECLA ; SALVA EM FILTRO_BOTOES ; RECARREGA FILTRO P/ EVITAR RUIDOS ; NOS BOTES
GOTO
VARRE
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
; 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
195
BCF
RS
; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 8 ; SELECIONA O DISPLAY P/ DADOS
; COMANDOS PARA ESCREVER AS ; LETRAS DE " OFF" MOVLW ' ' CALL ESCREVE
GOTO
VARRE
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
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
; COMANDOS PARA ESCREVER AS ; LETRAS DE " 50%" MOVLW ' ' CALL ESCREVE
GOTO
VARRE
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
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
; COMANDOS PARA ESCREVER AS ; LETRAS DE "75%" MOVLW ' ' CALL ESCREVE
GOTO
VARRE
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
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
GOTO
VARRE
;**************************************
END
; FIM DO PROGRAMA
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.
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.
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:
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
Ateno especial aos bancos onde se encontram os registradores: Registrador Banco /Endereo EECON1 EECON2 3/18Ch 3/18Dh
202
Registrador EEDATA EEDATH EEADR EEADRH Banco / Endereo 2/10CH 2/10Eh 2/10Dh 2/10Fh
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.
2.
3.
4.
5.
6.
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.
2.
3. 4.
5.
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.
206
207
208
209
210
211
212
;************************************** ;* ;* ;* ;* ;* ;************************************** ; * VERSO : 2.0 ;* DATA : 24/02/2003 ;************************************** * * CONECTANDO O PIC - RECURSOS AVANADOS EXEMPLO 7 * NICOLS CSAR LAVINIA e DAVID JOS DE SOUZA * * * *
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
CBLOCK 0X20
FILTRO_BOTOES TEMPO_TURBO
FLAG
VALOR_DADOS
VALOR_PROG_HIGH VALOR_PROG_LOW
AUX
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
;************************************** ; 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
;************************************** ; OS PSEUDOS-COMANDOS "BANK0" E "BANK1", AQUI DEFINIDOS, AJUDAM A COMUTAR ; ENTRE OS BANCOS DE MEMRIA.
215
BSF BCF
STATUS,RP0 STATUS,RP0
FILTRO_TECLA
EQU
.200
TURBO_TECLA
EQU
.60
END_MEM_DADO EQU
0X10
END_MEM_PROG_H END_MEM_PROG_L
EQU EQU
0X08 0X00
#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.
216
#DEFINE BOTAO_0 PORTB,0 ; ESTADO DO BOTO 0 ; 1 -> LIBERADO ; 0 -> PRESSIONADO
#DEFINE BOTAO_1
PORTB,1
#DEFINE BOTAO_2
PORTB,2
#DEFINE BOTAO_3
PORTB,3
;************************************** ;* SADAS *
;************************************** ; AS SADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE.
#DEFINE DISPLAY
PORTD
#DEFINE RS
PORTE,0
#DEFINE ENABLE
PORTE,1
217
ORG GOTO
0X0000 CONFIG
; ENDEREO DO VETOR DE RESET ; PULA PARA CONFIG DEVIDO A REGIO ; DESTINADA AS ROTINAS SEGUINTES
;************************************** ; 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)
; LIMPA WDT (PERDE TEMPO) ; FIM DE TEMPO0 ? ; NO - VOLTA 2 INSTRUES ; SIM - PASSOU-SE 1MS
RETURN
; RETORNA
;************************************** ; 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
218
GOTO BCF $+1 ENABLE ;. ;.
;************************************** ; 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
; COMANDOS PARA ESCREVER AS ; LETRAS DE "M.DADOS M.PROG." MOVLW 'M' CALL ESCREVE
219
MOVLW ' ' CALL ESCREVE
RETURN
; RETORNA
;************************************** ; 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
BSF
RS
MOVLW '>'
220
BTFSC TIPO_MEMORIA ; EST UTILIZANDO A MEMRIA DE DADOS ? ; NO - ESCREVE ESPAO EM BRANCO ; SIM - ESCREVE ">" NO DISPLAY
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
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
221
MOVLW '<' BTFSC TIPO_MEMORIA ; EST UTILIZANDO A MEMRIA DE DADOS ? ; NO - ESCREVE ESPAO EM BRANCO ; SIM - ESCREVE "<" NO DISPLAY
MOVLW '>' BTFSS TIPO_MEMORIA ; EST UTILIZANDO A MEMRIA DE PROGRAMA? ; NO - ESCREVE ESPAO EM BRANCO ; SIM - ESCREVE ">" NO DISPLAY
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
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
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
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
223
; (CONVERSO ASCII) CALL ESCREVE ; ENVIA CARACTER AO DISPLAY LCD
MOVLW '<' BTFSS TIPO_MEMORIA ; EST UTILIZANDO A MEMRIA DE PROGRAMA? ; NO - ESCREVE ESPAO EM BRANCO ; SIM - ESCREVE "<" NO DISPLAY
RETURN
;************************************** ; 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
; 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)
ENDERECO_LOW
ENDERECO_LOW,W
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
EECON1
EECON1,EEPGD EECON1,WREN
MOVLW 0X55 MOVWF EECON2 MOVLW 0XAA MOVWF EECON2 BSF EECON1,WR ; ESCREVE 0XAA EM EECON2 (OBRIGATRIO) ; INICIA ESCRITA ; ESCREVE 0X55 EM EECON2 (OBRIGATRIO)
BCF
EECON1,WREN
;************************************** ; 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.
225
DATA_EEPROM_READ MOVF DESTINO ENDERECO_LOW,W ; CARREGA NO WORK O ENDEREO DE
EEADR
; 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)
EECON1
EECON1,EEPGD EECON1,RD
EEDATA
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)
RETURN
; RETORNA
;************************************** ; 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.
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.
EEADRH
ENDERECO_LOW,W
; 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)
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
227
EECON1
EECON1,EEPGD EECON1,WREN
MOVLW 0X55 MOVWF EECON2 MOVLW 0XAA MOVWF EECON2 BSF EECON1,WR ; ESCREVE 0XAA EM EECON2 (OBRIGATRIO) ; INICIA ESCRITA ; ESCREVE 0X55 EM EECON2 (OBRIGATRIO)
BCF
EECON1,WREN
EEADR
; INCREMENTA ENDEREO
MOVLW B'00000011' ANDWF EEADR,W DOIS BITS DO ENDEREO BTFSS STATUS,Z DIFERENTE DE ZERO?) GOTO
FLASH_PROGRAM_WRITE_2 ; NO
BANKSEL EECON1
EECON1
BANKSEL 0X20
; VOLTA P/ BANK0
228
RETURN ; RETORNA DA SUBROTINA
;************************************** ; 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.
EEADRH
ENDERECO_LOW,W
EEADR
; 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)
EECON1
EECON1,EEPGD EECON1,RD
NOP NOP
EEDATH
EEDATH,W
229
BANKSEL DADO_HIGH_00 ; ALTERA P/ BANK DO REGIST. DADO_HIGH ; SALVA DADO LIDO EM DADO_HIGH_00 ; ALTERA P/ BANK DO REGISTRADOR
EEDATA,W DADO_LOW_00
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
;************************************** ; 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
MOVLW B'11111111'
230
MOVWF TRISB ; CONFIGURA I/O DO PORTB
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'00000111' MOVWF ADCON1 ; CONFIGURA CONVERSOR A/D ; CONFIGURA PORTA E PORTE COMO I/O DIGITAL
BANK0
; 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
231
GOTO $ ; NO - AGUARDA ESTOURO DO WDT ; SIM
;************************************** ; 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.
;************************************** ; ESTA ROTINA INICIALIZA O DISPLAY P/ COMUNICAO DE 8 VIAS, DISPLAY PARA 2 ; LINHAS, CURSOR APAGADO E DESLOCAMENTO DO CURSOR DIREITA.
232
MOVLW 0X30 CALL ESCREVE ; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO
BSF
RS
;************************************** ; 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
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
MOVF
MOVWF VALOR_DADOS
;************************************** ; ESTA ROTINA ESCREVE A TELA PRINCIPAL DO PROGRAMA, COM AS FRASES: ; LINHA 1 - "M.DADOS M.PROG." ; LINHA 2 - " >xxh< xxxxh "
CALL
CALL
;************************************** ; ESTA ROTINA VERIFICA SE ALGUM BOTO EST PRESSIONADO E CASO AFIRMATIVO ; DESVIA PARA O TRATAMENTO DO MESMO.
VARRE
234
CLRWDT ; LIMPA WATCHDOG TIMER
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
BTFSS GOTO
BOTAO_2 TRATA_BOTAO_2
BTFSS GOTO
BOTAO_3 TRATA_BOTAO_3
; 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
;**************************************
235
;* TRATAMENTO DOS BOTES *
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
CALL
GOTO
VARRE
TRATA_BOTAO_1 DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO
MOVLW TURBO_TECLA
236
MOVWF TEMPO_TURBO ; RECARREGA TEMPORIZADOR DO TURBO ; DAS TECLAS
BTFSC GOTO
TIPO_MEMORIA INC_MEM_PROG
CALL
GOTO
VARRE
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
CALL
GOTO
VARRE
TRATA_BOTAO_2 DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO
DECFSZ TEMPO_TURBO,F
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
CALL
GOTO
VARRE
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
CALL
GOTO
VARRE
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
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
GOTO
VARRE
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
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
FLASH_PROGRAM_READ
FLASH_PROGRAM_WRITE
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.
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
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.
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>:
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
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.
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
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.
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.
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:
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.
251
252
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
254
Por ltimo necessrio ainda habilitar o sistema de comunicao atravs do bit SSPCON<SSPEN>:
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.
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)
Nota: Esta condio representa um erro de programao, pois o SSPBUF foi limpo e o bit de SSPOV no.
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.
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.
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.
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.
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.
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
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
260
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.
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.
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.
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.
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.
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
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.
268
Esquema eltrico
269
270
271
272
273
274
;************************************** ;* ;* ;* ;* ;* ;************************************** ; * VERSO : 2.0 ;* DATA : 24/02/2003 ;************************************** * * CONECTANDO O PIC - RECURSOS AVANADOS EXEMPLO 8 * NICOLS CSAR LAVINIA e DAVID JOS DE SOUZA * * * *
;************************************** ; 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
CBLOCK 0X20
FILTRO_BOTOES TEMPO_TURBO
TEMPO1
275
TEMPO0 ; CONTADORES P/ DELAY
FLAG
AUX
ENDERECO_HIGH ENDERECO_LOW
; REGISTRADORES DE ENDEREO PARA ; ACESSO MEMRIA EEPROM SERIAL EXTERNA ; MAPEADOS NO BANCO 0 DA RAM
; EXTERNA
VALOR_DADOS EXTERNA
;************************************** ; 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
;************************************** ; OS PSEUDOS-COMANDOS "BANK0" E "BANK1", AQUI DEFINIDOS, AJUDAM A COMUTAR ; ENTRE OS BANCOS DE MEMRIA.
BSF BCF
STATUS,RP0 STATUS,RP0
276
FILTRO_TECLA
EQU
.200
TURBO_TECLA
EQU
.60
0X00 0X00
#DEFINE F_ERRO
FLAG,0
;************************************** ;* ENTRADAS *
;************************************** ; AS ENTRADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE.
#DEFINE BOTAO_0
PORTB,0
#DEFINE BOTAO_1
PORTB,1
#DEFINE BOTAO_2
PORTB,2
; ESTADO DO BOTO 2
277
; 1 -> LIBERADO ; 0 -> PRESSIONADO
#DEFINE BOTAO_3
PORTB,3
;************************************** ;* SADAS *
;************************************** ; AS SADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE.
#DEFINE DISPLAY
PORTD
#DEFINE RS
PORTE,0
#DEFINE ENABLE
PORTE,1
#DEFINE SCL
PORTC,3
;************************************** ;* ENTRADAS/SADAS *
;**************************************
#DEFINE SDA
PORTC,4
;**************************************
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
;************************************** ; 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)
; LIMPA WDT (PERDE TEMPO) ; FIM DE TEMPO0 ? ; NO - VOLTA 2 INSTRUES ; SIM - PASSOU-SE 1MS
RETURN
; RETORNA
;************************************** ; 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
279
BSF GOTO BCF ENABLE $+1 ENABLE ; ENVIA UM PULSO DE ENABLE AO DISPLAY ;. ;.
;************************************** ; 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
; COMANDOS PARA ESCREVER AS ; LETRAS DE "MASTER I2C" MOVLW 'M' CALL ESCREVE
280
CALL ESCREVE
RETURN
; RETORNA
;************************************** ; 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
BSF
RS
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
281
CALL ESCREVE ; ENVIA CARACTER AO DISPLAY LCD
MOVF
VALOR_DADOS,W
; CARREGA WORK COM 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
;************************************** ; 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
282
ACK_OUT BANK1 BCF BSF BANK0 RETURN SSPCON2,ACKDT SSPCON2,ACKEN ; ALTERA P/ BANK1 ; CARREGA ACK ; TRANSMITE ; VOLTA P/ BANK0 ; RETORNA
NACK_OUT BANK1 BSF BSF BANK0 RETURN SSPCON2,ACKDT SSPCON2,ACKEN ; ALTERA P/ BANK1 ; CARREGA NACK ; TRANSMITE ; VOLTA P/ BANK0 ; RETORNA
;************************************** ; 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.
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
;************************************** ; 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
; 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
MOVWF SSPBUF
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
; 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
; ALTERA P/ BANK1 ; INICIA LEITURA DO BYTE ; VOLTA P/ BANK0 ; AGUARDA FIM DO EVENTO
; SALVA DADO EM BUFFER ; ENVIA NACK --> FIM ; AGUARDA FIM DO EVENTO
; ALTERA P/ BANK1 ; INICIA STOP BIT ; VOLTA P/ BANK0 ; AGUARDA FIM DO EVENTO
RETURN
; RETORNA
285
;************************************** ; 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
; 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
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
;************************************** ; 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
287
MOVLW .250 CALL DELAY_MS
CALL RETURN
;************************************** ; 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
MOVLW B'11110101'
288
MOVWF TRISC ; CONFIGURA I/O DO PORTC
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'00000111' MOVWF ADCON1 ; CONFIGURA CONVERSOR A/D ; CONFIGURA PORTA E PORTE COMO I/O DIGITAL
BANK0
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 $
;************************************** ; 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.
;************************************** ; ESTA ROTINA INICIALIZA O DISPLAY P/ COMUNICAO DE 8 VIAS, DISPLAY PARA 2 ; LINHAS, CURSOR APAGADO E DESLOCAMENTO DO CURSOR DIREITA.
290
INICIALIZACAO_DISPLAY BCF RS ; SELECIONA O DISPLAY P/ COMANDOS ; ESCREVE COMANDO 0X30 PARA ; INICIALIZAO
BSF
RS
;**************************************
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
MOVF
MOVWF VALOR_DADOS
;************************************** ; ESTA ROTINA ESCREVE A TELA PRINCIPAL DO PROGRAMA, COM AS FRASES: ; LINHA 1 - " MASTER I2C " ; LINHA 2 - " xxh "
CALL
CALL
;************************************** ; ESTA ROTINA VERIFICA SE ALGUM BOTO EST PRESSIONADO E CASO AFIRMATIVO ; DESVIA PARA O TRATAMENTO DO MESMO.
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
BTFSS GOTO
BOTAO_2 TRATA_BOTAO_2
BTFSS GOTO
BOTAO_3 TRATA_BOTAO_3
; 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
293
TRATA_BOTAO_0 DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO
INCF
VALOR_DADOS,F
; INCREMENTA VALOR_DADOS
CALL
GOTO
VARRE
TRATA_BOTAO_1 DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO
294
DECF VALOR_DADOS,F ; DECREMENTA VALOR_DADOS
CALL
GOTO
VARRE
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
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
MOVWF BUFFER
CALL
I2C_EEPROM_WRITE
295
GOTO
VARRE
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
MOVWF VALOR_DADOS
CALL
GOTO
VARRE
296
;**************************************
END
; FIM DO PROGRAMA
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.
298
Anotaes
_________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________
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:
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
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:
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:
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
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
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.
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.
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
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
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
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
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.
310
Esquema Eltrico
311 Fluxograma
312
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 ;
;************************************** ;* DEFINIO DOS BANCOS DE RAM * ;************************************** ; OS PSEUDOS-COMANDOS "BANK0" E "BANK1", AQUI DEFINIDOS, AJUDAM A COMUTAR ; ENTRE OS BANCOS DE MEMRIA. #DEFINE BANK1 BSF
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
ENABLE P/ DISPLAY
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
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 -
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 ;.
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 -
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
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 -
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 ;
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 ;
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 ;
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 ;
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 ;
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 ;
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
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.
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.
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.
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.
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.
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
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.
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.
No usado para essa finalidade. Para obter mais informaes, consulte apndice A
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.
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.
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.
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.
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.
337
Anotaes
_________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________
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.
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.
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
341
342
Fluxograma
343
344
345
346
;************************************** ;* ;* ;* ;* ;* ;************************************** ; * VERSO : 3.0 ;* DATA : 24/02/2003 ;************************************** * * CONECTANDO O PIC - RECURSOS AVANADOS EXEMPLO 10 * NICOLS CSAR LAVINIA e DAVID JOS DE SOUZA * * * *
;************************************** ; 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
347
;************************************** ; ESTE BLOCO DE VARIVEIS EST LOCALIZADO LOGO NO INCIO DO BANCO 0
CBLOCK 0X20
AUX
INTENSIDADE_VENT INTENSIDADE_AQUE
ACCaHI ACCaLO
ACCbHI ACCbLO
ACCcHI ACCcLO
ACCdHI ACCdLO
temp
H_byte L_byte
348
mulplr mulcnd
TEMPERATURA TEMP_CELSIUS
; TEMPERATURA DO DIODO EM UNIDADES DE A/D ; TEMPERATURA DO DIODO J CONVERTIDO ; PARA GRAUS CELSIUS
FILTRO_BOTOES TEMPO_TURBO
TEMPO_1S
; TEMPORIZADOR DE 1 SEGUNDO
FLAG
WORK_TEMP STATUS_TEMP PCLATH_TEMP FSR_TEMP ; REGISTRADORES UTILIZADOS P/ SALVAR ; O CONTEXTO DURANTE AS INTERRUPES ENDC
;************************************** ; 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
349
;************************************** ;* DEFINIO DOS BANCOS DE RAM *
;************************************** ; OS PSEUDOS-COMANDOS "BANK0" E "BANK1", AQUI DEFINIDOS, AJUDAM A COMUTAR ; ENTRE OS BANCOS DE MEMRIA.
BSF BCF
STATUS,RP0 STATUS,RP0
FILTRO_TECLA
EQU
.200
TURBO_TECLA
EQU
.70
#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 *
350
; FUTURAS ALTERAES DO HARDWARE.
#DEFINE BOTAO_0
PORTB,0
#DEFINE BOTAO_1
PORTB,1
#DEFINE BOTAO_2
PORTB,2
#DEFINE BOTAO_3
PORTB,3
; 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
; 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
;**************************************
351
;* SADAS *
;************************************** ; AS SADAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAO E ; FUTURAS ALTERAES DO HARDWARE.
#DEFINE DISPLAY
PORTD
#DEFINE RS
PORTE,0
#DEFINE ENABLE
PORTE,1
; 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
ORG GOTO
0X0000 CONFIG
; ENDEREO DO VETOR DE RESET ; PULA PARA CONFIG DEVIDO A REGIO ; DESTINADA AS ROTINAS SEGUINTES
352
;************************************** ; POSIO DE DESVIO DO PROGRAMA QUANDO UMA INTERRUPO ACONTECE
ORG
0X0004
; 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 PCLATH_TEMP
CLRF
PCLATH
CLRF
STATUS
;************************************** ; 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
353
; CONT_VENT O NMERO DE ROTAES DO VENTILADOR POR SEGUNDO. NA VERDADE ESTE ; VALOR ENCONTRA-SE MULTIPLICADO PELO NMERO DE PALHETAS DO VENTILADOR.
BCF
T1CON,TMR1ON
MOVF
TMR1H,W
MOVWF CONT_VENT_LOW
CLRF CLRF
BSF
T1CON,TMR1ON
BSF
MOSTRA_RPS
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
354
;************************************** ; ANTES DE SAIR DA INTERRUPO, O CONTEXTO SALVO NO INCIO DEVE SER ; RECUPERADO PARA QUE O PROGRAMA NO SOFRA ALTERAES INDESEJADAS.
MOVWF FSR SWAPF STATUS_TEMP,W MOVWF STATUS SWAPF WORK_TEMP,F SWAPF WORK_TEMP,W RETFIE
;**************************************************************************** ; 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
;****************************************************************************
355
MOVWF temp ; CARREGA CONTADOR PARA DIVISO
MOVF
ACCbHI,W
MOVWF ACCdLO
CLRF CLRF
CLRF CLRF
DIV BCF RLF RLF RLF RLF MOVF STATUS,C ACCdLO,F ACCdHI,F ACCcLO,F ACCcHI,F ACCaHI,W ;check if a>c
;c-a into c
356
NOGO RLF RLF ACCbLO,F ACCbHI,F
RETURN
; RETORNA
;************************************** ;**************************************************************************** ; ; 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
;*******************************************************************
mult
MACRO bit
; Begin macro
357
BTFSC mulplr,bit ADDWF H_byte,F RRF RRF H_byte,F L_byte,F
ENDM
; End of macro
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.
0 1 2 3 4 5 6 7
RETURN
; RETORNA
;************************************** ; ESTA UMA ROTINA DE DELAY VARIVEL, COM DURAO DE 1MS X O VALOR PASSADO ; EM WORK (W).
DELAY_MS
358
MOVWF TEMPO1 MOVLW .250 MOVWF TEMPO0 ; CARREGA TEMPO0 (P/ CONTAR 1MS) ; CARREGA TEMPO1 (UNIDADES DE MS)
; LIMPA WDT (PERDE TEMPO) ; FIM DE TEMPO0 ? ; NO - VOLTA 2 INSTRUES ; SIM - PASSOU-SE 1MS
RETURN
; RETORNA
;************************************** ; 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 ;. ;.
;************************************** ; ESTA ROTINA RECEBE UM ARGUMENTO PASSADO PELO WORK E RETORNA NAS VARIVEIS
359
; CENTENA, DEZENA E UNIDADE O NMERO BCD CORRESPONDNTE AO PARMETRO PASSADO.
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
360
;************************************** ;* ROTINA PARA MOSTRAR A ROTAO DO VENTILADOR NO LCD *
;************************************** ; ESTA ROTINA ATUALIZA O VALOR DAS ROTAES POR SEGUNDO DO VENTILADOR NO LCD.
BCF
RS
; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 7 ; SELECIONA O DISPLAY P/ DADOS
MOVF
CONT_VENT_HIGH,W
MOVWF ACCbLO
CLRF
ACCaHI
CALL
D_divF
MOVF CALL
MOVF
MOVF
361
MOVF
RETURN
; RETORNA
;************************************** ; 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.
CALL
TABELA_TEMPERATURA
; CONVERTE A/D EM GRAUS CELSIUS ; SALVA VALOR EM TEMP_CELSIUS ; FAZ O AJUSTE DECIMAL
BCF
RS
; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 11 ; SELECIONA O DISPLAY P/ DADOS
MOVF
MOVF
MOVF
ADDLW 0X30
362
CALL ESCREVE ; ESCREVE VALOR NO LCD
TEMP_CELSIUS,W
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
;************************************** ; 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
MOVLW B'10111001'
363
MOVWF TRISC ; CONFIGURA I/O DO PORTC
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'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'
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
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
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
CLRF
CCPR1L
; 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 $
;************************************** ; ESTA ROTINA IR LIMPAR TODA A RAM DO BANCO 0, INDO DE 0X20 A 0X7F
MOVLW 0X20
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.
;************************************** ; ESTA ROTINA INICIALIZA O DISPLAY P/ COMUNICAO DE 8 VIAS, DISPLAY PARA 2 ; LINHAS, CURSOR APAGADO E DESLOCAMENTO DO CURSOR DIREITA.
367
MOVLW B'00000001' CALL ESCREVE ; ESCREVE COMANDO PARA ; LIMPAR TODO O DISPLAY
;************************************** ; ESTA ROTINA ESCREVE A TELA PRINCIPAL DO PROGRAMA, COM AS FRASES: ; LINHA 1 - "AQUEC. RPS TEMP." ; LINHA 2 - " 000% 000 000C"
; COMANDO PARA POSICIONAR O CURSOR ; LINHA 0 / COLUNA 0 ; SELECIONA O DISPLAY P/ DADOS ; COMANDOS PARA ESCREVER AS ; LETRAS DE "AQUEC. RPS TEMP."
MOVLW '.'
368
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 '%'
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"
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"
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
BSF
INTCON,GIE
BTFSC CALL
MOSTRA_RPS MOSTRA_RPS_LCD
BTFSC CALL
MOSTRA_TEMP MOSTRA_TEMP_LCD
BTFSS GOTO
BOTAO_0 TRATA_BOTAO_0
BTFSS GOTO
BOTAO_1 TRATA_BOTAO_1
BTFSS GOTO
BOTAO_2 TRATA_BOTAO_2
BTFSS GOTO
BOTAO_3 TRATA_BOTAO_3
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
;**************************************
TRATA_BOTAO_0 DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO
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
MOVWF mulplr
372
MOVLW .10 MOVWF mulcnd ; CARREGA 10d EM mulcnd
CALL
mpy_F
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
BCF
RS
; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 1 ; SELECIONA O DISPLAY P/ DADOS
MOVF
MOVF
MOVF
373
GOTO
VARRE
TRATA_BOTAO_1 DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO
INTENSIDADE_AQUE,F STATUS,Z INTENSIDADE_AQUE,F ; PODE DECREMENTAR PWM DO AQUECEDOR ? ; SIM - DECREMENTA INTENSIDADE_AQUE ; NO
MOVF
INTENSIDADE_AQUE,W
MOVWF mulplr
CALL
mpy_F
SWAPF L_byte,W ANDLW B'00110000' IORLW RRF RRF B'00001111' H_byte,F L_byte,F
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
BCF
RS
; SELECIONA O DISPLAY P/ COMANDOS ; COMANDO PARA POSICIONAR O CURSOR ; LINHA 1 / COLUNA 1 ; SELECIONA O DISPLAY P/ DADOS
MOVF
MOVF
MOVF
GOTO
VARRE
TRATA_BOTAO_2 DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO
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
MOVWF mulplr
CALL
mpy_F
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
376
TRATA_BOTAO_3 DECFSZ FILTRO_BOTOES,F GOTO VARRE ; FIM DO FILTRO ? (RUIDO?) ; NO - VOLTA P/ VARRE ; SIM - BOTO PRESSIONADO
INTENSIDADE_VENT,F STATUS,Z INTENSIDADE_VENT,F ; PODE DECREMENTAR PWM DO VENTILADOR ? ; SIM - DECREMENTA INTENSIDADE_VENT ; NO
MOVF
INTENSIDADE_VENT,W
MOVWF mulplr
CALL
mpy_F
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
377
GOTO
VARRE
;**************************************
ORG RADIX
0X200 DEC
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
DT DT DT DT
DT DT DT DT
378
DT DT DT DT
;**************************************
END
; FIM DO PROGRAMA
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
380
ADRESLeADRESH............................................................................................................................ 315
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
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:
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
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:
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
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.
/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
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
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 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
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 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
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 -
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:
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
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
-
Bit 4 R/W
TOUTPS1
Bit 1 R/W
T2CKPS1
Bit 0 R/W
T2CKPSO
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
TMR20N:
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
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
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:
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
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:
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
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:
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:
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:
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:
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
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.
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:
393
ADCON1
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
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
Parte baixa do PWM de 10 bits. A parte alta fica em CCPR1L. Vlido somente quando em PWM.
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
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
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
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 0 R/W RD 0
WRERR:
WREN:
WR:
RD:
Registrador: EECON2
2
Endereos: 18Dh
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
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
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:
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
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:
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 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
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
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
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
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-
C1OUT:
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:
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
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:
Seleo do valor da tenso de vref: Se CVRR = 1: VREF=(VR/24) * VDD Se CVRR = 0: VREF =1/4 * VDD+ (VR/32) * VDD
405
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
CCP1X CCP1Y:
Parte baixa do PWM de 10 bits. A parte alta fica em CCPR1L. Vlido somente quando em PWM.
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
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
00
INDF
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
GIE PEIE -
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
Contador TMR2 de 8-bits TOUT TOUTPS TOUTPS TOUTPS TMR20N T2CKPS T2CKPS PS3 2 1 O 1 SSPO V
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
CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0 --00 0000 --00 0000
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
1E ADRESH 1F ADCONO
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)
PS2
PS1
PS0
Parte baixa do PC (8 bits menos significativos) RP1 RPO /TO /PD Z DC C Ponteiro para endereamento indireto
---- ----
83 STATUS IRP
0001 1xxx
uuuu uuuu ---1 1111 1111 1111 1111 1111 1111 1111
RA3 RA2 RA1 RB3 RB2 RB1 RC3 RC2 RC1 RD3 RD2 RD1 RE2 RE1 T0IF
E
8B INTCON GIE
INTF
E
RBIF
0000 000x
ADIE RCIE TXIE SSPIE CCP1I TMR2I TMR1IE 0000 0000 EEIE BCLIE CCP2IE
/POR /BOR
No implementado No lmplementado
ACKST ACKDT ACKEN RCEN PEN RSEN AT SEN
0000 0000
Limite superior para contagem doTMR2 Registrador de endereo para I C CKE D/A P S R/W
2
UA
BF
oooo oooooooo oooo 0000 oooo oooo oooo oooo 0000 oooo 0000 -010 0000 -010
CIS
CM2
CM1 CM0
0000 0111 0000 0111 000- 0000 uuuu uuuu 0--- 0000
CVROE CVRR
9E ADRESL 9F
ADCON1 ADFM
408
Hex Nome
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3 BANK 2
BIT 2 BIT 1
Bit 0
Power-on
100 101
IDEF TMR0
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
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
Power-on
180 181
INDF
OPTION_RE G
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)
---- ----
Parte alta do PC (5 bits mais significativos) PEIE T0IE INTE RBIE T0IF INTF RBIF -
WRE WRE WR RD RR N 2 RD Registrador de segurana para escrita na E PROM (no um registrador implementado)
---- ----
----- ----
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:
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
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
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
411
BCF Limpa um bit do registrador F _______________________________________ Sintaxe: Descrio: Limites: Operao: Status afet.: Encoding: BCF f,b
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
01
Palavras: Ciclos: Exemplo: 1 1 ou 2
10bb bfff
ffff
Antes da instruo: PC= Linha 1 Aps a instruo: Se LED = 1 PC = Linha 2 Se LED = 0 PC = Linha 3
412
BSF Seta um bit do registrador F ________________________________________ Sintaxe: Descrio: Limites: BSF f,b
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
01
Palavras: Ciclos: Exemplo:
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
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:
10
Palavras: Ciclos: Exemplo: 1 2
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
CLRF FLAG Antes da instruo: FLAG= B11111111' Aps a instruo: FLAG =B'00000000' Z= 1
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
00
Palavras: Ciclos: Exemplo: 1 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
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
00
Palavras: Ciclos: Exemplo: 1 1
1001 dfff
ffff
0x13 OxEC
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
0x01 O 0x00 1
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:
00
Palavras: Ciclos: Exemplo: 1 1 ou 2
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
10
Palavras: 1
Ciclos: 2 Exemplo: GOTO CONTINUA Antes da instruo: PC= Linha 1 Aps a instruo: PC= CONTINUA Conectando o PIC 16F877A - Recursos Avanados
417
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
00
Palavras: Ciclos: Exemplo: 1 1
1010 dfff
ffff
0xFF 0 0x00 Z
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:
00
Palavras: Ciclos: Exemplo: 1 1 ou 2
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:
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
00
Palavras: Ciclos: Exemplo: 1 1
0100 dfff
ffff
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
MOVLW 0x5A Antes da instruo: W= ? Aps a instruo: W= 0x5A Move o valor de F para o destino d
MOVF
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
00
Palavras: Ciclos: Exemplo: 1 1
1000 dfff
ffff
421
MOVWF Move o valor de W para F ____________________________________________ Sintaxe: Descrio: Limites: Operao: Status afet.: Encoding: MOVWF f
00
Palavras: Ciclos: Exemplo:
NOP No executa nada _______________________________________________ Sintaxe: Descrio: NOP Esta instruo e usada somente para perder tempo, pois ela no executa operao nenhuma. Nenhum Nenhuma Nenhum
00
Palavras: Ciclos: Exemplo: 1 1 NOP
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
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)
11
Palavras: Exemplo:
1 Ciclos:
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
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:
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
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:
00
Palavras: Ciclos: 1 Exemplo: 1
1100 dfff
ffff
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
00
Palavras: Ciclos: Exemplo: 1 1
SLEEP
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
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:
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
XORWF
_____________________________________________________________________ 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
00
Palavras: Ciclos: Exemplo: 1 1
0110 dfff
ffff
REG,F
0xB5 0xAF
0xB5 0x1 A
429
Anotaes
_________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________
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>
431
Exemplo MOVLW MOVWF BANKISEL ... MOVWF
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>
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>
& _CP_OFF
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.
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
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"]
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.
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
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.
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.
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'
CONFIG
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
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
444
LOCALCOMP, LARG ; AS CONFLITOS COMP SET .30 LARG SET .50 ENDM VARIVEIS LOCAIS NC GERAM
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.
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'
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
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>
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
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>
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
Veja tambm LIST, TITLE, SUBTITLE, SPACE, PAGE SUBTITLE - Determina o subttulo do programa ____________________________________________________________________________ Sintaxe SUBTITLE "<texto>"
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>]
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
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.
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
c DC Z
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
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)
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
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
459
460
461
Anotaes
______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________
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
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
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
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
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.
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.
468
( ......................
Microcontroladores
469
( ......................
Microcontroladores
470
www.editoraerica.com.br