Page 1 of 12

Curso de Programação PIC Introdução
Este Curso de Programação foi projetado para introduzir o NOVATO na programação dos microcontroladores PIC12C508A e PIC16F84. O '508A é o "bebê" da gama de microcontroladores com 6 linhas que podem ser configuradas como entrada ou saída (O pino GP3 só pode ser uma linha de entrada) e o 'F84 é a versão de "uma porta e meia" com 13 linhas. Ambos são dispositivos muito pequenos no mundo "micro" mas eles são a escolha mais certa para começar. Antes de começar este curso nós preparamos uma discussão, por Jim Brown BSc(Eng), HDipEdAd, GDE (Inteligências), sobre o microcontrolador PIC16F84. Leia apenas os primeiros 25% e volte ao nosso curso.

Você pode ler gradualmente depois o restante.
A pinagem para os dois chips que estamos cobrindo neste curso é a seguinte:

Page 2 of 12

ALIMENTANDO UM PROJETO
Todos os projetos precisam ser alimentados a partir de uma fonte de energia. Esta pode ser uma bateria, uma fonte de alimentação ou mesmo um conjunto de células solares. Clique aqui para um artigo sobre Alimentando um Projeto.

OS PICs
Nós escolhemos estes dois microcontroladores da gama de dispositivos PIC pois eles são os mais baratos e os melhores (para o novato). Você verá o que nós queremos dizer, E CONCORDARÁ, depois que você houver lido o curso. Talvez você esteja querendo saber por que nós produzimos tantas informações sobre programar estes chips, uma vez que há uma quantidade enorme já disponível em livros e em websites. A razão é que a informação geralmente é de uma natureza altamente técnica e não projetada para orientar o REAL NOVATO a programar. O que é necessário é um curso para pessoas absolutamente leigas. Um que introduza a menor quantidade de complicação para conseguir fazer um programa pronto e funcionando. E isso é o que nós fizemos. Você não tem que saber Álgebra Booleana, matemática complexa ou o efeito de XOR'ing em um arquivo para ser capaz de programar. Nós fizemos tudo de um modo simples. O curso também lhe mostra como conectar os chips a dispositivos externos e aproveitar as idéias de um projeto aplicando-as em outro você poderá criar um circuito totalmente novo com o mínimo de conhecimento técnico. Há uma coisa surpreendente sobre programar. Um programa pode ser construído usando-se pensamento altamente complexo ou pensamento muito simples. O resultado final será o mesmo, mas a abordagem mais simples poderá conter mais instruções para

http://www.novaeletronica.net/q/n5/cursopic/cursopic_1.htm

03/12/2009

Page 3 of 12

alcançar o resultado final. Mas quem se preocupa com algumas instruções a mais quando o micro estiver processando a 1.000.000 instruções por segundo!? Nos começaremos com um programa bem simples, com cinco linhas para acender um LED com um microcontrolador PIC12C508A.

SetUp MOVLW 3E TRIS 06 TRISB

;Torna GP0 saída ;Carrega o arquivo

Out0 MOVLW 01 ;Carrega 1 em W MOVWF 06 ;Torna GP0 HIGH GOTO Out0 ; Vá para Out0

Este é o programa mais simples para o '508A. Ele acende um LED como mostrado na animação abaixo: Clique na animação abaixo e você verá o LED conectado a GP0 (General Purpose IN-OUT line ZERO - Pin 7) acender:

O que este programa está fazendo:
Nas primeiras duas linhas a porta de entrada/saída é configurada de forma que a primeira linha (GP0) é uma saída. GP0 é LIGADO

http://www.novaeletronica.net/q/n5/cursopic/cursopic_1.htm

03/12/2009

Page 4 of 12

(ON) e isso iluminará o LED conectado à linha. O programa vai para a quinta linha e é mandado de volta à terceira linha. As instruções 3, 4 formam um loop e o micro o executa repetidamente até que a alimentação seja interrompida. O diagrama acima é muito simples. A chave de força poder é LIGADA o LED acende. Você não precisa de um microcontrolador para acender um LED mas este é o circuito mais simples para explicar como o microcontrolador opera. O ponto importante para se notar é a operação do micro. Ele não executa as 5 instruções do programa acima e para. Ele mantém o programa em andamento uma vez que o oscilador interno do chip continua operando todo o tempo. O conjunto de instruções para o PIC12C508A não tem uma instrução PARE ou INTERROMPA, assim você tem que escrever o programa de forma que o micro execute os laços (loops) ao redor das várias instruções. Estas instruções às vezes são chamadas instruções "que-não-fazem-nada". No exemplo acima, o micro executa o loop ao redor das instruções 3, 4 e 5, executando 3, 4, 5, 3, 4, 5, 3, 4, 5, etc. O fluxograma para o micro é mostrado abaixo:

USANDO UM PIC16F84
O mesmo programa pode ser escrito para o microcontrolador PIC16F84. Embora os dois chips não tenham exatamente o mesmo conjunto de instruções, aproximadamente 90% desse conjunto é o mesmo e neste curso nós iremos nos concentrar nas instruções que são comuns a ambos os chips. As instruções para acessar as linhad de GP0 a GP5, para o PIC12C508A são as mesmas para acessar de RB0 a RB5 para o chip de PIC16F84. Isto significa que muitos dos programas e projetos que nós estaremos apresentando podem ser "queimados" em qualquer um dos chips. "Queimar" é um nome antigo para "programar" e nós o

http://www.novaeletronica.net/q/n5/cursopic/cursopic_1.htm

03/12/2009

Page 5 of 12

usamos para diferenciar entre a operação de escrever um programa - geralmente chamada de Programação, da operação de carregar um programa em um chip - também chamada de Programação. Assim que um projeto requeira mais de 5 ou 6 linhas (linhas de entrada/saída) o micro PIC16F84 será usado. Mas isto está se tornando muito avançado rápido demais; voltando ao programa mais simples, ele pode ser queimado ou pode "baixado " em um PIC16F84 e o circuito abaixo acenderá um LED. A instrução: MOVWF LIGARÁ (tornará HIGH) GP0 para um PIC12C508A ou Linha RB0 para um PIC16F84. O PIC12C508A tem um oscilador interno e nenhum componente externo é necessário. O PIC16F84 tem alguns componentes de oscilador internos e você tem que acrescentar os componentes de tempo (o resistor e capacitor). Estes dois componentes são mostrados no diagrama abaixo:

FAZENDO UM LED PISCAR
Suponha que você queira fazer o LED piscar, ficando aceso por 0,1s e apagado por 0,9s. Isso requer um programa de 4 etapas mostrado no gráfico abaixo:

http://www.novaeletronica.net/q/n5/cursopic/cursopic_1.htm

03/12/2009

Page 6 of 12

A partir do fluxograma você pode ver que precisa fazer 4 coisas: 1. LIGAR uma saída 2. Manter a saída LIGADA por um período de tempo – chamado tempo de Atraso 3. DESLIGAR a saída 4. Manter a saída DESLIGADA por um período de tempo – chamado tempo de atraso O que você precisa manter em mente é que o processador (o coração do chip do microcontrolador) deve ser mantido funcionando todo o tempo. O chip do PIC12C508A contém um oscilador a 4MHz e esta freqüência é dividida internamente por 4 de forma que uma instrução seja processada a cada microssegundo. Isto torna muito fácil a criação de rotinas de atraso precisas. O chip do PIC16F84 exige componentes externos para completar o circuito do oscilador. Usando um resistor 4k7 e um capacitor 22p o circuito do oscilador operará a 4MHz Em nosso exemplo nós podemos criar um atraso sabendo que cada instrução leva 1 microssegundo para executar ou 2 microsegundos se um desvio estiver envolvido. Isto significa nós precisamos produzir uma sub-rotina "que-não-faz -nada" de 100,000 ciclos para criar um atraso de 0.1 segundos. Para produzir o atraso de 0.9 segundos, a rotina de atraso acima mencionada é chamada 9 vezes. Para criar a rotina necessária para fazer o LED piscar, você pode começar do zero lendo as notas nós provemos em nossos capítulos ou ir direto para o capítulo Biblioteca de Rotinas. Toda a informação que você precisa para escrever um programa em um gabarito está contida na 24 deste curso.

http://www.novaeletronica.net/q/n5/cursopic/cursopic_1.htm

03/12/2009

Page 7 of 12

A página contém um arquivo compactado .zip chamado: Blank_F84.zip e o arquivo dentro dele é chamado Blank_F84.asm. Carregue-o e salve conforme é detalhado na página. Com isso você será capaz de escrever programas em um editor de texto e executá-los em um PIC16F84. Estas são as linhas de código que você precisará:
FlashLED1 BSF 03h,5 MOVLW 00 MOVWF 06 BCF 03h,5 BSF 06,0 CALL Delay1 BCF 06,0 MOVLW 09 MOVWF 0C CALL Delay1 DECFSZ 0C GOTO AA1 GOTO Loop1 ;Seleciona Page1 ;para tornar GP0 saída ;Seleciona Page0 ;CONFIGURA o bit0 como HIGH ;Torna bit0 LOW ;Coloca 9 em W ;0C é o arquivo de loops

Loop1

AA1

Delay1 DelX

MOVLW 82h MOVWF 1A DECFSZ 1B GOTO DelX DECFSZ 1A GOTO DelX RETLW 00

;130 loops ;256 decrementos ;instrução de 2 s

Este programa LIGA um LED por 0,1s (rotina Delay1) então o APAGA e o mantém assim por 0,9s chamando a rotina Delay1 9 vezes.

A seguinte animação mostra o resultado de “queimar” o código em um '508A:

http://www.novaeletronica.net/q/n5/cursopic/cursopic_1.htm

03/12/2009

Page 8 of 12

O programa pode ser baixado em um PIC16F84 e o circuito abaixo fará o LED piscar:

Mas, antes que você se apresse em fazer qualquer coisa, você tem que entender que um chip PIC12c508A só pode ser queimado UMA VEZ porque as células que mantêm o programa recebem uma carga durante a programação e esta carga não pode ser removida. O chip possui garantia para manter um programa por muitos anos mas você só usa este chip quando estiver completamente satisfeito com um programa e o projeto estiver pronto para conclusão.

DOIS CHIPS
Este curso concentra-se em dois chips. O PIC12C508A e PIC16F84. No momento você ainda não sabe o quanto são poderosos estes chips e o tipo de projetos que podem ser desenvolvidos com eles. Este conhecimento virá "durante o curso", então vamos explicar a nossa política: Primeiramente nós tentamos usar um PIC12C508A para um projeto. Se o projeto requer menos que 5 linhas de entrada e/ou saída, o PIC12C508A será satisfatório. Caso contrário você terá que usar o PIC16F84. Programar um PIC16F84 é fácil porque ele é programado no Programador Multi Chip e colocado no projeto em desenvolvimento. Se o projeto precisar de um PIC12C508A, você precisará de um adaptador. O adaptador contém um PIC16F84 e possui os componentes do oscilador soldados aos pinos. Um soquete CI de 8 pinos é soldado ao soquete de 18 pinos e ajustado ao projeto em

http://www.novaeletronica.net/q/n5/cursopic/cursopic_1.htm

03/12/2009

Page 9 of 12

desenvolvimento. O chip PIC16F84 é tirado do adaptador e "queimado" no Programador Multi Chip. Então é colocado no adaptador e funciona precisamente como um chip PIC12C508A. Quando o programa funciona com perfeição, você pode queimar um chip PIC12C508A real e incluí-lo no projeto. O diagrama abaixo mostra como o adaptador segura o chip PIC16F84 e se adapta a um soquete de 8 pinos no projeto você está desenvolvendo.

Este é o modo mais barato de montar um projeto com o chip PIC12C508A. Qualquer outro modo seria muito mais caro O PIC12C508A só pode ser programado UMA VEZ e o desenvolvimento de um projeto pode precisar de até 50 ou mais "ajustes" até que esteja operando corretamente. Você pode usar 50 chips PIC12C508A, ou comprar a versão EPROM. Estes são bem mais caros e você precisará de pelo menos de 5 a 10, porque eles precisam ser apagados durante 20 minutos antes que um programa novo possa ser gravado e isto reduz a velocidade e aumenta o tempo de desenvolvimento. Você também precisará de uma lâmpada apagadora de EPROM. Nosso adaptador de 8 para 18 pinos custa muito pouco e torna o desenvolvimento de um programa bastante simples. Você pode programar o PIC16F84 com instruções que funcionam com PIC12C508A e o programa pode ser queimado em um PIC12C508A. Para o exemplo nós usamos o nosso projeto de Provador Lógico. Esse projeto usa um chip PIC12C508A de 8 pinos e, utilizando o adaptador de 8 para 18 pinos e um chip PIC16F84, um programa pode ser desenvolvido a quase NENHUM CUSTO. Um truque inteligente é ajustar um chip de PIC a uma soquete para CI´s e manter os dois conectados ao se transferir as instruções do programador para um projeto. É muito mais fácil de remover um chip do soquete (no projeto) com os seus dedos. Veja a fotografia abaixo:

http://www.novaeletronica.net/q/n5/cursopic/cursopic_1.htm

03/12/2009

Page 10 of 12

O chip PIC é encaixado em a um soquete de CI para fácil remoção durante a programação.

O diagrama abaixo mostra o PIC16F84 sendo “queimado” no Programador Multi Chip, encaixado no adaptador de 8 para 18 pinos e conectado ao projeto do Provador Lógico:

Adaptando o chip PIC (e o soquete CI) no adaptador e a um projeto em desenvolvimento.

http://www.novaeletronica.net/q/n5/cursopic/cursopic_1.htm

03/12/2009

Page 11 of 12

Por quê nós usamos o PIC12C508A?
O '508A é bem mais barato que o '84 e se o seu projeto for muito simples, isso é o ideal. Podem ser criados projetos bem pequenos e baratos com o PIC12C508A e isto abre um campo inteiramente novo para outros projetos. O PIC16F84 pode ser programado e apagado mais de 1000 vezes e é ideal para o trabalho de desenvolvimento. Há muitos projetos desenvolvidos com base no PIC12C508A, mas os custos de desenvolvimento serão consideráveis se você não usar a nossa abordagem. Como você lerá nos capítulos que seguem, este curso é completamente PRÁTICO e o introduz na área da programação com a menor despesa possível. Por causa disto nós não usamos nenhum dos conceitos de "STAMP" uma vez que estes são muito caros e reduzem enormemente a capacidade do chip. Nosso objetivo é lhe introduzir em programação, assim você poderá produzir projetos com microcontroladores e até vender chips programados por cerca de US$ 5.00 cada (em quantidades grandes). Isto é algo que nunca havia sido cogitado anteriormente. É por isso que este curso se destaca de todos os outros. Assim que você entrar na programação PIC, você deve procurar na Internet por grupos de usuários de PIC, pois eles têm um mundo de informações valiosas em seus sites, o que lhe ajudará em muito a entender programação PIC. Os chips que nós escolhemos lhe permitirão criar projetos equivalentes a projetos que utilizavam 6 ou 8 chips (ou até mais na antiga tecnologia de portas, contadores etc) e produzir artigos como fechaduras eletrônicas que usam cartão de acesso, etiquetas de segurança que transmitem a até um metro eletrônico ou algo assim, displays, jogos, dispositivos de telefonia, alarmes, interagir com dispositivos conectados, osciladores, projetos de robótica e muito mais,. Como disse um programador: "Você nunca mais usará um temporizador 555!”. Todas as idéias e projetos que já foram produzidos para um módulo do tipo "STAMP" podem ser criadas agora em um único chip e produzido por menos que 1/4 do custo. Surpreendentemente, nosso curso terá uma atração enorme para àqueles que já programam com algum desses módulos caros. Com bastante freqüencia aparecerá alguma idéia conveniente para se comercializar. É aí que o projeto precisa ser convertido para um desenho bem mais barato para torná-lo comercializável. É também aí que nós entramos. O custo de um chip e uma placa de CI para prototipação raramente ultrapassa o valor de US$ 5.00, permitindo a você lançar seu próprio produto. Mas obviamente você terá que começar do princípio e se familiarizar com o código

