P. 1
Apostila Micro Control Adores PIC16F84 PIC16F628

Apostila Micro Control Adores PIC16F84 PIC16F628

|Views: 63|Likes:

More info:

Published by: Kleber Oliveira Guimarães Falcão on Sep 05, 2011
Direitos Autorais:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

12/31/2012

pdf

text

original

Sections

  • Capítulo 1
  • Capítulo 2
  • Capítulo 3
  • Capítulo 4
  • Capítulo 5
  • Capítulo 6
  • Capítulo 7
  • Capítulo 8
  • Capítulo 9
  • Capítulo 10
  • Capítulo 11
  • Capítulo 12
  • Capítulo 13
  • Capítulo 14
  • Capítulo 15
  • Capítulo 16
  • Capítulo 17
  • Capítulo 18
  • Capítulo 19
  • Capítulo 20
  • Capítulo 21
  • Capítulo 22
  • Capítulo 25
  • Capítulo 26
  • Capítulo 27
  • Capítulo 28
  • Capítulo 29

1

Microcontroladores PIC16F84 e PIC16F628
Esta apostila foi escrita no final de Julho de 2004 e teve a colaboração de:
Derli Bernardes Ivon Luiz José Domingos Luiz Cláudio Edson Koiti Luciana Petraites Para completar o aprendizado desta apostila baixe os seguintes arquivos da página www.luizbertini.net/microcontroladores/microcontroladores.html - telas do MPLAB 5.7.40 - sirene.rar - teclado_bas.rar - MT8870.rar - DELAY.rar - PIC16F84A.rar - PIC16F62XA.rar - Manual Pratica.rar - Conversão do 84 para o 628.rar - PIC16F627_PIC16F628 - comandos.rar – toda as instruções em uma só tabela. - display7seg.rar - picdisp.rar Todo este material é fornecido gratuitamente. Siga as instruções da página e desta apostila. O autor: o autor é um cara maluquinho que gosta muito de eletrônica e estuda microcontroladores desde 1997. Já leu um monte de livros, já escreveu um monte de livros, já fez um monte de projetos com e sem PICs. Mas não é nem um pouco melhor do que ninguém. Agradeço a você que fez o download desta apostila e espero que visite minha página de livros e compre meus outros livros e baixe minhas outras apostilas. Espero que você compre meu livro sobre PICs. Sai em breve e é bem mais completo que está apostila.

2 Nem todos os projetos apresentados estão completos dentro dela, ou seja, você terá que baixar mais arquivos da minha página sobre microcontroladores. Lá na página você encontrará algumas dicas de como usar este material. Esta apostila não é perfeita, pois eu também não sou perfeito. Lembre-se: se eu aprendi microcontroladores, você também consegue. Abraços. Luiz Bertini

Capítulo 1
MICROPROCESSADORES E MICROCONTROLADORES
E tudo começou com os microprocessadores. Primeiro eram de 4 bits, depois de 8 bits e assim por diante. Mas o que é um microprocessador? É um chip, com alta integração de componentes, que precisa de memória RAM externa, memória EEPROM externa, HD para armazenamento de programas e outros diversos periféricos. Ou seja, você usa um microprocessador dentro de um microcomputador e ele, em conjunto com um monte de outros CIs, trabalham direitinho. Por outro lado um microcontrolador é um componente completo por si só. Basta um programa e ele executa uma função específica. 2 Dentro do microcontrolador temos memória RAM, FLASH, EEPROM ou E PROM. Mas, tudo isto começou com a lógica digital baseada na condução ou não de transistores, Fets ou diodos entre outros. Mas para não entrar neste detalhe, vamos simplificar resumindo esta lógica em dois números ou como falamos muito, em dois dígitos: O 0 (zero) e o 1 (um). Quando falamos em 0 (zero), estamos nos referindo a zero Volt DC e quando falamos em 1 (um) estamos falando em + Vcc. No caso dos microcontroladores PIC, geralmente, estaremos falando que: 0 = GND e 1 = 5Vcc Tenha em mente, então, que a lógica digital se baseia em níveis de tensão contínua. E que os microcontroladores usam a lógica digital, e que um programa de computador ou para um microcontrolador, por mais complexo que seja, se resume em uma enorme quantidade de 0 (zero) e 1 (um) ordenados corretamente.

3

Capítulo 2
TIPOS DE MEMÓRIAS
Já falamos sobre alguns tipos de memórias, vamos agora ver com mais detalhes o que elas são e como funcionam além de suas aplicações, é claro. É um tipo de memória que só pode ser gravada uma vez e não pode ser apagada. Existem PICs que só possuam este tipo de memória e que se você gravar um programa errado já era. Onde temos uma memória deste tipo? Dentro de um computador pessoal, é a famosa “BIOS”. Mantém a gravação sem alimentação.

2.1. Memória ROM:

2.2. Memória RAM:
É um tipo de memória que pode ser gravada, apagada, regravada, mas, que tem um porém, desligando a alimentação dela todos os dados se perdem. É muito utilizada para gravar informações temporárias que serão utilizadas em um programa. Não mantém a gravação sem alimentação.

2.3. Memória EPROM:

Este tipo de memória permite a gravação, mas, para apagar os dados é necessário um banho de luz ultravioleta, para isto, este tipo de memória tem uma janela. Existem PCs com este tipo de memória e que são popularmente chamados de “PICs janelados”. Mantém a gravação sem alimentação.

2.4. Memória EAROM:
Este tipo de memória pode ser gravada e para apagá-la basta um nível de tensão adequado. Um inconveniente deste tipo de memória usada em muitos TVs antigos, é que ela precisa de uma tensão de - 30 Volts para funcionar corretamente. Mantém a gravação mesmo sem alimentação.

2.5. Memória EEPROM ou E2PROM:

Está é a evolução das memórias anteriores. Podem ser gravada e desgravada centenas de vezes apenas com a aplicação de níveis corretos de tensão. Um exemplo prático deste tipo de memória é a famosa “24C04” e toda a sua família. Mantém a gravação mesmo sem alimentação.

2.6. Memória FLASH:

É a suprasumo das memórias, mais rápida de gravação e a regravação muito mais fácil. Permite uma infinidade de usos. Desde a gravação de áudio e vídeo digitalizado até um programa em um PIC. Mantém os dados e a gravação mesmo sem alimentação.

Capítulo 3
O QUE É UM REGISTRADOR
Um registrador é um endereço na memória, que em nosso caso são formados por 8 números, ou melhor, 8 bits. Cada bit deste pode assumir o valor de 1 (um) ou 0 (zero). Temos então um endereço que podemos chamar de registrador. Este registrador terá 8 bits. Estes bits podem ser 0 (zero) ou 1 (um). Muitas vezes chamamos estes bits de Flags. Flags então é um bit dentro de um registrador. Mas o que é um Bit? Imaginemos 8 posições: Tabela 3.1

Hoje em dia. Com este recurso o microcontrolador consegue buscar uma informação enquanto processa outra. para isto basta escrever ou ler os flags. Um byte então é um conjunto de 8 bits. hora dados. Este conjunto. Um para dados e outro para endereços. como no exemplo a seguir: “00110011” ⇒ Chamamos isto de byte. Outras vezes os bits podem se agrupar com números maiores que 8. trabalham com dois bus. Desta forma ele fica mais rápido. Este set tem entre 33 a 35 instruções dependendo do PIC. Às vezes os bits podem ser agrupados em números de 4. Lembre-se. É como falar fluentemente um outro idioma. pois podem fazer duas coisas ao mesmo tempo. Isto ajuda na memorização. mas.1. ou set de instruções possuía mais de 100 instruções. veja: “001100110011” ⇒ Chamamos isto de “Word”: Nos pics existem registradores especiais. bit é o valor que há dentro da posição. 5. Com apenas um bus tínhamos que trafegar hora endereços. Pinagem: . Quando juntamos 8 bits. all right? Capítulo 5 PIC 16F84-04 Vamos agora ver a pinagem e algumas características do PIC 16F84-04. O nome mais correto para este “caminho” é Bus. ou melhor. Os PICs usam um set ou conjunto de instruções reduzidas. chamados de “RISC”. Capítulo 4 ARQUITETURA DE CONSTRUÇÃO Os primeiros microcontroladores usavam uma estrutura interna que tinha apenas um caminho para trafegar os dados e endereços. dados são informações e endereços são os locais onde serão armazenados os dados. veja: “0101” ⇒ Damos a isto o nome de “nibble”. Os PICs possuem ainda um outro recurso. Os microcontroladores mais antigos usavam um conjunto de instruções conhecidos por “CISC”. conhecendo poucas palavras. o que dificultava a memorização do programador. chamado de “Pipeline”. Esta posição com um valor é um bit. exige mais do programador. Este tipo de arquitetura recebe o nome de “Harvard”. os PICs particularmente.4 Cada posição pode ter um valor de 0 (zero) ou 1 (um). Esta arquitetura de construção recebe o nome de “Von Neumann”. vamos citar os três mais importantes: Intcon Option-reg Status Podemos através dos bits ou flags destes registradores “ajustar” o funcionamento do PIC ou ler como ale está operando.

Pino 5 ⇒ Vss ou terra. bit 6 ou Rb6 – pode ser usado como interrupção. Ra1. Cada pino tem uma função. por exemplo. para que o Pic funcione. Pino 11 ⇒ I/O – Port B. 5. Pino 10 ⇒ I/O – Port B. µ A corrente varia. Ra3.Com clock de 4MHz ≅ 2mA. como entradas onde serão ligadas chaves de pressão. . Ra3 e Ra4. 1.1 Esta pinagem corresponde ao encapsulamento Dual In Line ou DIP. bit 4 ou Rb4 – pode ser usado como interrupção. Ra2. o mais comum é 5Vcc. . bit 0 ou Rb0. pois o PIC tem um consumo diferente de acordo com a freqüência do clock e sua condução de funcionamento. 18. vamos ver as duas portas que ele apresenta. 9. Pino 2 ⇒ I/O – Porta. o registrador deve ser ajustado como se ele tivesse 8 bits.3. Pino 8 ⇒ I/O – Port B. 7. caso tenhamos 4 Leds acesos em suas saídas e cada led consuma 10mA. Neste PIC temos o “Port A” e “Port B” que chamamos de “porta e portb”. Consumo de corrente entre 26µA a 2mA. mas antes de falarmos deles individualmente.5 Fig. Ra5. Também é comum usarmos o portb. Podemos perceber que o porta só tem 5 bits. O portb é composto pelos pinos 6. . ou parte dela. bit 1 ou Rb1. 12 e 13 e que correspondem a: Ra0. Ra4. Pino 13 ⇒ I/O – Port B. É comum usarmos o porta. deveremos somar 40mA para saber o consumo total de corrente e quanto a fonte deve fornecer. . mas. bit 3 ou Ra3. bit 4 ou Ra4. Ra6 e Ra7. Pino 12 ⇒ I/O – Port B. ou parte dela. O pina 16 também pode ser usado como entrada do oscilador. Ra2. É bom lembrar que este é o consumo do PIC. Esta porta terá seus pinos definidos como entrada ou saída de acordo com os ajustes dos flags do registrador Trisa. Pino 3 ⇒ I/O ou entrada do timer0 – Porta. Função de Cada Pino: Pino 1 ⇒ I/O – Porta. Ra1. bit 2 ou Rb2 . Pino 6 ⇒ I/O ou interrupção externa – Port B.2.a barra indica que o reset é feito colocando este pino em 0 Volt. que correspondem a: Ra0. O porta é composta pelos pinos 17. Mas. Podemos perceber que são 8 bits. O pino 15 também pode ser usado como saída do oscilador. Pino 4 ⇒ Reset – MCLR\ . 11. portanto.Com clock de 32 kHz ≅ 150µA. 8. 10. 5. 2 e 3. Pino 14 ⇒ Vcc ou Vdd. Normalmente uma fonte com o CI LM7805 é suficiente para a maioria dos projetos. bit 2 ou Ra2. você pergunta: o que é porta (é o que tem na entrda da sua casa??!!!)? Porta é um conjunto de terminais que podem funcionar como entrada ou saída ou ambos e que tem um registrador próprio. bit 3 ou Rb3 . Pino 9 ⇒ I/O – Port B. bit 5 ou Rb5 – pode ser usado como interrupção. como saída. ele deve estar em + Vcc. 5. Esta porta terá seus terminais definidos como entrada ou saída através dos valores que colocarmos nos flags do registrador Trisb.Em stand-by ≅ 70µA. Características Elétricas: Alimentação de 2 a 6Vcc. bit 7 ou Rb7 – pode ser usado como interrupção. Pino 7 ⇒ I/O – Port B.

