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

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

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

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

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

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

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

que entra em OSC1. Vamos analisar o nome de dois PICs.8 GHertz ou 2.CLKIN – aqui pode ser ligado um oscilador externo desde um formado por uma constante RC até um VCO ou coisa parecida.OSC2 – saída para oscilador a cristal. o 16F628-04 e o 16F628-20. bit 7 – I/O: OSC1 – entrada do oscilador onde. normalmente eu aconselho se ligar um dos pinos do cristal a outro terminal do cristal. corresponde aos ciclos de máquina interno (veremos estes ciclos de máquina um pouquinho mais adiante). como a entrada para um dos comparadores. O período alto (+Vcc) é chamado de “Ton” e o período baixo de “Toff”. então de acordo com o nosso software e de como “setamos” ou ajustamos os registradores.8GHz Quer dizer que o clock do processador tem uma freqüência de 2.10 Pino 15 – Ra6 – port A. Pino 16 – Ra7 – port A. O pino 15 é normalmente a saída e o pino 16 é a entrada.AN1 – entrada analógica 1 para os comparadores. Nos PICs 16F84 e 16F628 os pinos que correspondem ao oscilador são os pinos 15 e 16. P4 de 2. veja um exemplo: O pino 18 pode tanto ser um I/O da porta.CLKOUT – teremos também neste pino a possibilidade de ler. bit 0 – I/O: . . um pino pode fazer uma função ou outra. Mas. Pino 18 – Ra1 – port A. Podemos perceber que cada pino tem mais de uma função. vai no pino 15. Pino 17 – Ra0 – port A. bit 1 – I/O: . Fique atento a isto. bit 6 – I/O: . 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. 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. 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.AN0 – entrada analógica zero para os comparadores.800 MHz. 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. antes de continuarmos com isto. Quando você vê a configuração de um microcomputador e ele tem um processador. usar ou. T = Ton + ToFF T=1 F ou F=1 T . retirar a freqüência de sinal. . É interessante que estes dois períodos sejam iguais.

001 segundos. 000.25 segundos. uma instrução demora para ser executada.000. Resumindo. Q3 e Q4”. o PIC precisa passar por Q1. . o ciclo de máquina é o nome das 4 fases Q1. então que cada instrução demora 1µs para ser executada.000 Ou 0. Q2. dividir por 4 e calcular seu período. pois. ou seja. Podemos também dizer que o clock de 4MHz é igual à freqüência de 1 MHz.000. vamos falar sobre ciclo de máquina. Q3 e Q4. Disto resultam quatro períodos que receberão o nome de: “Q1. 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”.000.1. 250ns.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. Isto é uma característica da estrutura Harvard que permite o pipeline de uma forma fácil. Agora que já conhecemos o clock. cada período destes “Qs” será igual ao período do clock externo. 7. Ciclo de Máquina: O microcontrolador PIC pega o sinal de clock e o divide internamente por 4. 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. que faz com que em um ciclo máquina ele busque a instrução e em outro ele a execute. portanto. Q2. e cada instrução é executada em um ciclo. estes 4 tempos somados: Q1 + Q2 + Q3 + Q4 = 250ns + 250ns + 250ns + 250ns = 1µs Vemos. Q3 e Q4. enquanto uma é executada outra ao mesmo tempo é buscada na memória. 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.

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.

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

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

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

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

125) = 2 1 Juntando os três temos 12CH. 1 com 2 . Exemplo: 1000 / 16 = 62.9375 2º) 15 = F 3º) (16 x 0.875) = 14 = E ⇒ junte os dois. Exemplo: / 16 = 3.125 ⇒ (16 x 0. F com F 2º) 1 = 1 3º) (16 x 0.125 ⇒ junte os dois.75 ⇒ (16 x 0. Exemplo: 505 / 16 = 31. Veja os exemplos a seguir: 300 / 16 = 18.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) = 15 = F 1 Juntando as três partes teremos o número 1F9H.875 ⇒ (16 x 0.9375 ⇒ (16 x 0.5625 ⇒ (16 x 0. Portanto 300 em decimal corresponde a 12 CH em hexadecimal.9375) = 15 = F 4º) 255 em decimal = FFH Quanto vale 18 em hexa? 1º) 18 / 16 =1.5625) = 9 31 / 16 = 1.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. Portanto 505 em decimal corresponde a 1F9 em hexadecimal.75) = 12 = C 300 / 16 = 1.5 ⇒ (16 x 0.19 1º) 255 / 16 = 15.