http://www.novaeletronica.net/q/n5/cursopic/cursopic_1.htm

03/12/2009

Page 12 of 12

de instrução e capacidades do chip. Na próxima seção nós apresentamos vários projetos que usam ambos os chips. Alguns dos projetos são simples enquanto outros são bastante complexos. Porém eu posso o assegurar eles apresentam menos que a metade da complexidade de um projeto que não utilize um microcontrolador. Toda a programação é "linear" (muito simples) e passando por cada linha você poderá ver exatamente o que está sendo feito a cada passo. O problema maior com o conceito de STAMP é o custo de duplicação. O primeiro protótipo pode custar de US$ 40 a US$ 70, mas as cópias adicionais vão custar mais que US$ 20. Com a nossa abordagem você pode vender um chip completamente programado por de US$ 5.00 a US$ 8.00 (eles custam tão pouco quanto US$ 2 em grandes quantidades), e uma placa de CI montada por menos de US$12.00. Isto lhe dá uma vantagem inicial no mundo do marketing e o torna competitivo em fabricar e vender as suas idéias. Muitos dirão que o "conceito de STAMP" pode ter um programa completo e funcionando com bem poucas instruções, mas nós temos contornamos isso projetando um conjunto de rotinas para executar muitas das operações você necessitará no desenvolvimento de um programa e as colocamos em uma BIBLIOTECA DE ROTINAS . Desse modo você poderá ter seus programas completos e funcionando com pouquíssimo esforço. A vantagem da nossa abordagem é que o micro opera em velocidade máxima e o espaço de memória de programa pode ser utilizado completamente, e nenhum chip adicional é exigido para armazenar o programa e todas as linhas de entrada-saída do chip estão disponíveis. Realmente não há nenhuma comparação entre os dois conceitos e as diferenças não serão mencionadas novamente. A vantagem maior de fazer coisas do nosso modo é que você é tem o controle total sobre o programa. Se algo não funcionar, você não tem que imaginar se a rotina provida por "STAMP ou CLONE" não está executando a sua função corretamente ou se o seu código tem um bug (erro de programação). Usando diretamente as instruções do micro (do conjunto de aproximadamente 33 instruções) você pode ver o que está acontecendo exatamente e por que não está funcionando.

http://www.novaeletronica.net/q/n5/cursopic/cursopic_1.htm

03/12/2009

Page 1 of 6

VISÃO GERAL
As coisas que você precisa para começar Página 2 PAGINAS : | 01 | 02 | 03 | 04 | 05 |
Este curso contém toda a informação que você precisa para começar o seu projeto. Mas antes de você começar na "estrada do desenvolvimento", há algumas coisas preliminares que precisam ser cobertas:

O Microcontrolador
Um microcontrolador é um "computador-em-um-chip. " Os dois microcontroladores que nós escolhemos para este curso são os mais básicos e provêem o ponto de partida para qualquer um que queira realizar um projeto "computadorizado". Eles são o PIC12C508A e o PIC16F84. As iniciais "PIC" são geralmente adotadas, significando "Controlador de Interface Programável" (originalmente em inglês Programmable Interface Controler). Os chips PIC se tornaram conhecidos como o Sonho dos Programadores. Eles são fáceis trabalhar com e todas as informações técnicas necessárias para entender a sua operação encontram-se disponíveis GRATUITAMENTE na Internet e são suportadas por grupos de entusiastas de PIC, no mundo inteiro. Mas a informação é muito vasta e desconexa e alguma parte dela é de difícil acesso. Nós reunimos muito dessa informação e a apresentamos de uma maneira que possa ser compreendida por um hobista iniciante. Basicamente um microcontrolador é capaz de armazenar e executar um programa. Ele pega as instruções ou dados do programa, e/ou de fontes externas, e fornece a saída do processamento em dispositivos para criar um resultado. Ele pode efetivamente tomar o lugar de um ou mesmo centenas de circuitos integrados e componentes simples. Isto torna o projeto de microcontrolador muito mais simples em aparência do que o projeto que ele está substituindo. O programa pode ser projetado para executar cálculos matemáticos ou analíticos e oferecer uma resposta rápida e deste modo podem até parecer que tem "inteligência”. O microcontrolador mais simples da família PIC é o PIC12C508A. É um dispositivo de 8 pinos com 5 linhas de entrada/saída mais uma linha apenas de entrada. Os outros dois pinos são para o pólo positivo (+5v) e pólo 0v (também chamado pólo negativo ou terra). O diagrama abaixo mostra as atribuições de cada pino:

As linhas de saída são chamadas GP (de Propósito Geral -general purpose) e são identificadas por GP0, GP1, GP2, GP3, GP4, e GP5. O diagrama abaixo mostra como o chip é conectado à fonte de alimentação.

http://www.novaeletronica.net/q/n5/cursopic/cursopic_2.htm

03/12/2009

Page 2 of 6

Conectando um PIC12C508A aos terminais da fonte O PIC12C508A tem um oscilador interno e assim nenhum outro componente é necessário para tê-lo operacional. O oscilador interno não é absolutamente preciso e se você precisar de uma contagem de tempo precisa, você pode adicionar um cristal como mostrado acima. Isto reduz a capacidade do chip em de entrada/saída. O circuito acima tem um botão conectado à GP3. Considerando que esta é uma linha exclusivamente de entrada, este é o melhor lugar para conectar o interruptor. O interruptor pode ter qualquer função. Depende do programa. Pode ser projetado para ser: reset, começo, incremento, decremento, pânico, aumento de brilho, mudança de uma melodia, etc etc. O chip executará feitos surpreendentes; tudo depende do seu programa. O programa na página anterior tem 5 linhas, o chip pode armazenar aproximadamente 511 linhas de programa e um programa deste tamanho realmente é "realizador"! Isso significa mais de 10 páginas de exercícios de programas! Mas a coisa principal que limita seu uso é o número de saídas. Ele só tem 5 saídas. Por isso que nós incluímos o próximo chip da família, o PIC16F84.

O PIC16F84 tem 13 linhas e tomará lugar em seus projetos maisavançados. Você também pode usar um PIC16C84. Ambos os chips são quase idênticos exceto que o PIC16C84 tem os arquivos de 0C a 2F enquanto que o F84 tem arquivos até 4F. O circuito básico para um PIC16F84, conectado aos pólos da fonte, é mostrado abaixo:

http://www.novaeletronica.net/q/n5/cursopic/cursopic_2.htm

03/12/2009

Page 3 of 6

Conectando um PIC16F84 aos terminais da fonte O chip requer "componentes de contagem de tempo" conectados à linha "clock in" para completar o circuito de oscilador. Estes componentes permitem ao chip produzir uma freqüência (chamada de pulso de clock) na linha "clock in" e então o micro executará as instruções do programa. Escolhendo um resistor 4k7 e um capacitor de 22p, o chip operará a 4MHz. O chip pode ser operado a qualquer freqüência, e diretamente a 0Hz! (Isto é chamado de single-steppinng) O princípio deste curso está em produzir o programa, queimá-lo no chip e executar uma determinada tarefa. A operação de "queimar" também é chamada de "programação" e para realizar essa tarefa nós provemos dois projetos de programação. Um é um programador independente, o Programador Multi-chip, e o outro é um programador "intercalado no circuito”, o Display 5x7. Uma das vantagens do PIC16F84 (e do PIC16C84) é a capacidade de programação “in-circuit". O projeto deve ser planejado para progamação "in-circuit", e pela inclusão de um soquete de 4 pinos, o chip pode ser atualizado sem precisar ser removido da placa. O soquete permite levar 4 linhas à porta serial de um computador para programação "in-circuit". Isso apresenta muitas vantagens. Um produto básico pode ser projetado para vários clientes ou operações diferentes, usando tecnologia de montagem de superfície (surface mount technology - SMT), e programado na última fase da montagem. O programa apropriado pode então ser instalado. Uma vez que os produtos são montados "vazios", o software mais recente pode ser instalado, e atualizações podem ser adicionadas sem qualquer trabalho de re-projeto ou remoção do chip. O produto também pode ser atualizado a qualquer hora, bastando conectá-lo a um programador.

Construindo os Projetos
Os projetos deste curso podem ser construídos a partir de sua própria fonte de componente, geralmente chamados de peças de uma "caixa-de-sucata" ou de um kit disponível simplesmente clicando-se no botão "Compre-me", ao lado do artigo. Você pode construir os projetos de seus próprios materiais mas o problema maior é a placa de CI. Ela é o um artigo que faz o projeto parecer

http://www.novaeletronica.net/q/n5/cursopic/cursopic_2.htm

03/12/2009

Page 4 of 6

profissional e todas as placas providas nos equipamentos são de fiberglass. Todas elas têm uma camada (chamada uma legenda) e uma máscara de soldagem. Os pontos de solda são todos pré-estanhados para facilitar a soldagem e as extremidades da placa são acabadas, sem rebarbas de corte. Algumas destas características não podem ser obtidas quando você faz a sua própria placa de CI,e, embora eu tenha que confessar que eu fiz alguns tábuas em meus primeiros dias, assim que eu adquiri uma feita por um fabricante de placas de CI, eu nunca mais voltei para o "feito-em-casa". Pelo baixo custo de uma placa o projeto aparentará ser 1000% melhor. Em essência, eu recomendo que você use uma placa de CI pré-fabricada preferivelmente a uma matriz ou breadboard (normalmente uma placa de plástico, vazia e perfurada, que é usada como suporte para protótipos de circuitos eletrônicos). A chance de um engano de circuito é eliminada e você pode ver exatamente onde cada componente é colocado. Todas as placas estão disponíveis separadamente, assim não há nenhuma desculpa para não produzir o melhor projeto possível. Agora, vamos aos componentes. Todos os componentes usados nos projetos são "padrão" e podem ser comprados em qualquer loja de componentes eletrônicos. Só há um problema. As peças usadas nos kits são as menores disponíveis e o espaçamento entre os furos para soldagem espaçando foi projetado adequadamente a elas. Se você for usar componentes do "estilo antigo", eles não vão se ajustar e ficarão salientes na placa. Este é, especialmente, o caso de chaves, plugues, soquetes de CI e capacitores eletrolíticos. Fique avisado que os kits providos para os cursos não são "kits de sobras"; eles não contêm excessos ou artigos sem marca. Muitos kits são comprados por hobistas em lotes de 10 ou 20, são montados e comercializados por eles como um negócio. Nós temos muitos clientes cujo negócio gira exclusivamente em torno dos nossos produtos, e isso é um dos objetivos deste curso. Como nós dissemos na introdução, os projetos lhe mostram como criar um projeto de microcontrolador ao custo mais baixo possível, mantendo tudo "em-casa". Tudo o que você tem que fazer é manter seus olhos abertos para uma possível aplicação. Um cronômetro simples ou controlador, especialmente no campo médico, ou algo para ajudar uma pessoa a resolver um problema. Pode ser um vibrador que funcione como campainha para uma pessoa surda, uma interface de detector de álcool para prevenir a condução um carro com uma leitura mais de 0.03% ou 0.08% dependendo da legislação local, um pilltimer para lembrar idosos de tomar seus remédios, um detector de volta para impedir alguém com algum problema de ficar vagando sem retorno. Os melhores projetos aparecerão quando você menos esperar por isso, e se você tiver feito o seu dever de casa em projetos de microcontroladores, você poderá pôr a idéia em prática.

As coisas que você precisa:
O único artigo que você precisa comprar para começar é o Kit laboratório 1, cabo serial para ligar ao computar ao programador de pic NE100. Este equipamento está disponível por preço bem acessível . O Kit laboratorio 1 para o PIC16F84 lhe mostra mais de 15 experiências para mostrar como escrever um programa. O software necessário para o programador de chip "NE100" é fornecido por um programa chamado ICPROG. Esse programa também está disponível para download dentro de um arquivo zip neste site da Web. Você também precisará de um editor de texto como NotePad ou TextPad, no qual

http://www.novaeletronica.net/q/n5/cursopic/cursopic_2.htm

03/12/2009

Page 5 of 6

você escreverá seus programas. E você precisará salvá-lo como um arquivo .asm.

A seguir:
Depois de montar o Kit Laboratório 1 e efetuar os experimentos você estará pronto para a próxima fase. Ela pode ser qualquer projeto que necessite de um chip PICF84, por exemplo o Provador Lógico (versão ‘F84). O próximo passo é poder "programar" (queimar) os chips PIC12c508A. Isto lhe dará a capacidade de produzir o menor e mais barato produto para o seu projeto. Você precisará comprar o Programador Multi-chip. Esse programador lhe permitirá queimar chips PIC12C508A e você poderá construir os outros projetos desta revista. Após ter trabalhado com ambos os chips, você estará pronto para projetar alguma coisa por si mesmo.

E mais ainda . . .
Um dos capítulos mais curtos neste curso é o mais importante. Ele é "Desenvolvendo Um Projeto." Esse capítulo contém as ferramentas de desenvolvimento nós criamos para lhe ajudar a começar o seu projeto. Possui módulos para lhe ajudar a desenhar um projeto via "breadboarding" e quando você estiver contente com o funcionamento do circuito, você pode transferir os componentes para uma placa matriz e pode juntar os componentes com fios de arame de cobre estanhado. Uma vez que o projeto esteja funcionando é uma tarefa mais simples projetar uma placa de circuito impresso - simplesmente siga o mesmo layout e é garantido que o projeto funcionará. Como um professor muito inteligente disse um dia: "Qual é a diferença entre você e um neurocirurgião? “ A resposta dele: "Duas Semanas." Você pode aprender qualquer coisa em um espaço muito curto de tempo se você se aplicar e tiver as ferramentas e equipamentos certos. Este curso tem a informação que você precisa e tudo que você tem que fazer é "absorvê-la”. Eu estou certo que você concordará. Abaixo, um gráfico das características que nós cobrimos. Clique nos links azuis e você será direcionado para a página correspondente:

http://www.novaeletronica.net/q/n5/cursopic/cursopic_2.htm

03/12/2009

Page 6 of 6

PAGINAS :

| 01 | 02 | 03 | 04 | 05 |

http://www.novaeletronica.net/q/n5/cursopic/cursopic_2.htm

03/12/2009

Page 1 of 7

25mA
A corrente de operação para cada linha de saída Página 3 PAGINAS : | 01 | 02 | 03 | 04 | 05 |06 | 07 |
Cada linha de saída de um PIC12c508A pode entregar um máximo de 25mA enquanto que o microcontrolador PIC16F84 pode entregar um máximo de 20mA e receber 25mA. Nós permitimos um máximo de 25mA para todas as situações para manter as coisas mais simples.

O que isso significa?
Significa que qualquer dispositivo conectado a uma saída tem que receber 25mA ou menos. Se necessitar mais do que os 25mA, um transistor de buffer (também chamado de transistor amplificador de corrente) deve ser somado e isto será discutido logo mais adiante. Porém, há outro modo para limitar a corrente - com a adição de um resistor limitador de corrente. Um dispositivo típico que requer um resistor limitador de corrente o LED. Um LED deve ser alimentado com 25mA ou menos para funcionar corretamente. Mas você não pode conectá-lo diretamente à saída de um microcontrolador. Isso pode parecer uma contradição, porque a saída de corrente de um microcontrolador é 25mA e um LED requer 25mA. O ponto técnico é este: A linha de saída de um microcontrolador é capaz de entregar mais que 25mA e um LED é capaz de receber mais do que 25mA e se os dois estiverem conectados juntos diretamente, um dos transistoresdriver no chip será danificado. Para limitar a corrente a 25mA, um resistor deve ser conectado em série com os LEDS. Ele é chamado um resistor limitador de corrente. Definir o valor do resistor limitador de corrente requer alguma matemática mas isto é muito fácil quando você sabe como.