Fig. Para que serve isto? Digamos que você fez um projeto com um PIC para controlar um elevador. definidos como entrada ou saída e isto individualmente. Há de saber como se travar bem este cão. o controle de acesso por RFID e os chefes chatos que. 13 – I/O: treze pinos que podem ser configurados. o programa volta a funcionar e o elevador volta a funcionar também. após um certo período. o cartão de ponto. 5. Pode gerenciar interrupções (interrupção é um comando interno ou externo.4. mas atento). Esta memória é a Flash. graças a Deus eu nunca tive Mas chega de falar bobagem).6 Pino 15 ⇒ Osc 2 onde deve ser ligado um terminal do ressonador ou cristal. 64 bytes de memória EEPROM para dados (como senhas e outras informações). pode ser colocada uma instrução do programa. também chamado de “periféricos”. Pino 18 ⇒ I/O – Port A. Pois bem. 1K corresponde a 1024 posições e em cada posição desta. Outras Características: .). Pode entrar em modo Sleep (dormindo. cada caixa é um nível). cada caixa contém algumas coisas. Caso seja usado um clock formado por uma constante RC. dando há um pico de tensão o PIC travou fazendo com que o elevador pare. um cão de guarda com um relógio que está de olho nos horários e tempos do PIC. mas isto é. 15 registradores na memória RAM: para controle do PIC e de tudo o que estiver conectado com ele. que manda o PIC ir para um endereço específico do programa. Depois de um curto período o Watch dog reseta o PIC. bit 0 ou Ra0. 5.2 Pino 17 ⇒ I/O – Port A. ele será a saída do clock dividido por 4. 68 bytes (lembre-se um byte é um conjunto de 8 bits) de memória RAM. se traduzindo. bit 1 ou Ra1. (Como se já não bastava. Pino 16 ⇒ Osc 1 onde deve ser ligado o outro terminal do cristal ou ressonador. outro capítulo. O Watch dog é um contador independente de tudo dentro do PIC. que é onde guardamos nossas variáveis. Capacidade suficiente de corrente em suas saídas para acender os leds e controlar o corte e a saturação de transistores. que reseta o mesmo. Tem também um Watch dog isto seria. 1K de espaço para palavras ou Words de 14 bits para programa. literalmente. Pilhas ou Stack: Com 8 níveis (imagine que você quer guardar 8 caixas iguais uma sobre a outra. fazer o que estiver lá e depois voltar). estourar a pilha (vai que dentro de uma pilha você colocou dinamite. Pode ter o seu programa protegido de forma a evitar que “alguém” copie o seu programa. Caso se use um circuito RC este pino será a entrada. Há de se ter cuidado para não “derrubar” esta pilha ou como se diz em programação. Timer: de 8 bits que pode ter sua contagem (um timer conta a passagem de tempo) através de um divisor chamado de “prescaler” (se você conhece o funcionamento de um PLL isto é fácil). Pode usar vários tipos de osciladores.

by happy). que recebem o nome de “byte”. 0 e 1 e 14. então faça um programa onde você possa gravar uma senha (mas sem usar a EEPROM seu espetinho ou espertinha) e usá-la depois para comandar uma das saídas do PIC.384 16.7 5.170 Podemos ter na memória de programa 1. de quilometragem. Será? Veremos.170 instruções. Lembre-se que esta memória é Flash (não é um Flash. Com 14 bits e 1K de espaço o número máximo de bits que conseguiremos 14 armazenar. pois. 14 Capítulo 6 PIC 16F628-04 Este capítulo deverá ser mais curto do que o anterior. Desta forma teremos: 2 = 16. 14 ou 16 bits. São 2. dependendo do PIC. devemos conhecer o tamanho da memória de programa. de cada posição. E é ela quem define de quantos bits é o microcontrolador. Lembre-se que a memória de programa é de 2 elevado a 14. será de 2 que é igual a 16. portanto não façam pose). não se apaga quando desligamos o aparelho. Vimos no começo deste capítulo que eu chamei o PIC de PIC 16F84-04. Sem. pois este é o tamanho. mas vamos lá. você não sabe fazer um programa? Isto é só uma questão de tempo ou como eu costumo dizer.6. 224 bytes de RAM para que você encha de variáveis. problemas vamos voltar a falar sobre eles. 5. Procure ler todos os livros que dizem respeito ao PIC e programação.048 posições. 2K de memória para instruções de 14 bits. 128 bytes de memória EEPROM (o processo asmático de ensino alerta: 1 byte é constituído de 8 bits).384 bits. No PIC 16F84 ela tem 14 bits e a esses 14 bits damos o nome de “Word” (palavra). Resumo: A memória de programa pode ter 12. teste se ela funciona. mas por quê? Vamos ver em partes: Alguns temas estão meios confusos? (No problem. como ele tem 8 bits o PIC 16F84 é de 8 bits. dá para perceber que podemos gravar um programa maior nele do que no 16F84. a vida é uma agradável surpresa (basta saber olhar para o lado certo). Observação Interessante: Para saber quantas instruções cabem na memória de programa. Você não acredita que os dados se apagam quando você desliga o circuito? Tá bom.384 ÷ 14 = 1. . Mas. Nesta memória é que escrevemos nossos programas. Grave a senha. estamos trabalhando em binário. ou seja. Dois. Desligue o PIC e tente usá-la novamente. don’t worry. em bits.5. A memória de dados é formada por 8 bits. Dá um “programão”. Todo os dados (aquele cubo com pontinhos?) armazenados nela se perdem quando a alimentação é desligada. A memória de programa é Flash e não volátil.

. um grupo de 35 instruções. Pino 2 – Ra2 – port A. mas o que é isto? É um recurso que permitirá que você converse com outros equipamentos.AN3 – entrada analógica 3 para os comparadores. 1 pino só de entrada. Timer contador com 16 bits.CMP2 – saída do comparador 2. tenha certeza. você conhecerá. de tensão. Quem gosta de amplificadores operacionais prepare-se para se divertir.AN2 – entrada analógica 2 para os comparadores. Não se preocupe que você terá um capítulo só de Stack para ler. . 15 I/O ou 15 pinos que você pode configurar como entrada ou saída a seu bel prazer. 2 comparadores analógicos com referência interna. Um Timer de 8 Bits. 10 possibilidades de interrupção. como uma porta serial de um microcomputador. Timer contador com 8 bits. bit 4 I/O: .8 Um Stack (não de frango) ou pilha com 8 níveis. O famoso Watch dog. Um set de 35 instruções. Cada pino de I/O com capacidade de fornecer ou consumir 25mA. bit 3 – I/O: . Uma aplicação PWM que permite captura e amostragem.CMP1 – saída do comparador 1. ou seja.Vref – saída de tensão de referência (muito útil quando trabalhamos com AOS). que não as conhece vamos ler o apêndice sobre “AOs”. Só para lembrar PWM quer dizer modulação por largura de pulso. Com elas você trabalhará com os PICs citados até agora. Pino 3 – Ra4 – port A. . programável. USART significa “Universal Synchronous Asynchrous Receiver transmiter ou Transmissor” Universal Síncrono ou Assíncrono. Veja o pino CCP1. Teoricamente quanto maior o número de bits de um timer maior a contagem que você poderá fazer. Vamos agora estudar este PIC pino a pino. Timer contador com 16 bits. Uma USART serial. Pino 1 – Ra2 – port A. com este recurso você conseguirá variar o brilho de uma lâmpada ou até fazer uma fonte chaveada (leiam o meu livro de fontes chaveadas publicado pela Antenna). se você conhecer bem os registradores TRISA e TRISB e. bit 2 – I/O: .

Pino 6 – Rb0 – port B. bit 1 – I/O: . . Sem saber nada de comunicações serial. Pino 7 – Rb1 – port B. . bit 3 – I/O: . bit 6 – I/O: .Vpp – Esta é a entrada para a tensão de programação que deve ser de 13Vcc sem ripple.CK – clock que permite a comunicação serial síncrona (USART).T1CK/ . compare e PWM (não tem nada a ver com a extinta União Soviética).DT – pino de dados para comunicação serial síncrona (USART). Pino 12 – Rb6 – port B. bit 5 – I/O: .TX – pino para comunicação. . transmissor e receptor fazendo as coisas ao mesmo tempo ou em sincronismo). Pino 9 – Rb3 – port B. . o pino 7 será o Rx que receberá os dados e o pino 8 será o Tx que enviará os dados. . bit 4 – I/O: .TOCKI – entrada do comparador TMR0 (vulgo timer0). também pode ser chamado de “Vss”. .MCLR – Reset ou Mosfet Clear externo. Se for síncrona. portanto ele deve sempre estar em Vcc. Caso você deixe este pino no terra ele não funcionará.RX – pino de recepção da comunicação serial assíncrona (USART). bit 5 – I/O: . Usado como clock. Pino 4 – Ra5 – port A. bit 0 – I/O: . bit 7 – I/O: . Pino 14 – Vcc – alimentação positiva e sem ripple (na dúvida coloque um capacitor de 100nF x 250Vcc no seu circuito). Pino 8 – Rb2 – port 2 – I/O: . Pino 10 – Rb4 – port B. . Se for assíncrona.PGC – usado para programação serial (ICSF).9 . podemos perceber que: . Pino 5 – GND ou terra.T1050 – saída para xtal ou cristal externo.é só.PGD – entrada de dados da programação serial (ICSP).PGM – usado para programação com baixa tensão que corresponde a 5 Vcc.CCP1 – pino para o capture. . .ela pode ser assíncrona (“me perdoem os experts” sem sincronismo entre o Tx e o Rx). mas apenas por observação.INT – entrada para interrupção.entrada do contador TMR1 (vulgo timer1). o pino 7 será DT e transmitirá e receberá dados.a comunicação serial precisa de dois pinos. transmissão.ela pode ser síncrona (de sincronizado. Pino 13 – Rb7 – port 7. e o pino 8 será o CK que manterá o sincronismo entre Tx e Rx.T1OSI – entrada para xtal ou cristal. assíncrona (USART). Pino 11 – Rb5 – port B.

usar ou. antes de continuarmos com isto. normalmente eu aconselho se ligar um dos pinos do cristal a outro terminal do cristal.AN1 – entrada analógica 1 para os comparadores. T = Ton + ToFF T=1 F ou F=1 T . o 16F628-04 e o 16F628-20. um pino pode fazer uma função ou outra. corresponde aos ciclos de máquina interno (veremos estes ciclos de máquina um pouquinho mais adiante). É interessante que estes dois períodos sejam iguais. eu pergunto: O que vem a ser Clock? Na prática um clock é um sinal de onda quadrada que serve para fazer um circuito lógico funcionar ou para sincronizar diversos dispositivos ou circuitos. que entra em OSC1. então de acordo com o nosso software e de como “setamos” ou ajustamos os registradores. bit 7 – I/O: OSC1 – entrada do oscilador onde. Quando você vê a configuração de um microcomputador e ele tem um processador. como a entrada para um dos comparadores. O nível alto do clock deve corresponder à tensão de alimentação do PIC (+Vcc) e o nível baixo deve corresponder ao terra.CLKOUT – teremos também neste pino a possibilidade de ler. Pino 17 – Ra0 – port A. O período alto (+Vcc) é chamado de “Ton” e o período baixo de “Toff”.8 GHertz ou 2. Vamos analisar o nome de dois PICs.AN0 – entrada analógica zero para os comparadores. Nos PICs 16F84 e 16F628 os pinos que correspondem ao oscilador são os pinos 15 e 16. Podemos perceber que cada pino tem mais de uma função. O pino 15 é normalmente a saída e o pino 16 é a entrada. veja um exemplo: O pino 18 pode tanto ser um I/O da porta.OSC2 – saída para oscilador a cristal. Fique atento a isto. Mas. vai no pino 15.CLKIN – aqui pode ser ligado um oscilador externo desde um formado por uma constante RC até um VCO ou coisa parecida.800 MHz. . bit 6 – I/O: . bit 0 – I/O: .8GHz Quer dizer que o clock do processador tem uma freqüência de 2. Pino 16 – Ra7 – port A. Capítulo 7 TIPOS DE OSCILADORES Um microcontrolador precisa de um sinal de clock para funcionar e o responsável por gerar este sinal e o oscilador.10 Pino 15 – Ra6 – port A. P4 de 2. Pino 18 – Ra1 – port A. bit 1 – I/O: . . A soma dos dois períodos resulta em “T” que é o período total da onda quadrada e pelo qual podemos definir qual é a freqüência ou vice-versa. retirar a freqüência de sinal.

000. 001 segundos.000. Veja: Clock interno = Clock externo = 4MHz = 1MHz 4 4 O período do clock interno será: T= 1 F = 1 1MHz T = 1µs ou 1 micro segundo ou 0. então que cada instrução demora 1µs para ser executada. e cada instrução é executada em um ciclo. vamos falar sobre ciclo de máquina. Disto resultam quatro períodos que receberão o nome de: “Q1. o ciclo de máquina é o nome das 4 fases Q1. portanto. que faz com que em um ciclo máquina ele busque a instrução e em outro ele a execute.11 Ao usarmos um cristal de 4MHz teremos uma freqüência de 4MHz e o período de: T=1 F = 1 = 250ns ou 250 nano segundos 4. pois. Para executarmos uma instrução. µ A forma mais fácil de sabermos o tempo que uma instrução leva para ser executada é pegar a freqüência do cristal ou oscilador externo. Q2. Q2. Q3 e Q4. enquanto uma é executada outra ao mesmo tempo é buscada na memória.000. dividir por 4 e calcular seu período. Ciclo de Máquina: O microcontrolador PIC pega o sinal de clock e o divide internamente por 4. 7. . Q3 e Q4. Q3 e Q4”. Freqüência da instrução = freqüência do xtal 4 Freqüência da instrução = 4MHz = 1MHz 4 Tempo ou período para executar a instrução = 1 = 1µs 1MHz O PIC usa um recurso chamado de “Pipeline”. 250ns. Resumindo. estes 4 tempos somados: Q1 + Q2 + Q3 + Q4 = 250ns + 250ns + 250ns + 250ns = 1µs Vemos.25 segundos. o PIC precisa passar por Q1.000. ou seja.000 Ou 0.1. Podemos também dizer que o clock de 4MHz é igual à freqüência de 1 MHz. Isto é uma característica da estrutura Harvard que permite o pipeline de uma forma fácil. uma instrução demora para ser executada. cada período destes “Qs” será igual ao período do clock externo. Agora que já conhecemos o clock. Q2.

12
Você pode estar pensando que todas as instruções, usando um cristal de 4MHz, demorarão 1µs µ para serem executados, mas, instruções que geram “saltos” dentro do programa gostam mais de 1µs, pois precisam de dois ciclos de máquina. Gastarão, então, 2µs. µ µ Você também pode estar pensando que 1µs é um “tempo muito pequeno”, mas, se você for µ construir, por exemplo, um gerador de barras para monitor ou TV, com um ciclo de máquina de 1µs poderá ter problemas. O que fazer então? Usar um PIC 16F628-20, por exemplo. Com um µ cristal de 20 MHz teremos o período de execução de cada instrução. Freqüência da instrução = 20MHz 4 = = 5MHz

Período para executar a instrução

1 = 200ns 5MHz

ou 200 nano segundos ou 0,000. 000.2 segundos. Desta forma ficou muito mais rápido. Você não acha? Agora que já vimos osciladores, clocks e ciclos de máquinas vamos ver os tipos de osciladores que estes PICs aceitam. XT – cristal ou ressonador com freqüência maior do que 200 kHz e que vá até 4MHz. HS – cristal ou ressonador com freqüência acima de 4Mhz. Neste caso a freqüência máxima será definida pelo PIC. LS – cristal ou ressonador com freqüência abaixo de 200 khz. Pausa: você sabia que existem cristais que oscilam em 15 khz? RC_CLKOUT – oscilador RC externo que deve estar ligado no pino 16. No pino 15 teremos este sinal dividido por 4.

RC_I/O – Oscilador externo mais que usa o pino 15 como I/O. Neste caso não teremos no pino 15 Fo ÷ 4, pois ou ele faz uma coisa ou outra. Isto só é válido para o PIC 16F28 (*relativo ao PICs que estamos estudando neste livro). INTOSC_I/O – oscilador interno com o pino 15 operando como I/O (*só é válido para o 16F28). EC_I/O – usado com clock externo e pino 15 funcionando como I/O (*válido para 16F628). RC – usando um circuito RC externo (# válido para 16F84). LP – usando cristal de freqüência abaixo de 200 kHz (# válido para 16F84). Estes tipos de osciladores recebem estes nomes, pois, é com eles que vamos trabalhar ao fazermos nosso software ou ao configurarmos o MPLAB para a gravação. Observe que algumas opções servem para os dois PIC estudados e outra apenas para alguns deles. Para facilitar vemos: * = válido para PIC 16F628 no nosso estudo. # = válido para PIC 16F84 no nosso estudo. Reescrever: PIC 16F84 – osciladores: XT

13
LP HS RC PIC 16F628 – osciladores: XT LS HS RC_CLKOUT RC_I/O INTOSC_I/O INTOSC_CLKOUT EC_I/O

Normalmente eu uso na prática ou no hardware, como queiram, cristais de 4 MHz com capacitores de 15pF. Caso você use capacitores acima de 33pF com um cristal de 4 MHz o oscilador poderá não funcionar adequadamente (o valor da XC será muito baixo e atenuará muito as oscilações do cristal). Com cristais de 20 MHz eu uso capacitores de 15pF e nunca tive problemas. Na hora de comprar os capacitores opte por capacitores de disco cerâmicos ou capacitores plate. Não vá fazer um software e um hardware que use um cristal de 20 MHz e na hora de gravar o PIC usar opção XT que é para cristais de até 4 MHz. Se você fizer isto, não aparecerá erro na gravação, mas, o seu circuito hora funciona, hora não. Eu sei disto na prática pois também erro. Nunca confunda a hardware com o software, quando falamos no componente cristal de 4 MHz ou de 20 MHz no capacitor cerâmico ou plate, estamos nos referindo ao hardware, a placa de circuito, ao cheiro da solda, a bancada. Quando nos referimos a XT, LP, RC_I/O, entre outros, estamos nos referindo ao software. Mas, especificamente ao comando ou diretriz que devemos incluir no software para que o projeto funcione. Na prática, se usarmos no nosso hardware, um componente chamado de cristal, com freqüência de 4 MHz, feito de cristal, envolto por metal e com dois terminais, devemos usar XT no nosso software. Dica: Fazer experiências com uma placa padrão já pronta é muito mais fácil que desenvolver o software e a hardware para uma determinada aplicação. Estudar eletrônica é muito importante e, como disse anteriormente, ler bons livros de eletrônica, é realmente muito importante em nossa área. Ao menos leiam todos os apêndices existentes neste livro.

Capítulo 8

O WATCH DOG
Como eu já havia dito anteriormente neste livro, o watch dog é um timer ou temporizador independente do clock do PIC ou de qualquer outro componente externo. Ele sempre esta contando e o seu tempo total de contagem é de, aproximadamente, 18ms. Este tempo pode variar de acordo com a temperatura e flutuação na alimentação (olha o ripple novamente). Mas, o importante é saber que quando o tempo de contagem excede 18ms, ele estoura (daí você vê uma pequena fumaça subindo da bancada), ou melhor, dizendo, ocorre um overflow e ele reseta o PIC e assim o programa começa tudo de novo.

14
A função dele é evitar que algum travamento no programa, causado por hardware ou software, seja resolvido depois de um reset do microcontrolador. Imagine um dimmer (controlador de intensidade luminosa) constituído com um PIC. Em determinado momento um pico de energia faz com que a luz, que estava bem fraquinha, fique com o seu brilho máximo devido há um “travamento” do PIC. O watch dog “reseta” ele e o brilho volta ao normal se o seu programa foi feito para isto. Isto apenas é um exemplo, imagine a importância do watch dog em sistemas ligados à segurança. Mas, meus programas vão ficar limitados a rodarem em 18ms? É claro que não. Basta você usar a instrução CLRWDT, e o registrador WDT, que faz a contagem da watch dog, será resetado e não acontecerá o overflow nem o reset do PIC. Mas, se o seu programa travar, ele não passará por esta instrução e o overflow acontecerá. A instrução CLRWDT é extremamente útil quando precisamos criar sub-rotinas de tempo, traduzindo para o português correto, ela é importante se pretendermos fazer um timer com o PIC. O watch dog pode ser ligado ou desligado, ou melhor, dizendo, pode ser ativado ou desativado em apenas duas condições: - com uma linha de comando no cabeçalho do programa; - na hora da gravação do PIC. Se você usar a instrução sleep (acorda o meu filho ou filha) e se acontecer um estouro, o microcontrolador retornará na instrução seguinte ao sleep. Você pode associar o watch dog ao prescaler, que é um divisor ajustável, e aumentar o período dele para até 2,2 segundos aproximadamente (não tenho cronômetro). Vamos estudar o prescaler daqui a pouco. Agora vamos salientar que apenas duas instruções zeram o watch dog e fazem com que ele recomece a contar. As funções são: SLEEP ⇒ zera o watch dog e coloca o PIC em modo econômico. CLRWDT ⇒ zera o watch dog evitando o overflow ou estouro e o reset do PIC.

Capítulo 9
O PRESCALER
Antes de tudo o prescaler é um divisor. No caso dos PICs é um divisor que pode ter o seu fator de divisão ajustado. O prescaler que é um divisor pode ser atribuído, ou seja, pode estar conectado ao TMR0 (timer 0) ou ao watch dog. Para definirmos isto precisamos atribuir um valor ao bit 3 ou flag 3 do registrador Option. Se o valor do bit 3 for 1 a prescaler estará ligado e dividindo a contagem do watch dog. Se for 0 o prescaler será atribuído ao TMR0. Podemos perceber a importância dos registradores, vamos estudá-los mais profundamente em um próximo capítulo. Tudo ao seu tempo.

. teremos um fator de divisão. Ele trabalha junto com o PC que é o programa Counter ou Contador de Programa.nível 3 ⇒ 3ª chamada call. e a máxima divisão do watch dog será por 128.nível 7 ⇒ 7ª chamada call. . O stack nesta família de PICs não é acessível ao programador. não podemos ter mais de 8 instruções de desvio acontecendo ao mesmo tempo. . .nível 6 ⇒ 6ª chamada call. Basicamente falando o PC conta as linhas do programa que estão sendo executadas e seu funcionamento é praticamente transparente ao usuário ou ao programador.nível 5 ⇒ 5ª chamada call. Capítulo 10 STACK O stack consiste em uma pilha com oito posições diferentes.nível 2 ⇒ 2ª chamada call. pois as chamadas acima da oitava serão armazenadas sobre as outras e aí o programa não saberá para onde ir. Nas nossas experiências iremos “ver” estas divisões na prática.nível 4 ⇒ 4ª chamada call. PS1 e PS0. após realizar a subrotina. sucessivamente. Também podemos perceber que a máxima divisão do Timer0 será por 256.terminada a 8ª chamada este espaço ficará vago. . o PC armazena o valor PC+1 na Stack. A mesma coisa acontece quando usamos interrupções. Sua função é armazenar a posição em que o programa parou ou foi desviado. para executar uma sub-rotina e fazer o programa voltar para a posição imediatamente seguinte. . .nível 1 ⇒ 1ª chamada call. . Também podemos dizer que ele tem oito níveis diferentes.15 O bit 0. Podemos perceber que de acordo com os valores nas posições PS2. isto para saber em qual linha do programa deve voltar. Você pode ler ou escrever o valor nestes flags do registrador Option. O bit 2 tem o nome de PS2. . Como temos apenas 8 níveis. Estes bits tem nomes próprios. Já aviso que esta taxa é diferente para a watch dog e para o TMR0. Toda vez que uma instrução Call é usada. . o bit 1 e o bit 2 do registrador Option definem a taxa de divisão do prescaler. vamos vê-los: O bit 3 recebe o nome de PSA. O bit 1 tem o nome de PS1. Os oitos níveis no Stack são montados da seguinte forma: . A pilha é montada de baixo para cima e desmontada de cima para baixo.nível 8 ⇒ 8ª chamada call. O bit 0 tem o nome de PS0.terminada a 7ª chamada este espaço ficará vago e assim.

2 – instrução 2. Para carregarmos o registrador W usamos as instruções: MOVWF e MOVLW. Capítulo 11 O PC O PC. Caso o Stack esteja cheio e uma chamada seja feita. e o seu programa também. 5 – instrução 5. As únicas instruções que tem acesso à pilha são Call. a instrução return saberá. ou seja. pois é através dele que fazemos diversas partes de um programa. chamada de XX. Usou interrupção. A instrução “GOTO” não armazena endereço no Stack. a instrução 4 + 1. ele “fica mais importante”. Caso desejamos colocar um determinado valor em um registrador de uso geral (GPR). Quando temos uma instrução Call ou uma interrupção. 7 – instrução 7. graças ao PC e ao Stack que deverá voltar para a posição 5. É através dele que carregamos os outros registradores com valores diversos e corretoss para um perfeito funcionamento de nosso projeto. Um Call e uma interrupção guardam endereços de retorno no Stack. o endereço que estava no nível 1 já era. o nível 1 já era. Retlw e Retfie além da interrupção. deixe um nível vazio no Stack. 6 – instrução 6. considere a pilha com apenas 7 níveis. que é igual a 5 será armazenada no Stack e quando terminar a sub-rotina. ou melhor. Veja no exemplo a seguir: 1 – instrução 1. O nome registrador W vem de “Registrador Work”. é muito importante prestar atenção em quantas chamadas se está usando. . quer dizer trabalho. primeiro temos que “carregar” o registrador W e depois passar para o outro registrador. Se você for usar interrupções em seu programa. haverá um estouro da pilha e o seu programa não funcionará. O PC não voltará para o lugar correto ao chegar ao nível 1. Return. ou contador de programa e é o responsável pela seqüência exata da execução das instruções dos programas. 4 – Call XX -> instrução 4 ⇒ nesta hora o valor PC+1 é armazenado no Stack. sigla para “Program Counter”. 3 – instrução 3. Capítulo 12 O REGISTRADOR W O registrador W é extremamente útil no PIC. que traduzindo.16 Como na série 16 dos microcontroladores PIC não podemos ver o estado da pilha. pois se não fizer isto e acontecer uma interrupção com os 8 níveis ocupados.

e normalmente. porém quando desejamos alterar ou ajustar o valor de uma ou mais flags em uma registrador de 8 bits o mais fácil é usar o binário. de uso geral. que vai de 32 a 128 no banco 0 o que dá 96 bytes. binário ou hexadecimal. são indicados pela letra f (minúsculo). exemplo: 128 em decimal é igual a 10000000. Temos assim o valor de 96 + 80 + 47 bytes disponíveis no PIC 16F628. que pode receber um nome. O ideal é darmos um nome a este registrador. As siglas significam o seguinte: GPR = General Purpose Register = Registrador de Propósito Geral (mais fácil -> Registrador de Uso Geral). você saberia como estariam os bits se coloca-se no “INTCON” o valor 154 em decimal? . além dos registradores W.17 Capítulo 13 CATEGORIA DE REGISTRADORES Os microcontroladores PICs possuem dois tipos de registradores. f = file register = Registrador de Arquivo. SFR = Special Function Register = Registrador para Funções Especiais. Temos um espaço de memória RAM. por exemplo. O mais comum para nós é o decimal. estes registradores são chamados de “GPR e SFR”. Importante: Um registrador é um endereço na memória RAM. o que dá 47 bytes para o PIC 16F628. Temos um espaço na memória RAM. Normalmente se usa “f” tanto para identificar registros “SFR” como “GPR”. Como os microcontroladores usados são de 8 bits o registro pode ter um valor entre 0 a 255 em 8 decimal (2 = 255) ou de 0000 0000 a 1111 1111 em binário ou de 0 a FFH em hexadecimal. No caso do PIC 16F84 ou do 16F628. Em binário fica mais fácil visualizarmos o estado de cada bit. Todo registrador pode assumir um valor entre 0 a 255 em decimal. de uso geral. que vai de 12 a 79 em decimal ou 0CH a 4FH em hexadecimal o que nos deixa um espaço de 68 bytes para o PIC 16F84 no banco 0 espelhado no banco 1. este registro tem que estar em uma posição da memória entre 0 a 127 em decimal ou 0000 0000 a 0111 1111 em binário ou 0 à 7FH em hexadecimal. temos um espaço de 160 a 240 no banco 1 o que dá 80 bytes e de 288 a 335 no banco 2. eles estão implementados dentro da memória RAM. em binário que é igual às 80H. Também é importante perceber que podemos definir um endereço ou uma variável em decimal. Um registro é um endereço de memória. Ao contrário do registrador W.

o binário ou o hexadecimal. Capítulo 14 DECIMAL / HEXADECIMAL / BINÁRIO No capítulo anterior vimos duas coisas raras e importantes. 2º) Transforme a parte inteira do resultado em hexadecimal. Melhor dizendo. No caso do PIC 16F84 estes registradores de uso geral se limitam a 15. precisamos avisar o microcontrolador em qual base vamos trabalhar. O número máximo de registradores de um microcontrolador irá depender do tipo de microcontrolador. 1F9H = 9 + (15 x 16) + (1 x 256) 1F9H = 9 + 240 + 256 1F9H = 505 em decimal.875) = 14 = E 4º) 254 decimal = FEH O valor 255 em decimal corresponde a quanto em hexadecimal? . os bancos de memória. Mas. e para transformarmos decimal em hexadecimal como faremos? Existem algumas formas. Neste capítulo estudaremos as bases numéricas. se você tiver uma calculadora científica.875 2º) 15 = F 3º) (16 x 0. o STATUS) e os GPR que são registradores de uso geral e normalmente “criados” pelo programador. por exemplo. No próximo capítulo estudaremos os bancos da praça. Exemplos: O valor 254 em decimal corresponde a quanto em hexadecimal? 1º) 254 / 16 = 15. Mas. Vamos estudar algumas conversões (à direita e a esquerda. 4º) Junte as duas partes e tá aí o resultado em hexadecimal. Cabe lembrar que teremos os registradores SFR que definirão as características de funcionamento do microcontrolador (como exemplo podemos citar o INTCON. com esta função. deixando a graça de lado. vamos ver uma forma simples: 1º) Pegue o valor em decimal e divida por 16. Mas.18 Podemos escrever nosso programa usando como base numérica o decimal. o TRISA. O resultado em decimal é a somatória deles todos. sempre com o uso da seta). é bico. 3º) Pegue a parte fracionada e multiplique por 16. Uma delas é a base numérica e a outra são os bancos de memória. o octal.