9375) = 15 = F / 16 = 1. Como a base do binário é 2 só teremos dois dígitos. Vimos que em decimal a base é 10 em hexadecimal a base é 16 e em binário a base será 2.9375 ⇒ (16 x 0. temos que perceber o seguinte: para encontrarmos o valor em decimal de um número em binário. 2 2 = 4 ⇒ dois elevado a dois é igual a quatro. que quanto o resultado é apenas inteiro (sem parte após a vírgula) o número 16 deve ser multiplicado por 0.20 4096 / 16 = 256. 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. esta diretriz recebe o nome de radix.9375 ⇒ (16 x 0. Usando esta tabela. antes vamos perceber o seguinte: 2 = 1 ⇒ dois elevado a zero é igual a um.0 ⇒ (16 x 0) = 0 15 = F 4095 em decimal é igual à FFFH. Exemplo: 0 . Agora vamos ver como passar de binário para decimal e vice-versa.0 ⇒ (16 x 0) = 0 16 1 4096 em decimal é igual a 1000H em hexadecimal. 4 2 = 16 ⇒ dois elevado a quatro é igual a dezesseis. Agora chega de exemplos.9375) = 15 = F 255 / 16 = 15. Veja por este exemplo. No cabeçalho de um programa com um PIC teremos uma diretriz que indicará com que base o programa trabalhará. podemos transformar qualquer número entre 0 a 16 em decimal em binário. Uma forma simples de perceber a relação entre decimal e binário é através do uso de uma tabela. Exemplo: 4095 / 16 = 255. Mas. 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. que pode receber o nome da tabela da verdade. 3 2 = 8 ⇒ dois elevado a três é igual a oito.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. 1 2 = 2 ⇒ dois elevado a um é igual a dois. 5 2 = 32 ⇒ dois elevado a cinco é igual a trinta e dois.

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

se repetir uma mesma informação (um registrador guarda uma informação) em dois ou mais endereços diferentes. como o Option.5) = 1 63 / 2 = 31.5) = 1 31 / 2 = 15.22 Exemplo: 255 / 2 = 127.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.5) = 1 / 2 = 1. .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.binário = base binária composta por 2 dígitos de 0 a 1. No PIC 16F84 existem 2 bancos de memória e no PIC 16F28 existem 4 bancos.5) = 1 127 / 2 = 63. Intcon.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. Resumo: .5 ⇒ (2 x 0. pois os registros que ocupam estas posições controlam o funcionamento e a comunicação do PIC. Muitos registradores especiais estão presentes em mais de um banco. isto pode ajudar na programação. mas. Chamamos de banco de memória de controle.5 ⇒ (2 x 0. Este espaço recebe o nome de “memória de controle”. Status.hexadecimal = base hexadecimal composta de 16 dígitos de 0 a F.5 ⇒ (2 x 0. Podemos perceber que existem registradores que estão no banco 0. Isto pode parecer estranho. um espaço na memória RAM que é reservado para os registros para funções especiais. em um programa. / 2 = 3. Trisb e etc. Junto com o banco de memória de controle há um espaço de memória de dados.5) = 1 35 / 2 = 7.5 ⇒ (2 x 0. Muitas vezes precisamos. Trisa.5 ⇒ (2 x 0.5 ⇒ (2 x 0. .5 ⇒ (2 x 0. É neste espaço que colocaremos as nossas “variáveis”. registradores que estão no banco 1 e registradores que estão nos dois bancos.

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

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

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

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

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

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.

cada PIC pode ter registradores diferentes. comparadores internos e uma porta USART de comunicação serial o bit 6. Releia o capítulo de registradores. Se era 1 fica 1 e se era 0 fica 0. Bit 1 – INTF −> indica que ocorreu uma interrupção externa através do pino Rb0/INT. Bit 1 = 1 = ocorreu pedido e interrupção. como o PIC 16F628 tem EEPROM interna. o importante é saber o conceito. que no 16F84. 0 = Nenhuma interrupção será tratada. Calma gente. mas os conheceremos depois. Bit 0 – RBIF −> indica mudanças do portb e interrupção do portb da Rb4 ao Rb7. vamos estar vendo aqui outros registradores não usados no 16F84. caso contrário. Este flag também deve ser “zerado” pelo seu software. era associada à EEPROM. . Bit 0 = 0 = não houve mudança de estado em nenhum pino do portb do Rb4 ao Rb7. Vamos ver primeiro o INTCON. Existem muitos outros registradores. 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. somos só aprendizes de feiticeiros. São o PIE1 e o PIR1. ele sempre ficará igual a 1. Ele é responsável pelas interrupções. mas. Bit 1 = 0 = não existe nenhum pedido e interrupção. Dá para perceber que este registrador só cuida das interrupções. você deve zerar este flag através de seu software. 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... 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. GIE: Habilitação geral das interrupções. Bit 0 = 1 = houve mudanças de nível de tensão em algum pino da portb do pino Rb4 ao Rb7.31 Quando ficar em 1. 1 = As interrupções habilitadas individualmente serão tratadas. mantém o estado que tinha antes do reset. Este bit também deve ser “zerado” pelo seu software. Lembre-se.

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

e fazer um programa ou “algoritmo” mais “legal” ou objetivo. Bit 6 – CMIF −> sinaliza mudança de estado nas saídas dos comparadores analógicos do PIC 16F62X. lembre-se disto. Bit 4 = 1 = interrupção habilitada. Sempre a indicação é feita pelo dígito 1. Bit 5 = 1 = com recepção. 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 2 = 0 = desabilitada. Bit 3 – Unused (não utilizada). Bit 1 = 0 = não habilitada. Mas. o Bit 5 e o Bit 4 precisam para isto. Bit 1 = 1 = habilitada. Bit 7 = 1 = escrita terminou. Bit 4 = 0 = interrupção desabilitada. Bit 2 = 1 = habilitada. Bit 0 = 0 = não habilitada. Bit 4 0 Bit 3 0 Bit 2 0 Bit 1 0 Bit 0 0 . Bit 5 = 0 = sem recepção. Bit 6 = 0 = não houve mudança na saída. Bit 5 – RCIF −> indica a recepção de caractere na USART. Bit 5 = 0 = não habilitada. Bit 4 – TXIE −> agora este flag habilita a transmissão (Tx) da USART. Bit 0 = 1 = habilitada.33 “USART” quer dizer: Universal Síncrono Assíncrono "Rx e TX” – Vulgo comunicação serial. 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). Bit 2 – CCP1IE −> este Flag habilita a interrupção do CCP (Captura/Comparação/PWM). Bit 7 = 0 = escrita não terminou ou nem começou. Bit 0 – TMR1IE −> habilitação da interrupção do estouro do timer 1 do PIC 16F628X. de outros SFRs (registradores). o timer1 e o timer2). Bit 6 = 1 = teve mudança de nível na saída. Bit 1 – TMR2IE −> habilitação da interrupção de estouro do timer 2 (este PIC tem o timer0. Após o reset fica: Bit 7 Bit 6 Bit 5 0 0 0 Agora o PIR1: L/E = permitem a leitura e escrita. Bit 5 = 1 = habilitada.

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

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

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

1 = Inversa. Tipo de saída do comparador 1: 0 = Normal. 10 = prescaler de 1:16. 0100 = postscaler de 1:5. Paralisa o contador do Timer2. 11 = prescaler de 1:16 T2CKPS1 T2CKPS0: Trabalhando com os comparadores internos. 0111 = postscaler de 1:8. 1 = Timer2 habilitado. 0101 = postscaler de 1:6. 1111 = postscaler de 1:16. 1011 = postscaler de 1:12. 1010 = postscaler de 1:11. 01 = prescaler de 1:4. 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. 0001 = postscaler de 1:2. 1001 = postscaler de 1:10.37 TOUTPS2 TOUTPS1 TOUTPS0: Ajuste do postscale: 0000 = postscaler de 1:1. 0010 = postscaler de 1:3. 1000 = postscaler de 1:9. 1101 = postscaler de 1:14. 1 = Inversa. 1110 = postscaler de 1:15. TMR2ON: Habilitação do Timer2: 0 = Timer2 desabilitado. 1100 = postscaler de 1:13. 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: . 0011 = postscaler de 1:4. 0110 = postscaler de 1:7. Ajuste do prescaler: 00 = prescaler de 1:1.

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

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

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

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

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

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

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

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

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

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

Pode ser chamada de constante.1. no registrador de trabalho W. o resultado será gravado no registrador f da operação em W. W. d −> o d pode ser colocado ou não. R. o resultado será salvo nele. Deve ter o valor entre 0 a 127 decimal. Lembre-se que. Capítulo 25 RESUMO DAS INSTRUÇÕES 25. b o que significam? f −> é um registro que deve estar definido no campo do cabeçalho onde colocamos as variáveis. ou seja. Se d = 1 o resultado é gravado no registrador indicado na operação. É um número entre 0 a 255 decimal. se for colocado. mas se não for colocado o resultado será salvo em f. ou seja. normalmente de novo. d. f. Você também poderá trabalhar com um cristal de 20Mhz. 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. e estas “letrinhas” f. k −> é normalmente. contanto que use um PIC 16F628A – 20 que oscila em até 20Mhz. se usar um cristal de 20Mhz deverá setar o oscilador para HS. que o PIC faz passar por ele. Ele especifica o destino do resultado da instrução: Se d = 0 o resultado é gravado em W. W −> é o registrador de trabalho. k. um valor que será carregado. tudo ou quase tudo. Se não for colocado o padrão será 1.48 Antes de cada código fonte haverá um alerta se você deve ou não usar o cristal externo de 4 MHz. .

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

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

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

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

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

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

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

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

1 . soma 1 ao valor de dica (1 + 0 = 1) . Explicação: .57 . carrega W com 0 movwf dica . mas.Soma 1 ao valor do registrador f e pula a próxima instrução se o resultado for 0.Soma 1 ao valor do registrador f (nunca pode passar de 255).Executa um “OR” ou “OU” entre W e k. esta instrução é pulada Viu agora o “poder de d”? Ele faz esta instrução mais útil e funcional. 0 . comentários Significado: . agora tem o valor de 54 pois d = 1 . o que corresponderá que ele é igual a 1. diminui 1 de teste (55-1 = 54) e teste . carrega dica com 0 incfsz dica.Nenhum. Exemplo: movlw 55 movwf teste incf teste . .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: . carrega teste com 55 mas W . Agora você me pergunta: Mas. Instrução: iorlw k .Você somará 1 ao valor de f se não existir o d.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). comentários Significado: . 0) o resultado será salvo em W. e o resultado foi salvo em teste Flags afetados: Z −> do registrador STATUS Instrução: incfsz f. Explicação: . quando que eu vou somar 1 a alguma coisa e vai dar 0? Calma. d . o resultado será salvo no próprio f. Se no lugar de d existir um 0 (f. Exemplo: Se f = dica e dica = 0 movlw 0 . portanto a próxima instrução é pulada bsf portb. Flags afetados: . continua com 55 . carrega W com 55 . salva em W e dica continua com 0 .

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

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

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

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

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

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

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

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

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

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

Algo similar à função E ou OU.. Explicação: .Nenhum Instrução: xorwf f. comentários Significado: .68 Flags afetados: . Explicação: . Z −> do registrador STATUS Instrução: swapf f.Esta função troca nibles. ou seja. DC. d . Este negocio de “exclusividade” é coisa de. que é um valor em binário . inverte ao nibles.executa a função OU exclusivo entre W e f. d . carrega W com 0 0 0 0 1 1 1 1 .C. carrega W com 15 que é um valor em decimal .. 0 0 0 0 1 1 1 1 = 15 e 1 1 1 1 0 0 0 0 = 240 Flags afetados: . muda fica com o valor de . Bonito não é mesmo. Exemplo: movlw B’ 0 0 0 0 1 1 1 1’ movwf troca swapf troca Mas. carrega o valor 15 no registrador muda . ou uma função da aritmética Booleana. 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 . só para variar. Mas. 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. inverte os nibles. o valor de troca fica .A função OU exclusivo é uma função lógica. comentários Significado: . 1 1 1 1 0 0 0 0 o valor será salvo erm troca. . 240 em decimal. Só quando as duas entradas forem diferentes é que a saída será igual a 1. . Só por curiosidade.Inverte os bits de 0 a 3 com os de 4 a 7. troca 4 bits. pode ser assim: movlw 15 movwf muda swapf muda .

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

26. que dizer transformar os mennônicos do assembly. mas. um monte de zeros e uns. Não se esqueça da homepage que pode ajudá-lo. Eles são: OPTION -> faz registro OPTION = W. Os operadores são comandos reconhecidos pelo MPASM e que podem ser usados nos programas. especialmente.−> 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.70 . vamos ver como usar o $ e deixar que você aprenda a usálo e faça “experiências”. mas. ou instruções do assembly. o valor de W será 1 0 0 0 0 0 0 1 Flags afetados: . Compilar em linguagem simples. no famoso código de máquina ou no português claro. bit a bit ll −> OU ou or = −> igual Operadores relacionais: Operadores lógicos: Operadores de atribuição: Poderíamos falar mais sobre isto. O próprio fabricante dos PICs. Operadores do MPASM: O MPASM é o software compilador que está incluído no MPLAB. Operadores matemáticos: + −>adição . um muito usado neste livro é o $.1. a Microchip™ não recomenda o uso delas.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. . Vamos falar dele. 10000001 . antes vamos mostrar outros. TRIS −> faz o registro TRIS = W.

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

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

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

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

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

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

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

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

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

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

. A função deste CI é fazer a comunicação entre o microcontrolador e os outros CIs usados 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. . que deverão ser trocados. Antigamente este CI era um VLSI montado e soldado do lado de trás do display e você podia ver o código dele. escreve E registrador W . chama rotina se (varredura de 30 a 100 Hz) . volta para o início . 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 . carrega L no registrador W . 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. repetidamente 20 a 30 vezes. retorna do deslocamento (rotina de 20 a 30 vezes) . próximas letras. assim sucessivamente. escreve E no display . Pinagem destes displays: . entrar na rotina de varredura. 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. Este números querem dizer o seguinte: 1 x 16 -> 1 linha de 16 caracteres. São os avançados tecnológicos. A rotina de deslocamento se chama “see” e faz com que as letras sejam impressas 20 a 30 vezes. por exemplo. 1 x 16 ou 2 x 16. 2 x 16 -> 2 linhas de 16 caracteres. chama rotina se (varredura de 30 a 100 Hz) . escreve L no display . mais antigamente ainda ele tinha o formato de um CI tipo DIL. A rotina de varredura se chama “se” e faz os displays ficarem piscando de 30 a 100 vezes por segundo (30 a 100 Hz). Hoje em dia ele vem encapsulado em uma resina e não é possível a leitura de código nenhum.

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

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

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

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

aguarda 1µs . final dos comandos .rotina do 1 a 2 segundos---------------------------------------- . e finaliza as instruções . 2 nop bcf porta. --. 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. --. 3 . ---. coloca 0 em E.. --. ---. vai para a rotina de deslocamento . 2 nop bsf porta...--------------------------rotina de deslocamento----------------------------------------------deslocamento: 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. carrega W para mover o texto .86 return end . aguarda 1 µs . ---. para a direita ..final da sub-rotina --. --... limpa RS e escreve comando .. veja: bcf porta. carrega o portb com o valor de W . Um exemplo ficaria assim: goto deslocamento ... ---- É 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. coloca 1 em E . para o deslocamento . coloca 0 em E . 2 . --.. ---. volta da rotina . --. ----. 3 movlw B ‘ 0 0 0 0 1 1 1 0’ movwf portb bcf porta.

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

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

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

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

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

D = 1 display ligado C = 0 cursor desligado. C = 1 cursor ligado B = 0 cursor sem piscar.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. “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. ou quatro pinos do PIC que poderão ser usados para outras funções. 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.

faça da seguinte forma: Envie primeiro os 4 bits mais significativos e depois os 4 bits menos significativos. Lembre-se que entre cada seqüência de bits de instruções. 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. O som não é muito agradável. Não há necessidade de colocar algum tempo entre a primeira linha de bits e a segunda linha de bits dos comandos 10. 12. ID = 0 cursor para esquerda S = 0 escrita não se move. Vamos ver o circuito da sirene sem o PIC. o resultado do aprendizado é bom. 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. Esta sirene terá dois tons. . S = 1 escrita se move Terminou a inicialização de 4 bits. Veja: RS R/W DB7 DB6 DB5 DB4 0 0 1 1 1 1 depois. mas.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”. após os bits. 400 Hz e 1 kHz. Faça download do arquivo sirene.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. 14 e 16. Para enviar os comandos ou o que vai ser escrito no display.

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

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

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

Isto “engana” o microcomputador permitindo a comunicação. Rx e terra. podemos ter dois tipos de controle de fluxo de dados: .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. 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).Por hardware – que precisa das linhas RTS e CTS além do Tx.97 300bps 1200bps 2400bps 4800bps 9600bps 19200bps 33.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. O cabo entre os dois dispositivos só será conectado através de 3 vias que são o Rx o Tx e o terra. Apenas para informação. .000bps 48. Você pode fazer isto.000bps 56. que gera tensões de -10 e +10 Volts a partir de uma tensão de +5 Volts.Por software . Rx e terra e que é conhecida por controle RTS/CTS.1 e 6 também são ligados em curto. . Os pinos 8 e 7 são ligados em curto e os pinos 4. usando o IC MAX 232. Com este tipo de ligação e com os dois dispositivos trabalhando “na mesma velocidade” não precisamos ter o controle de fluxo.

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

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

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

Sign up to vote on this title
UsefulNot useful