25mA
A corrente levada por um dispositivo é chamada a CORRENTE DE CARGA. Vinte e cinco milli-amperes não significam muito em termos de eletricidade mas em eletrônica, é impressionante o que pode ser conseguido. 25mA são 0.025 A e isso não é suficiente para fazer um motor funcionar ou acender uma lâmpada incandescente mas há vários dispositivos que podem ser acionados 1. LEDs (Light Emitting Diodes) requerem até cerca de 25mA para iluminação total. 2. Membranas Piezo requerem uma corrente muito baixa e podem ser acionadas diretamente por uma linha de saída. 3. Relês de baixa corrente podem ser acionados diretamente contanto que operem em 25mA e 5v. Se forem necessários mais de 25mA, um transistor driver (também chamado de transistor de amplificação ou estágio de amplificação) será necessário. A especificação para a linha de saída de um microcontrolador PIC é 25mA e 5v. Em outras palavras a linha de saída tem uma voltagem de saída de 5v e corrente máxima que podem ser fornecida por ela é de 25mA. A linha de saída vai, teoricamente, entregar mais que 25mA, mas o transistor no chip pode ser danificado (aquecer demais) se uma corrente mais elevada fluir. A corrente fornecida pela linha de saída é determinada pela resistência do

http://www.novaeletronica.net/q/n5/cursopic/cursopic_3.htm

03/12/2009

Page 2 of 7

dispositivo (ou dispositivos), conectado(s) à linha. O dispositivo mais simples é um resistor como mostrado na fig.1:

Se o valor do resistor for muito baixo, mais que 25mA fluirão. Se a resistência for alta, menos que 25mA fluirão. O fluxo da corrente não é determinado pelo chip mas pelo valor do resistor. O resistor é chamado RESISTOR de CARGA ou simplesmente de CARGA. O VALOR DO RESISTOR DE CARGA A resistência do resistor de carga é determinada pela Lei de Ohm. Nós sabemos que a voltagem na linha é 5v. Esta é V na fórmula. A corrente máxima disponível é 0.025A = I na fórmula. A Lei de Ohm declara: I = V/R (Corrente é igual a voltagem dividida pela resistência). Esta equação pode ser re-organizada assim: R = V/I Colocando-se os dois valores na equação temos: R = 5/.025 = 200 = 200ohms. Um resistor de 200 ohm conectado a uma linha de saída permitirá que fluam 25mA quando a saída for ALTA (HIGH). Esta é só uma explicação teórica sobre como um resistor em uma linha de saída não executará nenhuma função! Não fará nada por si só apenas ficar ligeiramente morno. Mas um resistor executará mais de 20 funções diferentes dependendo de onde é colocado no circuito e do valor dos componentes ao seu redor. Em nosso primeiro exemplo abaixo, um resistor é somado em série com um LED de forma que o LED receberá um máximo de 25mA. O propósito do resistor é duplo. Primeiramente permite o LED crie uma voltagem característica de 1.7v (para um vermelho LED) e secundariamente tem um valor que permita que 25mA passem pelo LED. O resistor estará usando 5v em uma extremidade e 1.7v na outra. Estas voltagens são providas pelo chip e o LED e o resistor não tem nada a ver com a sua origem. O resistor simplesmente permite que uma certa quantia de corrente o atravesse dependendo de seu valor, e esse é o valor trabalhado acima. Um ponto a se destacar: Os 508A têm 5 linhas de saída e se todas as saídas estiverem entregando 25mA, a saída total para o chip será 125mA. Isto está ligeiramente acima da corrente máxima permissível de 100mA para o chip, mas não será um problema. O PIC16F84 tem um máximo de 150mA para o chip e assim só 6 linhas podem estar entregando corrente ao mesmo tempo. Vamos para uma situação prática: CONECTANDO UM LED Se um LED for conectado a uma das saídas como mostrado na fig. 2,

http://www.novaeletronica.net/q/n5/cursopic/cursopic_3.htm

03/12/2009

Page 3 of 7

uma certa voltagem é encontrada passando por ele, de acordo com a cor do LED. Isso é chamado de voltagem CARACTERÍSTICA ou voltagem de queda no LED. Essa voltagem existe, não importa o quanto o LED esteja iluminado. Isso é completamente diferente das características de uma lâmpada incandescente e é por isso que LEDs e lâmpadas precisam ser tratados diferentemente quando estivermos trabalhando com as suas necessidades operacionais. Para um LED vermelho a "voltagem característica" é 1.7v. Para um LED laranja a "voltagem característica" é 1.9v. Para um LED verde a "voltagem característica" é 2.1v. LEDs não podem ser conectados diretamente à uma linha de saída sem um resistor limitador de voltagem. A razão é muito técnica, mas basicamente um LED vermelho, por exemplo, não se acende até que exatamente 1.7v o estejam alimentando, e, se a voltagem tentar subir além dos 1.7v, os LEDs brilharão com mais intensidade; permita uma corrente muito alta e eles serão danificados quando a intensidade da corrente for superior a 40mA. É virtualmente impossível prover uma voltagem constante de 1.7v e o modo mais simples para se prevenir danos ao LED é conectar um resistor em série. Se o valor do resistor for determinado através de uma formula, uma corrente precisa será entregue ao LED e tudo ficará ok. O LED durará 100 anos ou mais! Suppose we want to deliver 25mA to a LED. Se nós tomarmos um LED vermelho, o valor de resistência pode ser definida pela lei de Ohm. A voltagem que passa pelo resistor é determinada por: 5v - 1.7v = 3.3v (A voltagem através do LED é a voltagem de 5V da alimentação, menos os 1.7v dissipados pelo LED devido característica queda de voltagem mencionada acima). Esse é o valor para V. I = V/R 0.025 = 3.3/R R = 132 Use um resistor de 130 ohm. Um LED laranja tem uma voltagem característica mais alta, de 1.9v e assim, um resistor limitador de valor mais baixo será necessário para os 25mA. Use um 120R. Para um LED verde, use um 100R. LEDs de alto brilho estão disponíveis em todas as cores e embora eles sejam classificados em 25mA, eles produzirão brilho muito bom com corrente de 5 a 15 mA. Para projetos alimentados por bateria a corrente de LEDs pode ser reduzida para valores tão baixos quanto 1mA, e isso aumentará enormemente a vida da bateria. A Tabela 1 fornece o valor para o resistor limitador para um LED vermelho, em diferentes correntes. O modo mais fácil para determinar o valor de resistência por um resistor limitador é pôr um LED em série com um resistor de 1K com alimentação de 5v. Gradualmente reduza o valor do resistor até que um brilho satisfatório seja obtido. A iluminação de um LED é informada em milicandelas (mcd) e como a fabricação melhorou durante os últimos anos, o brilho emitido aumentou consideravelmente. Por isso é melhor experimentar com resistores de

http://www.novaeletronica.net/q/n5/cursopic/cursopic_3.htm

03/12/2009

Page 4 of 7

valores diferentes até chegar a um valor adequado para seu(s) LED(s) em particular.

Resistor de queda para um LED vermelho a 5V:
25mA 15mA 10mA 5mA 1mA 130 ohms 220 ohms 330 ohms 680 ohms 3k3