Exemplo: 505 / 16 = 31. F com F 2º) 1 = 1 3º) (16 x 0.9375) = 15 = F 4º) 255 em decimal = FFH Quanto vale 18 em hexa? 1º) 18 / 16 =1.125 ⇒ junte os dois. Portanto 505 em decimal corresponde a 1F9 em hexadecimal.5625) = 9 31 / 16 = 1.9375) = 15 = F 1 Juntando as três partes teremos o número 1F9H. 1 com 2 .875 ⇒ (16 x 0.125) = 2 1 Juntando os três temos 12CH. Veja os exemplos a seguir: 300 / 16 = 18.9375 ⇒ (16 x 0.75 ⇒ (16 x 0.75) = 12 = C 300 / 16 = 1.19 1º) 255 / 16 = 15.5 ⇒ (16 x 0. Portanto 300 em decimal corresponde a 12 CH em hexadecimal. Exemplo: 1000 / 16 = 62.5625 ⇒ (16 x 0.875) = 14 = E ⇒ junte os dois.125 ⇒ (16 x 0. Exemplo: / 16 = 3.125) = 2 4º) 18 = 12H Caso o resultado do lado esquerdo da vírgula (parte interna) seja maior do que 16 será necessário dividir esta parte por 16 novamente.5) = 8 62 3 Juntando os três números na duração indicada pela seta teremos o número 3E8 em hexadecimal ou 3E8H que corresponde a 1000 em decimal.9375 2º) 15 = F 3º) (16 x 0.

a finalidade de tanto é fazer você perceber uma lógica entre estas conversões e ver que com uma calculadora comum tudo isto é muito fácil. Usando esta tabela. antes vamos perceber o seguinte: 2 = 1 ⇒ dois elevado a zero é igual a um. esta diretriz recebe o nome de radix. devemos elevar a base 2 a potencia correspondente e multiplicar por 1 ou 0 dependendo da posição do número e/ou valor em binário. Veja por este exemplo. 1 2 = 2 ⇒ dois elevado a um é igual a dois. Mas.9375) = 15 = F / 16 = 1.20 4096 / 16 = 256. que quanto o resultado é apenas inteiro (sem parte após a vírgula) o número 16 deve ser multiplicado por 0. Uma forma simples de perceber a relação entre decimal e binário é através do uso de uma tabela.0 ⇒ (16 x 0) = 0 256 / 16 = 16. o zero (0) e o um (1) e todos os números serão representados por um conjunto de “zeros” e “uns Vamos fazer a tabela da verdade e falar um pouco sobre ela.9375 ⇒ (16 x 0. 3 2 = 8 ⇒ dois elevado a três é igual a oito. Como a base do binário é 2 só teremos dois dígitos. temos que perceber o seguinte: para encontrarmos o valor em decimal de um número em binário. que pode receber o nome da tabela da verdade. 5 2 = 32 ⇒ dois elevado a cinco é igual a trinta e dois.0 ⇒ (16 x 0) = 0 16 1 4096 em decimal é igual a 1000H em hexadecimal. Exemplo: 4095 / 16 = 255. 2 2 = 4 ⇒ dois elevado a dois é igual a quatro. Agora chega de exemplos. 4 2 = 16 ⇒ dois elevado a quatro é igual a dezesseis.9375) = 15 = F 255 / 16 = 15. Agora vamos ver como passar de binário para decimal e vice-versa.9375 ⇒ (16 x 0. podemos transformar qualquer número entre 0 a 16 em decimal em binário. Exemplo: 0 . No cabeçalho de um programa com um PIC teremos uma diretriz que indicará com que base o programa trabalhará.0 ⇒ (16 x 0) = 0 15 = F 4095 em decimal é igual à FFFH. Vimos que em decimal a base é 10 em hexadecimal a base é 16 e em binário a base será 2.

O resultado é igual a 145 em decimal.5 ⇒ (2 x 0. devemos pressupor que a parte fracionária é “0” e multiplicar 2 por 0. não acontece. x É importante saber qual o resultado do valor de 2 elevado a “x” (2 ). Quando houver uma parte fracionária. veja: Exemplo: 8 em binário é igual a: 8 / 2 = 4 ⇒ (2 x 0) = 0 4 / 2 = 2 ⇒ (2 x 0) = 0 2 / 2 = 1 ⇒ (2 x 0) = 0 1 8 em decimal = 1000 em binário. Lembre-se de que o primeiro “x” será “0”. Se quisermos colocar em uma porta o valor 32 em decimal. basta carregar na mesma o valor 10000 em binário. Devemos fazer isto até o resultado ser fracionário. devemos multiplicar por 2. Podemos perceber que todo número é múltiplo de dois. Podemos perceber que não é necessário se multiplicar os números por 0 (zero).21 100100 é igual a quanto em decimal. ou melhor. no caso dos registradores dos PICs estudados poderemos ter um número de 8 bits ou 1 byte. Exemplo: 17 8 2 2 1 10001 em binário = 17 em decimal. o número seria assim: 00010000 Para convertermos um número decimal em binário precisamos dividir este número por 2. Mas. onde “x” é um número que corresponde à posição do digito. Também é bom lembrar que qualquer número elevado à zero é igual a 1. O resultado é igual a 32 + 4 = 36 em decimal. como a porta pode ter 8 bits (lembre-se em consideração a port B). como calcular: O resultado é: 128 + 64 + 8 + 4 = 204 em decimal. Enquanto isto.5) = 1 / 2=4 ⇒ (2 x 0) = 0 / 2 = 2 ⇒ (2 x 0) = 0 / 2 = 1 ⇒ (2 x 0) = 0 . / 2 = 8.

em um programa.5 ⇒ (2 x 0. Chamamos de banco de memória de controle. No PIC 16F84 existem 2 bancos de memória e no PIC 16F28 existem 4 bancos.5) = 1 127 / 2 = 63.22 Exemplo: 255 / 2 = 127. Trisb e etc.5 ⇒ (2 x 0. Este espaço recebe o nome de “memória de controle”. . registradores que estão no banco 1 e registradores que estão nos dois bancos.5) = 1 63 / 2 = 31.5) = 1 31 / 2 = 15. pois os registros que ocupam estas posições controlam o funcionamento e a comunicação do PIC. .5 ⇒ (2 x 0. como o Option. Status. isto pode ajudar na programação. Junto com o banco de memória de controle há um espaço de memória de dados.5 ⇒ (2 x 0.hexadecimal = base hexadecimal composta de 16 dígitos de 0 a F.5 ⇒ (2 x 0.5 ⇒ (2 x 0. um espaço na memória RAM que é reservado para os registros para funções especiais.5) = 1 35 / 2 = 7.5) = 1 / 2 = 1. Trisa. Intcon. É neste espaço que colocaremos as nossas “variáveis”. Podemos perceber que existem registradores que estão no banco 0.5 ⇒ (2 x 0.5) = 1 Capítulo 15 BANCOS DE MEMÓRIA DE DADOS E CONTROLE DO PIC 16F84 Será que isto é um velho banco de praça. / 2 = 3. se repetir uma mesma informação (um registrador guarda uma informação) em dois ou mais endereços diferentes. Muitas vezes precisamos. Isto pode parecer estranho.binário = base binária composta por 2 dígitos de 0 a 1. . mas. Resumo: .decimal = base decimal composta de 10 dígitos de 0 a 9. onde um velho homem se senta para lembrar o passado? Acho que não.5) = 1 7 3 1 1111111 em binário = 255 em decimal Quando a parte inteira da divisão é igual a 1 (ou menor do que 2) terminaram as divisões e este 1 fará parte do conjunto. Muitos registradores especiais estão presentes em mais de um banco.

ou seja. também estará na posição 140 em decimal do banco 1. convém lembrar que algumas pessoas podem chamar estes flags de “chaves”. Nesta memória é que escreveremos os programas.384 combinações diferentes de bits. dependendo do PIC. A memória de programa. É importante lembrar. Para mudar de um banco para outro. é FLASH e não perde as informações quando a alimentação é cortada. É bom lembrar que o “F” do PIC 16F84 quer dizer que na memória de programa deste PIC é Flash ou EE-FLASH. Também é importante lembrar.23 mudar de banco para pegar uma informação que está em outro banco. que ela está dividida em bancos devido à construção interna do PIC. ela tem 14 bits. vai do endereço 12 em decimal até 79 em decimal o que dá um espaço de 68 bits. que esta memória guarda dados de 8 bits por endereço ou 1 byte por endereço. Mas. Capítulo 16 MEMÓRIA DE PROGRAMA DO PIC 16F84 A memória de programa pode ter 12. No PIC 16F84. . Vamos repetir para decorar. Teremos nele os bancos: . sem stress. . A esses 14 bits damos o nome de “Word” (Palavra).384 bits. mas. se a alimentação for cortada. e o espaço do banco 1? Como está escrito este espaço é um espelho do espaço correspondente no banco 0. ou seja. teremos 16. O banco onde normalmente o “PIC deve estar” quando um programa é rodado é o banco 0. uma informação caso estiver na posição 12 em decimal do banco 0. ou seja. 14 Com 14 bits o número máximo de bits será igual há: 2 = 16. Capítulo 17 BANCOS DE MEMÓRIAS DE DADOS E CONTROLE DO PIC 16F628 Neste PIC teremos 4 bancos e memórias ao invés dos 2 bancos do PIC 16F84. não ache. normalmente em PICs reagraváveis. . tenha certeza. em decimal (xxd) e em binário (xxb) para que você vá se acostumando com estas três formas de numeração que são comuns em circuitos digitais micro-controlados. Indicamos os endereços da memória em hexadecimal (xxH).14 ou 16 bits.banco 0. cada endereço da memória de programa pode ter até 14 bits. A memória RAM usada para se gravar variáveis. Todos os valores nestes bancos estão armazenados em memória RAM.banco 2. ou seja. Caso você ache que já leu isto em alguma outra parte deste livro. estes dados se perderão.banco 1. Caso contrário perderíamos o programa cada vez que desligássemos o nosso circuito. usaremos flags em registradores especiais. apenas de uma forma natural.

Caso você já não tenha percebido. normalmente ocupa mais espaço. Isto se deve ao fato de que ele possui mais recursos que a 16F84. Este PIC possui mais registradores que o 16F84. Temos dentro dele dois comparadores que podem ser utilizados em diversas configurações e permite associar uma variação analógica de uma tensão ao processamento digital feito pelo PIC. mais 80 bytes no banco 1 e 48 bytes no banco 2.24 . Perceba também que você terá 2 elevado a 14 combinações diferentes em binário. 16. Capítulo 19 . é quem faz. Intcon. ou seja. Trisa. Podemos perceber que com o 16F628 podemos fazer programas maiores. Cmcon. ou um byte. outras que estão mais de um banco. Vrcon. Lembre-se que um byte é composto de 8 bits.. como o Option. caso ele precise ler ou escrever algum bit ou flag. Capítulo 18 MEMÓRIA DE PROGRAMA DO PIC 16F628 A memória de programa do PIC 16F628 é de 2K Words ou 2. Lembre-se que a memória FLASH não perde os dados quando a alimentação é cortada. Você que é o programador. às vezes.024 posições de 14 bits.. ele não faz isto sozinho. Perceba que com o 16F628 você terá 2. tudo começa com 0 (zero).048 endereços. em cada posição. para usarmos com nossas variáveis. Status.banco 3. precisamos mudar de banco para acessar determinado registrador. 0 e 1.384 possibilidades de 0 e 1 para colocar em 2. Eu aconselho. No total teremos 224 bytes de memória para nossas variáveis. A memória é dividida em bancos devido à construção interna do PIC. Olhando os 4 bancos de memória (do banco 0 ao banco 3) podemos perceber que existem registradores que estão em um banco. e que estes bancos guardam informações de 8 bits.048 posições de 14 bits. de algum registrador em algum outro banco ele deve ir ler ou escrever e voltar para o banco 0 (zero). utilizar somente a memória do banco 0 (zero). etc. em digital. Neste PIC temos 96 bytes de memória no banco 0 (zero). Devido à posição dos registradores nos bancos. Programas maiores acontecerão com certeza quando você ler o meu próximo livro sobre PICs. pelo menos ao começar a programar. durante um programa. Trisb. Lá você aprenderá a programar em C e verá que um programa em C. Mas.048 posições para colocar uma combinação de números em binário. Temos também. No 16F628 existem 4 bancos de memória. Um PIC normalmente trabalha no banco 0 (zero). primeiro vamos escovar os bits em Assembler. Chamamos de banco de memória de controle um espaço na memória RAM que é reservado para os registradores para as funções especiais. Toda esta memória é FLASH ou EE-FLASH. O PIC 16F84 tem uma capacidade de 1K ou 1. Mas.

Se você não ficar atento. Na memória de dados também ficam os registradores de controle.1. Vamos lá: Na memória de dados você colocará suas variáveis. portanto 8 bits. Um bit indicado por R/W ou L/E permite que você faça a leitura de seu valor ou que escreva um valor nesta posição. Por programa você pode chamar o conjunto de instruções em Assembler ou seu algoritmo como algumas pessoas gostam de dizer. Então: L/E quer dizer leitura e escrita. Em minha opinião a análise separada de cada bit é mais eficaz. composta por 8 bits e que cada bit deste recebe o nome carinhoso de flag. mas não a escrita. é assim que funciona. Capítulo 21 REGISTRADORES ESPECIAIS E MAIS UTILIZADOS NO PIC 16F84 E PIC 16F628 21. Com a análise destes bits podemos fazer nossos programas ficarem mais rápidos e eficientes. é apenas uma forma de enfatizar alguns conceitos. Este recurso facilitará muito a construção de um programa. Podemos ler ou escrever em um registrador bit a bit ou tudo de uma vez. poderá nem perceber isto tudo.Leitura e escrita que tem suas versões em português para L/E. dados e acessos a registradores. Registrador STATUS: Este registrador está diretamente associado à unidade lógica Aritmética. ou a já famosa “ULA”. Observe que seu programa não consistirá apenas das instruções. Um bit ou flag indicado por R permite apenas a leitura. Capítulo 20 UMA “GERALZÃO” SOBRE MEMÓRIA DE DADOS Como já deu para perceber o “geralzão” não é tão grande assim. Através dele conseguimos ver o estado da ULA. Perceba meu amigo leitor que de 7 até 0 teremos 8 posições. pois toda vez que você precisar daquele variável é só chamála pelo nome. Vamos ver o que cada bit representa: . também de variáveis. R/W quer dizer Read e Write . mas. Lembre-se que você só poderá escrever 0 (zero) ou 1 (um).25 UM “GERALZÃO” SOBRE MEMÓRIA DE PROGRAMA Basicamente memória de programa é o local onde você estará gravando o seu programa. Estas variáveis normalmente receberão nomes dados por você e ocuparão um determinado endereço. Gostaria de relembrar que um registrador é um endereço na memória de dados. mas.

Este flag é R. Como o 16F84 só tem os bancos 0 e 1. só permite que seja feita sua leitura.IRP −> este flag seleciona o banco de dados usado para endereçamento indireto (calma. Bit 4 .). ou seja. Se o seu valor for 0 (zero) estaremos usando os bancos 0 (zero) e 1 (um)./PD ou PD\ −> este bit se chama Power-down. Seu estado será 0 (zero) quando acorrer um estouro do Watch-dog. Podemos perceber que ele trabalha junto com o Bit 5: Bit 5 – RP0 −> seleciona os bancos no endereçamento direto.26 Bit 7 . ou seja. Permite a leitura e escrita. Bit 7 = 1 −> bancos 2 e 3. Bit 6 – RP1 −> este tem a função de selecionar os bancos no endereçamento direto. Bit 3 . Clrwdt ou ligou o circuito. permitem a escrita ou leitura./T0 ou T0\ −> este bit informa que ocorreu um time-out. Veja: RP1 0 0 1 1 RP0: 0 1 0 1 = banco 0 = banco 1 = banco 2 = banco 3 podemos perceber que temos 4 combinações em binário o que nos permite selecionar 4 bancos. mas. Lembre-se que o Watch-dog conta separadamente de tudo e que se você não quer que o tempo de contagem estoure e o seu PIC seja resetado. Seu estado será 1 quando você ligar o PIC. principalmente dentro de Loops. um programa não funcionará). deve apagar sempre o valor na Watch-dog. o 0 (zero) e o 1 (um). mandar o PIC fazer a instrução Clrwdt ou Sleep. Mas. Se o seu valor for 1 estaremos usando os bancos 2 e 3.. devemos manter RP1 sempre em 0 (zero). o banco 0 e o banco 1. use a instrução Clrwdt em seu programa.. por causa disto. Para que isto não aconteça. Mas ele serve para ver se você executou uma instrução Sleep ou Clrwdt. /T = 1 −> você usou as instruções Sleep. devemos manter este bit sempre em 0 (zero). Bit 7 = 0 −> bancos 0 e 1. /T0 = 0 −> estouro de Watch-dog seu programa foi resetado e voltará ao começo (muitas vezes. . Estes dois Flags são R/W. Ligar o circuito também é chamado de Power-up. desta forma nossa tabela fica assim: RP1 0 0 0 0 RP0 0 1 0 1 = banco 0 = banco 1 = banco 0 = banco 1 Só temos duas combinações e podemos acessar os dois bancos do 16F84. o que é isto? Isto significa que houve um estouro no tempo de contagem do Watch-dog ou que o Watch-dog já contou até onde consegue e resetou o PIC. Como no 16F84 só temos dois bancos. não quer dizer que você desligou o PIC.

Z = 1 −> demonstra que o resultado da última operação lógica ou aritmética foi igual a 0 (zero). pois só temos as posições de P0 a P7. Dizemos. é R/W. Z = 0 −> mostra que o resultado da última operação matemática ou lógica não foi igual a 0 (zero). Este registrador é muito importante e tem seu lugar garantido no cabeçalho do programa.Ajustado para banco 0 de memória. você verá que poderá utilizar um cabeçalho padrão para fazer os seus programas (com poucas modificações. . quando ele estiver rodando. deve chamá-lo sempre por seu nome. Este bit só permite a leitura. STATUS. Bit 1 – DC −> o nome deste bit é Digit Carry/Borrow. C = 1 −> houve um carry-out do bit 7 para o bit 8 (nona posição).T0\= 1. DC = 1 −> houve carry-out de 3º para 4º bit ou de P3 para P4. Bit 0 – C −> este bit se chama Carry/Borrow e ele indica que ocorreu um carry-out da posição P7 o do bit 7 para a posição P8. 0 and 1 é uma operação lógica. este flag assumirá valores de 1 e 0 muitas vezes. então ele é R. Este flag permite a leitura e a escrita. ou seja. 2 + 2 é uma operação matemática ou aritmética.1 anterior. mas. ou seja.27 /PD = 1 −> você executou uma instrução Clrwdt. 8 bits e esta situação ultrapassa este 8 bits C = 0 −> não houve um carry-out e está tudo normal. que houve um estouro. às vezes). dependendo do programa é claro. quando isto acontece. Mais para frente. . Outros bits estarão em estado desconhecido. portanto.PD\ = 1. Traduzindo quer dizer que seu valor se altera quando ocorreu a passagem de um bit da posição 3 para a posição 4. permite escrita e leitura. Veja a figura 21. veja que não há posição P8. Este bit e R/W. Durante um programa. Depois de um reset o registrador STATUS estará assim: . ou seja. Você pode usar este registro fora do cabeçalho do seu programa. . Com este bit podemos simplificar nossos programas e conferir resultados de instruções. Este Flag é R/W. Bit 2 – Z −> a função deste flag é sinalizar o 0 (zero). ou seja. DC = 0 −> não houve um carry-out. salvo raras exceções. A mesma regra se aplica para os outros registradores especiais. /PD = 0 −> você mandou o PIC dormir executando uma instrução Sleep.

28

21.2. Registrador OPTION ou OPTION-REG:
Como o nome diz, este registrador permite se escolher uma série de opções do microcontrolador. É através dele que configuramos o prescaler, o TMR0, como será aceita uma interrupção externa, como ficarão as pull-ups do Portb entre outras coisas. Ele normalmente é chamado de “Option-Reg", pois existem PICs com uma instrução chamada Option e se colocássemos só o nome Option, nosso programa poderia apresentar problemas. R/W é igual a L/E o quer dizer que estes flags permitem leitura e escrita. Você verá que no cabeçalho de qualquer programa irá ter que configurar este registrador. Vamos ver qual a função de cada flag ou bit deste registrador. Bit 7 – RBPU\ −> este Flag define como estão os resistores de pull-ups do Portb. Bit 7 = 0 = pull-ups habilitados. Bit 7 = 1 = pull-ups desabilitados. Mas, o que vem a ser pull-ups? O pull-up é um resistor que é colocado entre um pino do portb e o Vcc internamente. Mas, como esta ligação é interna não podemos vê-la, mas, podemos configurá-los. Fica assim então: Bit 7 = 0 = resistores ligados ao Vcc – configurados como entrdas. Bit 7 = 1 = resistores dos ligados da Vcc – configurados como saídas. Ele aceita leitura e escrita. Bit 6 – INTEDG -> Este flag define como será aceita uma interrupção externa. Se quando o nível subir ou se quando o nível descer no pino Rb0/INT. Este flag aceita leitura e escrita. Bit 6 = 0 = a interrupção é entendida quando o pino está em nível alto (Vcc) e desce (terra). Bit 6 = 1 = a interrupção é entendida quando o pino está em nível baixo (terra) e vai para nível alto (Vcc). Bit 5 – TOCS -> Este bit ou Flag define a fonte de clock do timer0. “Você verá alguns softwares neste livro e na Internet, que demonstram o funcionamento do timer 0”. Bit 5 = 0 = o timer 0 conta através do clock interno. Normalmente usamos esta opção. Bit 5 = 1 = o timer 0 conta através das mudanças de nível ou clock no pino Ra4/TOCKI.

29
Bit 4 – TOSE -> Define se o timer0 será incrementado na subida do sinal ou na descida do sinal aplicado em Ra4/TOCKI. Bit 4 = 0 = conta quando o sinal passa de 0 para Vcc, ou seja, sobe. Bit 4 = 1 = conta quando o sinal passa de Vcc para 0, ou seja, desce. Bit 3 – PSA -> Este Flag define com quem o prescaler estará ligado, internamente, no PIC. Mas, o que é um Prescaler? Se você já trabalhou com RF deve conhecer o famoso PLL, se não conhece, acesse o site www.luizbertini.net/dowload.html e “abaixe” a apostila de PLL, e saberá que, muitas vezes ele trabalha em conjunto com um divisor que é o famoso Prescaler. Um Prescaler é um divisor que pode ser fixo ou não. Normalmente um Prescaler é utilizado para se dividir uma freqüência e a forma de onda desta freqüência deve ser quadrada. Nos PICs o valor de divisão dos Prescaler podem ser alterados, mas, tudo dentro de certos padrões. Os flags responsáveis pela configuração do Prescaler são o PS2, PS1 e PS0. E eles são os bits ou flags bit2, bit1 e bit0. Todos eles permitem leitura e escrita. Veja seus nomes e posições: Bit 2 – PS2 – bit mais significativo. Bit 1 – PS1 – bit “do meio”. Bit 0 – PS0 – bit menos significativo. Com os três podemos manter uma tabela com oito possibilidades. Teoricamente eles seguem a divisão de acordo com esta tabela. Perceba que o timer 0 começa dividindo por 2. Depois de um reset este registrador estará todo em 1 (1 1 1 1 1 1 1 1), na seguinte configuração: RBPU\=1 = pull-ups desabilitados. INTEDG = 1 = interrupção na subida. TOCS = 1 = clock pelo Ra4. TOSE = 1 = incrementa o clock na descida. PSA = 1 = prescaler com o Watch-dog. PS2 = PS1 = PS0 = 1 = divisão de Watch-dog por 128. Veja que é importante saber o estado após o reset e reconfigurá-lo se necessário.

21.3. Registrador INTCON:
A função básica deste registrador é controlar as interrupções. Uma interrupção é um comando elétrico que pode ser externo ou interno e que obriga o microcontrolador a ir para um determinado

30
endereço da memória. Em programas simples poucas vezes usamos interrupções, mas, em programas elaborados elas são fundamentais. O registrador tem 8 bits ou 8 flags. R/W = L/E = que quer dizer que eles permitem leitura e escrita. As configurações destes registradores permitirão definir como o microcontrolador trabalhará com as interrupções. Conhecendo flag a flag o registrador INTCON. Bit 7 – GIE −> este bit habilita ou desabilita todas as interrupções. Caso a chave Ch1 esteja aberta, não importa a posição das chaves Ch2 a Ch6, que não circulará corrente (I) entre as pontas (A) e (B). É esta a função do GIE, mais ou menos. Bit 7 = 0 = todas as interrupções desabilitadas, nenhuma interrupção externa ou interna atua sobre o PIC. Bit 7 = 1 = permite que as interrupções funcionem de acordo com sua “setagem” ou programação. Bit 6 – EEIE -> gera uma interrupção no final da escrita do EEPROM ou E2PROM interna. Bit 6 = 0 = não tem interrupção após acabar a escrita. Bit 6 = 1 = tem interrupção após acabar a escrita. Fique esperto com este flag, pois você poderá não conseguir fazer um programa que grave no E2PROM funcionar, devido ao “detalhe” de se esquecer que, caso haja uma interrupção o PIC vai para outro endereço da memória. No PIC 16F628, ele recebe o nome de PEIE e monitora todos os periféricos (atenção). Bit 5 – TOIE −> interrupção gerada por estouro ou overflow do TMRO ou timer0. Esta é uma interrupção, ou no caso do nosso circuito, uma chave individual. Bit 5 = 0 = interrupção habilitada, tem um estouro no timer0, tem uma interrupção. Bit 5 = 1 = interrupção desabilitada. Bit 4 – INTE −> controle ou flag de controle da interrupção externa no pino Rb0/INT. Bit 4 = 0 = está desabilitada. Bit 4 = 1 = está habilitada. Bit 3 – RBIE −> controla interrupções por mudanças no Portb. Se estiver habilitada qualquer mudança de estado no portb será interpretada como uma interrupção. Só da Rb4 ao Rb7. Bit 3 = 0 = não entende mudança no portb como interrupção. Bit 3 = 1 = entende mudança no portb como interrupção. Bit 2 – TOIF −> este Flag indica que houve uma interrupção no timer0 por estouro ou overflow. Bit 2 = 0 = não ocorreu estouro e por isto não houve interrupção. Bit 2 = 1 = ocorreu estouro e por isto ocorreu o sinal de interrupção, mas, ele só será reconhecido se o bit 5 deixar.

São o PIE1 e o PIR1. mas os conheceremos depois. Este flag também deve ser “zerado” pelo seu software. Existem muitos outros registradores. vamos estar vendo aqui outros registradores não usados no 16F84. Bit 1 = 0 = não existe nenhum pedido e interrupção.. Releia o capítulo de registradores. mantém o estado que tinha antes do reset. Bit 1 = 1 = ocorreu pedido e interrupção.31 Quando ficar em 1. Dá para perceber que este registrador só cuida das interrupções. Bit 0 – RBIF −> indica mudanças do portb e interrupção do portb da Rb4 ao Rb7. Este bit também deve ser “zerado” pelo seu software. caso contrário. . o importante é saber o conceito. 1 = As interrupções habilitadas individualmente serão tratadas. como o PIC 16F628 tem EEPROM interna. Vamos ver primeiro o INTCON. Lembre-se. você deve zerar este flag através de seu software. que no 16F84. Capítulo 22 REGISTRADORES ESPECIAIS E UTILIZADOS NO PIC 16F628 Além do registrador STATUS e do OPTION ou OPTION_REG que são iguais ao da 16F84. Bit 1 – INTF −> indica que ocorreu uma interrupção externa através do pino Rb0/INT. Se era 1 fica 1 e se era 0 fica 0. 0 = Nenhuma interrupção será tratada. somos só aprendizes de feiticeiros. Calma gente. GIE: Habilitação geral das interrupções. Quando acontece um reset ele fica assim: Bit 7: 0 0 0 0 0 0 0 Bit 0 X Todas as interrupções desabilitadas e o bit 0 não é afetado. ele sempre ficará igual a 1. cada PIC pode ter registradores diferentes. Bit 0 = 1 = houve mudanças de nível de tensão em algum pino da portb do pino Rb4 ao Rb7. Ele é responsável pelas interrupções. comparadores internos e uma porta USART de comunicação serial o bit 6. neste registrador está associado há todos os dispositivos citados (é como uma chave geral) e teremos mais dois registradores para controlar as interrupções originadas deles. mas. era associada à EEPROM.. Bit 0 = 0 = não houve mudança de estado em nenhum pino do portb do Rb4 ao Rb7.

PIR1 −> sinalização. 1 = Interrupção externa habilitada. Ele sempre sinalizará se houver uma interrupção. Tenha claro isto: PIE1 −> habilitação. Este flag é a “chave geral” mais teremos mais dois registradores para dividir entre eles as interrupções dos periféricos. . Bit 6 = 0 = não habilitada. INTE: Habilitação de interrupção externa no pino Rb0. 0 = Não ocorreu evento da interrupção. Bit 6 – PEIE −> responsável pelas interrupções dos periféricos. T0IF: Identificação de estouro do TMR0: 0 = Não ocorreu estouro do TMR0. Bit 7 = 1 = habilitada.32 PEIE: Habilitação das interrupções de periféricos. 1 = Interrupção de TMR0 habilitada. 0 = As interrupções de periféricos não serão tratadas. Agora vamos nos concentrar no bit 6 que é o PEIE e que a faz a diferença entre o PIC16F84 e o PIC 16F628. Por periféricos chamamos a E2PROM. RBIF: Identificação da interrupção por mudança de estado nos pinos Rb4 a Rb7. Vamos ver o PIE1: Bit 7 – EEIE −> interrupção do final da escrita EEPROM. RBIE: Habilitação da interrupção por mudança de estado nos pinos Rb4 a Rb7. os comparadores a USART e os timers. O registrador PIE1 permite a habilitação e desabilitação das interrupções dos periféricos. 1 = Ocorreu evento da interrupção (este bit também deve ser limpo por voce). Bit 5 – RCIE −> interrupção da USART. 0 = Interrupção externa desabilitada. Bit 6 – CCIE −> interrupção dos comparadores. T0IE: Habilitação da interrupção de estouro de TMR0. 1 = Interrupção por mudança de estado habilitada. Bit 7 = 0 = não habilitada. 1 = Ocorreu estouro do TMR0 (este bit deve ser limpo por você via software). O registrador PIR1 é o sinalizador das interrupções dos periféricos. Bit 6 = 1 = habilitada. 0 = Interrupção de TMR0 desabilitada. 0 = Interrupção por mudança de estado desabilitada. 1 = As interrupções de periféricos habilitadas individualmente serão tratadas.

Bit 1 – TMR2IE −> habilitação da interrupção de estouro do timer 2 (este PIC tem o timer0.33 “USART” quer dizer: Universal Síncrono Assíncrono "Rx e TX” – Vulgo comunicação serial. Bit 2 = 1 = habilitada. Após o reset fica: Bit 7 Bit 6 Bit 5 0 0 0 Agora o PIR1: L/E = permitem a leitura e escrita. o Bit 5 e o Bit 4 precisam para isto. Bit 0 – TMR1IE −> habilitação da interrupção do estouro do timer 1 do PIC 16F628X. Bit 1 = 0 = não habilitada. Bit 5 = 1 = com recepção. Bit 7 = 1 = escrita terminou. Bit 6 – CMIF −> sinaliza mudança de estado nas saídas dos comparadores analógicos do PIC 16F62X. Bit 6 = 0 = não houve mudança na saída. e fazer um programa ou “algoritmo” mais “legal” ou objetivo. Bit 6 = 1 = teve mudança de nível na saída. Bit 0 = 1 = habilitada. Bit 3 – Unused (não utilizada). Bit 5 – RCIF −> indica a recepção de caractere na USART. Bit 4 – TXIE −> agora este flag habilita a transmissão (Tx) da USART. Bit 5 = 0 = sem recepção. Mas. Bit 4 = 0 = interrupção desabilitada. Bit 5 = 0 = não habilitada. Bit 2 = 0 = desabilitada. Bit 7 = 0 = escrita não terminou ou nem começou. Bit 1 = 1 = habilitada. Este registrador indica o que está acontecendo com os periféricos do PIC 16F628/PIC 16F627 e permite a você acessá-lo com seu software. Bit 5 = 1 = habilitada. o timer1 e o timer2). Sempre a indicação é feita pelo dígito 1. lembre-se disto. Bit 4 0 Bit 3 0 Bit 2 0 Bit 1 0 Bit 0 0 . Bit 0 = 0 = não habilitada. Bit 2 – CCP1IE −> este Flag habilita a interrupção do CCP (Captura/Comparação/PWM). Bit 7 – EEIF −> sinaliza o término de escrita na EEPROM (você pode usá-lo para comandar/controlar uma escrita na EEPROM quando fizer um programa). de outros SFRs (registradores). Bit 4 = 1 = interrupção habilitada.

1 = indica que ocorreu um power-up ou foram executadas as instruções CLRWDT ou SLEEP. Vamos ver. 10 = Banco 2 (100h – 17Fh). Bit 1 – TMR2IF −> indica estouro no timer2. Indicação de zero: 0 = indica que o resultado da última operação (lógica ou aritmética) não resultou em zero. o STATUS: IRP: Seletor de banco de memória de dados usado para endereçamento indireto: 0 = Banco 0 e 1 (00h – FFh). Bit 2 = 0 = sem captura ou comparação.34 Bit 4 – TXIF −> sinaliza transmissão da USART. Bit 3 – Unused (não utilizada) Bit 2 – CCP1IF −> sinalização de captura ou de comparação. RP1 e RP0 Seletor de banco de memória de dados usado para endereçamento direto: 00 = Banco 0 (00h – 7Fh). 01 = banco 1 (80h – FFh). 11 = banco 3 (180h – 1FFh). Bit 0 = 1 = houve estouro. Bit 0 = 0 = não houve estouro. Bit 2 = 1 = com captura ou comparação. 1 = Banco 2 e 3 (100h – 1FFh). /TO: Indicação de Time-out: 0 = indica que ocorreu um estouro do Watch-dog Timer (WDT). de novo. Bit 1 = 0 = sem estouro. Bit 4 = 1 = com transmissão. Indicação/Power-down: 0 = indica que a instrução SLEEP foi executada. 1 = indica que ocorreu um power-up ou foi executada a instrução CLRWDT. Bit 4 = 0 = sem transmissão. /PD: Z: DC: . Digit Carry/Borrow: 0 = A última operação da ULA não ocasionou um estouro de dígito. Bit 1 = 1 = com estouro “bum”. 1 = indica que p resultado da última operação (lógica ou aritmética) resultou em zero. Bit 0 – TMR1IF −> indica estouro no timer 1.

1 = Não ocorreu um Power-On Reset. isto é. PSA: Configuração de aplicação do prescaler: 0 = O prescaler será aplicado ao TMR0. o OPTION: /RBPU: Habilita pull-ups internos para o PORTB: 0 = Pull-ups habilitados para todos os pinos do PORTB configurados como saída. INTEDG: Configuração da borda que gerará a interrupção externa no RB0: 0 = A interrupção ocorrerá na borda de descida. /POR: Indicação de Power-On Reset (energização): 0 = Ocorreu um Power-On Reset. quando T0Cs = 1: 0 = O incremento ocorrerá na borda de subida de RA4/T0CK1. Vamos ver. o resultado ultrapassou os 8 bits disponíveis. T0CS: Configuração do incremento para o TMR0: 0 = TMR0 será incrementado internamente pelo clock da máquina. o resultado ultrapassou os 4 bits menos significativos. 1 = Pull-ups desabilitados.35 1 = A última operação da ULA ocasionou um estouro (carry) entre o bit 3 e 4. 1 = A interrupção ocorrerá na borda de subida. C: Carry/Borrow: 0 = A última operação da ULA não ocasionou um estouro (carry). Configuração de valor de prescaler: PS2/1/0 TMR0 EDT 000 1:2 1:1 001 1:4 1:2 010 1:8 1: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 PS2. /BOR: Indicação de Brown-Out Reset (queda de energia): . o tipo de oscilador interno e a falta de energia. PS1 e PS0: Agora o Pcon que indica a queda de energia. 1 = O prescaler será aplicado ao WDT. isto é. Utilizado quando se trabalha com números de 4 bits. de novo. 1 = 37 KHz. 1 = O incremento ocorrerá na borda de descida de RA4/T0CK1. PCON: OSCF: Freqüência do oscilador interno: 0 = 4 MHz. 1 = A última operação da ULA ocasionou um estouro (carry) no bit mais significativo. T0SE: Configuração da borda que incrementará o TMR0 no pino RA4/T0CK1. 1 = TMR0 será incrementado externamente pela mudança no pino RA4/T0CK1.

Controle de sincronismo interno. Habilitação do Timer 1: 0 = Timer1 desabilitado. TMR1L e TMR1H: T1CKPS1 T1CKPS0: Ajuste do prescaler do Timer1: 00 = prescaler de 1:1. Quando TMR1CS = 0 este bit é ignorado: 0 = Sistema de sincronismo ligado. T1CON. /T1SYNC: TMR1CS: TMR1ON: Trabalhando com o timer2. FSR e o INDF: Comandando o Porta. T1OSCEN: Habilitação do sistema de oscilação externa para os pinos T1OSO e T1OSI: 0 = Oscilador desabilitado. PORTA e TRISA: Comandando o Portb. o sistema é desligado. TMR0: Trabalhando com o prescaler. 1 = Timer1 habilitado. 1 = Ocorreu um Brown-Out Reset.36 0 = Não ocorreu um Brown-Out Reset. com o prescaler e com o postcaler. 1 = Clock externo no pino T1OSO/T1CK1. Caso exista um cristal externo. e timer1. 1 = Sistema de sincronismo desligado (modo assíncrono). 01 = prescaler de 1:2. 1 = Habilita oscilador externo. TMR2 e PR2: TOUTPS3 . Seleção da origem do clock para Timer 1: 0 = Clock interno (Fosc/4). PCL e PCLATH: Para endereçamentos indiretos precisamos deles. 10 = prescaler de 1:4. Paralisa o contador do Timer1. PORTB e TRISB: Verificando o timer0. 11 = prescaler de 1:8. Vamos ver o Pcl e o Pclath que trabalham diretamente com o PC Counter. T2CON. clock interno ou externo.

1001 = postscaler de 1:10. 0010 = postscaler de 1:3. Ajuste do prescaler: 00 = prescaler de 1:1. 1011 = postscaler de 1:12. 1101 = postscaler de 1:14.37 TOUTPS2 TOUTPS1 TOUTPS0: Ajuste do postscale: 0000 = postscaler de 1:1. Chave seletora de entrada do comparador: Quando CM2:CM0 = 001 0 = RA0 conectado a C1 VIN1 = RA3 conectado a C1 VIN+ Quando CM2:CM0 = 010 CIOUT: C2INV : C1INV: CIS: . 10 = prescaler de 1:16. TMR2ON: Habilitação do Timer2: 0 = Timer2 desabilitado. Tipo de saída do comparador 1: 0 = Normal. 0001 = postscaler de 1:2. 0111 = postscaler de 1:8. 0100 = postscaler de 1:5. 1010 = postscaler de 1:11. 1 = Inversa. 11 = prescaler de 1:16 T2CKPS1 T2CKPS0: Trabalhando com os comparadores internos. 1100 = postscaler de 1:13. 0110 = postscaler de 1:7. CMCON: C2OUT: Valor da saída do comparador 2: Normal (C2INV=0): 0 = C2 VIN+ < C2 VIN1 = C2 VIN+ > C2 VINInversa (C2INV=1): 0 = C2 VIN+ > C2 VIN1 = C2 VIN+ < C2 VINValor da saída do comparador 1: Normal (C1INV=0): 0 = C1 VIN+ < C1 VIN1 = C1 VIN+ > C1 VINInversa (1INV=1) : 0 = C1 VIN+ > C1 VIN1 = C1 VIN+ < C2 VINTipo de saída do comparador 2 : 0 = Normal. 01 = prescaler de 1:4. 0101 = postscaler de 1:6. 1111 = postscaler de 1:16. Paralisa o contador do Timer2. 1000 = postscaler de 1:9. 1 = Timer2 habilitado. 1 = Inversa. 0011 = postscaler de 1:4. 1110 = postscaler de 1:15.

CCP1CON. 1 = Circuito de VREF energizado. Pino de saída (RB3) será setado (1) quando o compare ocorrer. Pino de saída (RB3) será zerado (0) quando o compare ocorrer. 1 = Range alto. 1100 = PWM ligado. VRCON: VREN: Energização do sistema de tensão de referência: 0 = Circuito de VREF desenergizado. Seleção do valor da tensão de VREF: Se VRR = 1: VREF = (VR/24) * VDD Se VRR = 0: VREF = ¼ * VDD + (VR/32) *VDD VRON: VRR: VR3.38 0 = RA0 conectado a C1 VINRA1 conectado a C2 VIN+ 1 = RA3 conectado a C1 VINRA2 conectado a C2 VIN+ CM2. A parte alta fica em CCPR1L. Seleção do range de operação do sistema de VREF: 0 = Range baixo. 1101 = PWM ligado. compare e PWM. 0100 = Capture ligado para borda de descida com prescaler de 1:1. Habilitação da saída de VREF: 0 = Tensão de referência desligada. Pino de saída (RB3) não será afetado. 1000 = Compare ligado. 1010 = Compare ligado. 1001 = Compare ligado. TMR1 será resetado. Pino de saída (RB3) não será afetado. 1011 = Compare ligado.VR0: Capture. . 0101 = Capture ligado para borda de subida com prescaler de 1:1. CCPR1L e CCPR1H : CCP1X CCP1Y: CCP1M3 CCP1M2 CCP1M1 CCP1M0: Parte baixa do PWM de 10 bits. 0110 = Capture ligado para borda de subida com prescaler de 1:4. 0111 = Capture ligado para borda de subida com prescaler de 1:16. CM1 CM0: Configura a pinagem dos comparadores (modo de operação): Trabalhando com as tensões de referencia. Válido somente quando em PWM. Seleção do modo CCP1 – Compare/Capture/PWW: 0000 = Modo desligado. 1 = Tensão de referência ligada ao pino RA2.

1 = Inicia o ciclo de leitura (deve ser setado por software). 1 = Máster. Seleção entre modo assíncrono/síncrono: 0 = Assíncrono. 1 = TSR vazio. Ciclo de escrita na EEPROM: 0 = Este bit será zerado pelo hardware quando o ciclo de escrita terminar (não pode ser zerado por software). WREN: WR: RD: Com eles conseguimos nos comunicar. 1 = Transmissão em 9 bits. Valor a ser transmitido como 9º bit. a escrita foi completada. Habilitação da comunicação em 9 bits para a transmissão: 0 = Transmissão em 8 bits. a recepção tem prioridade sobre este bit. 1 = Habilita a escrita na EEPROM. 1 = Em erro ocorreu por uma escrita não terminada (um reset pode ter ocorrido). TXSTA e RCSTA: CSRC: Seleção entre Máster/Slave (somente modo síncrono): 0 = Slave. No modo síncrono.39 1110 = PWM ligado. 1111 = PWM ligado. 1 = Inicia o ciclo de escrita (deve ser setado por software). Ciclo de leitura da EEPROM: 0 = Este bit será zerado pelo hardware quando o ciclo de leitura terminar (não pode ser zerado por software). TX9: TXEN: SYNC: BRGH: TRMT: TX9D: . EECON1. EEADR e EEDATA: WRERR: Identificação de erro durante a escrita na EEPROM: 0 = Não ocorreu erro. 1 = Transmissão habilitada. Seleção para Baud Rate (somente modo assíncrono): 0 = Baud Rate baixo. Habilitação de escrita na EEPROM (bit de segurança): 0 = Não habilita a escrita na EEPROM. 1 = Síncrono. 1 = baud Rate alto. EECON2. Seleção do registrador interno de transmissão (TSR): 0 = TSR cheio. Falando da eeprom interna. Pode ser usado como paridade ou endereçamento. Habilitação da transmissão: 0 = Transmissão desabilitada.

1 = Estouro do limite de 3 bytes recebidos antes da leitura de RCREG (para limpar deve-se zerar o bit CREN). Stop bit = 1 1 = Ocorreu um erro. RX9: SREN: CREN: ADDEN: FERR: OERR: RX9D: Ainda nos comunicando. esperamos que você. Ajustando a velocidade de comunicação. 1 = Recepção unitária habilitada. Depois de receber um dado.MANUAL EXSTO A Exsto cedeu gentilmente. Introdução: Parabéns! Você acaba de adquirir um produto de alta qualidade e tecnologia de ponta. por isto citamos aqui o manual desta placa. SPBRG.40 SPEN: Habilitação da USART: 0 = USART desabilitada. 1 = recepção em 9 bits. adquirindo-a. 1 = Habilita sistema de endereçamento. para as simulações dos softwares escritos e usados neste livro. TXREG e RCREG. Valor recebido no 9º bit. 1 = USART habilitada. uma placa Pratic628. desliga-se automaticamente. Erro de Stop bit (somente modo assíncrono): 0 = Não ocorreu erro. Habilitação da comunicação em 9 bits para a recepção: 0 = Recepção em 8 bits. Pode ser usado Omo paridade ou endereçamento. tenha o seu estudo e aprendizado muito mais completo. Habilitação da recepção contínua: 0 = Recepção contínua desabilitada. Minas Gerais. A Exsto Tecnologia é uma empresa situada em Santa Rita do Sapucaí. Habilitação da recepção unitária (somente para modo síncrono em Máster): 0 = Recepção unitária desabilitada. O Pratic 628 será o grande auxílio no aprendizado e desenvolvimento com microcontroladores da linha PICMicro da Microchip. Stop bit = 0 (deve ser atualizado lendo o registrador RCREG e recebendo o próximo dado valido). conhecida como “Vale da Eletrônica” por seu destaque na indústria eletroeletrônica e pela excelência de suas . CAPÍTULO 24 TEORIA DA GRAVAÇÃO . Habilitação do sistema de endereçamento (somente modo assíncrono de 9 bits): 0 = Desabilita sistema de endereçamento. 1 = Recepção contínua habilitada. Erro de muitos bytes recebidos sem nenhuma leitura: 0 = Não houve problemas de estouro do limite.

ele é compatível com o clássico PIC16F84. Mostra mensagens relativas a vários comandos.br para conhecer outras soluções e produtos oferecidos.br onde estão disponíveis as atualizações. O software (em português) realiza basicamente as seguintes funções: ® Permite a edição de programas. Além disso. 2. O Pratic 628 é um ambiente de desenvolvimento composto por um hardware e software visa facilitar o aprendizado e desenvolvimento com microcontroladores das linhas PIC 16Xxxx utilizando especialmente o PIC16F628. Janelas: Através dos diversos menus é possível ter acesso ao todas as funcionalidades do sistema. Ferramentas. ® Grava os programas compilados no microcontrolador presente na placa principal. Neste sentido. vi. todos eles compatíveis pino a pino com o PIC16F628A. Informa o compilador utilizado. suporta trabalhar com os microcontroladores listados abaixo. incluindo funcionalidades de hardware e software. b) Escolha um diretório onde deseja salvar o projeto. iii. Informa a linha do cursor na janela de edição. Informa o processador que está sendo utilizado.com. c) Barra de status: i. além de maximizar as possibilidades de experimentos. Visite periodicamente o site www. Software Pratic 628: 1) Componentes da janela principal: Ao se abrir o programa tem-se a janela principal. que agrega periféricos avançados sem deixar de ser simples. 1. criando novas versões para trabalhar com os novos lançamentos em microcontroladores PIC suportados pela placa. ® Compila/Monta os programas. como mostrada abaixo com os seguintes componentes: a) Menus: Arquivo. ou através da barra ferramentas. Nossa missão é sempre fornecer as melhores ferramentas para o desenvolvimento e aprendizado em eletrônica e. PIC16F627 PIC16F627A PIC16F628 PIC16F628A PIC16F648A PIC16LF627A PIC16LF627A PIC16LF628 PIC16LF628A PIC16LF648A Além desses componentes. . iv. em especial. Este documento contém as principais características do Sistema de desenvolvimento Pratic 628 e visa ser o guia de instalação e utilização desse sistema. agilizando os seus acessos. CAPS LOCK. Visite nosso site www. permitindo assim realizar um grande número de montagem mesmo com um microcontrolador de poucas entradas e saídas. INSERT e NUM estão acionadas ou não. v. A escolha do PIC16F628 se deve a popularidade desse componente. 2) Como criar um novo arquivo: Para criar um novo arquivo siga os passos abaixo: a) No menu escolha Arquivo-Novo. ii. O hardware do Pratic 628 foi desenvolvido procurando disponibilizar o máximo de recursos possíveis ao PIC16F628. Editar.exsto. o kit contém diversos circuitos que são ligados ao microcontroladores através de jumpers.41 instituições de ensino. Mostra a hora atual do sistema. Indica se as teclas.exsto. a Exsto Tecnologia está em constante trabalho de atualização do software.com. b) Barra de ferramentas: As funções principais localizam-se nesta barra. Componentes Suportados: O Pratic 628. microcontroladores.

e) Em intervalos regulares de tempo. para alterá-las. A seleção de qual compilador é feita na opção Compilador da janela de configuração do compilador. iv. 5) Componentes da janela Resultados da Compilação: 6) Resultados da Compilação: a) Mostra a qualidade erros. ii. que não é fornecido. ou através da barra de ferramentas . salve o projeto através do menu Projeto – Salvar. o cursor irá até a linha referente à mensagem e irá selecioná-la inteiramente.: A partir deste ponto os erros. b) Lista todos os erros. Salve o arquivo no diretório desejado. mensagens e avisos contidos no arquivo fonte compilando. a linha onde se localiza no arquivo fonte. 3) Abrindo um arquivo existente: Para abrir um arquivo criado anteriormente. serão chamados somente de mensagens. aparecerá a janela Resultados da Compilação. b) A linha correspondente à mensagem na caixa de listagem ficará em azul. mensagens e avisos gerados pelo compilador. iii. mensagem ou aviso selecionado com o mouse. aparecerá um pequeno texto explicativo referente à mensagem selecionada.42 c) Digite o nome do arquivo. ou através da barra de ferramentas . listando todos os erros. 7) Interpretando e localizando os resultados da compilação: Para localizar a linha que se refere à mensagem gerada na janela Resultados de Compilação. o número. Para cada compilador há opções diferentes. indicando: i. siga os passos abaixo: a) No menu escolha Ferramentas – Configurações de Compilador. ficando entendido que se trata dos 3 tipos. b) O software pode trabalhar com duas linguagens de programação. Uma delas é o Assembly. conforme abaixo: a) Montador MPASM: . qual o arquivo a que se refere. Obs. b) Navegue até a pasta onde se encontra o arquivo e abra o arquivo desejado. a descrição. 4) Montando/Compilando arquivos: Para montar um arquivo em Assembly ou compilar um arquivo em C. d) Ao final da compilação. 8) Alterando as configurações de montagem/compilação: Algumas configurações podem ser alteradas ou adicionadas na linha de compilação executada pelo compilador. mensagens e aviso gerados pelo compilador. c) Comentário do erro. indicando a sua seleção. d) No menu escolha Arquivo – Salvar Como. b) No menu escolha Ferramentas – Compilar ou através da barra de ferramentas . c) Na janela de edição. siga os passos abaixo: a) No menu escolha Arquivo – Abrir. siga os passos abaixo: a) Clique na janela de edição do arquivo que deverá ser compilado. mensagens e avisos da compilação. d) Na caixa de comentário da mensagem da janela Resultados de Compilação. A outra é o C-CCS. utilizando o compilador C do fabricante CCS. utilizando o montador MPASM da Microchip fornecido juntamente no CD. ou ainda através da tecla de atalho F5. ou através da tecla de atalho F6. c) Uma janela de status do compilador aparecerá indicando o andamento do processo de compilação do arquivo. siga os passos abaixo: a) Clique na mensagem que desejar localizar.

caso esta janela esteja aberta. b) Compilador CCS. Permite o uso de Macros. Configuração de tabulação. Lê memória de programa do dispositivo. Base numérica padrão: decimal (DEC). colocando os dados nos endereços correspondentes na janela Memória de programa. Lê a memória de programa do dispositivo. Obs. 10) Executando comandos de gravação: a) Apagando: Lê toda a memória de programa. iii.: Para usuários do WinNT. iii. de acordo com os dados contidos na janela Memória de programa. siga os passos: a) No menu escolha Ferramentas – Programador. c) Verificar: i. Lê a memória de dados do dispositivo. 9) Trabalhando com placa de gravação: Para trabalhar o sistema de gravação. Se esta janela não estiver aberta. Permite checar se a versão do compilador é compatível com o gravador. Lê memória de dados do dispositivo. Obs. v. ii. Configurações de processador. ii. Win2000 ou WinXP. ii. ii. Caso essa opção seja selecionada “como I/O” o chip deve ser apagado antes de realizar uma regravação. Programa dos bits de fusíveis de acordo com a configuração escolhida. i. . Bits de configuração dos fusíveis. Diferenciação de letras maiúsculas. c) A janela Gravador possui os seguintes componentes: i. ou através da barra de ferramentas. caso esta janela esteja aberta. comparando com os dados contidos na janela Memória de dados. iv. iii. ii. de acordo com os dados contidos na janela Memória de dados. Programa a memória de dados do dispositivo. verificando se está apagada.hex” a ser gerado.: Caso se esteja utilizando os componentes PIC16F628/627 fica disponível a opção MCLR. iv. a memória de dados do dispositivo permanecerá inalterada. Comandos de gravação. iii. hexadecimal (HEX) ou octal (OCT). Escolha de processador.43 i. Indica o local onde se espera que esteja instalado o compilador. A linha que será executada com as opções selecionadas é mostrada logo abaixo na janela. Mostra a linha de comando que será utilizada para a execução do compilador. d) Ler: i. ii. Status de andamento do processo. ou ainda através da tecla de atalho F9. colocando os dados nos endereços correspondentes na janela Memória de dados. b) A janela Gravador aparecerá. comparando com os dados contidos na janela Memória de programa. b) Programar: i. Programa a memória de programa do dispositivo. tenha a certeza de que o software foi instalado para usuários que possuam as permissões necessárias para acessar a porta paralela do PC. Formato do arquivo “. vi.

24. iii.hex” de memória de programa. Buzzer. bits de configuração e Device ID. Circuito de gravação in-circuit. Dip Switch de oito chaves. 25. 13. memória de programa e dados. Chave de contador ou uso geral. 17. 15. c) A janela Memória de programa aparecerá.44 Lê os bits de fusíveis e reconfigura às opções mostradas na janela Gravador seção Bits de configuração. Na figura acima são enumeradas as principais aplicações de hardware. Para abrir o manual do arquivo basta clicar no ícone. 16. 11) Trabalhando com arquivos “. 23. listadas abaixo: 1. e) Apagar: Apaga todos os dados do dispositivo. de acordo com os bits lidos do dispositivo. Jumpers para configuração das funções do port B. 10. 22. . TRIAC. 3. 8. 3. iii. Conector de acesso ao portal A. 19. Conector de acesso ao portal B. Hardware A figura abaixo a placa didática Pratic 628 baseada no PIC16F628. 7. A instalação desse programa está no CD. Trimpot. Um relé.hex” separadamente de um projeto: É possível trabalhar abrindo e salvando arquivos “. 9. Chave de interrupção ou de uso geral. PIC16F628. Chave “Programar/Executar”. 12. 11. Para isso é necessário que o Acrobat Reader esteja adequadamente instalado no computador. Por exemplo para abrir um arquivo “. 20. 18. 2. b) Escolha o arquivo desejado. Estando os dados nas janelas de memória de programa ou de dados. 6. Conector paralelo DB25F (para gravação). Detector de cruzamento por zero. Dois displays de sete segmentos multiplexados. com o conteúdo do arquivo. pode-se gravar no dispositivo estes dados.hex” separadamente. Lê o Device ID. Jumpers para configuração das funções do port A. NTC (resistor variável com temperatura) com ajuste. siga os seguintes passos: a) No menu escolha Arquivo – Abrir programa (*. LDR (resistor variável com luminosidade) com ajuste. 4. 5.hex). Chave de reset ou uso geral. Circuito de alimentação. Conectores para acesso aos terminais do relé. Conector para fonte de alimentação externa. 14. 21. 12) Abrindo o manual do componente: É possível abrir o manual do microcontrolador que estiver sendo usado. Siga os mesmos passos para abrir um arquivo de memória de dados. neste caso aparecerá à janela Memória de dados contendo os dados do arquivo que foi aberto. Lâmpada incandescente. Oito Leds. incluindo.