Tabela 1. Valores do resistor de queda CONECTANDO UM DIAFRAGMA PIEZO
Um diafragma piezo é essencialmente bem parecido a um condensador (aprox 22n) no que concerne ao microcontrolador. Exige muito pouca corrente para operar. Um diafragma piezo é um dispositivo passivo. Não contém nenhum componente ativo para criar o tom. Buzzers, sirenes e vibradores piezo têm componentes ativos dentro do alojamento (transistores, sufoque, etc) para criar um som bastante alto. Estes dispositivos operam com alimentação de corrente contínua (6 a 12v). Um diafragma piezo requer uma onda senoidal quadrada - em outras palavras uma forma de onda "pulsante" para fazer o diafragma curvar-se e assim produzir o som irritante característico. A amplitude da onda determina a intensidade do som e a freqüência da onda determina o tom. FORNECENDO CARGAS DE ALTA CORRENTE Cargas que requerem mais que 25 Ma devem ser conectadAs a uma saída do microcontrolador através de um transistor de amplificação (driver). Um transistor-driver é na realidade um amplificador de corrente. Transistores podem ser classificados em componentes de corrente baixa, média e alta. Se uma carga necessita, digamos, de 100 mA, um transistor amplificador de baixa corrente será necessário. Se uma carga requer de 500mA a 1A, um transistor amplificador de média corrente será necessário. Para correntes superiores a 1A, um transistor amplificador de alta corrente será necessário. Para 100mA, um do tipo baixa corrente como BC 547, 2N 3904 ou BC 338 será adequado. Se nós assumirmos que o transistor possui um ganho de corrente de 100, 1mA será necessário na sua base para que o transistor entregue 100mA. Você não consegue coisa alguma a partir do nada! Para um transistor ser capaz de ENTREGAR uma corrente para uma CARGA, ele necessita que uma corrente seja ENTREGUE a ele primeiro – em sua base. Por isso que um transistor é chamado de um dispositivo amplificador de corrente. Se o transistor estiver controlando uma lâmpada, a corrente inicial para o filamento da lâmpada é aproximadamente 6 vezes a corrente de iluminação e assim o transistor deverá ser capaz de entregar 600mA. Para entregar 600mA, a base deve ser alimentada com pelo menos 6mA. Para entregar esta corrente na base, o valor do resistor-base pode ser determinado como explicado a seguir: A voltagem pelo resistor base será: 5v (a saída do '508A) menos a voltagem base-emissor do transistor-driver (0.7v) = 5 - 0.7 = 4.3v Resistência do resistor base: = V/I = 4.3/.006 = 700 R = 700 ohms. Use 680 ohms.

http://www.novaeletronica.net/q/n5/cursopic/cursopic_3.htm

03/12/2009

Page 5 of 7

Este é o valor máximo de resistência que você deve usar. (Lembre-se: quanto mais alto o valor de um resistor, MENOS corrente irá passar por ele.) Teoricamente um resistor 680R saturará o transistor completamente e proverá 600mA para ligar a lâmpada. Mas suponha que o transistor não tenha um ganho de 100. Pode ter só um ganho de 80 ao entregar uma corrente alta. Neste caso os 600mA não fluirão em sua totalidade e sob as piores condições a Lâmpada não irá iluminar-se. Para considerar essa possibilidade, o valor do resistor base pode ser reduzido de forma que uma corrente ligeiramente mais alta fluirá pelo transistor. Deste modo você está garantindo que o transistor será saturado, no caso do ganho não ser 100. É bom manter uma margem de garantia e assim um resistor tão baixo quanto um 470R pode ser usado. Um resistor baixo, de 470 ohm não danificará o transistor e não fará o globo ascender de forma "muito brilhante." É simplesmente um valor para assegurar que o transistor sature-se completamente mesmo nas piores condições. Se o transistor não se saturar completamente, ficará mais quente que o normal e o globo ficará escuro. Isto pode aquecer demais o transistor e causar danos - por isso é importante que o transistor seja saturado COMPLETAMENTE. Uma corrente inicial alta é um dos problemas ocultos quando acionamos globos geralmente não é encontrado até que um globo de corrente alta seja empregado ou vários globos sejam acionados ao mesmo tempo. Como você pode ver, corrente é requerida da saída do microcontrolador para acionar o transistor e se forem acionadas cargas de correntes altas, os 25mA do micro serão gastos muito rapidamente! Suponha que você queira acionar uma lâmpada automotiva de 12v. Um transistor driver de alta-potência será necessário uma vez que a corrente inicial é de aproximadamente 6 ampères. Transistores de corrente alta têm aproximadamente um ganho de corrente de apenas 20 a 50 e se você usar a pior situação, a corrente requerida na base para saturar completamente (ligar) o transistor será 5,000/20 =250mA. Obviamente isto está além da capacidade de saída do microcontrolador. Assim você tem que efetuar alguns cálculos antes de conectar dispositivos de corrente alta. A resposta é acrescentar um transistor amplificador extra entre o chip e o transistor de potência como mostrado na fig: 3. este transistor é chamado transistor de buffer e efetivamente amplia a capacidade do chip por um fator de cerca de 100. Se o transistor de saída (o transistor de potência) requer uma corrente de 250mA em sua base, o transistor de buffer entregará esta corrente e irá precisar de 250/100 = 2.5mA do microprocessador. Os 2.5mA podem ser providos facilmente pelo micro e assim, nós estamos de volta ao negócio. O s transistores de saída e o driver podem estar em dois arranjos diferentes. A Fig. 3 mostra dois transistores individualmente ou um único transistor Darlington como mostrado na fig.4.

http://www.novaeletronica.net/q/n5/cursopic/cursopic_3.htm

03/12/2009

Page 6 of 7

O resultado é exatamente o mesmo. A única diferença é o número de componentes necessários e o espaço ocupado na placa de circuito impresso. Na fig. 3, quando a saída do micro é BAIXA, o transistor PNP de buffer está ligado. Isto entrega corrente à base do transistor de saída por um resistor 18R. Nós determinamos que a corrente na base deve ser de 250mA para ligar com segurança a lâmpada de 12v x 1amp. Esta corrente tem que passar pelo resistor 18R, e a potência em watts dissipada por este resistor será surpreendente! Ela precisa ser 1watt! Esta corrente é perdida já que não executa nenhuma função e os 250mA colocarão uma carga pesada na alimentação de 5v. A solução é pôr um transistor Darlington na saída, como é mostrado na fig. 4. Um transistor Darlington é composto de dois transistores no mesmo estojo e se parece com um transistor normal com três terminais. Um transistor Darlington típico pode ter um ganho de 2,500 e se a lâmpada requerer 6 amperes para ligar, a corrente requerida na base será 2.5mA. O resistor separador de 1K entregará aproximadamente 3.5mA, lembrando que há uma queda de 1.2v entre base e o pólo negativo negativa para o transistor de Darlington. Mas a maior vantagem maior do projeto com o Darlington é a ausência do resistor de 18 ohm. Isto eliminará a forte demanda nos 5v da alimentação. Um transistor Darlington satisfatório para uma carga de até 4 ampères é o BD 679. A pinagem para um BD 679 é mostrado na fig. 5.

http://www.novaeletronica.net/q/n5/cursopic/cursopic_3.htm

03/12/2009

Page 7 of 7

DRIVING TRIACS
Se cargas altas de corrente alternada precisarem ser acionadas, um TRIAC pode ser usado, como mostrado na fig. 6.

Um TRIAC é especialmente adequado para acionar cargas de corrente alternada pois conduz em qualquer direção e pode ser ligado parcialmente durante um ciclo (cada meio-ciclo) fornecendo suavização para lâmpadas (dimmer) ou controle de velocidade para motores. TRIACs estão disponíveis em versões "sensitive gate" que requerem baixa corrente no gate. Isto é ideal para o micro '508A. TRIACs requerem a menor CORRENTE DE DISPARO NO GATE, quando a corrente no gate é negativa.

PAGINAS :

| 01 | 02 | 03 | 04 | 05 |06 | 07 |

http://www.novaeletronica.net/q/n5/cursopic/cursopic_3.htm

03/12/2009

Page 1 of 3

Seguindo Adiante
Observando um PROGRAMA Página 4 PAGINAS : | 01 | 02 | 03 | 04 | 05 |06 | 07 |

Antes de nós começarmos o curso, vamos mais adiante e vejamos como tratar uma sentença simples. É interessante saber o que vem pela frente e em direção a quê você está trabalhando. Uma solicitação chegou na semana passada para auxílio com um programa para PIC. O escritor perguntava: Olá, eu estou tentando construir um projeto que funcione como uma secretária eletrônica. Eu estou tento problemas em programar o PIC16F84 para fazer o seguinte:

Faça "W". Verifique se "X" acontece. Se "X" não acontece no tempo "Y" então faça "Z". Eu espero que você entenda o que eu estou perguntando.
Esta é uma necessidade típica ao escrever quase qualquer programa e embora nós não saibamos o suficiente da sentença para criar um programa completo (ou sub-rotina) nós podemos explicar como agir no que diz respeito a tarefa Há duas coisas que você precisa lembrar: 1. O microcontrolador tem um oscilador interno (chamado clock) que funciona o tempo todo. Este oscilador incrementa um arquivo chamado o Contador do Programa e faz o micro continuar a executar a seqüência de instruções do programa. O programa pode ter laços (loops) e saltos (jumps) que fazem o micro desviar a execução do programa para cima e para baixo, mas ainda assim ele está avançando pelo programa." 2. Você deve evitar criar programas que façam o micro permanecer em um loop enquanto espera que um evento em particular aconteça. O microcontrolador pode fazer só uma coisa de cada vez e se estiver ocupado exclusivamente em um loop, não poderá estar produzindo a uma exibição ou executando outras operações. O programa deve ser estruturado de forma que cheque ou "consulte" uma linha de saída para ver se essa linha mudou de estado. Se você verificar a linha uma base regular, o evento não será perdido. O programa que satisfaz a declaração acima é chamado de sub-rotina. Ele é chamado a partir da rotina principal – “Main”. A primeira coisa a fazer é preparar um fluxograma:

http://www.novaeletronica.net/q/n5/cursopic/cursopic_4.htm

03/12/2009

Page 2 of 3

Flow diagram for "X", "Y" and "Z" A seção de contador/timer "pesquisa" ou "verifica em loops" uma linha de saída procurando por uma mudança. Isto é feito muitas vezes e forma um ATRASO de TEMPO. O contador/timer está carregado com um valor e decrementa a contagem até zero. Quando o contador/timer for zero, o programa executa o caminho "time-up".

MOVLW 40h MOVWF 1Ch Do "W" BSF 06h,0 CALL Delay BCF 06,0 AA CALL Delay BTFSS 06,1 GOTO BB RETLW 00 DECFSZ 1Ch GOTO AA BSF 06,1 CALL Delay BCF 06,1 RETLW 00 MOVLW 80h MOVWF 1Ah MOVLW 60h MOVWF 1Bh DECFSZ 1Bh GOTO Del3 DECFSZ 1Ah GOTO Del2 RETLW 00

;Carrega o arquivo de contagem regressiva 1C ;Torna RB0 HIGH ;Seleciona Page0 ;Torna RB0 LOW

;A entrada "X" está HIGH? ;Sim. Retorna para Main ;Decrementa o arquivo de contagem regressiva ;Tempo não acabou. Faça novamente ;Tempo acabou. Faça "Z" ;Torna RB1 LOW ;Retorna para Main

BB Do "Z"

Delay Del2 Del3

;Carrega um valor no arquivo 1A ;Carrega um valor no arquivo 1B

;Retorna para a sub-rotina acima

http://www.novaeletronica.net/q/n5/cursopic/cursopic_4.htm

03/12/2009

Page 3 of 3

Programa para a questão sobre "X", "Y" , "Z" acima

O tempo "Y" é composto pelos loops dentro do arquivo de contagem regressiva 1C e inclui o comprimento de tempo criado pelo Delay. A quantidade de tempo levado por cada uma as operações "W" e "Z" pode ser ajustada pela sub-rotina Delay. No momento você não sabe nada sobre as instruções que nós usamos no programa acima ou como interpretá-las, mas você pode ver aproximadamente quantas linhas de código são necessárias para trabalharmos com a questão proposta acima. A vantagem de trabalhar com uma linguagem de baixo nível como as instruções no programa acima, é a habilidade de dizer exatamente para o microcontrolador o que você quer que ele faça, do modo mais simples e mais rápido. Produzir um programa em Código de Máquina ou Mnemônico é o mais próximo que você pode chegar do tipo de instruções que são diretamente lidas pelo microcontrolador e isto é chamado linguagem de baixo nível. Um idioma de alto nível é um idioma de interpretador, como BASIC ou C++. Há vários "truques" no programa acima e estes geralmente estão na colocação de uma instrução em um lugar incomum. Um deles foi a é a colocação de CALL Delay CHAMADA como a 6ª instrução. .

AA

CALL Delay BTFSS 06,1 GOTO BB RETLW 00 DECFSZ 1Ch

;A entrada "X" é HIGH? ;Sim. Retorne para Main ;Decremente arquivo de contagem regressiva

Isto permite que a sub-rotina Delay seja chamada durante cada loop do contador/timer. Posteriormente, neste curso, você aprenderá o significado de cada instrução e verá por que o único lugar para a instrução CALL Delay é antes de decrementar o arquivo de contagem. O outro ponto que você pode observar nesta fase inicial é a simplicidade das instruções. Cada letra representa uma palavra. Por exemplo, BTFSS 06,1 significa: Teste o Bit 1 do Arquivo 06 e Salte se estiver Ligado (1). As letras que compõe a instrução são chamadas Mnemônicas e isso significa simplesmente um "conjunto de letras que são fáceis se lembrar". Nós não podemos cobrir mais nada do programa até que as instruções sejam explicadas completamente.. Isso é o que nós faremos nas próximas páginas: Página 5: Conjunto de instruções do PIC12C508A. Página 6: Conjunto de instruções do PIC16F84.

Prosseguir para Introdução no Laboratório 1 as 18 experiências

PAGINAS :

| 01 | 02 | 03 | 04 | 05 |06 | 07 |

http://www.novaeletronica.net/q/n5/cursopic/cursopic_4.htm

03/12/2009

Page 1 of 2

| 01 | 02 | 03 | 04 | 05 |06 | 07 | CONJUNTO DE INSTRUÇÕES PARA O PIC12C508A
Veja o conjunto de instruções explicado para detalhes Os termos em AZUL são para auxílio Os termos em VERMELHO não estão disponíveis para o 508A
ADDLW ADDWF ADDWF ANDLW ANDWF ANDWF BCF BSF BTFSC BTFSS Call CLRF CLRW CLRWDT COMF COMF DECF DECF DECFSZ DECFSZ GOTO IN INCF INCF INCFSZ INCFSZ IORLW IORWF IORWF LOAD MOVLW MOVF MOVF MOVWF NOP OPTION OR OUT READ RETLW RETURN RLF RLF RRF RRF SLEEP SUBLW Soma literal e W Não disponível para o ‘508A. Soma W e f (resultado em W) ex. ADDWF 0C,0 Soma W e f (resultado em f) ex ADDWF 0C,1 E literal com W ex. ANDLW 40h E W com f (resultado em W) ex ANDWF 0C,0 E W com f (resultado em f) ex ANDWF 0C,1 Limpa bit f bit0 até bit7 ex. BCF 1E,7 Liga bit f bit0 até bit7 ex. BSF 1F,3 Testa bit, ignora se desligado bit0 até bit7 ex. BTFSC 1A,5 Testa bit, ignora se ligado bit0 até bit7 ex. BTFSS 1B,6 Chama sub-rotina (faixa: 00atéFF) Nota: apenas primeiros 256 label bytes!! Ex. CALL Tone1 file Limpa f ex. CLRF 1A Limpa W Limpa o cronômetro watchdog file,0 Complemento de f (resultado em W) ex. COMF 0C,0 file,1 Complemento de f (resultado em f) ex. COMF 0C,1 file,0 Decrementa f (resultado em W) ex. DECF 0D,0 file,1 Decrementa f (resultado em f) ex. DECF 0D,1 file,0 Decrementa f, ignora se 0 (resultado em W) ex. DECFSZ 1A,0 Decrementa f, ignora se 0 (resultado em f) ex. DECFSZ 1A,1 – file,1 esta é a instrução a ser utilizada Desvio incondicional (faixa:000atéFFF) ex. GOTO Tone2 (000 label até 3FF para ‘508) Lê uma entrada BTFSS 06,0 06,1 06,2 06,3 06,4 06,5 para uma linha de entrada, ou MOV06,0 para porta file,0 Incrementa f (resultado em W) ex. INCF 1A,0 file,1 Incrementa f (resultado em f) ex. INCF 1A,1 file,0 Incrementa f, ignora se 0 (resultado em W) ex. INCFSZ 1A,0 file,1 Incrementa f, ignora se 0 (resultado em f) ex. INCFSZ 1A,1 00 to FF Inclusive OU literal com W ex. IORLW 20h file,0 Inclusive OU W com f (resultado em W) ex. IORWF 0D,0 file,1 Inclusive OU W com f (resultado em f) ex. IORWF 0D,1 Carrega um arquivo com um número (chamado literal) Uso: MOVLW XX então MOVWF 1C (ou qualquer outro arquivo) Move literal para W – Carrega W com um número ex. MOVLW 00 to FF 80h file,0 Move f (resultado em W) Copia F em W ex. MOVF 0E,0 Move f (resultado em f) Move F de e para F – não coloca F em file,1 W ex. MOVF )E,1 file Move W para f Copia W em f ex. MOVWF 0C Nenhuma operação Carrega o registrador OPTION Veja IORWF e etc acima Para ligar uma saída. Uso: BSF 06,0,1,2,4,5 ou MOVF 1C e então MOVWF 06 Lê uma entrada BTFSS 06,0 06,1 06,2 06,3 06,4 06,5 para linha de entrada ou MOVF 06,0 para porta. 00 to FF Retorna com literal em W ex. RETLW 80h Retorna de sub-rotina. Não disponível para o ‘508A. Uso RETLW 00 Desloca a esquerda de f por transporte (resultado em W) file,0 Dobra o valor * ex. RLF 1C,0 Desloca a esquerda de f por transporte (resultado em f) Dobra file,1 o valor * ex. RLF 1C,1 Desloca a direita de f por transporte (resultado em W) Divide file,0 por 2 o valor * ex. RRF 1D,0 Desloca a direita de f por transporte (resultado em f) Divide file,1 por 2 o valor * ex. RRF 1D,1 Sleep Subtrai W de literal. NÂO subtrai a literal de W. Não disponível 00 to FF para o ‘508A. 00 to FF file,0 file,1 00 to FF file,0 file,1 file,bit file,bit file,bit file,bit

http://www.novaeletronica.net/q/n5/cursopic/cursopic_5.htm

03/12/2009

Page 2 of 2

Subtrai W de f (resultado em W) ex. SUBWF 0E,0 Subtrai W de f (resultado em f) ex. SUBWF 0E,1 Troca meio-bytes (Nibbles) em f (resultado em W) ex. SWAPF SWAPF file,0 0C,0 Troca meio-bytes (Nibbles) em f (resultado em f) ex. SWAPF SWAPF file,1 0C,1 Carrega o arquivo TRIS do registrador W. GP0, GP1, GP2, GP3, TRIS 06h GP4, GP5 ** XORLW 00 to FF Exclusive OU literal com W ex. XORLW 40h XORWF file,0 Exclusive OU W com f (resultado em W) ex. XORWF 0C,0 XORWF file,1 Exclusive OU W com f (resultado em f) ex. XORWF 0C,1 * Deve-se limpar o transporte (carry) antes de RLF ou RRF se o arquivo for lido. Para RLF o valor é duplicado, para RRF é dividido pela metade. ** GP3 = SOMENTE entrada

SUBWF SUBWF

file,0 file,1

| 01 | 02 | 03 | 04 | 05 |06 | 07 |

http://www.novaeletronica.net/q/n5/cursopic/cursopic_5.htm

03/12/2009

Page 1 of 2

Página 5 PAGINAS : | 01 | 02 | 03 | 04 | 05 |06 | 07 |

CONJUNTO DE INSTRUÇÕES PARA O PIC16F84
Veja o conjunto de instruções explicado para detalhes. Os arquivos em um PIC16F84 são: Destino 0 = W 1 = F 00 a 06 Registradores de propósitos especiais 07 a 4F Arquivos de propósito geral.

A PORTA A tem 5 linhas – RA0 – RA4 (RA4 não entrega corrente – apenas
recebe 25mA) “Literal” pe outro nome para NÚMERO ou VALOR. Seu valor varia de 00 até FF. “W” é o Registrador de Trabalho (working) – ou “acumulador” em outros processadores. Números são “Carregados” em W e a partir de W são “MOVidos” para outros arquivos (e o valor permanece em W) ADDLW 00 to FF Soma literal à W ex. ADDLW 84h . Não disponível para o ‘508A Soma W e f (resultado em W) ex. ADDWF 0C,0 (o arquivo não ADDWF file,0 é alterado) ADDWF file,1 Soma W e f (resultado em f) ex. ADDWF 0C,1 ANDLW 00 to FF E literal com W ex. ANDLW 40h E W com f (resultado em W) ex. ANDWF 0C,0 (o arquivo não é ANDWF file,0 alterado) ADDWF file,1 Soma W e f (resultado em f) ex. ADDWF 0C,1 BCF file, bit Limpa Bit de f bit0 até bit7 i.e. 0 até 7 ex. BCF 1E,7 BSF file, bit Liga Bit de f bit0 até bit7 i.e. 0 até 7 ex. BSF 1F,3 Testa Bit, ignora se limpo bit0 até bit7 i.e. 0 até 7 ex. BTFSC BTFSC file, bit 1A,5 Testa Bit, ignora se ligado bit0 até bit7 i.e. 0 até 7 ex BTFSS BTFSS file,bit 1B,6 CALL label Chama uma sub-rotina (faixa: 000 até 3FF) ex. CALL Tone1 CLRF file Limpa F ex. CLRF 1A CLRW Limpa W CLRWDT Limpa o cronômetro Watchdog Complemento de f (resultado em W) ex. COMF 0C,0 (o arquivo COMF file,0 não é alterado) COMF file,1 Complemento de f (resultado em f) ex. COMF 0C,1 Decrementa f (resultado em W) ex. DECF 0D,0 (o arquivo não DECF file,0 é alterado) DECF file,1 Decrementa f (resultado em f) ex. DECF 0D,1 Decremente f, ignora se 0 (resultado em W) ex. DECFSZ 1A,0 DECFSZ file,0 (o arquivo não é alterado) Decremente f, ignora se 0 (resultado em f) ex. DECFSZ 1A,1 DECFSZ file,1 Esta é a instrução a usar. GOTO label Desvio incondicional (faixa: 000 até 3FF) ex. GOTO Tone2 Lê uma entrada, veja BTFSS 06,0 BTFSS 05,0 etc para linha de entrada, ou IN MOVF 05,0 MOVF 06,0 Incrementa f (resultado em W) ex. INCF 1A,0 (o arquivo não é INCF file,0 alterado) INCF file,1 Incrementa f (resultado em f) ex. INCF 1A,1 Incrementa f, ignora se 0 (resultado em W) ex. INCFSZ 1A,0 INCFSZ file,0 (o arquivo não é alterado) INCFSZ file,1 Incrementa f, ignora se 0 (resultado em f) ex. INCFSZ 1A,1 IORLW 00 to FF Inclusive OU literal com W ex. IORLW 20h IORWF file,0 Inclusive OU W com f (resultado em W) ex. IORWF 0D,0 IORWF file,1 Inclusive OU W com f (resultado em f) ex. IORWF 0D,1 Carrega um arquivo com um número (chamado literal) Uso: MOVLW XX LOAD então MOVWF 1C (ou qualquer outro arquivo) Move literal para W – Carrega W com um número ex. MOVLW MOVLW 00 to FF 80h MOVF file,0 Move f (resultado em W) Copia F em W ex. MOVF 0E,0 Move f (resultado em f) Move F de e para F – não coloca F em MOVF file,1 W ex. MOVF )E,1

A PORTA B tem 8 linhas – RB0 – RB7 Os termos em AZUL são para auxiliar -

http://www.novaeletronica.net/q/n5/cursopic/cursopic_6.htm

03/12/2009

Page 2 of 2

file Move W para f Copia W em f ex. MOVWF 0C Nenhuma operação Veja IORWF e etc acima Para ligar uma saída. Uso: BSF 05,0 BSF 06,0 etc ou MOVF 1C e então OUT MOVWF 06 Lê uma linha de entrada. Uso: BTFSS 06,0 ou BTFSS 06,1 ou BTFSS 06,2 READ etc RETLW 00 to FF Retorna com literal em W ex. RETLW 80h Retorna de sub-rotina. Não disponível para o ‘PIC12C508A. RETURN Uso RETLW 00 até FF Desloca a esquerda de f por transporte (resultado em W) RLF file,0 Dobra o valor * ex. RLF 1C,0 Desloca a esquerda de f por transporte (resultado em f) Dobra RLF file,1 o valor * ex. RLF 1C,1 Desloca a direita de f por transporte (resultado em W) Divide RRF file,0 por 2 o valor * ex. RRF 1D,0 Desloca a direita de f por transporte (resultado em f) Divide RRF file,1 por 2 o valor * ex. RRF 1D,1 SLEEP SLEEP SUBLW 00 to FF Subtrai W de literal. NÃO subtrai literal de W ex. SUBWF 40h Subtrai W de f (resultado em W) ex. SUBWF 0E,0 (o arquivo SUBWF file,0 não é alterado) SUBWF file,1 Subtrai W de f (resultado em f) ex. SUBWF 0E,1 Troca meio-bytes (Nibbles) em f (resultado em W) ex. SWAPF SWAPF file,0 0C,0(arquivo não é alterado) Troca meio-bytes (Nibbles) em f (resultado em f) ex. SWAPF SWAPF file,1 0C,1 Carrega o arquivo TRISA do registrador W. Alternativa: TRIS 05h MOVLW XX e então MOVWF 05 ** (porta A – 5 linhas) Carrega o arquivo TRISB do registrador W. Alternativa: TRIS 06h MOVLW XX e então MOVWF 06 ** (porta B – 8 linhas) XORLW 00 to FF Exclusive OU literal com W ex. XORLW 40h Exclusive OU W com f (resultado em W) ex. XORWF 0C,0 (o XORWF file,0 arquivo não é alterado) XORWF file,1 Exclusive OU W com f (resultado em f) ex. XORWF 0C,1 * Deve-se limpar o transporte (carry) antes de RLF ou RRF se o arquivo for lido. Para RLF o valor é duplicado, para RRF é dividido pela metade. ** Deve se usar BSF 03,5 antes das duas instruções alternativas e BCF03,5 após as duas instruções para se chegar à “Bank1” aonde o arquivo de controle de entrada/saída para as duas portas fica localizado

MOVWF NOP OR

PAGINAS :

| 01 | 02 | 03 | 04 | 05 |06 | 07 |

http://www.novaeletronica.net/q/n5/cursopic/cursopic_6.htm

03/12/2009

Page 1 of 19

| 01 | 02 | 03 | 04 | 05 |06 | 07 |

Entendendo e Programando o PIC16F84 Um tutorial para iniciantes por
Jim_Mackena_BSc(Eng), HDipEdAd,_GDE (Wits)
Para entender como programar um microcontrolador, você precisa de contribuição de muitas fontes diferentes. Isso inclui idéias e discussões de instrutores diferentes. Cada um oferece um ponto de vista diferente com uma terminologia para descrever uma característica, especialmente sobre algo tão complexo quanto programação. Este artigo de Jim Brown cobre muito das características do microcontrolador PIC16F84 e lhe ajudará a adquirir um conhecimento geral sobre este surpreendente dispositivo.

Conteúdo:
Introdução O que você precisa O que você deveria saber Arquitetura ao PIC16F84 Conjunto de Instruções Um programa simples para o PIC16F84 Usando MPLAB para depurar um programa Pausa para refletir O Conjunto de Instruções Formato da Instrução O Registrador STATUS

1: Instruções Move
MOVF f,d (Move f) MOVWF f (Move W para f) MOVLW k (Move literal para W)

2: Instruções Clear
CLRF f (Limpa f) CLRW (Limpa W)

3: Instruções Aritméticas
ADDWF f,d (Soma W & f) SUBWF f,d (Subtrai W de f) ADDLW k (Soma literal e W) SUBLW k (Subtrai W de literal)

4: Funções Lógicas
ANDWF f,d (E W com f) IORWF f,d (Inclusive OU W com f) XORWF f,d (Exclusive OU W com f) ANDLW k (E literal com W) IORLW k (Inclusive OU literal com W) XORLW k (Exclusive OU literal com W) COMF f,d (Complemento f)

5: Decrementando & Incrementando
DEC f,d (Decrementa f) INC f,d (Incrementa f)

6: Ligando e limpando Bit

http://www.novaeletronica.net/q/n5/cursopic/cursopic_7.htm

03/12/2009

Page 2 of 19

BCF f,b (Bit limpa f) BSF f,b (Bit liga f)

7: Controle do Programa
GOTO k (Vai para endereço) CALL k (Chama sub-rotina) RETURN (Retorna de sub-rotina) RETLW k (Retorna com literal em W) RETFIE (Retorna de Interrupção)

8: Instruções Skip
DECFSZ f,d (Decrementa f, ignora se 0) INCFSZ f,d (Incrementa f, ignora se 0) BTFSC f,b (Bit testa f, ignora se limpo) BTFSS f,b (Bit testa f, ignora se ligado)

9: Rotações e Troca
RRF f,d (Rotaciona f para a direita por transporte) RLF f,d (Rotaciona f para a esquerda por transporte) SWAPF f,d (Troca os meio-bytes em f)

10: Sleep & Timer Watchdog
SLEEP (Sleep,) CLRWDT (Limpa o timer watchdog.)

11: Miscelânea
NOP (Nenhuma operação) OPTION (Não recomendado) TRIS (N]ao recomendado) Pausa para refletir Interrupções no PIC16F84 O que é uma interrupção? Tipos de interrupção e o registrador INTCON Lidando com uma interrupção Timers no PIC16F84 A Idéia básica O módulo TIMER0 Usando overflow do timer Usando a memória de dados EEPROM

Introdução
Quando eu comecei a pensar em programar o PIC16F84, eu fiquei amedrontado pelo que eu vi. Parecia tão complexo. A folha de dados do PIC16F84 da Microchip é um excelente documento técnico e o manual do MPASM é um guia de referência completo. Nenhum destes documentos me serviu como um tutorial que era o que eu precisava. Assim este artigo é um tutorial para programar o PIC16F84, cobrindo o conjunto de instruções e algumas diretivas do MPASM. Pelo seu conteúdo ele cobre o próprio PIC16F84 em termos de registros, pinos e assim por diante. Ao final, você não será um super expert no ’84. Mas você se sentirá bastante à vontade com esse componente.

O Quê você precisa
Primeiro, você precisa ter alguma da documentação da Microchip. Como um mínimo, você precisará da folha de dados do PIC16F84. Ela contém toda a informação real que você precisará do próprio chip. Você também deve ter o Guia de usuário do MPASM. Ambos estes estão disponíveis no site da Microchip, http://www.microchip.com , ou do seu CD anual 'Biblioteca Técnica Microchip'. Você poderia trabalhar através deste artigo apenas com o mencionado acima, mas você conseguirá muito mais dele sendo capaz de experimentar. Assim, carregue uma cópia do MPLAB (para Windows) no seu PC.

http://www.novaeletronica.net/q/n5/cursopic/cursopic_7.htm

03/12/2009

Page 3 of 19

Este é o Ambiente de Desenvolvimento Interativo (IDE) deles, e contém um editor, o assembler e um simulador. Aqui, você pode criar seu código fonte (editor), produzir o código executável (assembler) e executar no seu PC (simulador). No simulador, você pode observar a execução do programa enquanto mantém a vista nos registros e você pode até mesmo simular eventos como mudanças causadas por fatores externos nos pinos de I/O. Você realmente deveria adquiri-lo pois também está disponível como o manual do MPASM mencionado mais acima. Faça todo o seu tutorial antes de começar este artigo e isso lhe ajudará a entender os pontos que nós estaremos cobrindo. O Simulador (Emulador) é muito bom para observar os registradores e executar um programa em um modo passo a passo, mas isso não resolverá todos os seus problemas quando uma falha acontecer. O modo passo a passo não leva em conta o efeito de uma entrada em um programa e uma rotina de delay deve ser ignorada para se prevenir horas de espera para a execução do programa. Isso é tudo que você precisa, mas há muito mais coisas das quais você pode gostar. Não menos, um chip PIC16F84 e um programador. O programador Multi-Chip apresentado por Nova Eletrônica é o equipamento mais barato no mercado e vem com alguns softwares para download para programar-se uma gama de chips, na qual o PIC16F84 está incluído.. De extrema ajuda, talvez numa jornada mais longa, são as Notas de Aplicação da Microchip (ANs). Eles as disponibilizaram como uma grande fonte de informação acessível a qualquer momento, bem à mão é o CD-ROM mencionado acima. Estas notas cobrem todos os tipos de usos dos PICs, com muitas dicas úteis para uso no mundo real. As ANs estão em formato Adobe .pdf: Usando o Adobe Acrobat você pode procurar pelas ANs por situações como 'motor' ou 'serial' e ler as anotações destinadas às suas necessidades. Um das notas, AN585 sobre sistemas operacionais de tempo real para o PIC, refere-se à Programação de Tempo Real - Tópicos Negligenciados. Eu lhe peço que adquira uma cópia com urgência. É em tutorial fascinante sobre todo o assunto das interrupções, controle de laço -fechado e similares.

O que você deveria saber
Na verdade, não sou eu quem deve dizer o que você deveria saber: Eu não sei quem é você ou o que você faz. Mas, eu acho que você achará o andamento deste tutorial mais fácil se você entender (ou puder descobrir com facilidade) a terminologia básica dos computadores, como bits, bytes & EEPROM e conceitos como binário e hexa. Claro que se você estiver usando o simulador em seu PC, você tem que estar familiarizado com seu PC e Windows, e ter passado pelo tutorial de IDE. Certamente eu não espero que você tenha qualquer conhecimento do PIC16F84 – este tutorial é voltado para o mais absoluto iniciante.

Arquitetura do PIC16F84
Um microcontrolador como o PIC16F84 é, por sua natureza, um computador completo em um chip. Ele possui: 1. um processador e 2. registradores, como também 3. programa e 4. memória de dados. Isto o faz diferente de uma CPU, (Unidade de Processador Central) que tem só o processador e registradores. 1: O PIC16F84 tem um processador de 8-bits, e isso é tudo que nós precisamos saber. 2: Os 90 registradores são a área de armazenamento interno do processador. Estes têm nomes como (STATUS, PORTA etc). Alguns têm funções especiais e nós os examinaremos depois. Por exemplo, PORTA armazena os conteúdos de uma das portas de I/O, isto é a chamada porta A. Dos 90 registradores, 68 são registradores de propósito gerais, e nós podemos considerá-los como nosso (ao contrário daqueles especiais do processador) e usálos como nosso 'bloco de rascunho''. 3: O PIC16F84 tem uma memória de programa de 1k: isso significa que há 1024 locais para programa. A memória vai do endereço 000h até o 3FFh: 3FFhex são 1023 em notação decimal, sendo assim há 1024 locais que incluem 000. 4: O PIC16F84 tem 64 bytes de memória de dados, chamados de memória de EEPROM a qual é usada para armazenamento de, por exemplo, valores para ajuste de dados recebidos do mundo externo. Nós olharemos para o uso dessa memória EEPROM por último nesta discussão. Além disso, o dispositivo inclui quatro tipos de interrupção e 13 pinos de I/O.

http://www.novaeletronica.net/q/n5/cursopic/cursopic_7.htm

03/12/2009

Page 4 of 19

5: Interrupções são uns meios de parar a execução do programa e atender a uma operação definida pela interrupção. Por exemplo, o acionamento de um botão poderia interromper o fluxo normal do programa e poderia executar alguma operação especial. Nós examinaremos as técnicas de interrupção do PIC16F84 depois. 6: O uso dos pinos de I/O é a chave para o uso de um dispositivo como os '84, uma vez que qualquer processo consiste em 3 partes: a entrada para o processo, o próprio processo, e a saída. O PIC16F84 tem 13 pinos configurados como 2 porta: porta A tem 5 alfinetes e a porta B tem 8; e nós os estaremos usando mais adiante.

Conjunto de instruções
Há 35 instruções no conjunto de instruções do PIC16F84, consistindo em um opcode (código de operação) e operando(s). Basicamente, o opcode especifica o que fazer e o(s) operando(s) especificam como ou onde. Estas instruções são divididas em 3 grupos: orientadas byte, orientadas a bit e literal & controle. Mais tarde nós usaremos cada uma dessas operações. Para agora, olhemos para uma das instruções. Concentre-se mais no formato, em lugar da função, a qual veremos logo mais adiante. Eu escolhi a instrução ADDWF. Neste tutorial, eu adotei a fonte Courier para todos os exemplos de codificação. A sintaxe desta instrução é: ADDWF f,d Onde ADDWF é o opcode e "f d" são os operandos. As letras ADDWF são chamadas de um mnemônico. Esta é uma abreviação que tanto o computador quanto os humanos podem entender. Você verá este mesmo layout em todas as instruções. Agora é um bom momento para falar do registrador de trabalho. Ele é um registrador especial (acima de todos já mencionados), conhecido como registrador W e é onde a unidade aritmética e lógica (ALU) faz os cálculos. Qualquer instrução com W no nome age em W. Os outros registradores são conhecidos como arquivos e nós usamos a letra 'F' nos comandos para indicar que um arquivo está sendo acessado. Assim, nós podemos entender que o comando ADDWF soma W ao arquivo F. Mas o que é arquivo F? Para cada arquivo (diferente de W) é determinado um endereço hexadecimal. Por exemplo, o arquivo 0C é chamado "0C", arquivo 10 é chamado "10" e arquivo 2F é chamado "2F”. A letra minúscula "h" sempre é incluída para indicar que arquivo tem um valor hexadecimal, como arquivo 10h por exemplo, que é na realidade o décimo sexto arquivo na memória. Alguns arquivos têm nomes, como por exemplo: PORTA é 05h, PORTB é 06h e TRISA é 85h. O 'f' na instrução acima é o endereço atual do arquivo. Não há nenhum arquivo chamado "F" ou "f". Isso é um símbolo para representar qualquer um dos arquivos. Assim, nós codificaríamos a instrução: "some W ao arquivo 3C" como: ADDWF 3Ch,d Bem, não totalmente - para que serve aquele 'd'? É o destino do resultado, e você verá isto em muitas instruções. Dependendo da exigência, o resultado da instrução pode ser posto no registro de funcionamento (W) ou no próprio arquivo F. Se 'd' for 0, o resultado estará em W, Se 'd' for 1, o resultado estará em F. A instrução pode ser seja qualquer um do seguinte: ADDWF 3Ch,0; soma W ao arquivo 3C, resultado em W ADDWF 3Ch,1; soma W ao arquivo 3C, resultado em 3C Vamos escrever....

Um programa simples para o PIC'84
Este programa de exemplo serve para vários propósitos. Além de mostrar como usar alguns instruções, apresenta também alguns conceitos do assembler e vai também mostrar algumas técnicas simples para o simulador. O programa, Simple.asm é apresentado abaixo; Eu lhe guiarei linha por linha. Programa 1: Simple.asm ;simple.asm ;para demonstrar o aspecto de um programa ;e introduzir algumas instruções e diretivas

http://www.novaeletronica.net/q/n5/cursopic/cursopic_7.htm

03/12/2009

Page 5 of 19