RC interno e externo). contador). ® 10 interrupções. Está presente também um relé para ser acionado pelo microcontrolador. interrupção. de forma que o usuário pode interligar a placa aplicações desenvolvidas por ele mesmo. Abaixo dessas chaves está escrito na serigrafia da placa os pesos binários de cada bit do port A. ® Encapsulamento DIP de 18 terminais. a chave “1” se refere ao bit 0. Todo o circuito AC é opto-acoplado. Descrição do hardware: O sistema é baseado no PIC16F628A. O sistema possuirá chaves ligadas a terminais com funções especiais (reset. a chave “128” se refere ao bit 7. por um circuito já presente na placa. com o circuito de detecção de cruzamento por zero já incorporado. ou seja. que apresenta as características: ® 2048 palavras de 14 bits de memória de programa FLASH. ® Tensão de referência interna programável. A gravação do componente é feita in-circuit. de forma análoga ao Dip Switch. ® 3 Temporizadores/Contadores. ou seja. Esses circuitos são ligados ao microcontrolador por jumpers. Tanto o LDR como o NTC tem trimpots para ajustes. Há um conector de tipo KRE que permite o acesso aos terminais do relé. fornecidos separadamente. Isso significa que o componente não necessita ser retirado da placa para gravação. ® Módulo CCP (Captura/Comparação/PWM). o que torna o sistema extremamente maleável. basta apenas mudar a posição da chave RUN/PROG para “Programar” (PROG) e gravar. ® 2 Comparadores analógicos. um LDR (resistor controlado por luminosidade) e um NTC (resistor controlado por temperatura). A placa conta também com um circuito de controle de carga AC com TRIAC.1. conforme mostrado na figura abaixo. ® 224 bytes de memória de dados RAM. Dessa forma é aumentado consideravelmente o tempo de vida do componente. foi elaborado um conjunto de circuitos que permitisse uma grande gama de experimentos. ® Comunicação serial síncrona e assíncrona (USART). Conta também com dois displays de sete segmentos para apresentação de valores numéricos. HS. evitando o desgaste/quebra dos terminais. Para fazer uso dos módulos comparadores analógicos existem um Trimpot de Referência. Ambos podem ser acionados através de uma saída normal ou utilizando o módulo de PWM. Executar (RUN) Programar (PROG) Quanto aos aplicativos de hardware presentes na placa. mudar a chave para “Executar” (RUN) e rodar o programa gravado. ® 16 terminais configuráveis como entrada ou saída independente. Existem também oito LEDs que podem apresentar valores de oito bits ou serem acionados individualmente. e assim por diante. decorrente das retirada constante do microcontrolador da placa para gravação. . Além disso. Os LEDs possuem valores na serigrafia que indicam em qual pino do port B eles estão ligados. isolado da placa. ® Vários modos de oscilador (XT. A placa suporta ainda a conexão de um teclado e um display tipo telefônico. LP. ® 128 bytes de memória de dados EEPROM. PORT A Dip Switch PORT B LEDs Foram incluídos também um buzzer (buzina) e uma lâmpada incandescente.45 3. conforme mostrado a seguir. Para entrada de dados há também um Dip Switch (conjunto de oito chaves). Tais terminais também podem ser configurados como entradas normais. os terminais dos portais do microcontrolador estarão acessíveis em dois conectores.

A tabela a seguir traz os sinais associados a cada um dos pinos do microcontrolador. Atenção para tensão da tomada! A chave 110/220 da fonte deve estar corretamente selecionada. Para utilizar os códigos de exemplo: ® Utilizando o Explorer.1. . • Para uso de LCD e de teclado todos os jumpers. ® No campo Atributos verificar se a opção Somente Leitura está selecionada. Instalação 4. após a instalação do software do Pratic 628. Instalação do Software: Para instalar o software: ® Utilizando o Explorer. WinXP ou Win2000. ® Para usuário de WinNT. clicar no drive de CD-ROM (D: ou E:). Jumpers: A tabela abaixo apresenta as funções selecionáveis através dos jumpers. ® Pó último conectar-se a fonte à placa principal pelo conector. através de um clique duplo. ® Antes de utilizar um código fonte. Instalação do Hardware: Para a instalação do hardware devem ser seguidos os seguintes passos: ® Conectar um extremidade de cabo DB25M-DB25M (paralelo) à porta LPT1 (porta de impressora) do computador. ® Escolher propriedades (última opção do menu). A seqüência dos jumpers é a mesma da placa. ® Copiar a pasta exemplos para o HD do computador. CL_X: São as colunas do Teclado Matricial. 4. Para a conexão dos módulos de display e teclado devem ser observados os seguintes cuidados: ® Ao conectarem-se os cabos aos módulos e à placa principal deve-se estar atento para a indicação do sentido do conector.2. clicar no drive de CD-ROM (D: ou E). ® Executar o aplicativo Setup. ® Entrar na pasta Instalação. ® Conectar outra extremidade do cabo DB25M-DB25M ao conector DB25 da placa principal do Pratic 628. L_X: São as linhas do Teclado Matricial. No caso dos pinos ligados a jumpers. a coluna “jumper” trás essas indicações. 4. Para verificar as propriedades de um arquivo: ® Entrar na pasta que contém e clicar sobre o arquivo com o botão direito do mouse.exe em “\instalação” do CD-ROM (caso não faça isto o software não rodará).2. ® Para a utilização de teclado e display todos os jumpers devem ser retirados. executar o arquivo port95nt. Para retirar o atributo de somente leitura do arquivo basta desmarcar a opção Somente Leitura. verificar em suas propriedades se ele não está como “Somente leitura”.46 ® O esquema elétrico da placa encontra-se no CD na pasta “Esquemas”. Segue abaixo uma legenda da tabela: SEG_X: São os segmentos do DISPLAY de 7 Seg. com exceção do JP3 devem ser retirados. ® Seguir as orientações do software de instalação. com exceção de JP3. 3.

1. o cristal e os capacitores. 5. O microcontrolador está protegido contra leitura. de forma a conseguir apenas encaixar. quando necessário.br )ou na minha página sobre microcontroladores http://www.net/microcontroladores/microcontroladores. Haverá erro na gravação se ele for retirado. 2ª) Por algum outro motivo o microcontrolador não está sendo gravado. O arquivo em questão tem propriedade somente leitura. Eu aconselho que você solde terminais torneados nestas posições.luizbertini. de fábrica. 3. b) todos em 3FFF. durante o processo de gravação. Há duas possibilidades: 1ª) A opção “code protect” (proteção e código) não está desligada. Veja a solução da Questão 2: 4. 2ª) A chave “run/prog” deve estar em posição “prog” durante o processo de gravação. mas quando em “verificar” aparece um aviso de erro na verificação. Não é possível lê-lo nessas condições. sem o cristal de 4Mhz e os capacitores de 15pF. Não consigo ler um pic. Se ligada em 110V o único sintoma será a não gravação. Não feche essas janelas.br ou do telefone (35) 3471-6898. mantenha a janela (“Gravador” aberta). 1º) o microcontrolador está apagado.html . A placa da Exsto vêm. para isto você deverá soldar um cristal e dois capacitores de 15pF no local indicado. leitor. Quando o arquivo for compilado será aberta à janela “Memória do Programa” (e a janela “Memória de dados”. Aviso você. 2º) tendo certeza de que ele está gravado. 4ª) A janela “memória de programa” deve estar aberta e contendo o programa a ser gravado. Isto permite que você use as I/Os Ra6 e Ra7 do PIC. 5. Selecione corretamente a tensão da fonte. Veja a seção “Instalação do Software” nesse manual como resolver esse problema.com. Quando vou compilar/montar um arquivo de exemplo. Quando for compilar/montar um programa. Resolvendo problemas 1 – Quando eu clico em “programar” o gravador realiza a gravação e mostra a mensagem que a gravação foi concluída. pode haver algum problema na gravação. mas deverá usar o oscilador interno do mesmo. Suporte Técnico: A Exsto tecnologia oferece suporte técnico gratuito para questões de utilização de seus produtos através do e-mail suporte@exsto. Veja a questão 2: 2 – O microcontrolador não está sendo gravado: 1ª) A fonte sai de fábrica ajustada para 220V. aparece à mensagem “Erro número 5”. há diferença entre s modelos com “final A” e os comuns no que se refere ao processo de gravação. Em alguns exemplos deste livro usaremos o cristal no hardaware e o oscilador XT no software. 5ª) O jumper JP5 deve estar conectado em qualquer posição (1 ou 2). para que possa fazer o máximo de experiências possíveis usando os códigos fontes contidos neste livro e na homepage da Exsto ( http://www. Quando clico em “ler” aparece: a) todos os endereços 0000. sobre isto.com.47 ® Recomenda-se fazer a conexão dos módulos antes de se ligar a fonte à placa principal.exsto. portanto o programa gravado está protegido contra leitura. 3ª) O microcontrolador que está sendo utilizado deve estar devidamente especificado no campo “Processador” da janela “gravador”. se estiver sendo usada).

se for colocado. o resultado será gravado no registrador f da operação em W.48 Antes de cada código fonte haverá um alerta se você deve ou não usar o cristal externo de 4 MHz. Lembre-se que. Ele especifica o destino do resultado da instrução: Se d = 0 o resultado é gravado em W. Pode ser chamada de constante. no registrador de trabalho W. o resultado será salvo nele. um valor que será carregado. W −> é o registrador de trabalho. Se d = 1 o resultado é gravado no registrador indicado na operação.1. ou seja. W. É um número entre 0 a 255 decimal. e estas “letrinhas” f. ou seja. R. tudo ou quase tudo. normalmente de novo. contanto que use um PIC 16F628A – 20 que oscila em até 20Mhz. d. d −> o d pode ser colocado ou não. Capítulo 25 RESUMO DAS INSTRUÇÕES 25. Você também poderá trabalhar com um cristal de 20Mhz. f. k −> é normalmente. Se não for colocado o padrão será 1. se usar um cristal de 20Mhz deverá setar o oscilador para HS. Deve ter o valor entre 0 a 127 decimal. que o PIC faz passar por ele. Algumas Dicas sobre as Funções: Tudo o que está escrito abaixo é baseado na prática: Instruções muito usadas em Loopings: goto call return decfsz clrwdt incfsz nop movwf movlw btfsc btfss nop Instruções usadas em leitura de chaves: Instruções usadas no cabeçalho: movlw movwf bcf bsf clrw retfie Mas. b o que significam? f −> é um registro que deve estar definido no campo do cabeçalho onde colocamos as variáveis. . mas se não for colocado o resultado será salvo em f. k.

Z. . de 0 a 255.Soma a constante k (valor numérico entre 0 a 255) a W. Exemplo: addlw 45 . comentários Significado: . Explicação: . o valor de W = 45. Instrução: addlw k . Instrução: addwf f. . Capítulo 26 COMO FUNCIONAM AS INSTRUÇÕES Vamos estudar as instruções. . uma a uma. Se d = 0 o resultado será salvo em W.O valor de W será somado com o valor que existir em f.) para separá-lo dos comentários. pois temos 8 bits para trabalhar e 2 nos proporciona 256. Depois de cada instrução.Flags afetados nos registros. .Instrução.Significado. DC −> todos do registrador STATUS. É importante que o valor 8 não seja maior do que 255. Observações: Os números estão indicados em decimal. Deve se um número entre 0 a 7 decimal. para ficar mais fácil de encontrá-los. . podem ser em binário ou hexadecimal.Comentários. comentários Significado: . mas. Todos em ordem alfabética. desta forma: . devemos usar o ponto e vírgula (. b −> ο b define um bit de um determinado registrador e você precisa usá-lo para que as instruções que o antecedem funcionem corretamente. Explicação: . basta estarem dentro dos valores apropriados.Soma o valor de W com f. ou seja.O valor de k será somado a W e o valor resultante será no próprio W.Explicação. Os comentários ajudam. o resultado desta instrução colocará . E vamos começar isto logo. posições. d .Exemplo teórico / Prático. Flags afetados: C. .49 R −> é um nome que você dará há uma rotina ou a uma parte do programa. Usado com goto e call.

50 Se d = 1 o resultado será salvo em f. d . iremos fazer a operação E bit a bit . e o valor será salvo em f. já é o padrão). somará 10que é o valor de W . a 0 0 0 0 0 0 0 0 ou zero. o que resultará no seguinte: .Executa a função lógica AND ou E entre W e o valor numérico k.Executa a função lógica “E” entre W e F. comentários Significado: . com 7 que é o valor de f . na maioria dos programas é assim que será. 00000000 . Z. 0 .W=0 Flags afetados: Z −> do registrado STATUS. DC −> todos do registrador STATUS. Instrução: andlw k . Portanto: . se a instrução for assim: addwf f. Exemplo: Se W = 1 1 1 1 0 0 0 0 e k = 0 0 0 0 1 1 1 1 andlw k . Flags afetados: C. . Neste caso Z será igual a 1 pois o resultado da operação foi 0. Para salvar em W use a instrução assim: Addwf f. somará 10 que é o valor de W . Se fosse diferente de Z seria igual a 0. e o resultado será f = 17 Mas. Exemplo: W = 10 e f = 7 addwf f . Explicação: . Instrução: andwf f. Veja a diferença de se colocar d = 0 (não se coloca d = 1 pois. O resultado será salvo em W.Será efetuada uma operação and bit a bit e para visualizarmos isto é mais fácil ver em binário. com 7 que é o valor de f . o valor salvo em W será igual . e o resultado será W = 17. comentários Significado: . k=00001111 . O padrão é d = 1 e. W=11110000 . 0 .

bit a bit.Faz o bit b do registrador f igual a 0. Explicação: . comentários Significado: .Será feita uma operação “E”.Faz o portb do registrador f igual a 1. Mas. Instrução: bsf f. Exemplo: Se W = 0 0 0 0 1 1 1 1 efF = 1 1 1 1 0 0 0 1 andwf f . do f. b . 7 . Neste caso Z = 0 pois o resultado da operação foi diferente de 0. será colocado em nível lógico 1 (5Vpp neste PIC). f=11110001 . Exemplo: Se F = 0 0 0 0 0 0 0 0 = portb . W. W=00001111 . o que faz o valor do portb ficar . se a instrução for assim: andwf f.O bit indica por b (que deve ser um número de 0 a 7) será zerado no registrador f. que deve ser um bit de 0 a 7. b . o valor salvo em f será: . Exemplo: Se f = 1 1 1 1 1 1 1 1 = portb bcf portb.Nenhum. Flags afetados: Z −>registrador STATUS. o valor agora será salvo em . coloca zero no bit 7 do porb . Explicação: . entre W e f.51 Explicação: . comentários Significado: . igual a 0 1 1 1 1 1 1 1 Flags afetados: . igual a 1. 00000001 . e visto resultará em: . operação E bit a a bit .O bit indicado por b. 0 . isto devido ao o depois . Instrução: bcf f.

que está ligada com uma chave.Supondo que o bit b seja uma entrada do portb podemos usar esta instrução para testar se esta.O bit b do registrador f será testada. testa o bit 7 do portb .52 bsf portb. como a instrução seguinte é um NOP . é lida . testa o bit 0 da portb . se estiver no terra (0) será lida.Nenhum Instrução: btfss f.Testa o bit b do registrador f e pula a instrução seguinte se b = 0. veja: 0 0 0 0 0 0 0 1 Flags afetados: . Se estiver no Vcc (1) a próxima instrução será pulada. b . Exemplo: Se o portb = 0 0 0 0 0 0 0 1 btfsc portb. 0 nop goto A Flags afetados: . como ele é 1 a próxima instrução . sim para Y . b . 0 . testa o bit 0 da portb . está ligada no Vcc ou no terra. 7 goto X goto Y . seja 1 . 0 nop goto A .Nenhum Instrução: btfsc f.como ele é 1 a próxima instrução . se for 0 a próxima instrução será pulada se for 1 a próxima instrução será lida. o PIC esperará um ciclo de máquina. para X mas. Se o portb = 1 1 1 1 1 1 1 0 btfsc portb. e vai para a instrução GOTO . comentários Significado: . será pulada e o programa não irá . Exemplo: Se portb = 1 0 0 0 0 0 0 0 btfss portb. Explicações: .Testa o bit b do registrador f e pula a próxima instrução se b = 1 Explicação: . Esta instrução é muito utilizada em testes condicionais associadas a chaves. como ele é 0 pula o NOP . comentários Significado: . fará com que o bit 0 do portb .

Nenhum. Esta instrução também fará com que o Flag Z fique em 1. comentários Significado: .Esta instrução chama uma sub-rotina e pula um pedaço do programa. o Z. zeca fica igual a 0 0 0 0 0 0 0 0 Flags afetados: Z −> do registrador STATUS. Exemplo: call tempo linha depois . “setado”. testa o bit 7 da portb . o PC salva o endereço 40 + 1 ou 41 e na hora de voltar da sub-rotina. pois como o registrador fica todo em zero ele.53 Mas se fosse assim: Se portb = 0 0 0 0 0 0 0 0 btfss portb. da CALL tempo Flags afetados: . para saber como voltar. ou 0 0 0 0 0 0 0 0 b ou 00H. sabe que deve voltar para a linha 41. vai para 1. seguinte e vai para X Dá para perceber que com um simples apertar de botão o seu programa pode fazer uma coisa ou outra. Exemplo: Se zeca = 1 1 1 1 1 1 1 1 clrf zeca . para a linha imediatamente depois . .Chama uma sub-rotina Explicação: . sub-rotina tempo . Flags afetados: . Z = 1.Coloca 0 no registro f Explicação: . e digamos que ele esteja na linha 40. quando voltar da sub-rotina voltará . comentários Significado: . desvia o programa para a .O registro f terá o valor 0. ou seja. Simples não. Instrução: call k . 7 goto X goto Y .Nenhum Instrução: clrf f . Quando você usa esta instrução. zero zeca . entra em cena o “Famoso C ou Program Counter”. mas. como ele é 0 lê a instrução .

começa a contar novamente Flags afetados: TO\ e PD\ −> que estão no registrador STATUS são “setados” e virarão 1. esta função tem que estar . pense como. ou seja. vá pensando. Significado: . clrwdt . Caso contrário. watch dog Explicação: . d . Se o prescaler estiver direcionado ao watch dog este também será zerado. reseta o PIC e . Exemplo: O watch dog conta. após . que é um timer independente de tudo. será zerado. esta instrução é igual a 0 Flags afetados: Z −> do STATUS Z = 1 Instrução: clrwdt . teste o flag Z e veja se ele virou 1. zera o registrador de trabalho W Significado: .54 Instrução: clrw . Exemplo: . reseta o watch dog ele zera e .reseta o. Se você quiser ter certeza que W virou 0. reset do PIC . Instrução: comf f.O watch dog.O W terá o valor 0 e o flag Z passará a ser 1. mas. impedindo o reset do PIC.faz o complemento dos bits do registrador f. zera o watch dog impedindo o . o inverte. Exemplo: Se W = 254 clrw . seu programa não funciona. W era igual a 254. Se eram: 0000 1111 Ficarão: 1111 0000 Explicação: . comentários Significado: . . o watch dag estoura. dentro das loopings.Bit a bit será invertido e você pode usar esta função para fazer um seqüencial ou um painel que escreva duas mensagens.

comf f. d . Flags afetados: Z −> do STATUS Se o resultado for ≠ de 0 −> Z = 0 Se o resultado for = a 0 −> Z = 1 Instrução: decfsz f. Você pode usar esta instrução para fazer um detonador.55 Se f = 0 0 0 0 0 0 0 0 comf f Mas. fica nele mesmo . comentários Significado: .. . o valor de tempo 1 será 45. Exemplo: movlw 45 movwf tempo1 decf tempo1 . carrega W com o valor 45 . carrega tempo1 com o valor 45 . 0 . e W continua com 45 Mas. Z será igual a 1 Se o resultado for 1. diminui 1 de tempo1 e agora . já sabe né . que fica com o valor de 1 1 1 1 1 1 1 1 . 0 Flags afetados: Z −> do STATUS Se o resultado for 0. Instrução: decf f.Diminui uma unidade o valor que está no registrador f e pula a próxima instrução se o resultado for zero. inverte/complementa f . inverte/complementa f .. Explicação: . veja a importância dof. d . que é um registrador. o valor dele é igual a 44 .O número que está em f será diminuído em uma unidade. e este valor é salvo. o valor 44 será salvo em W . 0 . com 0 0 0 0 0 0 0 0 . Z será igual a 0 Só para variar. comentários Significado: . agora o valor de 1 1 1 1 1 1 1 1 será . salvo em W e F continua . carrega tempo1 com 45 . se era 10 depois da instrução virou 9. movlw 45 movwf tempo1 decf tempo1.Diminui em uma unidade o valor armazenado em f. brincadeirinha. decrementa 1 de tempo1 .

pula a instrução seguinte e não vai . porta para “chegar” Looping . falta de conhecimento é a arrogância. . 99 lê a próxima instrução vai para . diminui de tempo2 e salva em W .Nenhum Instrução: incf f. não precisa de nenhuma condição ou teste. ou seja. Esta instrução é muito utilizada em Loops de tempo.Use com critério e use também outras ferramentas que ainda veremos Exemplo: goto livro nop nop livro: Flags afetados: . inicio e fuga dano voltinhas/Loopings . d . diminui 1 de tempo 2 .56 Explicação: . . Mas.manda o programa para o endereço/nome simbolizado por k. vai para o livro . . decfsz tempo2. Exemplo: Se tempo2 = f = 100 inicio: decfsz tempo 2 goto inicio bsf portb.O valor de f (que deve ser entre 0 a 255) será diminuído em uma unidade (f – 1) e caso o resultado seja 0 a instrução seguinte será pulada.Alguns dizem que usar goto é falta de conhecimento. é salvo no próprio tempo2. Explicação: . portb. até zerar e acende o Led que esta na . e pula os nops . 0 .Nenhum Instrução: goto k . caso o resultado seja 0 .Este desvio é incondicional. comentários Significado: . para inicio. como resultado é . Mas. tempo é a anterior Flags afetados: . 0 o resultado da “decrementação” . 0 . comentários Significado: . a maneira de usar em Loops de . Ele diz vai e o programa vai. .

0 . Agora você me pergunta: Mas. 1 . comentários Significado: . Exemplo: Se f = dica e dica = 0 movlw 0 .Soma 1 ao valor do registrador f e pula a instrução seguinte se o resultado for 0 (quando falamos “pula” a linha seguinte sempre estamos nos referindo à instrução seguinte).Soma 1 ao valor do registrador f e pula a próxima instrução se o resultado for 0.57 . salva em W e dica continua com 0 . carrega teste com 55 mas W . diminui 1 de teste (55-1 = 54) e teste . portanto a próxima instrução é pulada bsf portb. Se no lugar de d existir um 0 (f. comentários Significado: . d . carrega W com 55 . . carrega dica com 0 incfsz dica. o resultado será salvo no próprio f. soma 1 ao valor de dica (1 + 0 = 1) . 0) o resultado será salvo em W. carrega W com 0 movwf dica . Explicação: . Instrução: iorlw k . continua com 55 . mas. agora tem o valor de 54 pois d = 1 .Você somará 1 ao valor de f se não existir o d. quando que eu vou somar 1 a alguma coisa e vai dar 0? Calma. Explicação: .Nenhum. esta instrução é pulada Viu agora o “poder de d”? Ele faz esta instrução mais útil e funcional. Exemplo: movlw 55 movwf teste incf teste . Flags afetados: . o que corresponderá que ele é igual a 1.Um “OU” é uma operação lógica básica e vamos usar uma tabela da verdade e a simbologia usada em “Técnicas Digitais. Explicação: .Soma 1 ao valor do registrador f (nunca pode passar de 255). e o resultado foi salvo em teste Flags afetados: Z −> do registrador STATUS Instrução: incfsz f.Executa um “OR” ou “OU” entre W e k.

Lembre-se que a default. O resultado será salvo em W. Veja que . e salva em regfteste. comentários Significado: . . É 1 sim. livro = 1 1 1 1 0 0 0 0 . carrega regfteste com 2 . 1111 1111 .58 Quando a entrada A “OU” a entrada B. Exemplo: Se W = 0 0 0 0 1 1 1 1 e k = 1 1 1 1 0 0 0 0 Lembre-se que k é um nome. Exemplo: movlw B 0 0 0 0 0 0 1 0 movwf regfteste movlw B 0 0 0 0 0 0 0 1 iorwf regfteste . Faz o OU de W com regfteste . você quiser o resultado em livro veja . ou valor padrão para d.Como já vimos o OU é uma operação da lógica Booleana ou dos “Técnicas Digitais”. W=0000 0001 . está bem? movwf livro Flags afetados: Z −> do registrador STATUS Instrução: iorwf f. Se d = 1 o valor será salvo em f. carrega W com 2 . “Se tem 1 em uma entrada tem 1 na saída. só que está em binário e . Instrução: movlw k . B 0 0 0 0 0 0 0 1 é o k. comentários . faz um OU entre W e livro . o resultado é 3 em regfteste Flags afetados: Z −> do STATUS e como a operação é diferente de 0 ele é igual a 0. forem iguais a 1 a saída será 1. carrega livro com o valor de W . regfteste = 0 0 0 0 0 0 1 0 . Esta operação irá fazer um OU em o valor que está em W e o valor que está em f o resultado será salvo. Pois mais óbvio que pareça. Se d = 0 o valor será salvo em W. Explicação: . . as instruções seguintes . é sempre 1. iorlw livro . 0000 0011 . W=0000 1111 . se você não colocar 0 será 1. carrega W com 1.Executa um OU entre W e f. não importa quantas entradas”. e salva o resultado em W mas e se . eu até coloquei o 1 (mas não é . como sempre. d . preciso) . vamos chamá-lo de livro. dependendo de d.

Mas.carrega W com o valor representado por k. desta forma o valor de spock é copiado para o . Exemplo: Se W = 0 ou qualquer outro número movlw 17 . 1 spock = 0 −> Z = 1 e se spock for ≠ 0 então Z será 0 .Nenhum. spock ≠ 0 −> Z = 0 sem colocar o registrador de . mas. Se d = 1 o valor é armazenado em f.59 Significado: . Vamos ver. Se d = 0 ou d = W o valor é armazenado em W.Move f para d Explicação: . assim como? Vamos supor que você quer testar o Flag Z que indica se uma operação resultou em 0. Explicação: . Exemplo: Se f = spock = 15 e W = 0 ou outro número. que nada? É apenas uma forma de copar um valor de um registrador para W e manter este valor no registro. moveria spock para W também . hexadecimal. comentários Mas também pode ser assim. W Poderia ser assim: movf spock. o valor de W é 17 agora . Dia de folga dele. binário. 0 . trabalho W na jogada. sempre mexer no valor que existe registrado W. movf spock. W tinha que ser um “trabalhador” Flags afetados: . em decimal 10 ou .Até que enfim d vai pegar pesado. sempre alteramos W . simples e extremamente útil . move o valor de spock para W .W terá o valor de k e este X pode ser escrito em decimal. e isto é que é importante. . Instrução: movf f.10 (mais para frente) em binário B 0 0 0 0 0 0 0 0 (mais para frente mais explicações) em hexadecimal 10H (mais explicações à frente). d Significado: . Veja: movf spock . e W fica igual à spock e W = 15 . mas. Mas. próprio spock e se spock for 0 então Z será . tem mais.

Exemplo: Se W = 217 movwf jaca . de W. Para isto serve movf.3 . o valor de W vai para o registrador portb que como . carrega W com o valor de dream que é 0 e o valor . . fáceis e úteis. comentários Significado: . não muda o valor de W e sabe se o registrador está com o valor 0 lendo o Flag Z.. 26.60 Flags afetados: Z −> do registrador STATUS. . Alguns chamam de variáveis. desta forma mudamos . não acenderá nenhum Led. Instrução: movwf f .Nenhum. muito usada em qualquer programa. esta instrução será . o valor original de W. . Agora que vimos um monte de movxxs. é o indicador de zeros. . o valor de jaca será 217. Como ver se algum Led se acende na portb. Fig. mas. . O importante é que este nome. senão o software dará erro na compilação e não funcionará. que era 251. usa a instrução movf.. Vamos ver exemplos destes dois modos: Se o registrador dream = 0 e W = 251. mandou fazer isto. Normalmente junto com MOVLW e são . . Este Flag só para relembrar. o registrador portb é 0 mas. Quando você quer saber se um registrador está com o valor igual a 0 como você faz? Ou você carrega este registrador no W e carrega o W em algum lugar que permita visualizar isto. Flags afetados: . . vai para o espaço. tem o valor 0. Veja a seguir: . movlw dream movwf portb .O valor que está em W vai para f. Explicação: f é um registrador que tem um nome que você escolheu e definiu em uma área específica do cabeçalho de programa. associado ao f (minúsculo) tem que estar lá. pois a instrução . vamos fazer uma pausa para reflexão. . Para não mudar.

Exemplo: . lê a linha seguinte e . este teste deve ser feito logo após . a 251 (W = 251). Então o valor de W continua igual . para saber se dream é igual à zero (0) basta . testa o bit2 (Z) do STATUS como ele é 1 .Não faz nenhuma operação Explicação: . a instrução MOVF. dá um tempo para ter certeza da operação . 0 . O “tempo perdido” dependerá do clock do PIC. comentários Significado: . Você está vendo . carrega dream em dream . que é o responsável pelas interrupções gerais (GIE = 1). a 0. espera um ciclo de máquina Flags afetados: . esta instrução demora dois ciclos de máquina.Durante o nop o microcontrolador fica um ciclo de máquina sem fazer nenhuma operação na CPU. Esta é uma das formas. Explicação: Ela busca o endereço de retorno na pilha (STACK) e seta o flag GIE. verificar o Flag Z se ele for igual a 1 significa que dream é igual . Você pode usar o nop para “arredondar” um Loop de tempo. comentários Significado: .Nenhum Instrução: retfie . não afetará o valor de W. Vamos aprender a ler os valores dos registradores para ajudar nos programas. Como fazer isto? movf dream nop btfsc STATUS. sem mexer com W. Chega de reflexão. Z = 1 −> dream = 0 mas. acende o Led 0 na portb. Instrução: nop . 2 bsf portb. para esperar entre uma instrução e outra (às vezes isto é útil e você verá nos programas. exemplos). Conversaremos mais disto depois. como em um sonho. esta instrução vai carregar em dream o próprio valor de dream e . Embora não tenhamos falado nada semelhante até agora.A função desta instrução é terminar com a interrupção em andamento. Exemplo: nop . W junto às instruções? Não.61 Se dream = 0 e W = 251 movf dream .

0 . Linha 6 −> acende o Led que está na portb. espera um ciclo de máquina . indicador para a sub-rotina 6 – bsf portb. carrega W com 10 . . muda . Instrução: retlw k . vai para a sub-rotina . Mas para que tenta coisa? Para você ver que a instrução troca o valor de W e para você começar a ver as chamadas de subrotinas e as sub-rotinas. retfie . . 5 – saudade: . retorna da instrução mas. . Linha 5 −> ter o nome da sub-rotina. O programa funcionará assim: Linha 1 −> W é carregada com o valor 10. -------. Linha 2 −> espera um ciclo de máquina. seta o bit 1 da portb 7 – retlw 2 . indica o termino do programa .Já que GIE é um flag ele é afetado e ele está na INTCON.62 call interrupção . Linha 3 −>a instrução call manda o programa para linha 5. o valor de W de 10 para 2. ------. ------. tracinhos são linhas de programa ------. saudade 4 – bsf portb. Exemplo: 1 – movlw 10 2 – nop 3 – call saudade . comentários Significado: . -------. chama a rotina de interrupção . .Volta de uma sub-rotina com o valor de W = k. 1 .Além desta instrução chamar a de sub-rotina ela faz o valor de W igual ao valor de k. Para saber em qual linha voltar ela busca o endereço na pilha ou stack. Esta instrução gasta dois ciclos de máquina. -------. volta para a linha seguinte . Explicação: . . end . 1. seta o bit zero da portb . ao call e faz GIE = 1 Flags afetados: . interrupção .

Instrução: rlf f. d . Para quem não se lembra o Carry/Borrow indica quando aconteceu um carry-out.Com esta instrução você volta da sub-rotina. Explicação: . Esquerda 0 ← 1 direita Se o valor de d for igual a 0. Em outras palavras.63 Linha 7 −> muda o valor de W para 2 e volta para a linha imediatamente após o call. a volta da sub-rotina é nesta linha . (linha com o nop) . Esta instrução é útil para se fazer leds ou lâmpadas correrem de um lado para outro. Você vêm caminhando com o bit 1 da direita para esquerda e passa pelo C. Depois da instrução você tem −> 0 0 0 0 0 0 1 0 e C = 0 instrução. Esta instrução também demora 2 ciclos de máquina. que é a linha 4. volta para a linha imediatamente após a chamada de sub-rotina. usando o default o valor será salvo em F. Linha 4 −> acende o Led que está na portb. Flags afetados: . Instrução: return .Para entendermos isto o melhor é ver tudo em binário. carrega W com 100 return . indica o início da sub-rotina lembrança movlw 100 . É importante saber o quanto demora cada instrução quando fazemos temporizadores de precisão bem como quando fazemos geradores de vídeo ou de pulsos. Exemplo: call lembrança . vai para a sub-rotina lembrança nop . comentários Significado: Caminha com os números para a esquerda. Vamos ver: Antes da instrução você tem −> 0 0 0 0 0 0 0 0 e C = 1 instrução. comentários Significado: Retorna da sub-rotina Explicação: . 0. será salvo em W. Depois da instrução você tem −> 0 0 0 0 0 1 0 0 e C = 0. como já sabemos o valor. Depois da instrução você tem −> 0 0 0 0 0 0 0 1 e C = 0 instrução. volta para linha imediatamente . após o call que é a linha com o nop Flags afetados: . lembrança . feita com a instrução call.Nenhum. Estamos falando do stack de novo.Nenhum. quando um número 1 . O flag C do registrador STATUS é importante nesta função.

. comentários Significado: Caminha com os números para a direita. corresponde a 2. rlf anda Flags afetados: C – Carry/Borrow do registrador STATUS. Exemplo: Se C = 0 movlw 1 movwf anda rlf anda . Perceba que o bit 7 vai sendo “empurrado” para o flag C. e C será igual a 1 (C = 1) rrf anda1 Flags afetados: . carrega W com o valor 1 . carrega anda1 com 1 1 1 1 1 1 1 1 = 255 . Depois a instrução −> 1 1 1 1 1 1 0 0 e C = 1 houve um carry-out. W assume o valor 1 1 1 1 1 1 1 1 . adiciona mais um 1. de anda1 será agora igual a 1 0 1 1 1 1 1 1 = 191 . 0 1 1 1 1 1 1 1 = 127 e C será igual a 1 (C = 1) . Veja: Antes da instrução −> 0 1 1 1 1 1 1 1 e C = 0 instrução. agora anda fica . Explicação: Vamos ver em binário para entender melhor: Antes da instrução −> 0 0 0 0 0 0 0 0 e C = 1 instrução Depois da instrução −> 1 0 0 0 0 0 0 0 e C = 0 instrução Depois da instrução −> 0 1 0 0 0 0 0 0 e C = 0 Você caminha da esquerda para a direita e passa pelo C. Instrução: rrf f. poderíamos dizer que é o flag C do registrador STATUS. Esquerda −> direita Exemplo: Se C = 0 movlw B’ 1 1 1 1 1 1 1 1’ movwf anda1 rrf anda1 . agora o valor de anda é igual a 10 que . igual a 100 que corresponde a 4. caminha com os números para a .64 passa do bit 7 para o bit 8 (nona posição) que de uma forma simples. o valor de anda1 será agora igual a . rotaciona para a direita um digito o valor . que é o bit 0 do registrador STATUS para resetar o registrador ou fazer através da instrução rrf. os “1” voltarem. carrega o registrador anda o valor 1 . d . rotaciona ou anda com um 1 da direita para . Depois da instrução −> 1 1 1 1 1 1 1 0 e C = 0 instrução. Você pode aproveitar a leitura do flag C. direita passando pelo flag C . esquerda ← direita .

que era o número que estava no bit 7. fazendo o PIC ficar mais econômico. O oscilador também para e o Watch-dog e o prescaler são zerados. O bit 7 assumirá o valor 1. d −> rotaciona para a direita.O bit C. perceba que o flag C (o valor que está nele) vai sendo “empurrado” para o bit7. Vamos ver a estrutura da coisa.65 C – bit0 do registrador STATUS. Vamos ver a estrutura da outra coisa. Quando aplicamos a instrução rrf no registrador da Figura 26. Outra pausa para meditação. Quando aplicamos a instrução rlf no registrador da Figura 26.Elas vão rotacionando ou trocando de lugar. Se C = 1 ocorreu um carry-out. “Antes que eu me esqueça. . que tem o valor 1.Podemos usar o flag C para ajudar nos programas onde os usamos. Instrução: sleep . para sair do modo SLEEP você pode fazer . muitas vezes não são usadas pois. Vamos mostrar elas de uma outra forma e descrever seus segredos. e o bit C assumirá o valor 0 que era de bit 0. . que era de bit C. feita por pura observação.5.Nesta condição o conteúdo da memória fica salvo e o processamento para. Chega de meditação. ficam empurrando os bits pra lá e pra cá”. vai enviar este valor para o bit 7 e assim todos serão empurrados para direita. os bits de um registrador. um bit por vez.Vai dormir PIC e economizar energia. acontecerá o seguinte: . Observação: .Elas não caminham apenas com o número 1.reset pelo pino MCLR ou Reset . d −> rotaciona para a esquerda.6. estas são as instruções mais mal educadas do PIC. . vamos continuar de onde paramos. o PIC “dorme” .O bit C. que tem o valor 0. Exemplo: sleep . comentários Significado: . o programador não as entende direito (isto é uma observação minha. acontecerá o seguinte: . na prática). rrf f. vai enviar este valor para o bit 0 e assim todos serão empurrados para a esquerda e o bit C terá o valor 1. algumas coisas (usar um despertador): . Estas duas instruções. Explicação: . rlf f.

TO\e PD\ −> bits4 e 3 do STATUS . carrega W com 5 .O valor do registrador de trabalho W é subtraído do valor de k e o valor é salvo em W. que quando o resultado der negativo devemos somar 256 ao valor de W para saber o seu valor real. o valor de W é igual a 5 . carrega o registrador santicfy com 10 . . . início do programa. a 1 (C = 1) Mas podia ser assim: . podem acontecer resultados negativos e aí? E aí. o PIC começará a rodar do endereço 0 ou 00H em . Se você resetar ele.Subtrair k de W é igual a: W – k É a primeira situação que está em ação no uso desta função.TO\ será igual a 1 (TO\=1) .5 = 5 . mas. Perceba que subtrair W de k é diferente que subtrair k de W. . estar habilitado . através do pino MCLR ou Reset. . você pode perguntar como o Watch-dog consegue . . Flags afetados: . Dá tudo no seguinte: Após a instrução W = k – W k tem que ter um valor entre 0 a 255.Subtrair W de k é igual a: k – W . W = santicfy – W −> W = 10 . esquecidinho.interrupção no Rb0/INT .Faz uma subtração entre W e k (tem gente que chama k de Literal).interrupção da EEPROM (Final de escrita) . faz a subtração de Santicfy e W .66 . seu . carrega W com o valor 10 .PD\ será igual a 0 (PD\ = 0) Instrução: sublw k . interrupção através do Rb4 ao Rb7 da portb . ele precisa . “estourar” se o oscilador está parado. comentários Significado: . hexadecimal ou 0 0 0 0 0 0 0 0 em binário que é o . Exemplo: movlw 10 movwf santicfy movlw 5 sublw santicfy . o Watch-dog tem seu próprio oscilador. É que. . isto faz com que o flag C fique igual . Podemos perceber que às vezes. Explicação: .estouro do Watch-dog.

Na instrução anterior o valor só podia ser salvo em W. Quando o resultado for positivo C = 1. mas. DC e Z −> do registrador STATUS Instrução: subwf f. . carrega W com 100 . Exemplo: movlw 100 movwF ano movlw 100 subwf ano. Z = 0 pois o resultado não foi zero . carrega W com 25 “em decimal” . Quando o resultado for negativo C = 0. resultado foi negativo. Também podemos ter resultados negativos. o valor de W é: W = 256 + (-2) −> W = 254 Flags afetados: . devido ao d. Caso o resultado seja negativo. carrega W com o valor 27 .C. carrega o registrador novo com 100 . ele pode ser salvo em W ou f por isto escrevemos assim: d = f – W −> pois d é quem define onde o valor será salvo. carrega o registrador yourself com 25 . carrega o registrador ano com 100 . o valor de W é: W = 256 + (-1) = 255 Mas. o . carrega W com 101 . W = yourself – W −> W = 25 – 27 = -2 . W = ano – W −> W = 100 – 101 = -1 . comentários Significado: . o valor de C é igual a 0 (C = 0) pois. o resultado não foi zero. Se Z = 1 o resultado foi zero.67 movlw movlw movlw sublw 25 yourself 27 yourself . Se Z = 0 o resultado não foi zero.Subtrai o valor de W de f e salva o resultado em W se d = 0 ou em f se d = 1.O valor de W é subtraído do valor de f. 0 . mas. o resultado foi . carrega W com 100 . . carrega W com 99 . Explicação: . temos então: C = 1 pois. subtrai W de ano e salva em W (. podia ser assim: movlw 100 movlw novo movlw 99 subwf novo . .Z = 0 pois. novo = novo – W −> novo 100 – 99 = 1 . C = 0 pois o resultado foi negativo . nesta. o resultado não foi zero.0) . subtrai W de novo e salva em novo . como d = 1 fica: . W continua com 100 . positivo e Z = 0 pois. d . mas W continua com 100 . basta somar 256 decimal ao resultado e você terá o valor real.

Z −> do registrador STATUS Instrução: swapf f. carrega W com 0 0 0 0 1 1 1 1 . d . Algo similar à função E ou OU.executa a função OU exclusivo entre W e f. ou seja.. Vamos ver isto em binário: Antes da instrução −> 0 0 0 0 1 1 1 1 instrução Depois da instrução −> 1 1 1 1 0 0 0 0 O destino onde será salvo este valor depende de d. . Este negocio de “exclusividade” é coisa de. Só quando as duas entradas forem diferentes é que a saída será igual a 1. inverte os nibles. Explicação: . muda fica com o valor de . carrega o valor 15 no registrador muda . troca 4 bits. carrega W com 15 que é um valor em decimal . Exemplo: movlw B’ 0 0 0 0 1 1 1 1’ movwf troca swapf troca Mas. comentários Significado: . 1 1 1 1 0 0 0 0 o valor será salvo erm troca. comentários Significado: . 0 0 0 0 1 1 1 1 = 15 e 1 1 1 1 0 0 0 0 = 240 Flags afetados: . DC. só para variar.C.. o valor de troca fica . Bonito não é mesmo.68 Flags afetados: .A função OU exclusivo é uma função lógica. pode ser assim: movlw 15 movwf muda swapf muda .Nenhum Instrução: xorwf f.Esta função troca nibles. Só por curiosidade.Inverte os bits de 0 a 3 com os de 4 a 7. Mas. 240 em decimal. Explicação: . . inverte ao nibles. ou uma função da aritmética Booleana. d . que é um valor em binário . na prática trata-se da comparação de níveis lógicos na entrada de um dispositivo (normalmente chamada de porta lógica) e o resultado em sua saída. carrega o valor 0 0 0 0 1 1 1 1 em troca .

Faz o ou exclusivo com uva e salva em W .Esta função faz uma operação bit a bit entre W e k. pode ser assim: movlw B’ 1 1 1 1 0 0 0 0’ movf uva movlw B’ 0 1 1 1 0 0 0 1’ xorlw uva .69 O resultado será salvo em um local definido por d. carrega radio com o valor de W . o resultado será tudo 1 (1 1 1 1 1 1 1 1) . Exemplo: movlw B’ 0 0 1 1 0 0 1 1’ movwf radio movlw B’ 1 1 0 0 1 1 0 0 xorwf radio . carrega W com 1 1 1 1 0 0 0 0 . W=11001100 .Faz um OU exclusivo entre W e k.W=10101010 .Z −> do registrado STATUS Instrução: xorlw k .W=10101010 . A operação lógica é um OU exclusivo ou XOR. E se você usar esta instrução com o próprio W o resultado é zero.Para ver tudo isto melhor é útil recorrer ao binário. o valor será salvo em W. carrega W com o valor 1 1 0 0 1 1 0 0 . carrega W com o valor 0 0 1 1 0 0 1 1 em binário . Esta função é feita bit a bit. Explicação: . comentários Significado: . .Bits diferentes têm como resultado 1. carrega W com 0 1 1 1 0 0 0 1 . carrega uva com 1 1 1 1 0 0 0 0 . W=01110001 . 00000000 . Faz um ou exclusivo de W com W. Mas. Vamos usar o binário. Você pode usá-la para comparar a combinação de uma entrada/porta com o valor de W e quando der 0 acionar alguma coisa. carrega W com 170 (é o mesmo valor em decimal) . 11111111 . faz a função lógica OU exclusivo entre W e radio . uva = 1 1 1 1 0 0 0 0 .Bits iguais têm como resultado 0. “Combinação de cofre”. radio = 0 0 1 1 0 0 1 1 . O valor será salvo em W. . A função anterior também é útil para isto.Z=0 Flags afetados: . Exemplo: movlw B’ 1 0 1 0 1 0 1 0’ xorlw W . . .

ou instruções do assembly. um muito usado neste livro é o $. Não se esqueça da homepage que pode ajudá-lo. Compilar em linguagem simples.1. mas. bit a bit ll −> OU ou or = −> igual Operadores relacionais: Operadores lógicos: Operadores de atribuição: Poderíamos falar mais sobre isto. o valor de W será 1 0 0 0 0 0 0 1 Flags afetados: . um monte de zeros e uns. Vamos falar dele. 10000001 . 26. Operadores do MPASM: O MPASM é o software compilador que está incluído no MPLAB. Os operadores são comandos reconhecidos pelo MPASM e que podem ser usados nos programas. . antes vamos mostrar outros. TRIS −> faz o registro TRIS = W. Operadores matemáticos: + −>adição .70 . mas.−> subtração / −> divisão * −> multiplicação % −> restante de uma divisão = −> igual ! −> diferente de > −> maior < −> menor > = −> maior ou igual < = −> menor ou igual ~ −> complemento << −> rotação para a esquerda >> −> rotação para a direita && −> and (função lógica é óbvio) l −> OU bit a bit ^ −> ou exclusivo & −> E ou and. a Microchip™ não recomenda o uso delas. O próprio fabricante dos PICs. especialmente. vamos ver como usar o $ e deixar que você aprenda a usálo e faça “experiências”. Eles são: OPTION -> faz registro OPTION = W. que dizer transformar os mennônicos do assembly.Z −> do registrador STATUS Existem mais duas instruções que podem não funcionarem com todos os microcontroladores PIC e por isto não serão comentadas aqui. no famoso código de máquina ou no português claro.

vai uma linha para frente ou visualmente falando. goto $ . Explicação: . . que é a linha em que ele está. Daí você compara uma coisa com a outra e tem suas conclusões. ou seja. Exemplo: btfsc portb. pega a posição atual do PC. volta três linhas e assim adiante. vai duas linhas para frente e assim adiante. Vamos estudá-los em ordem alfabética: Diretiva: _BADRAM −> define endereços não válidos na memória RAM do PIC. 0 goto $ . O $ faz o que faz. a instrução goto junto com os operadores . goto $ + 1. e subtrai ou soma linhas de acordo com os operadores e números que estão junto com ele.71 Para aprender a usar o $ o ideal é ver exemplos e depois defini-lo. mas. O D maiúsculo indica que o endereço . Diretivas ou Diretrizes do MPASM: Com estes “comandos” que não são instruções dos PICs. Normalmente usamos o operador $ junto com a instrução goto. pois.2. Muitos destas diretivas são utilizados nos cabeçalhos dos programas. Enquanto o bit 0 da portb não for zero o . . S e (-) e o número 1 acontece o seguinte: . goto será linha e o goto irá mandar o programa . Com este operador podemos enviar um programa para uma determinada posição sem indicadores.3. com um número e com os operadores matemáticos + ou -. Traduzindo. está em decimal. na linha que tem a instrução btFsc. para $ . eu respondo: $ .1 . Se for zero pula a próxima linha . (program counter) menos (-) uma (1) linha. Mas onde é $ .1 você me pergunta e . se o bit 0 da portb não for zero a linha de . volta para a linha anterior.1 é a posição atual do PC . goto $ . os endereços de 10 a 30 são inválidos. testa se o bit 0 da portb é igual a 0. . . Se colocarmos junto um número mais um sinal de (+) ou (-) acontecerá o seguinte: goto $ -1. goto $ + 2. Uso: _badram D’ 10’ – D’ 30’ .1. programa ficará em “Looping” entre estas duas linhas. que são entendidas pelo MPASM você conseguirá fazer um programa mais eficaz e mais rapidamente. uma linha para baixo. o operador $ manda o programa para a posição atual do PC (program counter ou contador das linhas do programa). Teste os outros operadores. volta duas linhas.

início dos variáveis . deverá selecionar estas opções no gravador do PIC. . caso você “queira” usar.72 Na verdade esta diretiva nem precisa ser usada pois. isto é configurado no software de gravação. Diretiva: BANKISEL −> gera um código de acesso que permite o acesso indireto ao banco de memória. . Esta diretiva é muito utilizada (eu aconselho você a usá-la em todo programa). Ela fica no cabeçalho. define o final dos variáveis Diretiva: CODE −> permite que partes de programas sejam ligadas a partes de outros programas para formar uma “coisa” maior. Diretiva: Duas under lines __CONFIG −> define os fusíveis dos PICs ou os bits de configuração. Daí fica assim: _maxram D’ 100’ . define endereço 20 em hexadecimal como . No nosso caso no gravador da Exsto. . Diretiva: CBLOCK −> esta diretriz define um bloco de variáveis e/ou constantes. . Com esta diretriz ajustamos automaticamente os bits RP0 e RP1 do STATUS para ir para o banco de memória onde está o registrador que buscamos. Ela é muito usada nos programas mostrados neste livro e facilita bastante à confecção do cabeçalho do programa. . antes dela deve ver outra diretiva. Diretiva: BANKSEL −> gera um código para acesso indireto aos bancos de memória. variáveis . _boden_off −> se desligado o PIC não reseta se a tensão cair para menos de 4V. Caso você não coloque esta linha de configuração. você deve saber se o seu projeto permite isto. Nos PICs que estamos estudando o responsável por isto é o flag IRP do STATUS. Veja as definições dos PICs usados neste livro: _boden_on −> se ligado o PIC resetará se a tensão de alimentação cair para menos do que 4V durante 100µs. ajusta RP0 e RP1 para irmos para o banco . Vem sempre acompanhada da diretriz ENDC. Uso: cblock 0 x 20 tempo tempo1 tempo bom beleza legal endc . Mas. o PIC já tem definidos os endereços inválidos (veja mapa ou banco de memória). “máximo endereçamento” _badram D’ 10’ – D’ 30’ . de memória onde está o intcon. . Uso: banksel intcon . mas.

_extclk_osc −> usado com clock externo. Dá para regravar mas não copiar ou ler o que está gravado. _lvp_on −> permite a programação em baixa tensão (5V). ou seja.6.6 (pode trabalhar em 37 kHz). Você sabia que existem cristais de 15 kHz? _xt_osc −> para cristal ou ressonador entre 100 kHz a 4 MHz. _pwrte_off −> desabilita o reset interno do PIC. _wdt_on −> liga o watch-dog. Use esta opção se estiver usando um circuito de reset externo. _cp_off −> código de proteção desligado.73 _cp_all −> protege toda a memória evitando-se cópia. _intrc_osc_noclkout −> oscilador interno de 4 MHz sem oscilador externo. _cp_on −> protege a memória toda contra cópia. _hs_osc −> para oscilador com ressonador ou cristal acima de 4 MHz. o PIC só começará a funcionar depois de 72ms. _cp_50 −> protege parte da memória. Ra6 vira uma I/O (pode trabalhar em 37 kHz). Deve ficar habilitado. Cristais abaixo de 200 KHz. _mclre_on −> permite o reset externo através da colocação de 0 volts no pino MCLR. _lvp_off −> a gravação deve ser feita com tensão de 13V. _cp_75 −> protege parte da memória. Alguém pode copiar o seu programa. _mclre_off −> não permite o reset ou “clear” externo. _lp_osc −> usada para oscilar o cristal de baixa freqüência. _pwrte_on −> habilita o reset interno do PIC. entrando no pino porta. Usada em ICSP.7 (Ra7) e sem saída na porta. Você pode ligar o Vcc com o MCLR. O Ra6 será uma I/O (entrada/saída). _wdt_off −> desliga o watch-dog. após você colocar Vcc no MCLR. _er_osc_clkout −> usado quando o oscilador externo é composto por uma constante RC e temos a saída de clock no pino Ra6. Não use esta opção se o seu projeto inclui a segurança física das pessoas. Se esta opção estiver ligada você deve resetar o watch-dog durante o programa. _intrc_osc_clkout −> oscilador interno de 4 MHz com saída de clock pelo Ra6 ou porta. Deve ficar desabilitada com a maioria das placas de gravação. _er_osc_noclkout −> oscilador RC sem saída de clock. .

e colocadas no cabeçalho do programa. Estes valores são aproximados e tem uma tolerância. Se OSCF = 1 −> clock de 37 KHz. posso garantir que esta diretriz é muito útil. Desta forma colocamos no programa o texto ou palavra ao invés da instrução. mas. Se OSCF = 0 −> clock de 4 MHz. 1 Explicação: Não tenho muito que explicar. 2 #define led_aceso bsf portb. toda vez que botao for encontrado . . mas. Diretiva: DT −> cria uma tabela na memória de programa. com o uso do operador &. 1 .74 Normalmente estas definições são escritas uma após a outra. Uso: #define botao porta. 2 . a instrução bsf . Diretiva: DB −> vai encher a memória de programa byte após byte. Diretiva: DA −> armazena conectores no rom ou Flash. toda vez que a palavra for encontrada no programa. será executada e acenderá o . led na portb. as instruções associadas serão executadas. Usando osciladores internos podemos trabalhar em 4 MHz ou 37 KHz. estaremos falando do porta. Uso: Constante meia dúzia = 6 Diretiva: #DEFINE −> define uma palavra ou pequeno texto que será associado há uma função em assembler. Diretiva: DE −> inicializa os dados da EEPROM interna durante a gravação. toda vez que encontrarmos . Exemplo de linha de __config: __config _boden_on & cp_on & pwrte_on & wdt_off & lvp_off & mclre_on & _xt_osc Diretiva: CONSTANT −> define um valor constante para uma palavra. Diretiva: DW −> coloca expressões na memória de programa uma após a outra. Diretiva: DATA −> preenche a memória com um valor definida por um texto ou palavra. Selecionamos isto no registrador PCON através do flag OSCF. led_aceso.

o valor de tempo1 será salvo no . Uso: movlw 10 end ou goto y x: end y: goto x . final do programa . vai para y . . Diretiva: ENDM −> finaliza uma macro. . Diretiva: END −> esta diretiva deve estar no final de todo programa para fazer com que o compilador pare de “montar” o programa. . início dos constantes . Fique atento a isto. . . Diretiva: EQU −> associa um nome há um endereço na memória. Uso: cblock tempo tempo 1 tempo bom tempo 3 endc . Diretiva: ENDW −> é usado para definir o final de um bloco de repetição que também pode ser chamado de Loop. . índice para goto . . Uso: tempo1 equ 0X0D . Define o final de um bloco de constantes. Usados com IF. . índice para instrução goto . . . vai para x . . . carrega W com 10 . Diretiva: ENDC −> é usada junto com CBLOCK. Deve ficar no final dos testes. termina o programa O final do programa não está sempre no final do que está escrito. final das constantes Diretiva: ENDIF −> indica o final de um teste condicional. Normalmente usamos ela junto com a diretiva WHILE.75 Diretiva: ELSE −> usada junto com IF.

veja se ele tem o PIC 16F84 e os PICs 16F627. Nada impede que você use e ou até aconselho. . Independente disto. basta na instalação escolher um caminho diferente para cada uma.76 . . que lhe dará uma noção rápida do tempo de um looping. . . o Ivon Luiz. 16F628. N2.O clock usado como referência neste capítulo é de 4 MHz. Capítulo 28 SUB-ROTINAS DE TEMPO (A VERDADE POR TRÁS DAS LOOPINGS) Existem algumas maneiras de se calcular o tempo de loopings. mas.1 ciclo de máquina = 1µs. como o stopwatch.7. Finalmente eu me dei por vencido e adotei algumas idéias dele. de um programa pronto é pegar o número de µs gasto no looping principal. quase saímos no braço para chegarmos à conclusão sobre os loops de tempo. multiplicar pelo número deste looping (N) e multiplicar este valor pelo número dos outros loopings (N1. pois ela é mais leve e roda em máquinas mais simples mais rapidamente. Observações: . “Faz bem aprender com os outros”. Baixe a tabela sobre delay Este capítulo começou a ser escrito em 1998.40? Vamos utilizar esta versão do MPLAB. Você pode instalar mais de uma.2 ciclos de memória = 2µs. teve uma “parte” em especial no ano de 2004. Mas. os períodos das instruções mudam e você precisa levar isto em consideração nas equações. 16F628A e também 16F877 e 16F877A (nosso futuro). duas versões. endereço 0X0D em hexadecimal Diretiva: ERROR −> cria uma mensagem de erro para o usuário programador. mas. algumas mais precisas ou menos precisas. Esta é o principal motivo para usar esta versão deste ambiente de desenvolvimento integrado. Eu tenho em minha máquina. etc). Observe que em uma sub-rotina de tempo os loopings estão “um dentro de outro” e interagem um com o outro.Se usar clock diferente. tudo depende da sua aplicação. quando eu e meu ex-supervisor. outras versões da MPLAB.9 define o tipo de mensagem de erro. 16F627A.Isto foi o mais próximo do loop perfeito que chegamos. mas. o MPLAB vai oferecer ferramentas para você criar uma rotina de tempo super preciso. Capítulo 27 POR QUE USAR O MPLAB 5. Diretiva: ERRORLEVEL −>. .As instruções têm a duração de 1 ou 2 ciclos de máquinas. Uma das formas mais simples e imprecisas. .

em W * . Primeiro com o 16F84: Escrevendo na EEPROM interna: bcf status. .. . volta para a linha anterior e fica neste loop . . poder ir para o registrador EECON1 que . acabou a gravação e pula a linha seguinte. permitirá gravar na EEPROM . ser capaz de utilizá-la novamente. goto $ . Se estiver . volta para o banco 1 da memória. zera o bit EEIF evitando interrupção. Ele está no banco 0 por isto fomos para lá. desabilita a escrita na EEPROM . ela não se perderá. gie bss status. para .até que wr seja zero e acabou a escrita. em W * . por exemplo. carrega 85. seguinte. gravarmos uma senha e salvá-la e mesmo desligando o PIC. wrc btfsc eecon1. . carrega o registrador EEADR com o número 5.77 Capítulo 29 EEPROM/E2PROM É O BICHO Agora vamos ver como escrever e ler a memória EEPROM que está dentro do PIC. gie * Estas quatro linhas e/ou quatro instruções são uma seqüência usada como segurança. rp0 bsf intcon. coloca 1 no flag wr do registrador eecon1 . wren bcf status. habilita escrita na EEPROM . . em decimal. desabilita as interrupções para que o PIC não . vai para o banco 0 da memória .1 bcf eecon1. . seleciona o banco 0 de memória . . carrega eecon2 com 170 * . carrega W com o número 25. este valor. . rp0 bsf eecon1. em decimal. wren movlw 85 movwf eecon2 x movlw 170 movwf eecon2 bsf eecon1. testa se ofFlag wr está em 0. Usando a EEPROM podemos entrar com a senha que temos e gravar uma senha nova e nunca perdê-la. eeif bcf eecon1. Sem a EEPROM isto é muito difícil. wr . este será o valor . . e começa a gravar. carrega o registrador EEDATA com o valor 25 . carrega W com 5 . . carrega eecon2 com 85 * . Se estiver em 1 não acabou e lê a linha . gravado e 5 será o endereço onde é gravado . seja resetado devido a EEPROM . carrega 170. ou seja. de forma que não ocorram gravações por acaso na EEPROM. habilita as interrupções. Usamos esta memória para. rp0 movlw 5 movwf eeadr movlw 25 movwf eedata bcf intcon. .. É necessário se carregar o registrador EECON2 com 85 em decimal ou 55H em hexadecimal depois 170 em decimal ou AAH em hexadecimal antes de qualquer tentativa de escrita.

carrega W com 25 . salva o valor de W. volta para a banco 1 para “achar” . instruções são uma “senha” de proteção . liga as interrupções . w (ou 0) . rd . começa a escrita . desliga as interrupções . wren movlw 85 movwf eecon2 movlw 170 movwf eecon2 bsf eecon1.78 Este recurso foi desenvolvido pela própria Microchip. gie bcf status. carrega eecon2 com 170. carrega W com 5. Lendo a EEPROM interna: bcf status. que é o fabricante. Isto é feito colocando-se . todos os registradores que precisamos . rp0 . permite escrita no EEPROM . dadoseeprom Agora o 16F628/16F628A: Escrevendo na E2PROM interna: bsf status. “achar” o registrador EEADR movlw 5 . carrega W com 85 . o registrador EEDATA movf eedata. A resposta é: picos de tensão na alimentação. o registrador EECON1 bsf eecon1. faz o valor de W igual a EEDATA que . faz o loop enquanto não termina a escrita . contra gravações indesejadas . que irá ser . de forma a evitar gravações não desejadas. rp0 . com o número 5 (endereço 5) bsf status.1 bcf eecon1. movwf dadoseeprom . Estas 4 últimas . que é o valor do . rp0 . carrega o endereço 5 no registrador EEADR . (espelhados). seleciona o banco 0 para poder . carrega o registrador EEADR . carrega eecon2 com 85 . lê o registrador. wrv btfsc eecon1. volta para o banco 0 para poder “ver” . trabalho” do PIC Lendo o 16F628/16F628A: . corresponde a 25 em nosso exemplo. wren bsf intcon. 1 no flag rd do registrador EECON1 bcf status. não permite mais a escrita . volta para o banco 0 que é o “banco de . carrega a data 25 no registrador EEDATA . endereço 5 da EEPROM no registrador . rp0 . Neste PIC temos . seleciona o banco 1. o endereço movwf eeadr . carrega W com 170 . Você pode perguntar como podem acontecer gravações indesejadas e eu lhe respondo com um exemplo prático de diversos equipamentos que usam EEPROM. Toda vez que você precisar gravar na EEPROM interna precisa usar esta seqüência que funciona então como um tipo de código ou senha de permissão para gravar. carrega W com 5 . wr goto $ . gie bsf eecon1. . enquanto wr for 1 aguarda a escrita . rp0 movlw 5 movwf eeadr movlw 25 movwf eedata bcf intcon.

Bit 0 = 0 = não começa a ler a EEPROM. Bit 4 = 1 = já acabou de escrever e é preciso resetar ele(tornar 0) pelo software. em decimal. Bit 2 – WREN −> este flag habilita a escrita na EEPROM. EECON2 – este registrador não tem nenhum ajuste que passa ser feito pelo programador e/ou técnico. Vimos o seu uso nos exemplos anteriores. rp0 movlw 5 movwf eeadr bsf eecon1. Ele aciona a escrita. Bit 2 = 1 = permite que se escreva na EEPROM. W = eedata = dados = 25 . No PIC 16F62X teremos 128 posições ou bytes de memória ou de 0 a 127. O dado é colocado neste registrador e o endereço é colocado na EEADR. Bit 1 – WR −> este flag define o início da escrita. o 0 é por conta do PIC. rd movf eedata. Só dá para você colocar 1 neste flag. bit 6 e bit 5 “não existem”. Bit 1 = 1 = colocando-o em um (1) a escrita começa e fica em 1 até que ela termina. No PIC 16F84 este registrador tem cinco flags ou bits usados e no PIC 16F62X são apenas quatro flags ou bits. Bit 0 – RD −> este bit define o início da leitura da EEPROM. em decimal. salva leitura em dadoseeprom 32.W=5 . EECON1 – este registrador é conhecido como registrador de controle 1. No PIC 16F84 teremos apenas 64 posições de memória ou de 0 a 63. volta banco 0 . vai para endereço 5 . Quando a escrita terminar o PIC coloca este bit ou flag em 0 e podemos usar isto para confirmar a escrita. Ele é utilizado para evitar que ocorram escritas não desejadas. Bit 1 = 0 = indica que a escrita terminou. rp0 movlw dadoseeprom . . Bit 4 = 0 = ainda não acabou a escrita. Bit 3 – WRERR −> este bit indica erro na escrita da EEPROM. e devem ser lidos como 0 (zero). L/E = permite leitura e escrita (R/W) Os bits 7. lê valor no endereço 5 . Bit 3 = 1 = a escrita não foi feita corretamente. Bit 3 = 0 = a escrita foi terminada com sucesso. EEDATA – é através deste registrador que trabalhamos com os dados que queremos gravar ou ler da EEPROM.79 bsf status. banco 1 . Eles são: EEADR – responsável pelo endereçamento da memória EEPROM. Bit 2 = 0 = escrita na EEPROM não é permitida. w (ou 0) bcf status. Bit 4 – EEIF −> determina a interrupção do final da escrita.1 Registradores usados com a EEPROM: São quatro os registradores usados com a EEPROM interna dos PICs.

Esta rotina será usada para fazer a varredura dos displays. 18F628A): L/R −> permite escrita e leitura pelo usuário (R/W).Crie uma rotina de tempo. é assim que enxergo. Ao menos foi isto que verifiquei na prática e que constatei na conversa com amigos experts em PIC. Os dois têm as mesmas funções e um pode substituir o outro. menos o bit 4. 2º −> Mudar o PIC no programa gravador. Podemos perceber que os registradores EEADR. tenha claro o seguinte: para cada letra que acrescentar nos displays deverá fazer com que ela seja impressa umas 20 a 30 vezes. são necessárias algumas “coisinhas” para que um funcione no local do outro. Quando terminar a leitura o PIC o coloca em 0 e isto pode ser usado para se saber quando aconteceu o final da leitura. . Mas. isto não quer dizer que você não precise setar o seu gravador. Observe os software dos dois tipos de PICs e veja as diferenças. Apenas o EECON1 permite mais “interação”. EEDATA. É como uma UPGRADE no PIC. 3º −> Ver se o seu gravador (hardware-plaquinha) é capaz de gravar os PICs com ou sem A no final. Com isto quero dizer o seguinte: Se você escrever CA nos displays.80 Bit 0 = 1 = inicia a leitura da EEPROM e fica em 1 até terminar a leitura. com freqüência entre 30 a 100 Hz. .2. 32. “transparentes” para você. Que me perdoem os catedráticos mas. A EECON1 do 16F62X (16F627. 16F628. isto deverá sempre ser impresso pela rotina de varredura dos displays entre 20 a 30 vezes. Informações adicionais 2 VARREDURA EM DISPLAYS DE 7 SEGMENTOS . Todos os flags funcionam como o da 16F84. 1º −> Colocar o arquivo include correspondente ao PIC usado. Supondo que a palavra completa seja CASA o próximo passo é deslocado uma letra.Supondo que você esteja usando dois displays.DICAS -Faça uma tabela de variáveis onde você associe as letras que serão escritas ao código binário que acenderá cada segmento dos displays. EECON2 são praticamente. Só dá para colocar 1 neste flag o 0 é “função” do PIC. . Informações adicionais 1 PIC COM “A” E SEM “A” Até onde eu sei a diferença entre um PIC com final A e sem final A está na estrutura interna. que não existe neste registrador. assim o que aparecerá nos displays será AS. Chamo isto de rotina de deslocamento.

São os avançados tecnológicos. 1 x 16 ou 2 x 16. Hoje em dia ele vem encapsulado em uma resina e não é possível a leitura de código nenhum. mais antigamente ainda ele tinha o formato de um CI tipo DIL. escreve E registrador W . Este números querem dizer o seguinte: 1 x 16 -> 1 linha de 16 caracteres. volta para o início . escreve E no display . Para que o efeito de varredura fique bom é necessário que a cada duas letras exista um loop que chame a varredura umas 20 a 30 vezes. por exemplo. chama rotina se (varredura de 30 a 100 Hz) . A função deste CI é fazer a comunicação entre o microcontrolador e os outros CIs usados no display. Antigamente este CI era um VLSI montado e soldado do lado de trás do display e você podia ver o código dele. 2 x 16 -> 2 linhas de 16 caracteres. decrementa o valor entre 20 a 30 vezes .81 Para fazer isto associe ao final dos 20 a 30 impressões os códigos binários nas saídas para os displays. entrar na rotina de varredura. assim sucessivamente. que deverão ser trocados. retorna do deslocamento (rotina de 20 a 30 vezes) . A rotina de deslocamento se chama “see” e faz com que as letras sejam impressas 20 a 30 vezes. . Exemplo: Palavra usada = ELA Início: movlw E movwf display call se movlw L movwf display call se decfsz xxx goto início call see . repetidamente 20 a 30 vezes. Pinagem destes displays: . A rotina de varredura se chama “se” e faz os displays ficarem piscando de 30 a 100 vezes por segundo (30 a 100 Hz). chama rotina se (varredura de 30 a 100 Hz) . Informações adicionais 1 Baixe o arquivo picdisp DISPLAYS LCD BASEADOS NO HD 44780 O circuito integrado HD 44780 é muito comum no uso em displays de cristal liquido que trabalham com linhas e caracteres. carrega L no registrador W . escreve L no display . próximas letras. .

R/W = (R = read = leitura e W = write = escrita) a 0. Pino 10 −> DB 3 – I/O. deve estar em 0 e depois de colocado os dados. Normalmente os “pontos” que acionam esta luz são indicadas por “A” e “K” ou “A” e “C”.82 Pino 1 −> terra. Condições Inicias: RS = 0 para mandar as instruções. Pino 7 −> DB 0 . Pino 2 −> Vcc (5 Volts). Pino 12 −> DB 5 – I/O. Quando um display LCD possui back-light ou luz de fundo. Seqüência Binária: Liga o circuito e espera 45ms (tempo mínimo de 15ms) Pino 6 (E) = 1 . quer dizer que é possível acender uma luz no fundo do display. o pino RS (pino 4) e o pino R/W (pino 5) devem estar em nível 0 (entrada de instrução e escrita no display). Fazer a inicialização é enviar uma série de comandos (bits de 0 e 1) para que o display comece a entender o microcontrolador. Pino 14 −> DB 7 – I/O. Esta inicialização pode ser feita com 8 ou 4 bits e é um padrão para todos os displays baseados no HD 44780 (Este CI virou quase um padrão para displays). mas. Pino 3 −> ajuste de contraste (Vee). Inicialização em 8 Bits: Para inicializarmos o display precisamos jogar uma seqüência de códigos binários no mesmo. Normalmente entramos com informações em um display mas também podemos ler as informações que estão escritas neles. Pino 11 −> DB 4 – I/O. E = varia entre 0 e 1 de acordo com as informações anteriores. Isto mesmo.I/O. Para que passamos usar um display é necessário fazermos a inicialização dele. Eu costumo trabalhar com inicialização em 8 bits (na contramão da história). Pino 5 −> R/W (entrada) 0 = escreve no display. Pino 9 −> DB 2 – I/O. “K” ou “C” de catodo ou negativo. Após isto temporizar 1ms. entenda pinos de entrada ou saída. “A” de anodo ou positivo. 1 = lê o display. Observação: Instrução é um comando para o display funcionar. Pino 8 −> DB 1 – I/O. passar para 1 e voltar para 0. teremos acesso a inicialização com 4 bits graças ao amigo do peito chamado Derli. Escrita é uma informação que aparecerá no display. Pino 6 −> E (entrada) habilita leitura. Por I/O. Pino 13 −> DB 6 – I/O. Pino 4 −> RS (entrada) 0 = entrada de inscrição 1 = entrada de dados. Para que isto possa acontecer.

Pino 6 (E) = 1 Espera 1ms (pode ser 1µs que funciona) Pino 6 (E) = 0 Espera 45ms (tempo mínimo 1. C = 0 o cursor fica desligado. como se fosse uma “underline” ou risquinho).83 Espera 1ms (pode ser 1µs que funciona) Pino 6 (E) = 0 Espera 45ms (tempo mínimo 4. Pino 6 (E) = 1 Espera 1ms (pode ser 1µs que funciona) Pino 6 (E) = 0 Espera 45ms (tempo mínimo 40µs) D = 0 o display fica desligado. B = 1 o cursor pisca. Aparecerá o cursor na tela. F = 1 se cada caractere for de 5 x 11 pontos.1ms) Pino 6 (E) = 1 Espera 1ms (pode ser 1µs que funciona) Pino 6 (E) = 0 Espera 45ms (tempo mínimo 40µs) N = 1 se o display for de duas linhas. este caso. B = 0 o cursor não pisca. N = 0 se o display for de uma linha. DL = 1 se a inicialização for com 8 bits. Eu acho melhor deixar o cursor piscando. É interessante e mais didático deixar D = 1. D = 1 o display fica ligado.1ms) Pino 6 (E) = 1 Espera 1ms (pode ser 1µs que funciona) Pino 6 (E) = 0 Espera 45ms (tempo mínimo 100µs) Pino 6 (E) = 1 Espera 1ms (pode ser 1µs que funciona) Pino 6 (E) = 0 Espera 45ms (tempo mínimo 4.64ms) Esta linha limpa o display. C = 1 o cursor fica ligado. F = 0 se cada caractere for de 5 x 8 pontos. . DL = 0 se a inicialização for com 4 bits.