;***************** setup *************************** processor 16F84 ;tipo de processador org 0010h ;origem do programa na memória w equ 0 ;para instruções de byte, use w & f f equ 1 ; ao invés de 0 & 1, isso é bem mais claro MyReg_1 equ H'10' ;posição Meus Registradores na memória MyReg_2 equ H'15' ; em h'10' & H'15' ;***************** programa ****************************** ;Nós vamos carregar o acumulador (reg w) com valores ; e efetuar algumas operações aritméticas em W utilizando ; MyReg_1&2 movlw H'08' ;coloca o valor H'08' no registrador w movwf MyReg_1 ;move o conteúdo de w para MyReg_1 ; nota – é o mesmo que movwf 10h, já que ; MyReg_1 e 10h são a mesma coisa. movlw 32h ;coloca 32h no registrador W addwf MyReg_1,f ;soma o conteúdo de w àquele em MyReg_1 ; a resposta vai para MyReg_1, devido ao f. movlw 92h ;coloca o valor 92h no registrador w movwf MyReg_2 ;move o conteúdo de W para MyReg_2 ; nota – é o mesmo que movwf 15h, já que ; MyReg_2 e 15h são a mesma coisa. movlw 26h ;coloca 26h no acumulador W subwf MyReg_2,w ;subtrai w de MyReg_2 ; a resposta vai para w end Vamos dar uma olhada nesse programa de exemplo. Você pode verificar o que irá se seguir encontrando cada diretiva ou instrução na seção Programação PIC deste Site. Qualquer coisa depois de um ';' é um comentário. Todo livro de programação recomenda a criação de comentários para explicar o que está acontecendo. Na seção chamada 'setup', nós encontramos três diretivas do assembler: "processador 16F84" informa ao assembler para qual chip o programa foi escrito. Se isto estiver incorreto, o código será preparado pelo assembler para o processador errado. "org" diz ao assembler aonde começar a colocar o código na memória de programa. Você deve colocar seu código além de 004h para ficar claro o endereço para onde o processador deve ir quando uma interrupção é descoberta. "equ" é uma equivalência ou "igual a." Simplesmente significa que os itens em qualquer lado de equ significam a mesma coisa. Por exemplo, a instrução ADDWF espera um 0 ou 1 no lugar de 'd': igualando 'w' a 0' significa que nós podemos usar 'w' na instrução em lugar de 0'. Isto é mais fácil de se lembrar durante a codificação, e para ler depois. Analogamente, igualando MyReg_1 a 10h toda vez que nos referirmos ao registrador, será mais fácil de fazê-lo através do seu nome mais significante e fácil de lembrar. Na parte chamada 'programa', nós encontramos várias instruções do PIC16F84. Confira as descrições completas; nós as estaremos estudando mais tarde. MOVLW k faz o valor k (no exemplo 08h) ser colocado no registrador de trabalho. MOVWF f copia o conteúdo de W no registrador f. Note que movwf é estritamente uma nomenclatura equivocada, já que na realidade ocorre uma cópia (W não é esvaziado), e não uma movimentação (na qual W seria esvaziado). Note também a convenção da Microchip de comparar movlw e movwf: descrevendo a operação os parênteses () significam 'o conteúdos de'. Assim k→ (W) quer dizer que o valor k se torna o conteúdo de W; (W)→ (f) meios que o conteúdo de W se tornam o conteúdo de f. Por último, certifique-se de entender o uso do conceito de equ com respeito a registradores. O ' f ' em MOVWF f refere-se a um arquivo. Ele mostra que arquivos têm endereços hexadecimais e nós esperaríamos ler a instrução como MOVWF 10h por exemplo. Igualando MyReg_1 a 10h, quer dizer que nós podemos escrever MOVWF MyReg_1 com o mesmo resultado. ADDWF f,d e SUBWF f,d respectivamente executam a adição e subtração aritméticas nos conteúdos de W e f. Note o uso de equivalências aqui também; nós podemos nos referir a MyReg_1 como antes, e também substituir os valores permitidos de d (no exemplo 0 e1) por w e f respectivamente.

http://www.novaeletronica.net/q/n5/cursopic/cursopic_7.htm

03/12/2009

Page 6 of 19

Conseqüentemente nós podemos escrever ADDWF MyReg_1,f no lugar de ADDWF 10h,1. Vamos montar e executar esse programa...

Usando MPLAB para depurar o programa...
Este é um processo de três passos: editar o código fonte, montá-lo e então executá-o no simulador para ver o que acontece. Se você trabalhou através do tutorial da MPLAB, você já sabe sobre editar e montar. Eu assumirei que você o fez, assim nós podemos passar para a simulação. Com o exemplo .asm montado com sucesso, e o editor sendo a única janela aberta no MPLAB, execute o programa passo a passo (o ícone de pegada). Não ajuda muito - você vê cada linha do programa ser realçada à medida que é ativada, mas isso é tudo. Assim, comecemos a usar algumas das outras facilidades do simulador. Eu sugiro que você abra as seguintes janelas no MPLAB. Todas servem a propósitos semelhantes - isto é, ver o que está acontecendo nos registradores - mas todas executam diferentemente. Eu achei isto útil ter todas abertas simultaneamente para comparar as implementações: Janela > File Register Esta janela lista o conteúdo de todos os registradores de arquivos de 00 a 4F - ie, não mostra aqueles na região 80 a 8B. À medida que você caminha pelo programa poderá ver o conteúdo hexadecimal dos registradores 10h e 15h mudando. Note que qualquer registrador cujo conteúdo mudou há pouco é mostrado em vermelho - e volta para azul no próximo passo (a menos que haja outra mudança). Janela > Special Function Registers Aqui você pode ver os SFRs (Registradores de Função Especial) por nome ao invés de local, que é o que mostra a janela anterior. O conteúdo é mostrado em decimal, hexa e binário. Janela > New Watch Window Esta é sua janela personalizada para os registradores, e lhe permite selecionar quais registradores você quer monitorar. Todos os registradores estão disponíveis à sua escolha, SFRs e GPRs. Quando você escolhe esta janela é mostrada uma caixa de seleção com uma seta para baixo. Clique na seta, e uma lista de todos os registradores aparece: escolha o você quer (eg, Myreg_1) e então clique OK. Você verá o conteúdo do registrador exibido na janela. Para adicionar outros registradores você pode clicar no ícone no canto esquerdo superior da janela e então escolher Add Watch; ou simplesmente apertea a tecla insert (enquanto a janela está ativa). Você pode salvar as combinações usadas com mais freqüência como arquivos .wat, e então carregá-las depois através da Janela> Load Watch Window. Uma palavra de advertência... De onde veio a lista de nomes de registradores para selecionar? Os SFRs são óbvios: o MPLAB sabe a respeito deles de qualquer maneira. Os outros, como MyReg_1 e2, entram das diretivas de equ em seu código, o que é excelente. Porém, em nosso exemplo, nós usamos também w equ 0 e f equ 1 embora estes não são planejados como nomes de registro. Porém, eles ainda aparecem na lista de possibilidades. Aí que está o problema - apenas não os escolha você diz. Mas não esqueça que aquele W é um registrador: então agora há duas entradas de W na lista, uma desde o princípio (o registro de funcionamento), e nós criamos a outra com equ. Usar qualquer uma delas, causa um erro de símbolo não encontrado em sua tabela de observação, o que significa que você não pode monitorar o registro de funcionamento se você declarou um equ de W em seu código. Tente você, então comente a linha com erro com um ‘;', re-monte e tente novamente. Agora você pode usar o registro de trabalho no seu monitoramento. Com estas três janelas, caminhe pelo seu programa: agora você tem alguma noção do que está acontecendo. Fique satisfeito consigo mesmo porque tudo está funcionando ok. Pausa para refletir Para onde devemos ir a partir daqui? Bem, onde nós estamos agora? Nós vimos brevemente a arquitetura e o conjunto de instruções; nós criamos um programa simples e examinamos o código para adquirir o feeling disso; nós editamos e montamos esse programa; e nós vimos algumas das facilidades do simulador. Eu penso que nós deveríamos olhar mais detalhadamente o conjunto de instruções.

O Conjunto de Instruções

http://www.novaeletronica.net/q/n5/cursopic/cursopic_7.htm

03/12/2009

Page 7 of 19

A Microchip tem detalhes completos do conjunto de instruções. Elas se agrupam em 3 categorias, o que eu não considero particularmente útil. Estas categorias são operações Orientadas a Byte, a Bit e a Literal/Controle. Eu assumi a postura de agrupar as instruções dentro daquilo que nós usaremos para cada comando, tais como executar operações aritméticas. Um arquivo de ajuda para as janelas está disponível na Internet no site da Trisys Inc: Eu achei isso muito útil. É uma arquivo de ajuda normal com os links e buscas esperados. Para cada instrução, eu expliquei a operação, e aprofundei essas explicações onde achei apropriado. (Por exemplo, eu expliquei o que um Inclusive-OU de fato está em IORWF). Talvez mais importante ainda, eu sugeri exercícios para usar as instruções apresentadas. Os exercícios sugeridos são bastante simples, mas o deixarão usar cada instrução, e também praticar o uso do simulador. Lembre-se de usar os recursos, como a janela de monitoramento para ver o que está acontecendo a cada passo do seu programa: preste atenção nos registradores que você decidiu usar, bem como nos registradores W e STATUS.

Formato da instrução
O agrupamento da Microchip mantém as instruções de formato semelhante juntas. As instruções aparecem assim: : byte_command f,d onde f é a designação do arquivo do registrador e d é o destino; se d=0, o resultado vai para W. Se d=1, o resultado vai para o registrador f bit_command f,b onde f é o arquivo do registrador, e b é o bit dentro dele; bits são numerados da direita para a esquerda de 0 a 7. No texto, um bit é escrito como FILE_REG <n>, por exemplo INTCON <4> significa o bit número 4 no registrador intcon. O registrador INTCON fica no local 0B other_command k onde k é uma constante ou literal de 8-bit.

O registrador STATUS
O '84 têm o registrador STATUS em 03h. Ele contêm o estado aritmético da unidade de aritmética e lógica. Muitas instruções do '84 afetam certas partes do STATUS. Muitas instruções afetam STATUS <2>, Z - a flag Zero que é ligada se o resultado de uma operação for zero. Certas operações afetam os bits de transporte: STATUS <0>, C - o bit Carry, é ativado se um transporte ocorrer no bit mais a esquerda no resultado; STATUS <1>, DC - o bit Digit Carry, é ativado se houver um transporte entre os dígitos hexadecimais (ie, do meio-bit à -bit 3 - ao bit à esquerda -bit 4). Dois comandos afetam STATUS <3>, o bit Power Down PD, e STATUS <4>, o bit Time Out TO.

1: Instruções Move
Nós encontramos algumas dessas instruções, que nada fazem além de colocar coisas nos registradores. MOVF f,d (Move f) (f) → (dest) MOVWF f (Move W to f) (w) → (f) MOVLW k (Move literal to W) k → (W) Exercício: Escreva um programa para usar estes comandos para (por exemplo) por algo em W, mover de lá para outro registrador, então ponha alguma outra coisa em W, e então mova a coisa original de volta para W. Veja moves.asm..

2: Intruções Clear
Estes dois commandos limpam um registrador. CLRF f (Clear f) 00h → (f) CLRW (Clear W) 00h → (W)

http://www.novaeletronica.net/q/n5/cursopic/cursopic_7.htm

03/12/2009

Page 8 of 19

Exercício: Amplie o programa anterior para limpar os registradores no final. Veja clears.asm

3: Instruções Aritméticas
Executar operações aritméticas é muito importante. O '84 pode apenas somar e subtrair. A aritmética ocorre entre W e um registrador f: ADDWF f,d (Add W & f) (W)+(f) → (dest) SUBWF f,d (Subtract W from f) (f)-(W) → (dest) or between W and a literal: ADDLW k (Add literal & W) (W)+k → (W) SUBLW k (Subtract W from literal) k-(W) → (W), Exercício: Use estes e os comandos anteriores para carregar um registrador a partir de W e efetuar algumas adições e subtrações. Preste atenção no bit Carry e no bit Zero no registrador STATUS. Veja arith.asm. Aparte técnico: Você pode ver que a subtração é feita usando o método do segundo complemento. Este é o modo normal que a subtração acontece com binários. Eu explicarei, então mostrarei um exemplo. Primeiramente, expresse ambos os números em binário. Deixe o número a partir do qual você está subtraindo inalterado. Forme o segundo complemento do que está sendo subtraído assim: mude todos os 0s para 1s e todos os 1s para 0s (este é o complemento), some 1 ao dígito à direita dígito, transportando à esquerda conforme necessário. Agora acrescente o resultado ao outro número inalterado. Descarte o transporte à esquerda, se houver. O resultado é a resposta. Vamos conferir... Nós queremos subtrais 20 de 27 – devemos obter 7. Proceda como segue: Convert para binário: 27 → 11011 . . . . x 20 → 10100 . . . . y complement0: 01011

Faça o segundo complemento de y: some 1: Some x e z: (1) 00111 = 7 01100 . . . . z

+ 11011 . . . . x

O 1 entre parênteses é o transporte, que é descartado.

4: Funções Lógicas
Nesta fase, antes de nós examinarmos as funções lógicas providas pelo 84, nós discutiremos as funções lógicas em geral. Considere um dispositivo eletrônico com 3 fios ligados. Digamos que 2 fios são entradas, e o resultado no terceiro fio dependa das entradas. Além disso, nós diremos que esse é um dispositivo digital, de forma que os 3 fios possam ter apenas os valores binários de 1 e 0. Que relações podem existir entre as 2 entradas e a saída? As combinações de entrada são fáceis: 00, 01, 10 e 11. O fio 3 podem ser 1 se, e somente se, as entradas forem ambas 1 (i.e: 11) ou se uma ou ambas as entradas forem 1 (i.e: 01, 10, 11), e outras combinações. As relações básicas são conhecidas como E e OU (AND e OR). AND significa ambas as entradas enquanto OR significa qualquer uma ou ambas. A maioria das explicações a respeito disso, resultam em uma TABELA da VERDADE, desenhada abaixo para as seguintes operações lógicas: AND, OR, XOR, NAND, NOR. Eu as explicarei após você ter dado uma olhada na tabela.

Entradas A B

A AND B A OR B

A XOR B

A NAND B

A NOR B

http://www.novaeletronica.net/q/n5/cursopic/cursopic_7.htm

03/12/2009

Page 9 of 19

ambos 00

ou, ambos

ou, não ambos

não ambos

nem um, não ambos

0 0 0 1

0 1 1 1

0 1 1 0

1 1 1 0

1 0 0 0

01 10 11

A função AND significa que o resultado só será 1 quando ambas as entradas forem 1. OR significa que qualquer uma das entradas pode ser um 1 para a saída ser 1, mas assim também será se ambas as entradas forem 1. A função XOR quer dizer "eXclusive OR", e significa dizer que qualquer entrada sendo 1 fará o resultado na saída ser 1, e, especificamente exclui a situação onde ambas as contribuições forem 1. Finalmente, NAND e NOR são as negações de AND e OR respectivamente: compare as colunas e você verá o que isso significa. A propósito, a função OR (ao contrário da função de XOR) às vezes é conhecida como "Inclusive OR" (IOR). O PIC16F84 usa este termo. O PIC16F84 provê várias operações lógicas que agem em dois valores de 8-bits; esses valores são comparados bit a bit. Por exemplo - sem olhar para uma instrução do '84 considere o ANDing dos números H'5F' (equivalente a D'95 ou B'01011111') e H'A3 (que é D'163' ou B'10100011'); resultando em H'03 (que é D'3' ou B'00000011'). 5F: 01011111 A3: 10100011

and: 00000011 Claramente, só nas 2 posições mais à direita AND é satisfeito. O resultado aí é 1, e 0 em qualquer outro lugar. Vamos ver as instruções fornecidas pelo 'PIC16F84. A comparação ocorre entre os registradores W e f: ANDWF f,d (AND W with f) (W) AND (f) → (dest) IORWF f,d (Inclusive OR W with f) (W) OR (f) → (dest) XORWF f,d (Exclusive OR W with f) (W) XOR (f) → (dest) ou entre W e uma literal: ANDLW k (AND literal with W) (W) AND k → (W) IORLW k (Inclusive OR literal with W) (W) OR k → (W) XORLW k (Exclusive OR literal with W) (W) XOR k → (W) Por fim, você deve ter notado que o '84 não suporta as funções NAND ou NOR. Ao contrário, ele prove meios de complementar (negar) um registrador; isso significa que para realizar NAND você primeiro deve efetuar AND e então: COMF f,d (Complementa f) complemento de (f) → (dest) Exercício: Eu sugiro duas coisas aqui. Primeiro, usando a calculadora do Windows, verifique os resultados acima: isto assegurará você entendeu os conceitos. Então, escreva para um programa em assembler para conferir as instruções do '84, carregando os registros apropriados e executando as operações e conferindo os resultados. Veja lógic.asm.

5: Decrementando e Incrementando
Duas instruções simples podem decrementar ou incrementar o conteúdo de um registrador, assim: DEC f,d (Decrementa f) (f)-1 → (dest) INC f,d (Incrementa f) (f)+1 → (dest) Exercício: Em um programa, talvez aproveitando um dos anteriores nos quais você fez alguma aritmética ou alguma lógica, verifique o funcionamento destes comandos. Fique atento à flag Zero, que é ativada se qualquer comando fizer o registro em questão zerar: nós nos

http://www.novaeletronica.net/q/n5/cursopic/cursopic_7.htm

03/12/2009

Page 10 of 19

basearemos nesse fato depois em dois outros comandos. Veja dec_int.asm

6: Ativando e limpando Bits
Usando os dois comandos a seguir, você pode ativar ou limpar qualquer bit b no registrador f. Mas, por quê? Duas razões vêm à mente: Primeiro, como exemplo, o registrador em questão pode ser uma porta, controlando algum equipamento externo. Cada bit pode estar ativando um dispositivo diferente: um motor, uma luz, ou o que quer que seja. Ativando e limpando cada bit, liga e desliga cada dispositivo. Segundo, como veremos no item 8 mais abaixo, nós podemos usar o fato de um bit estar ativado ou não para pular instruções em nosso programa. A capacidade de ativar ou limpar qualquer bit, nos dá a habilidade para controlar esse processo. BCF f,b (limpa Bit em f) 0 → (f<b>) BSF f,b (ativa Bit em f) 1 → (f<b>) Nós lemos essas duas operações como 0 (ou 1) se tornando o conteúdo do bit ‘b’ no registrador ‘f’. Exercício: Coloque esses comandos em qualquer um dos programas anteriores e observe as mudanças a bits individuais em sua janela de monitoramento. Veja bits.asm.

7: Controle de Programa
Por muitas razões, nós precisamos controlar o fluxo através do nosso programa. Normalmente, o fluxo procede linearmente a partir do topo; e freqüentemente isto não é adequado ao que queremos. Primeiramente, nós podemos precisar efetuar laços por certas instruções: nós poderíamos ter um sistema no qual um determinado processo seja contínuo. Este poderia ser o controle de um transportador que continuamente acrescenta ingredientes a um depósito. Aqui, quando um depósito é realizado nós voltamos ao topo e passamos novamente pelos mesmos passos somando mais depósitos a cada passagem. Segundo, pode ser uma parte de nosso programa que será útil em muitas outras partes. Em lugar de repetir este código em muitos lugares, nós separamos esse pedaço do restante do código; então nós simplesmente chamamos isto tão freqüentemente quanto precisarmos. O pedaço reutilizável é chamado de SUB-ROTINA. A seqüência de dados devolve o controle ao ponto em que foi chamada quando terminar. Vamos ver os laços (looping) primeiro: GOTO k (Vá para um endereço) k → (PC) Esta instrução ‘vai para k’, e faz isso carregando o endereço k dentro do contador do programa, PC. Para usar GOTO você deve primeiro informar para onde quer que o programa vá, utilizando para isso um Label. Então você usa GOTO Label. Exercício: Modifique um dos programas que você já escreveu. Você pode colocar um rótulo (label) perto do início, e um GOTO mais adiante. À medida que você anda pelo programa verá realçada a linha em que seu programa está fazendo o loop. Olhe para o contador do programa (PCL) na janela de monitoramento e você pode conferir isso. Veja GOTO.asm Agora nós examinaremos seqüência de dados. Nós precisamos entender o conceito de stack (pilha). A pilha - que tem 8 níveis no PIC16F84 - é o lugar onde o endereço da próxima instrução é colocado, quando uma instrução CALL é encontrada. à medida que cada instrução é executada, é trabalho do Contador do programa (PC) saber onde o microcontrolador está, a qualquer tempo. A colocação do próximo endereço na Pilha diz ao microcontrolador aonde ir, depois que uma sub-rotina tenha acabado. Nós nos referimos à carregar a pilha como popping, isto é lendo o último valor e girando a pilha para cima. A pilha só é acessível pelo topo: assim como uma pilha de pratos. O topo da pilha é abreviado por TOS (Top of stack). Há 2 instruções associadas com qualquer sub-rotina - uma para enviar o microcontrolador à sub-rotina, e a outra para trazê-lo de volta.: CALL k (Call sub-rotina) (PC)+1 → TOS, k → (PC) A chamada CALL para uma sub-rotina empurra o PC+1 atual para o topo da pilha, então altera o PC para o endereço k. Isto resulta em um salto no fluxo do programa para a subrotina, mas o endereço para voltar após a execução da sub-rotina está preservado na pilha para recuperação posterior.

http://www.novaeletronica.net/q/n5/cursopic/cursopic_7.htm

03/12/2009

Page 11 of 19

RETURN (Retorna da sub-rotina) TOS → (PC) RETURN é a última instrução da sub-rotina. A instrução de retorno lê e remove o último dado da pilha e assim o programa retorna ao lugar certo. Pense na profundidade da pilha: significa que chamadas podem ser encadeadas, e o fluxo estará correto contanto que cada chamada tenha um retorno correspondente. RETLW k (Retorna com literal em W) k → (W), TOS → (PC) Isto retorna com k → (W) somado. RETFIE (Retorna de Interrupção) TOS → (PC), 1 → GIE Quando uma interrupção acontece, o PC é empurrado para a pilha da mesma forma que acontece com uma chamada de sub-rotina, então RETFIE gira a pilha. Também, a ocorrência de uma interrupção incapacita interrupções adicionais: alguém não quer as interrupções sejam interrompidas. O que acontece é que a interrupção faz com que a flag de interrupção global, GIE (INTCON <7>) seja fixada em 0. Voltar de uma interrupção significa que devem ser permitidas interrupções adicionais, conseqüentemente RETFIE fixa GIE de volta a 1.

8: Ignorando instruções
Existem 4 instruções que permitem que você ignore a instrução seguinte. DECFSZ f,d (Decrementa f, ignora se 0) (f)-1 → (dest), ignora se o resultado for = 0 INCFSZ f,d (Incrementa f, ignora se 0) (f)+1 → (dest), ignora se o resultado for = 0 Os comandos acima são baseados nos comandos DECF e INCF vistos anteriormente. A parte SZ signfica ‘skip if zero' (ignora se for zero). Exercício: Confira essas 2 instruções carregando um valor inicial em um registrador chamado 'count.' Então use qualquer instrução para mudar esse valor, efetuando laços nesse bloco de código. Confira para ver se a instrução que segue o decfsz ou incfsz (provavelmente um GOTO, para causar laço) é ignorada ou não, como apropriado. Veja Skip.asm. BTFSC f,b (Testa Bit f, ignora se limpo) skip if (f<b>)=0 BTFSS f,b (Testa Bit f, ignora se ativado) skip if (f<b>)=1 Leia estas instruções como ‘testa bit f e ignora se ativado’. Exercício: Escreva um programa com um bloco de código com um loop. Ponha um BTFSS no final, seguido por um GOTO para retornar ao início. Inclua um pouco mais de código. O BTFSS precisará referir-se à uma das portas de I/O do PIC16F84 como seu f (H'05' ou H'06' para PortA e B respectivamente), e você pode usar qualquer pino de 0 a 4 na PortaA, 0 a 7 na PortaB. Você deve ter outro GOTO exatamente no final para efetuar um loop mais externo para o começo, assim você pode ver o loop do programa para ver o que acontece quando um pino de entrada sofre alteração. Veja Bits.asm. See Bits.asm. Mas como nós fazemos com que o pino mude de estado? Há um modo fácil de fazer isso no simulador da MPLAB. Vá em Debug> Simulatos stimulus> Asynchronous stimulus; você verá uma tabela de botões de Stim0 até Stim12. Clique com o botão direito em qualquer um, por exemplo, Stim7, e clique em Assign pin. Dê um duplo-clique no pino que você escolheu para usar como sensor, talvez fosse RA3. Stim7 então muda para RA3. Agora clique com o botão direito novamente no botão: você pode escolher pulsar, tornar LOW, HIGH ou chavear o pino. Aqui, nós vamos escolher chavear o pino. Agora nós estamos prontos para efetuar os testes. Caminhe pelo seu programa. Dependendo do estado inicial do pino, o qual ainda é desconhecido na ligação da alimentação, o programa fará o loop ou não. (No loop mais interno, isto é, ele sempre voltará para o início a partir do final, para propósitos de teste) A qualquer hora que você quiser, clique com o botão esquerdo no botão Stim que você escolher, que agora nós sabemos que é RA3. (Se você tiver a exibição das portas em uma janela de monitoramento, você verá o pino mudar de estado nos limites da próxima instrução). De qualquer modo, da próxima vez o programa chegar ao passo BTFSS, ele deveria se comportar diferentemente, já que nós chaveamos o pino e assim o BTFSS deveria ter uma resposta diferente.

9: Rotações e Trocas
Três instruções permitem a você manipular os bits dentro de um registrador. Destas, duas deslizam os bits para a direita ou para a esquerda (através do bit de transporte), e a terceira inverte os dois meio-bits (nibbles) do registrador.. RRF f,d (Rotaciona f à direita através do bit carry.)

http://www.novaeletronica.net/q/n5/cursopic/cursopic_7.htm

03/12/2009

Page 12 of 19

Cada bit no registrador f é deslocado 1 para a direita. O que sai fora para a direita é movido para carry, e carry é movido para a esquerda. RLF f,d (Rotaciona f à esquerda através do bit carry) Cada bit no registrador f é movido 1 para a esquerda. O que sai fora pela esquerda é movido para dentro de carry, e carry circula para a direita. SWAPF f,d (Inverte os nibbles em f) (f<3:0) → (dest<7:4>), (f<7:4>) → (dest<3:0>) Exercício: Observe o efeito desses comandos no conteúdo de um registrador. Veja Rot_swap.asm.

10: Sleep e o Timer Watchdog
Estes dois comandos estão relacionados. O WDT (Watchdog Timer) é um dos caminhos para se despertar do comando sleep. SLEEP (Sleep) 0 → WDT, 0 → WDT prescaler, 1 → TO, 0 → PD CLRWDT (Clear watchdog timer) 0 → WDT, 0 → WDT prescaler, 1 → TO, 1 → PD

11: Miscelânea
NOP (Nenhuma operação) Esta instrução não faz nada. Ela é bastante útil para a criação de pequenos intervalos de atraso (1µs) para permitir que alguma coisa seja pré-ajustada antes que outra operação seja executada. TRIS 05 Esta instrução controla a direção de cada linha da porta chamada Porta A. É o Registro de Controle de Direção (DCR). Há 5 linhas na porta A chamadas de RA0, RA1, RA2, RA3 e RA4. Cada linha pode ser de entrada ou de saída. Para fazer uma linha entrada, o bit correspondente no registro TRIS é definido como "1. " Para fazer uma linha saída, o bit correspondente é definido como "0. " Assim o valor 01 fará RA0 uma entrada e todas as outras linhas serão saídas. O valor 23 (0010 0011) fará RA0 e RA1 entradas e o bit5 não terá nenhum efeito, pois nenhuma linha corresponde a esse bit. TRIS 06 Esta instrução controla a direção de cada linha na porta B. Existem 8 linhas na porta B. RB0, RB1, RB2, RB3, RB4, RB5, RB6, and RB7. Um "0" no registrador TRIS torna a linha correspondente na porta B uma Saída. Um “1” no registrador TRIS torna a linha uma Entrada. Isso é fácil de ser lembrado, pois “0” é similar a 0utput (saída) e “1” é similar a 1nput (entrada). Você não deve usar a instrução a seguir, que foi incluída para efeitos de compatibilidade. OPTION (Não recomendado)

Pausa para refletir
Agora nós conhecemos cada instrução do PIC16F84, com toda a base necessária, e as usamos programas simples. Vamos a seguir explorar duas áreas importantes do PIC16F84: interrupções e cronômetros. Estas duas áreas passam o PIC16F84 para o mundo real.

Interrupções no '84
O que é uma interrupção? Pense simples, isso é exatamente o que quer dizer: uma forma de atrair a atenção do computador. Uma vez uma interrupção tenha sido tratada, o controle tem que voltar para onde estava anteriormente. Não só isso, mas todo o estado do sistema deve ser recuperado: se qualquer registrador foi mudado durante o controle da interrupção, ele deve ser restaurado. Nós veremos isso mais adiante. Agora que nós sabemos o conceito de interrupção vamos ver como o ’84 lida com esse conceito.

Tipos de Interrupção e o registrador INTCON

http://www.novaeletronica.net/q/n5/cursopic/cursopic_7.htm

03/12/2009

Page 13 of 19

O PIC16F84 tem 4 tipos diferentes de interrupção: . uma interrupção externa no pino 6, também conhecido como: RB0 . uma mudança em qualquer dos pinos de 10 a 13, também chamados RB4 a RB7 . um estouro no cronômetro . uma de gravação completa na EEPROM. Para permitir interrupções, e para determinar a sua origem, o processador utiliza o registrador INTCON (0Bh). Cada bit serve a um propósito específico, e interrompe o trabalho de acordo com o seu valor (ativado ou não). Primeiramente, interrupções, como um todo, podem ser habilitadas ou desabilitadas pelo bit INTCON <7>, o GIE (Habilitação de Interrupção Global). Se esse bit estiver zerado, então nenhuma interrupção pode acontecer: Esse é o valor no power-up. Também, se uma interrupção acontecer, então o GIE é zerado para prevenir a interrupção de ser suspensa; o retorno da interrupção com a instrução RETFIE re-habilita as interrupções. Segundo: cada um dos tipos de interrupção deve ser habilitado com seu próprio bit em INTCON, antes de poder ser utilizada: interrupção externa no pino 6: INTCON <4>, o bit INTE mudança em quaisquer dos pinos 10-13: INTCON <3>, o bit RBIE estouro do cronômetro: INTCON <5>, o bit T0IE gravação completa da EEPROM: INTCON <6>, o bit EEIE. Terceiro, quando interrupções acontecem, certos bits (conhecido como flags de interrupção) são ativados de forma que nós podemos então determinar a origem da interrupção: interrupção externa no pino 6: INTCON <1>, o bit INTF mudança em quaisquer dos pinos 10-13: INTCON <0>, o bit RBIF estouro do cronômetro: INTCON <2>, o bit T0IF Por que nós precisamos saber a origem? Bem, dependendo do tipo de interrupção, nós entraremos em ação de modo diferente: verificar o bit apropriado nos diz que tipo de interrupção é. Note que as flags de interrupção sempre são ativadas quando há uma interrupção, independente do estado do bit de habilitação correspondente.