Rotina para escrever Instruções: bcf porta. repetir isto quantas instruções . a maioria dos displays tem cada caractere formado por 5 “quadradinhos” na horizontal por 8 “quadradinhos” na vertical e portanto são 5 x 8. move o valor de W para a portb que está ligada com o display . Mas. 2 . deve haver um pulso 1 de enable (pino 6 = E) e depois uma temporização. Para escrever após o oitavo caractere. fomando: movwf portb nop bcf porta. Tudo há seu tempo.. deixa passar 1µs (devido ao clock de 4 MHz) .. pelo menos na minha. coloca 1 em E .. colocar a instrução em binário em W. S = 1 o display shift (se desloca). Mas. Cada linha em um display de 16 caracteres é dividida em duas partes. Também percebemos que entre uma linha e outra.. sub-rotina e assim funciona) . Determinadas letras devem ser substituídas por 0 ou 1 de acordo com o que desejamos. S = 0 o display não shift (não se desloca). escrever no display que é bom nada. 2 nop bsf porta. Podemos perceber que a inicialização é uma seqüência binária com 8 dígitos. coloca entrada RS em 1 e permite a entrada de instruções no display . é comando. 3 movlw b ‘instrução’ call comando . Término da inicialização com 8 bits. Eu aconselho o seguinte: D=1 DL = 1 C=1 B=1 ID = 1 S=1 F = 0 −> na prática. Por enquanto estamos entendendo o display e depois vamos dar recursos para você brincar com ele. Todas estas temporizações são conseguidas com rotinas de tempo ou instruções nops. forem necessárias . escreve 1µs (poderia ser 1ms mas daí precisaria de outra . coloca 0 em E (pino 6 do display) . a teoria ainda não acabou. o nome desta sub-rotina . é necessário enviar uma instrução para o display para que ele enderece o seu banco de memória RAM em C0 que corresponde a 192 em decimal e a 1 1 0 0 0 0 0 0 em binário. chama sub-rotina para escrever instruções.84 Pino 6 (E) = 1 Espera 1ms (pode ser 1µs que funciona) Pino 6 (E) = 0 Espera 45ms ID = 1 o display escreve para a direita. Cada parte possui 8 caracteres.

coloca o valor de 250 em W . vai para ms1a ms1: movlw . decrementa 1 do valor na variável tempo1 . vai para m451 . ---. ---. --..final da sub-rotina --.. . ---. ---... 2 nop bcf porta. cuidado se mudar os pinos do PIC . diminui 1 de xxxx e pula a inscrição seguinte ... ---m45: movlw 250 movwF tempo m451: movlw 60 movwf tempo1 m452: decfsz tempo 1 goto m452 decfsz tempo goto m451 return end . --. aguarda 1µs . colocar a letra em binário no W .. ---.. coloca o valor 60 em W . perde 1µs para ajudar a conseguir a . sub-rotina de tempo correta . ----. --. os comandos acima. 250 movwf xxxx ms1a: nop decfsz xxxx goto ms1a . coloca 1 no pino E do display . diminui 1da variável tempo . coloca o valor 60 em tempo1 . aguarda um 1µs (para clock de 4 MHz) .. ---. 2 nop bsf porta. comandos necessários . carrega W com 250. ---. ----.. 2 . coloca 0 em E . habilitam a entrada . O ponto indica decimal . coloca entrada RS em 1 e permite escrita . quando o valor de xxxx for igual a (0) zero.85 nop bcf porta. volta para a linha abaixo do comando call . da letra no display . espera 1µs segundo . coloca o valor de 250 na variável tempo . move o valor de W para a portb . coloca zero (0) no pino E do display . ---- Rotina para Escrever uma Letra ou Dado: bsf porta.sub-rotina de ± 45ms --. 3 movlw b ‘letra’ call escrever . chamar a sub-rotina escrever para ter os . vai para m452 .... escrever: movwf portb nop bcf porta. --. de um dado no display . ---. coloca 0 em E (pino 6 do display) . carrega xxxx com 250 . 2 .aguarda 1µs .. final dos comandos .

. Veja: rotina para escrever instruções Assembler assembler call comando comando: assembler assembler no final do programa em um ponto do programa Andando com o Texto: Lembre-se de fazer o bit RS do display ficar igual a 0. ----. --. carrega o portb com o valor de W . --. veja: bcf porta. Um exemplo ficaria assim: goto deslocamento . aguarda 1 µs . ---. 2 nop bcf porta.. 3 movlw B ‘ 0 0 0 0 1 1 1 0’ movwf portb bcf porta. o bit RS será igual à zero Lembre-se também que será necessário se criar uma rotina de temporização para definir a velocidade de deslocamento. --. --. coloca 0 em E. para o deslocamento .rotina do 1 a 2 segundos---------------------------------------- .final da sub-rotina --.. ---- É importante perceber que as sub-rotinas comando: e escrever: devem ficar no final do programa e a chamada para ir até uma ou outra deve ficar na posição desejada do programa.. final dos comandos . 2 ... limpa RS e escreve comando . vai para a rotina de deslocamento . para a direita . carrega W para mover o texto . e finaliza as instruções .. 3 . --. aguarda 1µs .. coloca 1 em E . 2 nop bsf porta.--------------------------rotina de deslocamento----------------------------------------------deslocamento: bcf porta.. --. ---. ---. volta da rotina . ---.86 return end .. coloca 0 em E .

decrementa tempo2 . carrega W em 4 . carrega W com 40 . como funciona um loop de tempo. perde 1µs (4 MHz) . 1µs na instrução decFsz.44s.87 1a2s: movlw 4 movwf tempo 1a2sa: movlw 40 movwf tempo1 1a2sb: movlw 250 movwf tempo2 1a2sc: nop decfsz tempo2 goto 1a2sc decfsz tempo1 goto 1a2sb decfsz tempo goto 1a2sa return end . 2µs na instrução goto. vai para 1 a 2sa .000 x 120 x 12 =1. decrementa tempo . . volta à chamada . final dos comandos 4µs x 250 = 1ms 3µs x 40 = 120µs 3µs x 4 = 12 Observe estes tempos para ver de uma forma simples. 2µs na instrução goto. Para encontrarmos o tempo total gosto para que este loop termine. carrega tempo com o valor de W .440ms = 1. decrementa tempo1 . carrega tempo1 com 40 . Veja: 1ms x 120µs x 12µs = 1. O loop chamado de (3) dará 4 “voltas” e perderá 3µs em cada uma: Sendo assim temos 4 x 3µs = 12µs. vai para 1 a 2sb . carrega W com 250 . 1µs na instrução nop. na verdade a tempo real será sempre maior que o calculado assim). O loop chamado de (2) dará 40 “voltas” e perderá 3µs em cada uma: 1µs na instrução decFsz. Sendo assim 40 x 3µs = 120µs. Sendo assim 250 x 4µs = 1ms. basta multiplicar estes três tempos (isto é uma forma simples e não com 100% de precisão. O loop chamado de (1) dará 250 “voltas” e perderá 4µs em cada uma. vai para 1a2sc . carrega tempo2 com 250 .

se o display tiver 16 posições o tempo total será de 1. . você tem a seguir os endereços iniciais e finais de cada linha de diversos displays. goto x1 decfsz tempo goto x bsf porta. 3 . . . 2 nop bsf porta. 3 movlw B ’11000000’ movwf portb nop bcf porta. . . mas. A numeração dentro do display está em hexadecimal e em um padrão que começa em 80H. Este tempo será o necessário para o texto se deslocar de uma posição no display para outra. . 2 movlw 250 movwf tempo x: movlw 60 movwf tempo1 .44s para o deslocamento do texto. Para escrever após o oitavo caractere é necessário endereçar a memória RAM do display para C0H ou 192 decimal ou 11000000B. normalmente podemos chamar este endereço subtraindo 80H daí ficaria assim: Sem somar 80H (lembre-se. . reset. 2 nop bcf porta. Um display de 1 x 16 é formado por duas linhas. 2 bcf porta.88 O tempo será de aproximadamente. seta e reseta o bit E do display .44s x 16. só que deve ser feito após se escrever o 16 caracter. . . 20 x 1: Linha 1 −> 00H às 13H 20 x 2: Linha 1 −> 00H às 13H Linha 2 −> C0H a D3H 20 x 4: Linha 1 −> 00H às 13H Linha 2 −> 40H às 53H Linha 3 −> 14H às 27H . Para fazer isto podemos usar a seqüência em assembler seguinte: bsf porta. Para displays de 2 x 16 o procedimento é o mesmo. . 1. x1: decfsz tempo1 . você pode ir para o endereço que quiser do display somando ou não 80H ou 128 decimal). Em alguns displays devemos mudar o endereço para 40H para mudar de linha. uma após a outra de 8 caracteres. . . . . ou seja. ou 192 em decimal ou C0 em hexadecimal .

Lembre-se sempre de terminar ma escrita em um display com um loop ou um loop sem fim. . principalmente se você quer fazer apenas um teste inicializando e escrevendo alguma palavra.Rotina de ± 15ms V – 15.000µs (supondo 4 MHz de Clock). escreve A no display Mas. . . + 1µs . . isto é uma característica da MPLAB e poderá não funcionar com outro compilador. Informações adicionais 3 EXEMPLOS DE SUB-ROTINAS DE TEMPO . aqui se perde o tempo da instrução Call . . . + 1µs . + 1µs . + 2µs . ms: movlw 230 movwf tempo ms15: movlw 20 movwf tempo1 ms1sa: decfsz tempo1 . + 3µs . .Rotina de ± 4.100µs (para 4 MHz de Clock): ms: movlw 180 movwf tempo2 ms4. .1a: decfsz tempo 3 goto ms4.89 Linha 4 −> 54H às 67H 40 x 2: Linha 1 −> 00H às 27H Linha 2 −> 40H às 67H Lembre-se de chamar o endereço certo. .1: movlw 6 movwf tempo3 . + 1µs goto ms15a decfsz tempo goto ms15 return .1a decfsz tempo2 . ms4. + 1µs . carrega W com a letra A movwf portb . Observação: As letras podem ser escritas assim: movlw ‘A’ . + 2µs .1ms – 4. .

Rotina de ± 100µs (para um cristal de 4 MHz): ms: movlw 33 movwf tempo4 ms 100: decfsz tempo4 .64a decfsz tempo6 goto ms1. . .64: movlw 5 movwf tempo7 ms1. diminui 1 de tempo 5 e perde 1µs quando . . . carrega o variável tempos com o . . .64ms – 1. goto ms100 return . .Rotina de ± 40µs (para clock de 4 MHz): ms: movlw 12 movwf tempo5 ms40: decfsz tempo5n goto ms40 return .Rotina 1. . . . . W = 240 . valor do registrador W (+ 1µs) . . . .90 goto ms4. volta para a linha após a instrução Call (+ 2µs) . . tempo 5 for = 0 pula a instrução seguinte (+ 1µs) . vai para ms40 (+2µs) . . . nome para “ajudar” o goto .64 return . Y = W = 240 . .640µs (para um xtal de 4 MHz): ms: movlw 82 movwf tempo6 . carrega W com o valor 12 (+ 1µs) .Rotina de ± 60s (para xtal de 4 MHz): ms250: movlw 240 movwf y ms250c: movLw 250 . a instrução Call chama ms (+ 2µs) . ms1. .64a: decfsz tempo7 goto ms1. . .1 return . W = 250 .

igual a 0 pula a linha seguinte. nome para se conseguir usar a instrução . . W = tempo1 = 250 . perde 1 ciclo de máquina . demora 2 ciclos de memória (2µs) . carrega W com 250 em decimal . nome para se chamar com a instrução goto .Rotina de tempo de ± 250ms (4 MHz): ms250: movlw 50 movwf tempo ms250A: movlw 250 movwf tempo 1 ms250B: nop decfsz tempo 1 goto ms250B decfsz tempo goto ms250A return end . . neste caso tempo e tempo1. o registrador de trabalho W será carregado . W = 250 . vai para ms250b . goto e fazer Loop . . .Outros para fazer os loopings. neste caso ms250A e ms250B. manda o programa para o nome ms250A . tempo = W = 250 . espera 1µs . . última linha do programa Perceba que para se fazer uma sub-rotina de tempo. Decrementa ou diminui 1 de tempo . . diminui 1 de tempo 1 quando o tempo 1 for .91 movwF tempo ms250a: movlw 250 movwf tempo1 ms250b: nop decfsz tempo1 goto ms250b decfsz tempo goto ms250a decfsz y goto ms250c return end . mesmo depois da instrução return é “interessante” se colocar a instrução end. linha se tempo 1 = 0 . . . uma instrução call chama ms250 e isto .Uma para chamar a rotina. precisamos de nomes: . volta para uma linha após a instrução Call . carrega tempo 1 com o valor de W . . que é esta. a variável tempo será carregada com o valor . diminui 1 de tempo1 e pula a próxima . . . do registrador W . . Também precisamos de variáveis. neste caso ms250. . com o valor 250 . veja que se a sub-rotina for a última “coisa” do programa. A linha acima vai para ms250B. .

D = 1 display ligado C = 0 cursor desligado. ou quatro pinos do PIC que poderão ser usados para outras funções.1ms 8 – RS R/W DB7 DB6 DB5 DB4 0 0 0 0 1 0 −> esta linha define inicialização em 4 bits 9 – loop de 40µs 10 – RS R/W DB7 DB6 DB5 DB4 0 0 0 0 X 0 0 0 1 F X X −> o valor de F define a matriz do display se F = 1 display de matriz 5 x 11 se F = 0 a matriz do display é de 5 x 8 X = não importa o valor 11 – Loop de 40µs 12 – RS R/W DB7 DB6 DB5 DB4 0 0 0 0 0 0 0 0 1 D C B −> D = 0 display desligado. C = 1 cursor ligado B = 0 cursor sem piscar. “Os bits não usados (DB3 a DB0) devem ter o valor zero (0)”. Veja a inicialização: 1 – loop de 15ms 2 – RS R/W DB7 DB6 DB5 DB4 0 0 0 0 1 1 3 – loop de 100µs 4 – RS R/W DB7 DB6 DB5 DB4 0 0 0 0 1 1 5 – loop de 100µs 6 – RS R/W DB7 DB6 DB5 DB4 0 0 0 0 1 1 7 – loop de 4. B = 1 cursor piscando 13 – Loop de 40µs 14 – RS R/W DB7 DB6 DB5 DB4 0 0 0 0 0 0 0 0 0 0 0 1 15 – Loop de 1.64ms .92 Informações adicionais 4 INICIALIZANDO UM DISPLAY COM 4 BITS O bom de inicializar um display com 4 bits é que você “economiza” quatro fios.

o resultado do aprendizado é bom. Veja: RS R/W DB7 DB6 DB5 DB4 0 0 1 1 1 1 depois. Não há necessidade de colocar algum tempo entre a primeira linha de bits e a segunda linha de bits dos comandos 10. 14 e 16. O som não é muito agradável. Esta sirene terá dois tons. Faça download do arquivo sirene. RS R/W DB3 DB2 DB1 DB0 0 0 1 1 1 1 Informações adicionais 5 UMA SIRENE COM PIC E COM FET A finalidade deste circuito é fazer com que você comece a brincar com Mosfets. faça da seguinte forma: Envie primeiro os 4 bits mais significativos e depois os 4 bits menos significativos. Vamos ver o circuito da sirene sem o PIC. 400 Hz e 1 kHz. Para enviar os comandos ou o que vai ser escrito no display. ID = 0 cursor para esquerda S = 0 escrita não se move. S = 1 escrita se move Terminou a inicialização de 4 bits. 12. Lembre-se que entre cada seqüência de bits de instruções. mas. após os bits. você deve fazer o seguinte: Pino 6 (E) = 1 Espera 1ms Pino 6 (E) = 0 Dúvidas? Leva novamente a inicialização com 8 bits.rar RL = alto falante de 8Ω e 5 Watts D1 = diodo de proteção = 1N4007 Q1 = Mosfet IRF640 C = 100nF para 1kHz e 200nF para 400 Hz R = 2K2Ω x 1/4 Watts A comutação entre 0 e 5 Volts na saída Rb1 do PIC fará com que o Fet ora conduza ora corte e o alto falante “berre”. .93 16 – RS R/W DB7 DB6 DB5 DB4 0 0 0 0 0 0 0 0 0 1 ID S −> ID = 1 cursor para direita.

O clock que vai ligado na RB6. faça mudanças. Você desenvolve um projeto. Você pode usar este circuito como um mini . vende milhares e. Veja as diferenças entre os programas. . Através de 7 exemplos que estão escritos aqui. Para programar o PIC você deve elevar a tensão de programação (Vpp) para 13 Volts (entre 3.rar Informações adicionais 7 ICSP ICSP significa (In Circuit Serial Programing) e traduzindo para um bom português. depois o retire e o coloque aqui. . fica muito mais fácil você fazer um upgrade no software do seu PIC. você pode me fazer uma doação.O terra ou Vss. você poderá brincar bastante com o display LCD. Como você vendeu centenas de milhares.94 Informações adicionais 6 Testando a inicialização com 8 bits A finalidade deste circuito é testar a inicialização do display de LCD com 8 bits.placar.A tensão de alimentação Vcc ou Vdd. O ICSP usa cinco pinos para a gravação do software: . em cash. que eu agradeço. Você deve saber iniciá-lo na teoria e na prática com 8 e 4 bits. . mas. Você pode gravar o PIC na placa Pratic628 da Exsto. aprenda na teoria e na prática. bem como o que resta de memória em um dispositivo OTP. .5 Volts).A tensão de programação que vai ligado no MCLR/Vpp. quer dizer programando o PIC com ele já montado no próprio circuito.Os dados que vão ligados no RB7. Aqui estamos apresentando um circuito para inicialização e funcionamento com 8 bits. para isto monta milhares. Informações adicionais 8 O CIRCUITO INTEGRADO MT 8870 . Baixar programas LCD. Através da programação no próprio circuito ou ICSP. Baixe o circuito display_pratica. O ideal para fazer este tipo de gravação é o gravador (hardware) Pro Mate II da Microchip ou algum equivalente real. isto há long time ago.estádio. e só programa com tudo “soldado” inclusive o PIC. A gravação ICSP serve tanto para regravar toda a memória de um dispositivo Flash. onde passam mensagens repetidas.rar O display usado é um 2 x 16 baseado no IC HD 44780.5 a 13. Eu montei este pequeno circuito para ser usado como placar de um mini .

G = R1 R2 Na prática eu já usei ganho de 10. O pino 15 fica em Vcc quando o IC detecta um tom DTMF. O pino 6 desabilita o IC e desliga e oscila.rar O pino 1 é a entrada não inversora. O pino 4 gera uma tensão de referência e deve ficar ligado com o pino 1. O pino 5 inibe a detecção dos tons. Para o circuito funcionar ele deve estar em 0 (zero). Normalmente os valores de R1 e R2 são iguais a 100K. veja: Informações adicionais 9 RS 232 – USART RS 232 quer dizer padrão recomendado 232 ou. junto com alguns resistores externos. você deve usar transistores como driver de corrente. O pino 8 é a saída do oscilador. Os pinos 16 e 17 estão ligados há uma constante RC que determina um período para validação dos tons DTMF. Os pinos 11. O pino 18 á o Vcc que deve ser alimentado com +5 Vcc. O pino 2 é a entrada inversora. são eles que definem o ganho e/ou a sensibilidade do circuito. O pino 9 é o terra e vai ligado em 0 Volt. . Normalmente colocamos entre estes dois pinos um cristal de 3. usei R1 = 100K e R2 = 10K. 12. que corresponde há um cristal de cor do sistema NTSC. As saídas Q1 a Q4 e CT fornecem uma corrente baixa e caso você queira ligar leds a elas para analisar o funcionamento. Para funcionarem normalmente. Cada tom DTMF é composto de duas freqüências diferentes e com forma senoidal. Com um telefone comum. O pino 3 define o ganho do IC. DTMF são aqueles tons emitidos por um telefone comum. O pino 7 é a entrada do oscilador. principalmente se a linha que você usar for ruidosa ou a fonte de sua bancada não eliminar todo o ripple e RFI. O pino 10 define se as saídas Q1 a Q4 funcionam normalmente ou ficam em TRI-STATE (alta impedância). em inglês “Recommended Standard 232”.95 O circuito integrado MT 8870 é um detetor de DTMF. mais um IC destes (pode ser o HT 9170 também). Só de ver isto dá para perceber que podemos trabalhar com áudio balanceado ou desbalanceado.579545 MHz. mas. 13 e 14 são as saídas que apresentam um código em binário para cada tom DTMF. ou seja. este pino deve estar ligado no Vcc. Faça download do arquivo MT8870. mas um 16F628 você pode brincar de controlar tudo a distância via telefone comum/fixo ou telefone celular. Para detectar ele deve estar em 0 (zero). Este pino pode ser usado para controle.

Apenas o necessário para a subida e descida dos sinais. “Eletronic Industries Associaton”. Terra – é o terminal comum entre DTE e DCE. Rx – está operando quando o microcomputador recebe bits do gravador (bits do DCE para o DTE). DCE −> equipamento responsável pelo “recebimento” das informações e por manuseá-las. nível lógico 1 o que corresponde há um nível de tensão negativa. Clear to Send – “pode enviar” – CTS. Você pode alimentar circuitos simples com estes sinais. EIA quer dizer. Este sinal também pode ser chamado de DTR. Request to Send – “vu enviar” – RTS. Quando o DCE está pronto ele avisa com o sinal CTS. Agora o que eles fazem? Tx – está funcionando quando estão sendo transmitidos bits do micro para o gravador (de DTE para o DCE). Terra – gnd. Entre -3 a +3 Volts “tudo pode acontecer” pois estes níveis estão em uma região de transição e é muito útil que permaneçam o mínimo tempo nela. RTS – este sinal é habilitado em 0 (tensão positiva) para enviar o gravador (DCE) que ele deve aceitar os bits transmitidos pelo microcomputador (DTE). ele vai para nível lógico 1). Acabou a conversa. DTE – este sinal passa para nível lógico 0. há algumas décadas. Existem alguns nomes e sinais que são definidos por este padrão: DTE −> terminal responsável pelo envio da informação. Para explicar poderíamos citar um microcomputador “controlado” ou conectado com uma placa de programa de PICs. Vamos aqui apresentar os sinais usados em um cabo serial DB9 (com conector DB9) com ênfase em aplicações com microcontroladores. Sem uso. sua tensão é negativa em relação ao terra e isto significa nível lógico 1. DCE – este sinal é usado quando o microcomputador é ligado com um modem e não é importante em nossas aplicações. • Níveis de corrente: Normalmente se mantém o nível de corrente inferior a 500mA. CTS – este sinal é habilitado pelo gravador (DCE) em nível lógico 0 (tensão positiva) e avisa ao microcomputador (DTE) que a transmissão de bits pode começar.96 Este padrão foi criado há muito tempo. DCE – indica DCE pronto. este é o caso de alguns gravadores de baixo custo: • Velocidades da comunicação comuns: . Quando nada é transmitido. Nível lógico 0 −> tensões entre +3 Volts a + 25 Volts em relação ao terra. Rx – recepção de dados. e hoje em dia a forma correta de chamá-lo é EIA 232. • Níveis de tensão dos sinais: Nível lógico 1 −> tensões entre -3 Volts a -25 Volts em relação ao terra. quando o micro quer falar com o gravador (o DTE informa o DCE que quer falar. DTE – indica DTE pronto. através da porta serial (a do mouse). Normalmente um microcomputador. o que corresponde há um nível positivo de tensão. sem o uso de uma fonte de alimentação. Tx – transmissão de dados.

Os pinos 8 e 7 são ligados em curto e os pinos 4.Por software . .1 e 6 também são ligados em curto.onde o controle de dados é feito através de dois caracteres/números (caracteres ASCII) e que é conhecido por XON/XOFF e só usa Tx.Por hardware – que precisa das linhas RTS e CTS além do Tx.000bps 48.000bps 56. Rx e terra.000bps • Pinagem do DTE (microcomputador): 1 – NC* 2 – Rx 3 – Tx 4 – DTE 5 – terra 6 – DCE 7 – RTS 8 – CTS 9 – NC* * em nossas aplicações • Pinagem do DCE (gravador): 1 – NC* 2 – Tx 3 – Rx 4 – DTE 5 – terra 6 – DCE 7 – CTS 8 – RTS 9 – NC* * em nossas aplicações Quando você monta um circuito para comunicação serial pode ser que esteja trabalhando com níveis TTL (0 e 5 Volts) e precisará convertê-los para o padrão EIA 232. Isto “engana” o microcomputador permitindo a comunicação. Você pode fazer isto. Rx e terra e que é conhecida por controle RTS/CTS. Este tipo de ligação necessita da conexão com o cabo/conector DB9 como mostrado como Null Modem (sem modem) e é utilizado para se conectar dois DTE (ou dois dispositivos “inteligentes” como um microcontrolador com um microcomputador). O cabo entre os dois dispositivos só será conectado através de 3 vias que são o Rx o Tx e o terra. podemos ter dois tipos de controle de fluxo de dados: . usando o IC MAX 232. Apenas para informação.97 300bps 1200bps 2400bps 4800bps 9600bps 19200bps 33. Com este tipo de ligação e com os dois dispositivos trabalhando “na mesma velocidade” não precisamos ter o controle de fluxo. que gera tensões de -10 e +10 Volts a partir de uma tensão de +5 Volts. .

. .List File . Quando Rb2 é entrada de clock dissemos que estamos trabalhando em modo escravo.case sensitive .Temos que configurar os registradores próprios da USART.INHX8M . com 8 bits e cabo Null Modem.Os pinos de comunicação são o Rb1 e Rb2. Pois um pino é usado para clock. . exemplo: x equ 0DH .98 • Algumas considerações: . O loop ficará rodando e o programa ficará parado até que o PIC seja resetado. .O pino Rb1 é o Rx em modo assíncrono e DT (ou entrada e saída de dados) em modo síncrono. Exemplo: loop: nop goto loop .Uma forma simples de “parar” um programa é se fazer um loop sem fim. . ou seja.Ao fazer um projeto no MPLAB o projeto e o arquivo “.Toda variável que irá assumir um valor. deve estar indicada no espaço de constantes e RAM.No modo síncrono só poderemos trabalhar como half-duplex (meio-duplo). W = 100 .asm” devem estar no mesmo diretório e este diretório só deve ser usado para eles. Informações adicionais 10 ALGUMAS DICAS E ORELHADAS .Tente trabalhar em modo assíncrono. X = 100 . Quando Rb2 é a saída de clock dissemos que estamos trabalhando em modo mestre. .cross-reference file Coloque em on: .Quem gera o clock é o “chefe”. . . quando há transmissão não há recepção e vice versa.O pino Rb2 é Tx em modo assíncrono ou entrada/saída de clock. .error File .Quando definir as características do compilador coloque as seguintes em off: . para: movlw 100 movwF x .Cuidado para não confundir O (letra O) com 0 (zero). .

7.4X para tudo).40 é mais leve. se você usa um cabo conversor USB – Serial ou USB – paralelo. mais provavelmente. roda em Windows 95 e 98. . . porém pode apresentar alguns conflitos com alguns gravadores. exemplo: call 1ms “ “ “ “ “ “ 1ms: . etc) e se o seu micro for meio “lento” ela será pesada. começar a apresentar erros. .Podemos escrever todo o programa no bloco de notas e salvar com a terminação “.40 são superiores porém só rodam com o Windows 98SE para cima com o XP.hex”.Se acontecer persistentemente. pois poderão acontecer erros na gravação do PIC. importe o arquivo novamente e grave novamente. Ás vezes é necessário “ajustes” nesta comunicação. . Basta importá-lo e mandar gravar.7. .Os valores para se escrever em um LCD podem estar em decimal de acordo com a tabela de caracteres já mencionada. . mesmo que tenha sido criado em outro local.7. Depois gravamos. . apague a memória Flash. Millenium. .Você pode usar um software de gravação para gravar qualquer arquivo “. Depois rodamos o compilador (MPASWIN) e passamos para “.O ideal é que as portas sejam definidas sempre pelos seus números: Ra0 = 0 Ra1 = 1 Rb3 = 3 Etc.As versões do MPLAB acima da 5. .99 O resto deixe em branco (salvo alguma informação específica ao contrário).A versão do MPLAB 5. “ “ “ “ “ “ ms: . . . erros ao importar um arquivo “.hex” para o MPLAB. Se o Propic do MPLAB. . isto está errado . feche-o e o inicie-o novamente. . Caso contrário. ele não aparece na janela na hora de gravar o PIC (isto para quem usar o MPLAB 5.asm”. versões de firmawares e pcs. . Isto pode acontecer. .Se após a gravação aparecer uma lista de erros. dentro de um projeto. isto está certo . desinstale algum “outro” compilador e instale-o novamente associando-o ao MPLAB. Faça sempre com uma letra: call ms . feche o gravador.Nunca inicie uma chamada de sub-rotina com um número. . .Jamais crie mais de um projeto dentro da mesma pasta.É necessário compilar o código fonte (.hex”.asm).

luizbertini. um sinal aplicado na entrada Rb4/TOCKI.html Luiz Bertini De Janeiro a julho de 2004 Santicfy Yourself .100 O timer0. Espero que você tenha lido esta apostila inteira e tenha aprendido mais do que já sabia. Informações adicionais 11 Tentando ajudar. .luizbertini.luizbertini. antes de tudo. que poderá se repetir muitas vezes.Em uma sub-rotina. aparecerão “warnings” no resultado da compilação. porém os nomes das chamadas para o goto devem ser diferentes..html www. podemos usar as mesmas variáveis. Nossa intenção ao escrevê-la.luizbertini.net/circuitos.html www. Deixe um espaço antes de colocar uma diretriz. Visite estes sites: www. (Deu um trabalho danado escrever).Se as diretrizes começarem da coluna 1. .inclusive circuitos para o PIC www..net/eletronica. mesmo sem o prescaler já apresenta.net/livros.net/download. e ajudar a você leitor aprender sozinho. dividido por dois.html .

You're Reading a Free Preview

Descarregar
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->