Lidando com uma Interrupção
No PIC16F84, todas as interrupções são enviadas para 004h. Esse ponto é o vetor de interrupção e o programa é orientado a dirigir-se para esse endereço. No vetor, temos que ter certeza nós supriremos o código necessário para tratar com cuidado do problema. Um ponto crucial é que nós podemos ter que salvar o status da máquina como ele estava antes da interrupção, antes de nós corrigirmos a interrupção. Claramente, as atividades empreendidas durante a correção poderiam mudar algumas coisas tais como os registradores W e STATUS; nós precisamos tê-los restabelecidos após ter controlado a interrupção, para que nosso outro trabalho possa continuar. O PIC16F84 só salva o Contador do programa na pilha (PC+1, na verdade), e cabe a nós assegurar que salvaremos e recuperaremos qualquer outra coisa que possamos precisamos! Há 3 partes a um programa que devem controlar interrupções simples: . uma seção initialize onde, em nosso caso, nós habilitaremos as interrupções; . uma seção Main onde a maior parte do é utilizada (fazendo cálculos ou o que quer que seja) e a parte de manipulador(handler) onde a interrupção é tratada. Initialize: ativa GIE , INTCON <7> para habilitar interrupções, ativa INTE, INTCON <4> para habilitar interrupções no pino 6 Handler: salva o estado da máquina; provavelmente W e STATUS; checa as flags de interrupção para determinar a origem; INTF, RBIF, T0IF derivam para o correto 'o sub-handler' para determinar o tipo de interrupção (embora nós fixamos apenas INTE). Faz o que é necessário para restaurar o estado anterior à interrupção e retorna. Main: Efetua cálculos, por exemplo. Exercício: Comece lentamente com as interrupções. Isto pode se tornar bastante complexo. Escreva um programa para provocar a menor interrupção possível: habilite-as e faça uma rotina de serviço de interrupção (ISR – interrupt service routine) que faça bem pouca, ou coisa

http://www.novaeletronica.net/q/n5/cursopic/cursopic_7.htm

03/12/2009

Page 14 of 19

alguma que não seja reabilitar as interrupções e retorne, e uma rotina principal que somente faça loops por algum código que espere por uma interrupção. Você não precisa preservar o estado da máquina, nem conferir o tipo de interrupção nesta fase. Para ver este programa funcionando corretamente no simulador, eu sugiro usar a interrupção de mudança na porta B, usando a técnica de estímulo assíncrona discutida anteriormente. Use um chaveamento do pino para provocar a mudança: enquanto o programa estiver efetuando os loops na seção principal, chaveie o pino e verifique que a interrupção acontece quando você executa o próximo passo do programa. Enquanto o programa estiver na ISR, chaveie o pino novamente: se tudo estiver funcionando, a mudança no pino não causará uma interrupção, porque GIE foi sido zerado. Veja Inter1.asm Exercício: Agora implemente esse programa para salvar o estado da máquina no momento da interrupção. Teste isso, tenha certeza você carregou W (digamos) na parte principal, então altere-o na ISR, e verifique se ele é restaurado corretamente. Veja inter2.asm. Exercício: Finalmente, permita mais de um tipo de interrupção - mudança em um dos pinos da porta B 4:7 bem como uma interrupção no pino RB0/INT. Agora, você precisará determinar o tipo de interrupção, e controlar isso adequadamente. Veja Inter3.asm.

Timers no '84
A idéia básica, é que nós quereremos usar nosso PIC16F84 para cronometrar algo. Cronometrar,quer dizer do modo nós usamos um relógio normal: nós poderíamos acender a iluminação de nosso aquário por exemplo, ou fechar as cortinas às 18h00 todas as noites. Mas não há nenhum relógio nos 84: nenhum relógio no sentido de um relógio normal. O que há, entretanto, é uma relação simples entre executar instruções e a velocidade em que o processador trabalha. Uma instrução é completa em 1µs quando o chip está operando à 4MHz. Vamos conferir isso e introduzir uma característica bem útil do MPLAB ao mesmo tempo: o Cronômetro. No MPLAB prepare-se para executar qualquer um dos programas você escreveu. Abra o cronômetro através de Janela >Cronômetro. Você verá uma janela simples contendo 3 informações importantes: o número de passos completos em um determinado tempo, e a freqüência. Veja se a freqüência está fixada agora em 4MHz, clique zero e execute um passo do seu programa uma vez. Você deve ver que progrediu 1 ciclo em 1µs. (A menos que esse passo fosse, coincidentemente, um desvio no programa, o que é uma instrução de 2 ciclos.) Assim, nós temos o vislumbre de um relógio comum. Nós saberemos quanto tempo passou se nós soubermos quantos passos foram executados. Entre em Timer0…

O Módulo TIMER0
O cronômetro do PIC16F84, TIMER0, trabalha numa base em que cada vez que acontece um ciclo de instrução, um certo intervalo de tempo decorreu. Quando TIMER0 está correndo, seu registrador (TMR0) é incrementado a cada ciclo; a cada 1µs se o clock for de 4MHz. Então, o valor de TMR0 representa o 'tempo' em passos de 1µs. Mas TMR0, como todos os registradores, é um registrador de 8 bits e assim só pode contar até FF: isso significa que o tempo vai até 255µS o que não é muito tempo. Projete a sua mente até a discussão de interrupções, onde nós dissemos que um dos tipos de interrupção era uma interrupção de estouro de cronômetro: isso significa que o registrador TMR0 ultrapassou o limite de FF e retornou para 00. Isso significa que essa interrupção acontece a cada 256µS do tempo real. Cabe a nós fazer alguma coisa com esta interrupção, o que provavelmente significa incrementar um nosso próprio registrador. Vamos caminhar pelo processo de simplesmente ter TIMER0 funcionando, usando as técnicas de interrupção com initialize, handler e main, vistas anteriormente. Initialize: ativa GIE, INTCON<7> para habilitar interrupções, ativa T0IE, INTCON<5> para habilitar a interrupção do timer limpa T0CS, OPTION<5> para habilitar o timer - veja ativar PSA, OPTIOPN<3>, para manter o prescaler fora disto. Handler: incremento 'cronometrado em função do clock', nosso contador de overflow (estouro) Main: tem um loop para manter o programa rodando

http://www.novaeletronica.net/q/n5/cursopic/cursopic_7.htm

03/12/2009

Page 15 of 19

Exercício: Escreva um programa para implementar o cronômetro simples acima, tendo em mente que nós não estaremos fazendo nada com os estouros a não ser clicá-los. Confira o programa no simulador, observando os registradores que você acha que deve monitorar e também o cronômetro. Antes de você começar, você precisará entender como acessar o registrador de opção (OPTION), o que não é exatamente tão simples quanto acessar, digamos, STATUS. Eu explico isso mais abaixo. Veja Time1.asm Acessando registradores em Bank1: Você deve ter percebido que alguns registradores como OPTION estão naquilo que é referido como Bank1, ao invés de Bank0. Outros, como STATUS está em ambos Bank0 e Bank1. O que isto significa na prática, é que estes registradores do Bank1 normalmente não estão disponíveis, porque nossa esfera de operações é o Bank0. Nós usamos o registrador de STATUS para alternar entre os bancos, com RP0 (STATUS <5>) fazendo o truque. Isto simplesmente significa que nós temos que ativar RP0 para ir para Bank1 e zerá-lo para retornar. Para aqueles registradores que estão em ambos os bancos, você tem acesso não importa de onde você esteja, mas lembre-se que o registrador tem 2 endereços diferentes: STATUS tem seus endereços conhecidos em h'03' e h'83'.

Usando o estouro do timer
Agora nós provavelmente podemos ver para onde estamos indo. Nós temos um registrador que está se atualizando sempre que o cronômetro estoura. Isso acontece aproximadamente a cada 256µs e o timer vai estourar em 256. Nós precisamos contar estes estouros também, em outro registrador (arquivo). Agora, nós estamos chegando mais perto de um segundo na cronometragem, que é o objetivo que estamos perseguindo. Até quanto nós precisamos contar no segundo arquivo para alcançar 1 segundo? Incrementar a cada .0,0256 segundos significa que existem aproximadamente 39 incrementos em um Segundo, então isso significa que podemos contar segundos de tempo-real incrementando um outro registrador, SECONDS por exemplo, a cada 39 passos. Para conseguir minutos e horas, nós simplesmente tratamos com o estouro do registrador SECONDS para minutos a cada 60 segundos e o mesmo com um registrador de minutos, a cada 60 minutos para marcarmos as horas. Exercício: Crie um programa para implementar o anterior, pelo menos até a parte do registrador SECONDS. Usando a memória de dados EEPROM

Apendice: Listagem dos Programas
Os programas a seguir têm o objetivo de ilustrar o uso dos comandos discutidos. Eles são simples e não mostram toda a técnica de programação. Em cada um eu incluí uma seção chamada simulador. Nesta seção há uma sugestão para as coisas que você possa querer fazer durante a simulação do seu programa. Por exemplo, você poderia precisar ter uma janela de monitoramento aberta mostrando o registrador W e a Porta B, e também tendo a pilha sendo mostrada. É claro que cabe a você a forma de projetar e edificar esses programas, e a forma como você vai fazer experimentos com eles no simulador. Programa 2: Moves.asm ;moves.asm para mostrar como MOVF, MOVWF & MOVLW funcionam ;*********************************** simulador *** ;watch window: reg1, w, pcl ;*********************************** setup *** processor 16F84 reg1 equ h'10' ;*********************************** programa *** start: movlw h'05' ;carrega w movwf reg1 ;move (w) para reg1 movlw h'82' ;altera w movf reg1,0 ;restaura w end

http://www.novaeletronica.net/q/n5/cursopic/cursopic_7.htm

03/12/2009

Page 16 of 19

Program 3: Clears.asm ;clears.asm para mostrar como clrf & clrw funcionam ;baseado em moves.asm ;*********************************** simulador ;watch window: reg1, w, pcl ;*********************************** setup processor 16F84 reg1 equ h'10' ;*********************************** programa start: movlw h'05' ;carrega w movwf reg1 ;move (w) para reg1 movlw h'82' ;altera w movf reg1,0 ;restaura w clear: clrf reg1 ;limpa reg1 clrw ;limpa w end

Program 4: Arith.asm ;arith.asm para mostrar o uso de ADDWF, SUBWF, ADDLW, SUBLW ;************************************* simulador ;watch window: reg1,reg2,status,w,pcl ;************************************* setup processor 16F84 reg1 equ h'10' reg2 equ h'12' ;************************************* programa loads: movlw d'20' ;carrega w movwf reg1 ;carrega reg1 movlw d'80' ;carrega w mais uma vez movwf reg2 ;carrega reg2 arith: addlw d'05' ;adiciona d'05' a w sublw d'100' ;subtrai w de d'100' addwf reg1,1 ;soma w a reg1, dentro de reg1 subwf reg2,1 ;subtrai w de reg2, dentro de reg2 end

Program 5: Inter1.asm ;inter1.asm é um manipulador simples de interrupções; ele não salva o estado da máquina ; nem determina o tipo de interrupção. ;*********************************************simulador ;watch window: intcon, pcl ;stack: mantenha aberta também- veja o endereço de retorno ida e volta ;asynch stimulus: tenha um chaveamento em rb4 ;********************************************* setup processor 16F84 movlw h'0' movwf h'0b' ;limpa intcon goto main ;salta sobre a isr ;********************************************** início da isr isr: org h'0004' ;interrupções sempre apontam para cá nop ;aqui nos lidamos de fato nop ; com a interrupção bcf h'0b',0 ;limpa int antes de retornar retfie ;isto reativa o intcon gie ;*********************************************** fim da isr ;*********************************************** início de main main org h'0020' ; deixa espaço bastante para a isr! bsf h'0b',7 ; ativa global int enable bsf h'0b',3 ; ativa mudança em b int enable

http://www.novaeletronica.net/q/n5/cursopic/cursopic_7.htm

03/12/2009

Page 17 of 19

payrol nop goto nop nop end

nop ; payrol

; loop aqui até interrução, realize tarefas de payroll

Program 6: Inter2.asm ;inter2.asm salva o estado da máquina ; mas não determina o tipo de interrupção. ; ;****************************************************simulador ;watch window: intcon, pcl, portb, w, w_saved ;stack: mantenha aberta também- veja o endereço de retorno ida e volta ;asynch stimulus: tenha um chaveamento em rb4 ;**************************************************** setup processor 16F84 w_saved equ h'10' ;um lugar para manter w movlw h'0' movwf h'0b' ;limpa intcon goto main ;salta sobre a isr no início ;**************************************************** isr isr org h'0004' ;interrupções sempre apontam para cá movwf w_saved ;salva w como em main movlw h'65' ;alguma coisa para mudar w nop ;mais operaçõas da isr ;agora, restaurar w: não há ; "movfw"- 2 swapf's parece ser o caminho a seems to be ; seguir para faze-lo... swapf w_saved,1 ;primeiro, swap w_salvo nele próprio swapf w_saved,0 ;então, swap dentro de w bcf h'0b',0 ;limpa int em b antes de voltar retfie ;isto reativa intcon gie ;***************************************************** final da isr ;****************************************************** Início de main main: org h'0020' ; deixe espaço para a isr! bsf h'0b',7 ; ativa global int enable bsf h'0b',3 ; ativa mudança em b int enable payrol nop ; loop aqui até a interrupção, nop ; fazendo instruções em payroll movlw h'0f' ; simule um calculo carregando w goto payrol nop nop end Program 7: Inter3.asm ;inter3.asm salva o estado da máquina ; e determina o tipo de interrupção. ; ;**************************************************simulator ;watch window: intcon, pcl, portb, w_saved, w ;stack:mantenha aberta também- veja o endereço de retorno ida e volta ;asynch stimulus tenha um chaveamento em rb4 (for rbi) e rb0(int) ;************************************************* setup processor 16F84 w_saved equ h'10' ;Um lugar para manter w movlw h'0' movwf h'0b' ;limpa intcon goto main ; salta sobre a isr no início ;*************************************************** isr isr org h'0004' ;interrupções sempre apontam para cá movwf w_saved ;salva w como ele estava am Main

http://www.novaeletronica.net/q/n5/cursopic/cursopic_7.htm

03/12/2009

Page 18 of 19

;descobre qual o tipo de interrupção btfsc h'0b',0 ;é uma rbi? call _rbi ;sim - chame o 'sub-handler' rbi btfsc h'0b',1 ;é int? call _int ;sim – chame o 'sub-handler' int ;termina aqui após os sub-handler ;agora, restaura w swapf w_saved,1 ;primeiro, swap em w_salvo dentro dele mesmo swapf w_saved,0 ;então, swap em w bcf h'0b',0 ;limpa rbif antes de voltar bcf h'0b',1 ;limpa intf antes de voltar retfie ;isto reativa intcon gie _rbi movlw h'65' ;faz algo para mudar w return _int movlw h'24' ;faz algo diferente com w return ;***************************************************** Final da isr ; ;**************************************************** Início de main main org h'0020' ; leave room for the isr! bsf h'0b',7 ; ativa global int enable bsf h'0b',3 ; ativa mudança em b int enable bsf h'0b',4 ; ativa ext int no pin6 enable ; nós tivemos 2 tipos de interrupção! payrol nop ; loop aqui até interrupção, nop ; fazendo operações em payroll movlw h'0f' ;simule cálculo carregando w goto payrol nop nop end

Program 8: Time0.asm ;time0.asm para mostrar como timer0 funciona ;************************************ setup processor 16F84 STATUS EQU H'03' OPTIO EQU H'81' tmr0 EQU H'01' BANK_ EQU H'05' T0CS EQU H'05' PSA EQU H'03' clocked equ h'10' INTCON equ h'0B' T0IE equ h'05' GIE EQU H'07' goto top ;************************************ isr isr ORG h'0004' incf clocked ;clocked é o ‘relógio comum’ BCF INTCON,2 retfie ;************************************ programa top org h'0010' clrf tmr0 ;limpa o registrador tmr0 clrf clocked mode bsf STATUS,BANK_ ;alterna para page 1 bcf OPTIO,T0CS ;vai do counter para o timer bsf OPTIO,PSA ;sem prescaler ainda bsf INTCON,GIE bsf INTCON,T0IE loop nop

http://www.novaeletronica.net/q/n5/cursopic/cursopic_7.htm

03/12/2009

Page 19 of 19

nop goto END

loop

| 01 | 02 | 03 | 04 | 05 |06 | 07 |

http://www.novaeletronica.net/q/n5/cursopic/cursopic_7.htm

03/12/2009