Você está na página 1de 50

1.

Introdução

Vivemos na era da automação e, como prova disto, basta olhar para o lado e observar que os
eletrodomésticos fazem quase todos os serviços especializados sozinhos, assim como ocorre nos caixas
eletrônicos quando desejamos sacar algum dinheiro ou nas linhas de produção das fábricas onde a
automatização tem incrementado a produção e reduzindo os custos.

Esta revolução silenciosa seria impensável caso não fosse o desenvolvimento recente da microeletrônica
e dos dispositivos digitais que possibilitam, dia a dia, a criação de transistores menores, mais rápidos e
mais confiáveis. Assim, é possível criar dispositivos digitais cada vez melhores e com mais
funcionalidades.

Entre os dispositivos digitais, um dos que mais vem chamando a atenção pela sua versatilidade,
aplicabilidade e funcionalidade são os microcontroladores.

Neste curso iremos abordar os conceitos básicos do hardware e da linguagem de programação


Assembly dos microcontroladores PIC, da Microchip.

O Criatronics

O Criatronics, Centro de Robótica, Inteligência e Automação, foi fundado no ano de 2001 por
pesquisadores da área da Física e Computação. Sua área de atuação é o desenvolvimento de projetos
com tecnologias avançadas e de cursos que abrangem as áreas de Robótica e Automação.

Pré-requisitos para o curso

Este curso pode ser visto por estudantes que nunca tiveram um contato prévio com a eletrônica, porém,
é desejável que o aluno já possua conhecimentos de eletrônica analógica e digital básica – sobretudo
conhecimentos em circuitos RC e polarização de transistores bipolar e mosfet.

2. O que é um Microcontrolador?

Histórico

Em 1969, uma equipe de engenheiros da INTEL, sob a responsabilidade do engenheiro Marcian Hoff,
recebeu a missão de construir calculadoras com um número reduzido de circuitos integrados. Hoff, que
já tinha uma boa experiência no projeto de computadores, propôs uma maneira fundamentalmente
diferente de construir as calculadoras. Segundo ele, era possível construir uma máquina capaz de mudar
sua funcionalidade com base em um programa armazenado em uma memória. Sendo assim, Hoff,
juntamente com o engenheiro Frederico Faggin, implementaram para a INTEL o primeiro
microprocessador.

Desde então os microprocessadores não pararam de evoluir. Porém, os microprocessadores não


atendiam as necessidades dos engenheiros quando era necessário um processamento em sistemas
embarcados, como celulares, aparelhos de som, televisão, controle de motores, etc.

Aula 01 Pág. 1
Para suprir estas necessidades foi lançado o primeiro microcontrolador pela Texas em 1974, o TMS
1000 de 4 bits, que inclui RAM, ROM e suporte a I/O em um único chip, permitindo o uso sem qualquer
outro chip externo.

Em 1977 a Intel lança o microcontrolador 8048, que possuía memória de programa externa (ROM), e
memória de dados interna (RAM).

Em 1980 nasceu o 8051, com vários periféricos, 4K de memória de programa e 128 bytes de memória
de dados, possibilitando o uso sem a necessidade de chips externos. Tem encapsulamento de 40 pinos,
tecnologia HMOS e ainda hoje é largamente utilizado.

Atualmente há diversos fabricantes no mercado de microcontroladores, por exemplo, a ATMEL, a


Microchip, a HOLTEK e a Motorola.

Aplicações

O microcontrolador é um componente bastante versátil, podendo através de sua programação ter


diversas aplicações. O microcontrolador pode realizar desde o controle da velocidade e posição de um
guindaste até o controle das lâmpadas decorativas de uma árvore de Natal. Basicamente, o modo de
operação do microcontrolador irá variar de acordo com a necessidade de seu cliente.

Entre outras aplicações de um microcontrolador podemos citar automação industrial, controle de


telefones celulares, auto-rádios, fornos de microondas e videocassetes. Além disso, a tendência da
eletrônica digital é de se resumir a microcontroladores e a chips que concentram grandes circuitos
lógicos, como os PLDs (Programmable Logic Devices). Para a maioria dos sistemas dedicados, o
microcontrolador apresenta-se como a solução mais viável em função do baixo custo e facilidade de uso.

Logo, o microcontrolador, hoje em dia, é um elemento indispensável para o engenheiro elétrico,


eletrônico ou ainda para o técnico de nível médio da área e hobbistas, em função de sua versatilidade e
da enorme aplicabilidade.

Microcontrolador versus Microprocessador

Um microcontrolador difere de um microprocessador em vários aspectos. O primeiro e o mais importante


é a sua funcionalidade. Para que um microprocessador possa ser usado outros componentes devem-lhe
ser adicionados, tais como memória e componentes externos para receber e enviar dados. Em resumo,
isso significa que o microprocessador é o verdadeiro coração do computador. Por outro lado, o
1
microcontrolador foi projetado para ter tudo num só CI . Nenhum outro componente externo é necessário
para suas aplicações uma vez que todos os periféricos necessários já estão embutidos nele. Assim,
poupamos tempo e espaço na construção dos dispositivos.

Do ponto de vista da aplicação, a principal diferença entre o microcontrolador e o microprocessador é


que, para controle de sistemas embarcados, é necessário que o controlador seja dedicado a um
pequeno conjunto de tarefas. O microcontrolador é construído para realizar o controle do ambiente

1
CI – Circuito Integrado – Dispositivo microeletrônico que consiste de transistores (podendo chegar a milhares) e outros
componentes interligados capazes de desempenhar diversas funções. Suas dimensões são extremamente reduzidas e estes
componentes são fabricados em uma pastilha de material semicondutor em comum.

Aula 01 Pág. 2
externo e, por isso, possui circuitos elétricos mais adequados para conectar-se com o ambiente, além de
ter um custo bem menor que o microprocessador. Essa característica o torna ideal para sua utilização
em sistemas embarcados, como em detectores de fumaça, aeronaves e brinquedos, por exemplo.

Já o microprocessador é construído para otimizar o processamento de dados com o auxílio de diversos


componentes externos, como memórias, co-processadores, dispositivos periféricos, etc., sendo sua
aplicação mais voltada para tarefas que exijam a execução de diferentes programas e um alto volume de
processamento de dados, como no computador, por exemplo.

3. A Microchip

A microchip é uma empresa especializada em desenvolvimento de dispositivos para sistemas


embarcados. Em sua linha de produtos podemos encontrar os microcontroladores PIC (MCUs), dsPIC
controladores para sinais digitais, dispositivos de segurança KeeLoq, diversos produtos de interface
analógica, memórias seriais EEPROMs, etc.

4. Os Microcontroladores PIC - Peripheral Interface Controller

Os microcontroladores PIC são considerados os que apresentam a melhor relação custo/benefício do


mercado. Sua arquitetura RISC (não entraremos em detalhes neste curso sobre os tipos de arquitetura)
2 3
proporciona um set de apenas 35 instruções para a maioria dos modelos (família MidRange ), sendo
assim um dispositivo de fácil programação. A execução de suas instruções também é mais rápida que
outros tipos de microcontroladores que utilizam a arquitetura CISC, como o famoso e ainda muito
utilizado 8051.

A família de microcontroladores PIC é bastante ampla, tendo diversos modelos com diversas
funcionalidades, conforme poderemos observar na próxima aula.

Nesse curso todos os projetos serão com o PIC16F84A ou PIC16F628A no encapsulamento PDIP (ver
figura 1). Ao longo do curso aprenderemos as funcionalidades de cada pino deste CI (ver figura 2).

2
SET - Conjunto
3
MidRange – Os microcontroladores PIC estão disponíveis em três famílias: Low-End, MidRange, High-End. A família Low-End
tem um subset reduzido de instruções, sem tratamento de interrupções, instruções de 12 bits, menor memória RAM disponível e
sem I/O avançados, logo, esta família não deve ser utilizada para novas aplicações ou para o aprendizado. A família High-End tem
instruções de 16 bits, acesso a todos os registradores diretamente, múltiplos vetores de interrupção e não é recomendado para o
aprendizado. A família MidRange é a mais comum no mercado e possui as características mais adequadas para o ensino, logo,
durante o curso trabalharemos com o PIC 16F84A, pertencente da família MidRange.

Aula 01 Pág. 3
5. Encapsulamento e Pinagem

O PIC está disponível no mercado em diversos encapsulamentos (inclusive SMD). Por ser mais fácil de
realizar testes e prototipagens, utilizaremos o PIC no encapsulamento PDIP de 18 pinos (ver figura 1).

Figura 1: Encapsulamento PDIP 18 Pinos

Figura 2: Pinos do PIC16F84A

Tabela 1: Lista dos pinos e funções

Pino PDIP Descrição


OSC1 / CLKIN 16 Entrada do oscilador / Entrada de clock externo
OSC2 / CLKOUT 15 Saída do oscilador / Saída para clock externo
/MCRL 4 Master Clear Reset
RA0 17 PortA - Porta bi-direcional de entrada e saída
RA1 18
RA2 1
RA3 2
pode ser selecionado como entrada de clock para o TMR0. A saída
RA4 / T0CKI 3
é do tipo "open drain"
RB0 / INT 6 PortB - Porta bi-direcional de entrada e saída
RB1 7 Estas portas podem ser configuradas individualmente
RB2 8 com pull-ups nas entradas
RB3 9 RB0 pode também ser configurada como entrada
RB4 10 para interrupção externa
RB5 11 RB4:RB7 podem ser configurados como entrada
RB6 12 para interrupção por mudança de nível
RB7 13
Vss 5 Referência do Terra
Vdd 14 Alimentação positiva
Aula 01 Pág. 4
6. Portas de Entrada e Saída

As portas de entrada e saída são os canais de comunicação entre a central de processamento e o


mundo físico. Estas portas podem ser de saída, ou seja, podem controlar dispositivos externos como
relés, chaves, LEDs, ou podem ser de entrada e receber os sinais vindo de sensores e botões. Quem irá
informar que pinos serão entradas e que pinos serão saídas será o programador através do software.

O PIC16F84A tem 13 pinos de entrada e saída (I/O pins) que podem ser individualmente configurados
como entrada ou saída a depender do software. Alguns destes pinos podem ser multiplexados com
outras funções do dispositivo, como:

 Interrupções externas;

 Interrupção por mudança de estado em alguns pinos;

 Entrada do clock para o contador, conforme veremos melhor nas próximas aulas.

Os 13 pinos de I/O estão divididos em dois blocos, com diferentes características elétricas:

 PortA;

 PortB.

O PortA tem 5 pinos de I/O (RA4, RA3, RA2, RA1 e RA0) e o PortB, 8 (RB7, RB6, RB5, RB4, RB3, RB2,
RB1 e RB0), totalizando 13 pinos de I/O.

PortA (RA3:RA0)

A figura 3 mostra o esquema elétrico dos pinos de I/O RA3:RA0. Como o foco deste curso não é o
hardware, não iremos nos aprofundar na eletrônica interna do PIC, porém há alguns detalhes que devem
ser observados.

Figura 3: Diagrama em blocos dos pinos RA3:RA0

Aula 01 Pág. 5
4 5
Podemos observar que a saída (I/O pin) está conectado a dois transistores mosfet e a um buffer TTL
de entrada. Isto indica que a impedância de saída destes pinos é baixa quando o pino está configurado
como saída. Já a impedância de entrada é alta quando configurado como entrada. Na prática isto indica
que devemos ter cuidado ao configurar um pino do PIC como saída, pois, um erro na ligação elétrica
pode ocasionar a queima do pino devido à baixa impedância de saída (e consequentemente à alta
corrente de saída do pino de I/O).

PortA (RA4)

Um detalhe do RA4 (figura 4) é que este não tem o transistor ligando o pino RA4 ao Vdd. Com isso
6
devemos ter atenção ao utilizar este pino como saída, pois este é do tipo “open drain” e, sendo assim,
não é possível gerar 5V neste pino sem o auxílio de componentes externos auxiliares.

Figura 4: Diagrama em blocos do pino RA4

Na prática temos que, se ligarmos um LED deste pino ao Terra (referência) sem qualquer circuito
externo, mesmo que o PortA 4 (pino RA4) esteja configurado como saída e o programa coloque este
pino em nível lógico 1, o LED nunca acenderá (figura 5).

A principal utilidade de se ter um pino do tipo “open-drain” é a possibilidade de conectar vários


dispositivos “open-drain” em uma única linha física sem o risco de queimar algum dispositivo.

4
MOSFET - Metal Oxide Silicon Field Effect Transistor, é um transistor de efeito de campo feito de silício dopado com óxido
metálico.
5
BUFFER TTL – Seguidor de tensão formado por circuitos digitais TTL que tem como principal característica a utilização de sinais
de 5 volts para níveis lógico altos. Seus circuitos integrados são constituidos basicamente de transistores bipolares, o que os torna
poucos sensíveis a eletricidade estática.
6
OPEN DRAIN – O terminal do dreno do transistor de saída está desconectado. A conexão do transistor de saída ao Vcc deverá
ser feita através de um resistor denominado de “pull-up”.

Aula 01 Pág. 6
R1
RA4 1k

D1
Q1 LED1

Figura 5: Esquema elétrico da ligação de um LED no RA4: este LED nunca acenderá

PortB (RB7:RB0)
7
Uma característica interessante do PortB é a possibilidade da configuração de um “pull-up” fraco via
software quando o pino está configurado como entrada. Isto permite que, por exemplo, um botão seja
ligado no PortB de uma maneira bem mais simples que no PortA.

O PortB também é capaz de drenar e suprir mais corrente que o PortA, sendo bastante utilizado para o
acionamento de LEDs e displays.

Figura 6: Diagrama em blocos dos pinos RB7:RB4

7
PULL UP – Resistor utilizado na entrada de circuitos digitais para definir o nível lógico quando a entrada estiver desconectada ou
em alta impedância.

Aula 01 Pág. 7
Figura 7: Diagrama em blocos dos pinos RB3:RB0

A única diferença entre os pinos RB7:RB4, RB3:RB1 e RB0 são os tipos de interrupções que cada um
deste conjunto de pinos tem. As interrupções estudadas na aula 6.

7. Clock e execução dos comandos

O clock é quem dá o sinal de partida para o microcontrolador e dá o “ritmo” de execução dos comandos
e este é obtido a partir de um componente externo chamado oscilador. Se imaginarmos que um
microcontrolador é um relógio de sala, o nosso clock corresponderia ao pêndulo.

Um ciclo de instrução é executado a cada 4 ciclos de clock no PIC (gerados por osciladores ou circuitos
geradores de clock externos), ou seja, caso esteja utilizando um oscilador de 4MHz, haverá a execução
de um ciclo de instrução a cada 1µs, conforme podemos observar abaixo:

 Freqüência do oscilador: 4MHz;

 Freqüência da execução das instruções: 4MHz / 4 = 1MHz;

 Período de execução das instruções: 1 / 1MHz = 1µs.

Se estivéssemos utilizando um oscilador de 20MHz, os cálculos seriam:

 Freqüência do oscilador: 20MHz;

 Freqüência da execução das instruções: 20MHz / 4 = 5MHz;

 Período de execução das instruções: 1 / 5MHz = 0,2µs (200ns).

A maioria dos comandos do PIC é executada com apenas um ciclo de instrução, a menos que seja
necessário um teste condicional ou modificação no PC (ver detalhes nas próximas aulas).

Aula 01 Pág. 8
8. Osciladores

Há basicamente dois tipos de osciladores para gerar o clock que utilizamos em nossos projetos:

 Cristais;

 RC.

Os osciladores mais utilizados nos projetos do Criatronics são os cristais de 20MHz pela precisão
necessária e rápido processamento de dados, apesar de termos mais problemas de instabilidade inicial
8
no funcionamento sendo necessário um maior esforço no design da PCI .

O PIC 16F84A pode funcionar em 4 modos diferentes de operação no que se diz respeito aos
osciladores. A escolha do modo de operação deve ser feita no software de gravação antes da gravação
do PIC, como veremos no final desta aula.

Os modos possíveis são:

 LP – Low Power Crystal / resonador cerâmico;

 XT – Cristal / resonador cerâmico;

 HS – High Speed Crystal / resonador cerâmico;

 RC – Resistor/Capacitor.

Configuração LP, XT ou HS utilizando cristal

Neste modo o cristal é conectado aos pinos OSC1 e OSC2, como mostrado na figura 8.

Figura 8: Ligação elétrica do cristal

Na Tabela 2 seguem os valores recomendados para C1 e C2. Quanto maior a capacitância, maior a
estabilidade do oscilador, porém há um aumento também no tempo de start-up.

A resistência Rs pode ser necessária caso hajam problemas na oscilação do cristal (para maiores
detalhes consultar os dados técnicos do cristal a ser utilizado), porém, nos nossos projetos não há a
necessidade de utilizar esta resistência.

8
PCI – Placa de Circuito Impresso – peça fundamental na montagem de qualquer conjunto eletrônico. Ela costuma ter a cor verde
(máscara de solda), contudo, também existem nas cores azul e marrom, por exemplo. Estas placas fazem a ligação física entre
componentes eletrônicos, por exemplo, processadores, capacitores, chips, etc.

Aula 01 Pág. 9
Tabela 2: Capacitores recomendados para utilização com o cristal

Modo Frequência Capacitores


32 kHz 68 - 100 pF
LP
200 kHz 15 - 33 pF
100 kHz 100 - 150 pF
XT 2 MHz 15 - 33 pF
4 MHz 15 - 33 pF
4 MHz 15 - 33 pF
HS
20 MHz 15 - 33 pF

Configuração LP, XT ou HS utilizando um gerador de clock externo

Caso o circuito possua um gerador de clock comum para os dispositivos digitais, é recomendada a
utilização da montagem conforme a figura 9.

Figura 9: Configuração para utilização do PIC com um circuito gerador de clock externo

Configuração RC

Em aplicações onde a precisão do clock não é determinante no projeto, pode-se optar por uma
configuração mais simples e barata, utilizando apenas um resistor e um capacitor, conforme mostrado na
Figura 10.

Figura 10: Configuração RC

Os valores recomendados para Rext e Cext são:

 5KΩ ≤ Rext ≤ 100KΩ;

 Cext ≥ 20pF.

A freqüência de oscilação estará em função dos valores de Rext, Cext, Vdd, Vss, tipo do capacitor e
temperatura de operação. Tendo assim tantas variáveis de influência significante, fica quase impossível
manter um alto grau de precisão utilizando este tipo de oscilador.

Aula 01 Pág. 10
9. Resets
9
Estudaremos neste tópico três tipos de Resets que o PIC diferencia:

 Power-on Reset;

 MCRL Reset;

 WDT Reset.
10
Não serão vistos os resets MCRL e WDT ocorridos durante o modo SLEEP do microcontrolador.

Power-on Reset

Um pulso de reset é gerado toda vez que o microcontrolador é alimentado (a tensão em Vdd é detectada
entre 1.2V e 1.7V), eliminando assim a necessidade de criação de um circuito eletrônico externo mais
elaborado de reset através do pino MCRL.

Power-up timer

Caso ativado antes da gravação, o power-up timer mantém o microcontrolador resetado durante 72ms
após a sua alimentação, garantindo assim que a alimentação já estará estável quando o
microcontrolador começar a executar as suas instruções.

Oscillator Start-up timer

Após o Power-up timer temos ainda o Oscillator Start-up timer, que espera 1024 ciclos do oscilador para
estabilizar a operação do cristal antes do início da execução do programa.

Figura 11: Instabilidade do oscilador ao circuito ser alimentado

Tempo de subida lento de Vdd

Porém, se mesmo após a ativação do Power-up o circuito ainda apresente problemas devido a um
eventual tempo excessivo que o circuito de alimentação precise para suprir o CI com a tensão Vdd
adequada, pode ser necessária a criação de um circuito externo para geração de um pulso de Reset
através do pino MCLR.

9
RESET – Reinicialização do microprocessador
10
SLEEP – Modo do PIC de espera. Neste modo o PIC tem um baixo consumo de energia.

Aula 01 Pág. 11
MCLR Reset

O MCLR (Master Clear Reset) é um modo de reset que pode ser facilmente acessado pelo usuário
através do pino MCLR do PIC. O MCLR pode ser útil quando é necessário reiniciar o microcontrolador
através de um circuito externo de controle ou quando o Power-on Reset não inicializa corretamente o
microcontrolador.

A qualquer momento em que este pino estiver no nível lógico 0, o circuito estará resetado. Para que as
instruções sejam executadas, é necessário manter esse pino constantemente em Vdd.

WDT Reset

O WDT (Watchdog Timer) é um oscilador RC interno ao CI que não requer nenhum componente externo
para seu funcionamento. O WDT estará operando independente de qualquer oscilador externo que o PIC
esteja utilizando para execução dos comandos, ou seja, ele funciona mesmo que o oscilador principal do
PIC tenha parado de funcionar.

O WDT pode ser ativado no programa de gravação do CI e, quando isto é feito, o circuito do WDT irá
gerar um pulso de reset toda vez que o tempo do WDT for atingido (18ms para operação sem
11
prescaler ). Em nossos projetos não utilizaremos o WDT, deixando-o sempre desabilitado.

10. Algumas características elétricas do PIC

 Tensão em qualquer pino (exceto Vdd, MCLR e RA4) em relação ao Vss: -0.3V a (Vdd + 0.3V);

 Tensão de Vdd em relação ao Vss: -0.3V a 7.5V;

 Tensão de MCLR em relação ao Vss: -0.3V a 14V;

 Tensão em RA4 em relação ao Vss: -0.3V a 8.5V;

 Máxima corrente no pino Vss: 150mA;

 Máxima corrente no pino Vdd: 100mA;

 Máxima corrente em qualquer pino de I/O: 25mA.

11
PRESCALER – Detalhado no capitulo de interrupção por TMR0

Aula 01 Pág. 12
11. O Kit Didático Criatronics

Nas nossas práticas iremos utilizar um kit próprio para aplicações didáticas. O kit (Figura 12) é dotado de
uma única placa onde estão o gravador de PIC, botões ligados no PortA, LED’s e um display de 7
segmentos ligado no PortB, além de outras funcionalidades conforme veremos adiante.

Há ainda uma chave que deve estar na posição correta, conforme indicação na placa, quando for para
gravar e quando for para executar o programa.

Figura 12: Kit didático completo do Criatronics

As funcionalidades de cada item enumerado na figura estão relacionadas a seguir:

1. Microcontrolador PIC 16F84A;

2. Cristal de 4 MHz;

3. Buzina ligada ao RB5;

4. Leds ligados ao PortB;

5. Display de 7 segmentos ligado ao PortB;

6. Relé ligado ao RB7 com conectores de potência;

7. Led infravermelho (IR) ligado ao RB6;

8. Botões ligados à PortA e botão de reset ligado ao MCLR;

9. Saída para conector ligado à PortA;

10. Saída para conector ligado ao PortB;

11. Saída para conexão da placa a um display LCD;

Aula 01 Pág. 13
12. Jumper para definição: o PortB estará ligado aos LEDs ou ao display 7-seg;

13. Jumpers para definição: o RB5 estará ligado ou não à buzina; o RB6 estará ligado ou não ao
LED IR; o RB7 estará ligado ou não ao relé eletromecânico;

14. Chave para definição: a placa for gravar um programa a partir do computador ou executar um
programa já previamente gravado;

15. Conector para interface com o computador através do padrão serial RS-232;

16. Conector para alimentação da placa (12 Vdc);

17. Regulador de tensão (5 Vdc).

12. Gravando e Testando um Programa no PIC


12
Para gravar um programa feito no MPLAB no PIC através do nosso kit didático, é necessário realizar as
seguintes atividades:

 Verificar se o PIC, cabo de alimentação e o cabo serial estão devidamente conectados;

 Abrir o programa “NTPICPRO.EXE”;

 Clicar em “Load” e selecionar o arquivo “nome_do_projeto.hex” referente ao projeto que está


sendo desenvolvido. Os arquivos de extensão .hex são gerados automaticamente quando o
programa é compilado no MPLAB e ficam na mesma pasta do projeto.

 Selecionar os itens adequados na guia “configuration word”. Como padrão, pode ser desabilitado
o “code protect”, habilitado o “power up timer”, desabilitado o “watchdog time”, selecionado o
oscilador do tipo “XT osc”, porta de comunicação “COM1”, uma vez que em geral utilizaremos o
mouse na porta PS2 ou USB do computador, e em “mode” deve ser selecionado “16C84”.

Na aula deve ser gravado os arquivos “projeto01.hex”, “projeto02.hex” e “projeto03.hex” na placa


didática. Estes arquivos, que serão passados pelo instrutor, deverão ter sido previamente programados e
simulados e serão utilizados inicialmente apenas para demonstração de gravação e execução de
programas no kit didático PIC do Criatronics.

13. Ferramentas de desenvolvimento da Microchip

A Microchip produz ferramentas para o desenvolvimento do software, hardware para testes e simulações
e também produz placas para demonstrações.

Software

Os principais softwares para desenvolvimento da Microchip são:

 MPLAB IDE (freeware)

 MPLAB C18

12
MPLAB – Programa onde serão desenvolvidos, compilados e simulados os projetos em Assembly.

Aula 01 Pág. 14
 MPLAB C30

O MPLAB IDE será estudado com mais detalhes adiante. O MPLAB C18 e C30 são compiladores para a
linguagem C, que não serão estudados nesse curso.

Hardware

Os principais hardwares disponíveis pela Microchip para o desenvolvimento são:

 MPLAB ICE

 MPLAB ICD

Estes dois dispositivos são utilizados para a simulação e emulação do programa já quando este estiver
gravado no próprio PIC, ou seja, permitem verificar a execução do programa com o hardware final (com
o PIC montado na placa onde este será aplicado).

14. O MPLAB IDE

O MPLAB IDE é o programa executado no computador que utilizamos para desenvolver as aplicações
para os microcontroladores PIC na linguagem Assembly. O termo IDE significa “Integrated Development
Environment” por que ele é um ambiente de desenvolvimento integrado de simples utilização, onde estão
integrados o gerenciador de projetos, o editor do código, ferramentas para conexão dos diversos códigos
13
fontes e bibliotecas, debugger e simuladores.

15. Programando o PIC

O MPLAB IDE tem todos os componentes necessários para a programação do PIC. Porém, além de
realizarmos programação propriamente dita no MPLAB, devemos realizar alguns passos antes para
poder obter um sistema que atenda as necessidades do usuário. As atividades típicas para o
desenvolvimento do software de um sistema embarcado serão descritas a seguir.

Entendendo o problema (Análise de requisitos)

Antes de se fazer qualquer programa é necessário saber o que se quer programar. Isto parece ser óbvio,
mas é considerado umas das principais falhas nos programadores. No Brasil não temos o costume de
investir tempo e dinheiro nesta etapa do projeto, ficando o sistema muitas vezes deficiente em diversos
pontos ou mesmo totalmente inadequado para a aplicação desejada pelo cliente.

Esquematizar o sistema em alto nível (Planejamento)

Primeiro é necessário conhecer quais as características e desempenho necessário para decidir qual o
PIC que será utilizado. Em seguida é recomendado realizar o esquema eletrônico do hardware
associado ao PIC para conhecermos quais serão os pinos de entrada, saída, quais periféricos serão
utilizados, etc.

13
Debugger – Programa de computador utilizado para verificar os erros de sintaxe, simular e compilar o programa.

Aula 01 Pág. 15
Só então será a hora de realizar a programação. Antes de iniciar, é necessário escolher qual a
linguagem de programação que será utilizada. Em nosso curso, aprenderemos a linguagem de baixo
nível Assembly, que é diretamente convertido em linguagem de máquina. Outra opção é a linguagem C
para PIC, que é uma linguagem de nível médio (mais fácil de programar, porém gera códigos menos
enxutos). A escolha da linguagem de programação deverá estar em função da complexidade do sistema,
memória disponível e eficiência do programa desejado.

Criando o fluxograma (Lógica de programação)

O fluxograma utiliza-se de símbolos específicos para a representação de algoritmos (seqüência de


passos que devem ser executados para se alcançar um determinado objetivo). Abaixo segue uma
simbologia tradicionalmente utilizada.

Processo Decisão Conector Terminal Setas

de Fluxo

O fluxograma ajuda durante a programação e manutenções futuras do programa, facilitando, sobretudo,


no entendimento do sistema. Esta etapa do projeto é comumente desprezada por diversos
programadores, porém esta prática é altamente não recomendada.

Escrevendo as linhas de códigos (Implementação)

As linhas de códigos devem ser digitadas de forma clara, seguindo fielmente o fluxograma, com rótulos
(labels) e sempre que possível, comentários, além de utilizar as cores disponíveis no MPLAB para
distinguir os diversos tipos de dados (códigos, números, comentários, labels, etc., cada “coisa” de uma
cor). Isto facilita bastante o entendimento quando outro programador ler seu programa, ou mesmo
quando você for fazer uma manutenção futura em seu próprio programa.

Compilação do programa

A compilação consiste na conversão das linhas de programa digitadas pelo programador para o código
de máquina. Durante a compilação, o compilador também verifica eventuais erros de sintaxe ou
inconsistências no programa. Atenção: o compilador não verifica se a lógica empregada no programa
está correta!

Simulação e ajustes do programa

O MPLAB já tem integrado uma ferramenta de simulação que deve ser utilizado sempre que um código
for escrito. O compilador não irá detectar os erros de lógica no programa, logo, a simulação é necessária
para verificar se seu programa está fazendo exatamente aquilo que você queria que ele fizesse
(segundo o documento de requisitos). As falhas na programação deverão ser removidas neste momento.

Aula 01 Pág. 16
Gravação do programa

A gravação do programa no microcontrolador é o último passo do processo e é onde deve ser verificado
se a utilização do microcontrolador está adequada para sua aplicação final.

A gravação do programa pode ocorrer de maneira integrada com a simulação caso o usuário esteja
utilizando o MPLAB-ICD, onde o circuito é simulado na própria placa, “on-line”.

Cada uma das etapas citadas pode ser bastante complexa e consumir muito mais tempo que o previsto
inicialmente.

Neste curso iremos abordar apenas as etapas posteriores à geração do fluxograma, uma vez que a
aquisição e análise de requisitos, planejamento e lógica de programação, cada uma, têm por si só,
assuntos suficientes para novos cursos.

Aula 01 Pág. 17
16. Memórias

A memória é um componente do microcontrolador indispensável, responsável pelo armazenamento de


todos os dados do sistema (quando o sistema não possui memórias auxiliares). Os microcontroladores,
em sua maioria, possuem uma pequena quantidade de memória construída internamente no dispositivo.

Fazendo uma analogia a um supermercado, os dados são armazenados em prateleiras com endereços
específicos. Quando o processador quer saber o que tem em certa prateleira, ele acessa o endereço da
prateleira e rapidamente tem acesso ao dado lá disponível. Junto com o endereço, o processador
também envia um sinal informando se quer apenas ler (read) o que está lá naquele endereço ou se ele
quer deixar algum dado escrito naquele endereço (write).

É imPortAnte ressaltar ainda que no PIC a memória é dividida em regiões com diferentes finalidades. Por
exemplo, uma das regiões pode ser alocada somente para armazenar o programa a ser executado pelo
processador, por isso é chamada memória de programa. Outra região é alocada para armazenar
temporariamente os dados enquanto o programa está sendo executado, por isso é chamada memória de
dados. Temos ainda a região chamada de pilha (do inglês, stack) e a região de memória EEPROM,
conforme veremos a seguir.

17. Tipos de memória

O PIC tem dois blocos de memória independentes, que podem ser acessados simultaneamente:

 Memória de programa (Flash);

 Memória de dados (RAM);

Há ainda um bloco de memória de dados que requer um procedimento especial para a sua escrita e
leitura. Esta memória é chamada EEPROM. Nesta memória devemos gravar os dados que não podem
ser perdidos quando o microcontrolador for desligado, por exemplo, a temperatura em que o usuário
deixou programado o ar condicionado. Neste curso não aprenderemos a utilizar este tipo de memória.

18. Organização da Memória de Programa

O PIC 16F84, bem como toda a família “F”, possui como memória de programa um tipo chamada Flash.
Memória Flash é uma forma de memória não volátil que pode ser apagada e reprogramada
eletronicamente.

Alguns outros modelos de microcontrolador utilizam a tecnologia EPROM ou mesmo a PROM. A


tecnologia EPROM permite a gravação do programa pelo PC, porém, para gravar um novo programa no
microcontrolador é necessário apagar a memória de programa deste iluminando o circuito integrado com
uma luz ultravioleta. Já a tecnologia PROM permite apenas a gravação de um programa no
microcontrolador. Uma vez programado, o microcontrolador não poderá ser nunca mais reprogramado.

O PIC tem capacidade de endereçar um programa de 8K words (1 word tem 14 bits no caso da família
do PIC16F84A). No PIC estudado, os primeiros 1K (do endereço 0000h ao endereço 03FFh) são
fisicamente implementados. A partir do endereço 03FFh temos uma repetição dos dados anteriores. Por
Aula 02 Pág. 18
exemplo, os dados existentes nos endereços 0020h, 0420h, 0820h, 0C20h, 1020h, 1420h, 1820h e
1C20h são os mesmos. Logo, não há a necessidade de tentar endereçar a partir do endereço 03FFh.

O endereço inicial de processamento é o 0000h, ou seja, após um Reset (inclusive o Power-on Reset) o
microcontrolador irá executar a instrução gravada no endereço 0000h. O vetor interrupção14 é o 0004h
(conforme veremos aplicação nas próximas aulas).

Figura 13: Mapa da memória de programa

19. Organização da Memória de Dados

A memória de dados pode ser dividida para fins de estudo em dois blocos:

Memória RAM para uso geral (GPR – General Pupose Registers);

Registradores especiais (SFR – Special Function Registers).

A memória EEPROM também faz parte da memória de dados, porém essa memória não é mapeada
diretamente na memória de dados. No PIC 16F84A temos 64 bytes de memória EEPROM disponíveis
para o usuário, mas, como já visto, não iremos utilizar nem estudar este tipo de memória em nossos
projetos iniciais.

Na Figura 14 podemos observar o mapa de memória de dados do PIC 16F84A. Verificamos a presença
dos SFRs e da área destinada para uso geral (GPR).

14
Interrupção – Detalhado no capítulo de interrupções

Aula 02 Pág. 19
Figura 14: Mapa de memória de dados

A memória de dados está dividida em dois bancos de memória (Bank0 e Bank1). Deveremos indicar no
software qual o banco que estamos trabalhando antes de operar com os registradores, conforme
veremos nas próximas aulas.

Os SFRs podem ser divididos em dois blocos:

 Registradores para controle das funções essenciais;

 Registradores para controle das funções dos periféricos.

São nos registradores para controle das funções essenciais que são definidos, por exemplo, quais os
pinos do PIC serão entrada, quais serão saída, se houve ou não a ocorrência de um zero após a última
operação matemática, se houve a ocorrência de um reset, se as interrupções estão ativadas, etc.

São nos registradores para controle das funções dos periféricos que configuramos, por exemplo, os
parâmetros de uma conversão analógico/digital, os parâmetros para geração do PWM automático, os
parâmetros para transferência de dados através dos protocolos disponíveis pelo PIC (SPI, USART, etc).

Nos exemplos de programas aprenderemos aos poucos como trabalhar com os SFRs.

Aula 02 Pág. 20
20. O Program Counter (PC) e a Pilha (Stack)

Observando o mapa de memória de programa na Figura 13 observamos dois blocos de memória ainda
não discutidos: o PC e a Pilha.

O PC indica em que ponto da memória de programa o microcontrolador lerá a próxima instrução. Por
exemplo, se no PC estiver armazenado o valor 01Ah, isto significa que a próxima instrução a ser
executada pelo microcontrolador será a instrução gravada no endereço 01Ah.

A Pilha tem a função de armazenar temporariamente informações sobre o fluxo de atividades do


programa. Maiores detalhes sobre estas regiões de memória serão vistas durante as práticas.

21. Dispositivos periféricos auxiliares

Os dispositivos periféricos são as partes do microcontrolador responsáveis por atividades específicas,


auxiliando o processador e realizando algumas interfaces com o mundo físico, como a transferência de
dados via o padrão RS-232, a comunicação com outros PICs via o protocolo I2C15, a geração de um
sinal PWM para controle de motores ou mesmo a conversão de um sinal analógico em digital.

Neste tópico iremos ver alguns periféricos disponíveis em vários modelos de PIC. O PIC que iremos
trabalhar neste curso, o 16F84A, não possui boa parte desses periféricos, ficando suas utilizações para
um curso mais avançado (com exceção do módulo Timer0 que será visto neste curso).

Módulo Timer0

O Módulo Timer0 é um temporizador (timer) / contador que possui as seguintes características:

 Timer/contador de 8 bits;

 Pode ser acessado para leitura e escrita pelo usuário;

 Pode ser aplicado um “prescaler”;

 Pode ser ativado através de um clock externo;

 Pode gerar uma interrupção em seu overflow;

 Pode ser incrementado na borda de subida ou decida.

Este módulo será estudado com mais detalhes nas próximas aulas.

Módulo Timer1

O módulo Timer1 é um timer/contador de 16 bits (armazenados em dois registradores) que pode ser
acessado para leitura ou escrita pelo usuário.

15
I²C – Inter-Integrated Circuit – é um barramento serial inventado pela Philips que é usado para conectar dispositivos periféricos
de baixa velocidade de transferência de dados.

Aula 02 Pág. 21
Módulo Timer2

O módulo Timer2 é um timer de 8 bits com prescaler e postscaler. Este timer pode ser utilizado como
base de tempo para a geração de PWM no módulo CCP (visto no próximo item). Este módulo também
pode ser acessado para leitura e escrita pelo usuário.

Módulo CCP

O Módulo CCP (Capture / Compare / PWM) contém um registrador de 16 bits que pode operar como:

 Registrador de captura de 16bits (captura o valor do Timer1 quando um evento ocorrer no pino
CCP1 do PIC);

 Registrador comparador de 16bits (compara o valor do módulo com o valor do Timer1);

 Modo PWM (Produz um sinal PWM com resolução de 10bits).

Módulo MSSP

O módulo MSSP (Máster Synchrounous Serial Port) é um módulo de interface serial, muito útil para
comunicação com outros periféricos ou outros microcontroladores.

O módulo MSSP pode operar em um desses dois modos:


16
 SPI (Serial Peripheral Interface) ;

 I2C (Inter-Integrated Circuit).

Módulo USART

O Módulo USART (Addressable Universal Synchronous Receiver Transmitter) é um dos dois módulos de
transmissão serial que diversos modelos de PICs possuem e é também um dos mais utilizados,
principalmente quando há a interface com o computador através do PortA serial.

Módulo Conversor Analógico/Digital (A/D)

Quando utilizado o modo A/D do PIC, o pino de entrada fica conectado a um Sample and Hold17, e este
conectado a entrada do conversor A/D. O processo então irá converter o sinal analógico em um sinal
digital de 10bits.

Em PIC de 28 pinos há geralmente 5 entradas analógicas multiplexadas. Em PIC’s maiores, há 8


entradas multiplexadas.

Módulo Comparador

Em alguns modelos de PIC’s há um comparador analógico, gerando uma saída digital. A tensão de
referência do comparador pode ser definida via software ou segundo uma tensão externa.

16
SPI - Serial Peripheral Interface Bus – padrão amplamente utilizado para controle de dispositivos periféricos. Um subconjunto do
SPI e bastante utilizado é o “microwire”.
17
Sample and Hold – Dispositivo utilizado para realizar a interface entre o mundo real (e seus sinais analógicos) e um conversor
analógico digital. O objetivo é capturar rapidamente o sinal analógico para ser convertido posteriormente lentamente pelo A/D.

Aula 02 Pág. 22
22. Alguns modelos de PIC’s

6 pinos - PIC10F202

 Número de pinos: 6

 Número de pinos de I/O: 4

 Memória de programa: 512 Words

 Memória de dados:

 Memória EEPROM: 0

 Timers/WDT: 1 Timer de 8bits e 1 WDT

 Oscilador máximo: Cristal 20MHz

8 Pinos - PIC12F675

 Número de pinos: 8

 Número de pinos de I/O: 6

 Memória de programa: 1024 Words

 Memória de dados: 64 Bytes

 Memória EEPROM: 128 Bytes

 Timers/WDT: 1 Timer de 8bits, 1 Timer de 16bits e 1 WDT

 Conversores A/D: 4 (resolução de 10bits)

 Comparadores: 1

 Oscilador máximo: Cristal 20MHz

18 Pinos - PIC16F84A

 Número de pinos: 18

 Número de pinos de I/O: 13

 Memória de programa: 1024 Words

 Memória de dados: 68 Bytes

 Memória EEPROM: 64 Bytes

 Timers/WDT: 1 Timer de 8bits e 1 WDT

 Oscilador máximo: Cristal 20MHz

18 Pinos – PIC16F628A

 Número de pinos: 18

 Número de pinos de I/O: 16

 Memória de programa: 2048 Words


Aula 02 Pág. 23
 Memória de dados: 224 Bytes

 Memória EEPROM: 128 Bytes

 Timers/WDT: 2 Timer de 8bits, 1 Timer de 16bits e 1 WDT

 Comparadores analógicos: 2

 Módulo CCP: 1

 Oscilador máximo: Cristal 20MHz

28 Pinos – PIC16F873

 Número de pinos: 28

 Número de pinos de I/O: 22

 Memória de programa: 4096 Words

 Memória de dados: 192 Bytes

 Memória EEPROM: 128 Bytes

 Timers/WDT: 2 Timer de 8bits, 1 Timer de 16bits e 1 WDT

 Conversores A/D: 5 (resolução de 10bits)

 Módulo CCP: 2

 Interfaces: MSSP, USART

 Oscilador máximo: Cristal 20MHz

40 Pinos – PIC16F877

 Número de pinos: 40

 Número de pinos de I/O: 33

 Memória de programa: 8192 Words

 Memória de dados: 384 Bytes

 Memória EEPROM: 256 Bytes

 Timers/WDT: 2 Timer de 8bits, 1 Timer de 16bits e 1 WDT

 Conversores A/D: 8 (resolução de 10bits)

 Comparadores: 2

 Interfaces: AUSART, MI2C, SPI

 Oscilador máximo: Cristal 20MHz

Aula 02 Pág. 24
23. Uma visão sobre sistemas numéricos

Além do sistema decimal, onde temos 10 símbolos para representar os números (0, 1, 2, 3, 4, 5, 6, 7, 8,
9), há também outros sistemas numéricos. Utilizamos o sistema decimal no dia a dia por questões
históricas: a razão de o sistema decimal ter 10 símbolos é por que possuímos 10 dedos nas mãos.

O computador e outros aparelhos eletrônicos não necessitam utilizar o sistema decimal em seus
cálculos. Eles podem utilizar sistemas de numeração mais simples, que facilitem os cálculos
computacionais e armazenamento de dados, com apenas 2 símbolos, 8 símbolos, ou mesmo com 16
símbolos.

Sistema binário de numeração

No sistema binário há apenas 2 símbolos. Normalmente utilizamos o “0” e o “1” como símbolos binários.
Exemplo: “01001110”. Com os números binários, assim como com qualquer outro sistema numérico
utilizado no PIC, é possível realizar operações aritméticas.

Deste ponto em diante chamaremos um símbolo binário de bit, um conjunto de 8 bits de byte e durante o
curso iremos aprendendo aos poucos como trabalhar com este sistema de numeração.

Obs.: Para saber quantas combinações podem ser realizadas com “n” dígitos binários, basta realizar o
n
seguinte cálculo: nº de combinações = 2 . As aplicações para este cálculo veremos mais adiante nas
aulas práticas.

Sistema hexadecimal de numeração

O sistema hexadecimal (16 símbolos) é um sistema numérico bastante útil e utilizado no PIC. Por
exemplo, os endereços da memória do PIC podem ser melhores visualizados com números
hexadecimais.

O sistema hexadecimal é composto pelos seguintes símbolos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F.

Uma das principais vantagens de se utilizar o sistema hexadecimal é a facilidade de conversão para o
sistema binário. A cada 4 bits é possível gerar um número em sistema hexadecimal de maneira direta,
conforme a tabela abaixo.

Aula 02 Pág. 25
Tabela 3: Equivalências entre sistemas de numeração

Binário Hexadecimal Decimal


0000 0 0
0001 1 1
0010 2 2
0011 3 3
0100 4 4
0101 5 5
0110 6 6
0111 7 7
1000 8 8
1001 9 9
1010 A 10
1011 B 11
1100 C 12
1101 D 13
1110 E 14
1111 F 15
Por exemplo, para converter o número binário 010111100101100 em hexadecimal devemos dividir o
número em partes de 4 dígitos (0010 1111 0010 1100), incluindo zeros à esquerda do número binário
quando necessário, e em seguida converter em hexadecimal dígito por dígito, ficando 2F2Ch. O “h” no
final do número é somente para indicar que o número está no formato hexadecimal. A operação de
transformação inversa é realizada da mesma maneira.

No MPLAB utilizamos as seguintes sintaxes para escrevermos os números:

 Binário: B’10010100’

 Decimal: .148

 Hexadecimal: 0X94

Mas não vamos nos preocupar muito com os sistemas de numeração no momento, pois, o MPLAB
trabalha com os três sistemas apresentados (decimal, binário e hexadecimal) de forma que podemos
escolher sempre qual dos sistemas utilizar.

24. Configuração dos SFRs

Como já vimos antes, os SFRs são registradores especiais que ficam na memória de dados. Esses
registradores, assim como toda a memória de dados, têm 8 bits e possuem neles configurações
essenciais para o funcionamento do dispositivo. Alguns autores chegam a denominar os registradores
especiais como “os registradores que configuram tudo”.

São nos registradores especiais que iremos informar quais interrupções irão ocorrer, quais portas serão
entrada ou saída, se ocorreu um zero após a última operação aritmética, etc. Logo, ao longo do curso,
iremos aprender para que servem alguns dos registradores do PIC16F84, começando com o TrisA,
TrisB, PortA e PortB.

TrisA e TrisB

Estes dois registradores especiais são reservados para a definição de quais pinos serão entrada e quais
pinos serão saída. O TrisA está relacionado com o PortA; o TrisB relacionado com o PortB.
Aula 02 Pág. 26
Para definir o RA2 como uma entrada, basta armazenar em TrisA,2 (bit 2 do registrador TrisA) o valor
“1”. Caso eu quisesse que o RA2 fosse uma saída, bastaria armazenar em TrisA,2 o valor “0”.

Para qualquer bit do TrisA ou TrisB, “1” significará que o PortA associada é uma entrada e “0” que o
PortA é uma saída. Para facilitar a memorização, podemos relacionar “1” com Input (entrada) e “0” com
Output (saída).

Lembramos que o RA4 (PortA,4), quando configurado como saída, funciona com o dreno aberto, como
vimos na aula 01. Vimos ainda que todos os pinos do PortB (RB7:RB0), quando configurados como
entrada, podem ter em cada pino individualmente um fraco pull-up habilitado via software.

PortA e PortB

É muito simples mudar o nível lógico de umo PortA no PIC, quando esta está configurada como saída.
Assim como também é bastante simples ler o nível lógico nos pinos do PIC quando este pino está
configurado como entrada.

Para que meu RB2 esteja no nível lógico “1”, se ele estiver configurado como saída (TrisB,2 = 0), basta
gravar o bit “1” na posição PortB,2. Para que ele retorne ao nível lógico “0”, basta gravar o bit “0” na
posição PortB,2. Estas operações de escrita no PortA é utilizada, por exemplo, para o acionamento de
um relé, LED ou uma buzina.

Mas se eu quiser ler o RB5, que está configurado como entrada (TrisB,5 = 1), basta ler o bit 5 do
registrador PortB (PortB,5). As operações de leitura do PortA podem servir, por exemplo, para verificar o
status de um sensor de proximidade.

25. O Work register (W)

O W é um registrador utilizado pelo PIC para auxílio nas operações lógicas ou aritméticas. Antes de
realizar qualquer soma, por exemplo, um dos operando deve estar no W e o outro em um registrador
qualquer. O resultado desta soma ficará armazenado no W até que este dado seja movido para algum
registrador.

26. Instruções MOVF, MOVLW e MOVWF

MOVF

Sintaxe: MOVF f,d

O conteúdo do registrador f será movido para um destino d. Em geral utilizamos d = W, ou seja, o valor
de um registrador é movido para o W.

Exemplo:

MOVF TRISA,W

MOVLW

Move um valor numério (literal) para o registrador W (Work).

Aula 02 Pág. 27
Sintaxe: MOVLW k

Obs.: k deve estar entre 0 e 255 pois W é de 8bits.

Exemplo:

MOVLW .120

MOVWF

Move (copia) o valor do registrador W para o registrador f

Sintaxe: MOVWF f

Exemplo:

MOVWF PORTB

A seguir apresentamos um exemplo para mover (copiar) um valor literal para um registrador f qualquer.

MOVLW B’11001010’
MOVWF STATUS

Neste exemplo, o número binário 11001010 será copiado no registrador STATUS.

Como pode-se ver, para se copiar um número literal k em um registrador f é necessário que antes este
número k seja copiado para o W e só então movido para o registrador f.

Outro exemplo

Se quisermos configurar o RB4 e o RB7 como entradas e os demais pinos do PortB como saída,
devemos realizar a seguinte seqüência de instruções:

MOVLW B’10010000’
MOVWF TRISB

27. Instruções BSF e BCF

BSF

Sintaxe: BSF f,b

O bit b do registrador f será setado (colocado em nível lógico 1)

Exemplo: BSF PortA,3

Neste exemplo o pino RA3 foi para nível lógico 1.

BCF

Sintaxe: BCF f,b

O bit b do registrador f será limpo (colocado em nível lógico 0)

Exemplo: BCF TrisA,3

Neste exemplo o pino RA3 foi definido como saída.

Aula 02 Pág. 28
28. Instruções BTFSC e BTFSS

BTFSC

Sintaxe: BTFSC f,b

Se o bit b do registrador f for 1, a próxima instrução será executada.

Se o bit b do registrador f for 0, a próxima instrução será descartada (pulada).

Exemplo:

BTFSC PortA,1
BSF PortB,2
BCF PortB,2

Na seqüência de instruções acima o PIC irá testar a entrada RA1. Se o pino estiver em 1, o PIC irá
colocar a saída RB2 em 1 também e, logo em seguida, colocará o RB2 em 0.

Caso o RA1 esteja em 0, a saída RB2 irá para 0 sem executar o comando BSF (que será pulado pelo
PIC).

BTFSS

Sintaxe: BTFSS f,b

Se o bit b do registrador f for 1, a próxima instrução será descartada (pulada).

Se o bit b do registrador f for 0, a próxima instrução será executada.

Exemplo:

BTFSS PortA,1
BSF PortB,2
BCF PortB,2

Na seqüência de instruções anterior o PIC irá testar a entrada RA1. Se o pino estiver em 0, o PIC irá
colocar a saída RB2 em 1 também e, logo em seguida, colocará o RB2 em 0.

Caso o RA1 esteja em 1, a saída RB2 irá para 0 sem executar o comando BSF (que será pulado pelo
PIC).

29. Labels

Os labels são rótulos (como o nome diz em inglês) que marcam algumas posições da memória de
programa. Esses rótulos auxiliam bastante o trabalho do programador uma vez que quando for
necessário realizar um desvio no programa não será necessário que o programador saiba o endereço do
destino (conforme veremos no comando GOTO).

Exemplo: supondo a existência de LEDs ligados aos pinos RA2, RA3 e RA4, poderíamos ter no
programa

LIGA_LEDS
BSF PORTA,2
BSF PORTA,3
BSF PORTA,4
...
DESLIGA_LEDS
BCF PORTA,2
Aula 02 Pág. 29
BCF PORTA,3
BCF PORTA,4
...

30. Instrução GOTO

Sintaxe: GOTO [label] / GOTO $+x

GOTO é um desvio incondicional.

Exemplos:

GOTO LIGA_LEDS

Neste exemplo o PIC irá pular incondicionalmente para o bloco de instruções logo abaixo do rótulo
LIGA_LEDS.

GOTO $+2

Neste exemplo o PIC irá pular duas linhas na execução dos comandos.

31. Comentários

Como poderemos perceber no modelo, os comentários devem ser inseridos no programa após um “;”.

Exemplo:

MOVLW TMR0 ;Carrega o Timer 0 com o valor de W

A importância do comentário é extrema uma vez que é muito difícil, às vezes, impossível, analisar um
programa em Assembly feito por terceiro, ou pela própria pessoa, quando o código é um pouco mais
complexo. Quanto mais comentário tiver o programa, mais fácil será o entendimento do programa e as
manutenções futuras.

32. Arquivos de definição padrão da Microchip

Quando digitamos no programa “MOVWF TRISA” o compilador tem que saber em que endereço da
memória está armazenado o registrador TrisA (no caso, TrisA=85h). O arquivo que indica em que
endereços estão armazenados os SFR, assim como outras definições genéricas, é o arquivo de
definição padrão fornecido junto com o MPLAB.

Quando digitamos um programa devemos indicar qual será o arquivo de definições que utilizaremos de
acordo com o tipo do PIC que iremos utilizar em nosso projeto. Em todos os nossos programas deste
curso utilizaremos o arquivo “P16F84.INC”.

Para realizar esta declaração do arquivo padrão deveremos sempre escrever a seguinte linha no nosso
programa:

#INCLUDE <P16F84.INC>

Aula 02 Pág. 30
33. Estrutura padrão dos cursos Criatronics

A seguir apresentamos um modelo padrão completo para o desenvolvimento dos programas deste
curso. Porém, para os primeiros programas, utilizaremos uma versão reduzida deste modelo,
descartando as partes que ainda não foram aprendidas até o momento.

Aula 02 Pág. 31
Modelo padrão completo Criatronics

;********************************************************************
;* CRIATRONICS - CENTRO DE ROBÓTICA, INTELIGÊNCIA E AUTOMAÇÃO *
;* CURSO DE MICROCONTROLADORES PIC I - INSTRUTORES: YGO BATISTA *
;* KOSME LUSTOSA *
;* ALUNO: DATA: XX/08/2005 *
;********************************************************************

;********************************************************************
;* DESCRIÇÃO DO PROGRAMA: *
;* *
;* *
;* *
;* *
;* *
;********************************************************************

;********************************************************************
;* DECLARAÇÃO DO ARQUIVO DE DEFINIÇÃO PADRÃO DA MICROCHIP *
;********************************************************************

#INCLUDE <P16F84.INC>

;********************************************************************
;* DEFINIÇÃO DA PAGINAÇÃO DA MEMÓRIA *
;********************************************************************

#DEFINE BANK0 BCF STATUS, RP0 ;SETA O BANCO 0 DA MEMÓRIA


#DEFINE BANK1 BSF STATUS, RP0 ;SETA O BANCO 1 DA MEMORIA

;********************************************************************
;* DEFINIÇÃO DAS VARIÁVEIS *
;********************************************************************

CBLOCK 0X0C ;ENDEREÇO INICIAL DA MEMÓRIA DE USO GERAL


W_TEMP ;REGISTRO TEMPORÁRIO PARA ARMAZENAMENTO DE
STATUS_TEMP ; W E STATUS DURANTE A INTERRUPÇÃO
CONTADOR_A ;REGISTRADOR AUXILIAR PARA GERAÇÃO
CONTADOR_B ; DE DELAYS
FLAG ;REGISTRADOR PARA DEFINIÇÃO DE FLAGS INTERNOS
ENDC ;FIM DO BLOCO DE VARIÁVEIS

;********************************************************************
;* DEFINIÇÃO DOS FLAGS INTERNOS DO SISTEMA *
;********************************************************************

;********************************************************************
;* DEFINIÇÃO DAS CONSTANTES *
;********************************************************************

;********************************************************************
;* DEFINIÇÃO DAS ENTRADAS *
;********************************************************************

;********************************************************************
;* DEFINIÇÃO DAS SAÍDAS *
;********************************************************************

;********************************************************************
;* VETOR RESET DO SISTEMA *
;********************************************************************

ORG 0X00 ;ENDEREÇO INICIAL DE PROCESSAMENTO


GOTO INICIO

Aula 02 Pág. 32
;********************************************************************
;* VETOR INTERRUPÇÃO DO SISTEMA *
;********************************************************************

ORG 0X04 ;ENDEREÇO INICIAL PADRÃO DA INTERRUPÇÃO


;* ARMAZENAMENTO DE W E STATUS
MOVWF W_TEMP ;ARMAZENA W
MOVF STATUS,W
MOVWF STATUS_TEMP ;ARMAZENA STATUS

;* IDENTIFICAÇÃO DA INTERRUPÇÃO OCORRIDA


BTFSC INTCON,2 ;TESTA SE OCORREU A INTERRUPÇÃO PELO
GOTO INT_TMR0 ; ESTOURO DO TMR0
BTFSC INTCON,1 ;TESTA SE OCORREU A INTERRUPÇÃO PEL0
GOTO INT_RB0 ; RB0
GOTO INT_RB ;CASO NEGATIVO, OCORREU INTERRUPÇÃO POR
; MUDANÇA DE PINO EM RB7:RB4

;* ROTINA PARA TRATAMENTO DA INTERRUPÇÃO POR ESTOURO DO TMR0


INT_TMR0

;* FIM DO TRATAMENTO DA INTERRUPÇÃO POR ESTOURO DO TMR0


BCF INTCON,2 ;LIMPA O FLAG DE IDENTIFICAÇÃO DA INTERRUPÇÃO
GOTO FIM_INT

;* ROTINA PARA TRATAMENTO DA INTERRUPÇÃO PELO RB0


INT_RB0

;* FIM DO TRATAMENTO DA INTERRUPÇÃO PELO RB0


BCF INTCON,1 ;LIMPA O FLAG DE IDENTIFICAÇÃO DA INTERRUPÇÃO
GOTO FIM_INT

;* ROTINA PARA TRATAMENTO DA INTERRUPÇÃO POR MUDANÇA EM RB7:RB4


INT_RB

;* FIM DO TRATAMENTO DA INTERRUPÇÃO POR MUDANÇA EM RB7:RB4


BCF INTCON,0 ;LIMPA O FLAG DE IDENTIFICAÇÃO DA INTERRUPÇÃO
GOTO FIM_INT

;* RECUPERAÇÃO DE W E STATUS E RETORNO DA FUNÇÃO


FIM_INT
MOVF STATUS_TEMP,W
MOVWF STATUS ;RECUPERA O STATUS ANTERIOR À INTERRUPÇÃO
MOVF W_TEMP,W ;RECUPERA O W ANTERIOR À INTERRUPÇÃO
RETFIE ;RETORNA DA INTERRUPÇÃO

;********************************************************************
;* SUB-ROTINAS DE DELAY *
;********************************************************************

;* ROTINA DE DELAY UTILIZANDO BASE DE TEMPO EXTERNA


DELAY
MOVWF TMR0 ;O VALOR DE W É PASSADO À TMR0
BCF INTCON,2
BTFSS INTCON,2 ;O DELAY SERÁ IGUAL À
GOTO $-1 ; D=(256-W)*1/PRESCALE*(BASE DE TEMPO)
BCF INTCON,2 ;PARA OPTION,PS2:PS0=0, TEMOS PRESCALE=1:2
RETURN

;* ROTINA DE DELAY INTERNA

;Nº CICLOS DO DELAY (ND) CASO N HAJA INTERRUPÇÕES DURANTE A EXECUÇÃO


; DESTA SUB-ROTINA: ND = 3*CONTADOR_A*CONTADOR_B+4*CONTADOR_A+4
;TEMPO DE EXECUÇÃO DA SUB-ROTINA (TE): TE = 4*ND/FREQUENCIA

DELAY_INT
MOVWF CONTADOR_A ;INICIALIZA O CONTADOR_A COM O VALOR DE W
MOVLW .12
MOVWF CONTADOR_B ;INICIALIZA O CONTADOR_B
DECFSZ CONTADOR_B,F ;DECREMENTA O CONTADOR_B, CASO CONTADOR_B=0
GOTO $-1 ; O SISTEMA DECREMENTARÁ O CONTADOR_A
DECFSZ CONTADOR_A,F ; E RECARREGARÁ O CONTADOR_B, ATÉ QUE
GOTO $-5 ; CONTADOR_A SEJA IGUAL A 0
RETURN

Aula 02 Pág. 33
;********************************************************************
;* INICIO DO PROGRAMA *
;********************************************************************

INICIO
BANK1 ;ALTERA PARA O BANCO 1
MOVLW B'11111111' ;ENTRADAS NO PORTA:
MOVWF TRISA ;SAÍDAS NO PORTA:
MOVLW B'11111111' ;ENTRADAS NO PORTB:
MOVWF TRISB ;SAÍDAS NO PORTB:
MOVLW B'00100000' ;
MOVWF OPTION_REG ;DEFINIÇÃO DE CONFIGURAÇÕES GERAIS DO PIC
MOVLW B'10000000' ;
MOVWF INTCON ;DEFINIÇÃO DE CONFIGURAÇÕES DE INTERRUPÇÕES
BANK0 ;ALTERA PARA O BANCO 0

;OPÇÕES DEFINIDAS (OPTION_REG):


; BIT 5 - CLOCK DE INCREMENTO DO TMR0 EXTERNO (RA4)

;INTERRUPÇÕES DEFINIDAS (INTCON):


; BIT 5 - HABILITA INTERRUPÇÃO POR OVERFLOW EM TMR0
; BIT 4 - HABILITA INTERRUPÇÃO EXTERNA POR RB0
; BIT 3 - HABILITA INTERRUPÇÃO POR MUDANÇA EM RB7:RB4

;********************************************************************
; INICIALIZAÇÃO DAS VARIÁVEIS *
;********************************************************************

CLRF PORTA ;LIMPA AS SAÍDAS DE PORTA E DE PORTB


CLRF PORTB

;********************************************************************
;* ROTINA PRINCIPAL *
;********************************************************************

MAIN
GOTO MAIN

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

END ;INSTRUÇÃO OBRIGATÓRIA - FIM DO PROGRAMA

34. Programa 01 – Acendendo um LED através de um botão

Descrição do programa

O nosso primeiro programa irá ler uma entrada (um botão) e irá acionar uma saída (um LED) caso a
entrada esteja no nível lógico 1. Ou seja, irá ligar um LED sempre que o botão estiver pressionado.

O botão estará ligado ao RA2 (por escolha do programador) e o LED estará ligado ao RB5 (igualmente
por escolha do programador).

Aula 02 Pág. 34
Criação do Fluxograma

Figura 15: Fluxograma do programa 01

Observamos que o sistema estará sempre verificando se o botão está pressionado ou não. Se estiver
pressionado, o sistema ligará o LED. Se não estiver, o sistema desligará o LED.

É imPortAnte observar que, como a execução das instruções é muito rápida, o usuário não irá perceber
que o sistema fica testando o botão para só depois tomar uma decisão de ligar ou não o LED. Para
termos uma idéia da velocidade de processamento do microcontrolador, se utilizarmos um oscilador de
4MHz este programa irá verificar se o botão está pressionado 167.000 vezes a cada segundo.

Implementação

;********************************************************************
;* CRIATRONICS - CENTRO DE ROBÓTICA, INTELIGÊNCIA E AUTOMAÇÃO *
;* CURSO DE MICROCONTROLADORES PIC I - INSTRUTORES: YGO BATISTA *
;* KOSME LUSTOSA *
;* ALUNO: YGO NETO BATISTA DATA: 20/08/2005 *
;********************************************************************

;********************************************************************
;* DESCRIÇÃO DO PROGRAMA: *
;* O SISTEMA IRÁ ACIONAR O LED LIGADO AO RB5 SEMPRE QUE O BOTÃO *
;* LIGADO AO RA2 ESTIVER PRESSIONADO (NÍVEL LÓGICO 1) *
;********************************************************************

;********************************************************************
;* DECLARAÇÃO DO ARQUIVO DE DEFINIÇÃO PADRÃO DA MICROCHIP *
;********************************************************************

#INCLUDE <P16F84.INC>

;********************************************************************
;* VETOR RESET DO SISTEMA *
;********************************************************************

ORG 0X00 ;ENDEREÇO INICIAL DE PROCESSAMENTO

INICIO
BSF STATUS,RP0 ;ALTERA PARA O BANCO 1
MOVLW B'11111111' ;ENTRADAS NO PORTA: TODAS
MOVWF TRISA ;SAÍDAS NO PORTA: -
MOVLW B'11011111' ;ENTRADAS NO PORTB: RB7:RB6,RB4:RB0
MOVWF TRISB ;SAÍDAS NO PORTB: RB5
BCF STATUS,RP0 ;ALTERA PARA O BANCO 0

Aula 02 Pág. 35
;********************************************************************
;* ROTINA PRINCIPAL *
;********************************************************************

MAIN ;LABEL DA ROTINA PRINCIPAL


BTFSS PORTA,2 ;TESTA O BOTÃO
GOTO DESL ;SE FOR 0 - DESVIA PARA DESL
GOTO LIGA ;SE FOR 1 - DESVIA PARA LIGA

DESL ;LABEL DESL


BCF PORTB,5 ;DESLIGA O LED
GOTO MAIN ;RETORNA PARA O INÍCIO DO PROGRAMA

LIGA ;LABEL LIGA


BSF PORTB,5 ;LIGA O LED
GOTO MAIN ;RETORNA PARA O INÍCIO DO PROGRAMA

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

END ;INSTRUÇÃO OBRIGATÓRIA - FIM DO PROGRAMA

Aula 02 Pág. 36
35. General Pupouse Register (GPR)

Para o próximo programa será necessário conhecer um pouco mais da memória do PIC. Como já
vimos na segunda aula, o PIC tem dois blocos de memória independentes, que podem ser
acessados simultaneamente:

 Memória de programa (Flash);

 Memória de dados (RAM);

E a memória de dados pode ser dividida para fins de estudo em dois blocos:

 Memória RAM para uso geral (GPR – General Pupose Registers);

 Registradores especiais (SFR – Special Function Registers).

Vamos estudar neste tópico os registradores para uso geral.

No PIC16F84A temos 68 registradores disponíveis, iniciando com o do endereço 0Ch (até o


endereço 4Fh), conforme a Figura 14, cada um registrador contendo 8 bits.

Estes registradores são disponibilizados para o programador para o armazenamento dos dados
necessários do sistema. Lembramos que todos os registradores são apagados quando o
microcontrolador é desligado ou reiniciado.

Um exemplo de utilização destes registradores é quando precisamos armazenar temporariamente


o número de latas que passaram por um sensor em uma fábrica e quantas destas latas estavam
danificadas. Após o armazenamento destes dois números na memória podemos fazer
comparações entre eles ou alguma outra função lógica ou aritmética.

No PIC, o bloco da programação que define quais os registradores serão utilizados durante a
execução do programa é o seguinte:

;********************************************************************
;* DEFINIÇÃO DAS VARIÁVEIS *
;********************************************************************

CBLOCK 0X0C ;ENDEREÇO INICIAL DA MEMÓRIA DE USO GERAL


W_TEMP ;REGISTRO TEMPORÁRIO PARA ARMAZENAMENTO DE
STATUS_TEMP ; W E STATUS DURANTE A INTERRUPÇÃO
CONTADOR_A ;REGISTRADOR AUXILIAR PARA GERAÇÃO
CONTADOR_B ; DE DELAYS
FLAG ;REGISTRADOR PARA DEFINIÇÃO DE FLAGS INTERNOS
TAMANHO_PE ;REGISTRADOR PARA ARMAZENAMENTO DO TAMANHO DO PÉ DO
CLIENTE
ENDC ;FIM DO BLOCO DE VARIÁVEIS

Neste exemplo definimos W_TEMP, STATUS_TEMP, CONTADOR_A, CONTADOR_B, FLAG e


TAMANHO_PE como registradores para uso geral e estes podem ser escritos ou lidos pelo
programa a qualquer momento.

A linha CBLOCK 0X0C indica que o primeiro registrador da lista (no exemplo, W_TEMP) será
armazenado no endereço 0Ch da memória de dados. Os demais registradores em seguida listados
serão armazenados nos endereços imediatamente após o endereço 0Ch.

O comando ENDC indica o fim do bloco de definições das variáveis.

Aula 03 Pág. 37
36. Delays

Os “sensores” e “atuadores” dos seres humanos, como a visão, por exemplo, não são tão rápidos
quanto o microcontrolador. Logo, se o microcontrolador quiser escrever num display de LCD uma
mensagem, ele tem que deixar a mensagem no display durante um tempo suficientemente grande
para que haja a compreensão pelos humanos do que está escrito no display antes que o
microcontrolador mude para uma outra mensagem. Por isso é que é necessário o microcontrolador
esperar um tempo (delay) antes de mudar de mensagem.

O mesmo ocorre com teclados. Quando nós teclamos, por mais rápido que seja o digitador, os
nossos dedos pressionam cada tecla por alguns milésimos de segundos (vamos supor 100ms).
Logo, o computador ou microcontrolador tem que esperar um pouco (delay) para poder ler
novamente o teclado e saber qual é a nova tecla que o usuário está pressionando.

Lembramos que enquanto o microcontrolador estiver alimentado e o oscilador estiver funcionando,


este estará sempre executando algum comando. O microcontrolador não pode simplesmente parar
de executar o programa por algum tempo (a exceção do modo “sleep”, que não estudaremos neste
curso). Para a criação deste primeiro tipo de delay que apresentaremos é necessário fazer com
que o microcontrolador fique executando algum comando repetidas vezes só para gastar o tempo
desejado.

Implementação

Antes de explicarmos melhor o programa é necessário conhecermos melhor uma nova instrução
do PIC.

37. Instrução DECFSZ

DECFSZ

Decrementa um registrador em uma unidade e pula a próxima linha caso o resultado do


decremento seja zero.

Sintaxe: DECFSZ f,d

Se o registrador f for 1 após um decremento, a próxima instrução será executada.

Se o registrador f for 0 após um decremento, a próxima instrução será descartada (pulada).

O resultado do decremento é armazenado em d.

Exemplo:

DECFSZ PACIENTES,F
GOTO INICIO
GOTO LIGA_SOM

O registrador PACIENTES será decrementado em uma unidade e o resultado armazenado no


próprio registrador PACIENTES (PACIENTES = PACIENTES - 1). Se após o decremento
PACIENTES for diferente de zero então o programa vai para INICIO. Caso contrário, se
PACIENTES for zero, o programa vai para LIGA_SOM.
Aula 03 Pág. 38
Implementação do delay

DELAY_INT
MOVWF CONTADOR_A ;INICIALIZA O CONTADOR_A COM O VALOR DE W
MOVLW .12
MOVWF CONTADOR_B ;INICIALIZA O CONTADOR_B
DECFSZ CONTADOR_B,F ;DECREMENTA O CONTADOR_B, CASO CONTADOR_B=0
GOTO $-1 ; O SISTEMA DECREMENTARÁ O CONTADOR_A
DECFSZ CONTADOR_A,F ; E RECARREGARÁ O CONTADOR_B, ATÉ QUE
GOTO $-5 ; CONTADOR_A SEJA IGUAL A 0
RETURN

No programa acima, inicialmente o CONTADOR_A é carregado com o valor de W e o


CONTADOR_B é carregado com o valor 12.

O CONTADOR_B em seguida irá decrementar e testar se é zero. Como o valor inicial é 12, após a
primeira execução de DECFSZ CONTADOR_B,F o valor de CONTADOR_B passará a ser 11 (que
é diferente de zero) e não haverá um pulo da próxima linha. Quando o comando GOTO $-1 é
executado, o ponteiro do PIC irá voltar uma linha e executará novamente a instrução DECFSZ
CONTADOR_B, F. Após 10 execuções deste comando o valor de CONTADOR_B será 1 e então
quando executado novamente o comando DECFSZ CONTADOR_B,F ocorrerá o pulo de uma
linha, passando o programa a executar a linha DECFSZ CONTADOR_A,F. Se CONTADOR_A for
diferente de zero após o decremento, o programa irá voltar 5 linhas e irá recarregar o valor 12 em
CONTADOR_B e repetirá todo o procedimento já descrito até então. O delay só irá se encerrar
quando, após decrementado, o CONTADOR_A for zero e a instrução RETURN for executada.

38. Instruções CALL e RETURN

CALL

Sintaxe: CALL k

Chama a sub-rotina representada por k (que é um endereço da memória de programa ou um nome


dado pelo usuário - label).

Antes de executar o desvio, o endereço de retorno (PC+1) é armazenado na pilha.

Exemplo:

CALL DELAY_INT

RETURN

Sintaxe: RETURN

Retorna de uma sub-rotina, recuperando o último endereço da pilha (gravado através da instrução
CALL).

Aula 03 Pág. 39
Exemplo:

No exemplo a seguir dois LEDs ficarão piscando.

PISCA_LED
BSF LED1
CALL DELAY_INT
BSF LED2
CALL DELAY_INT
BCF LED1
BCF LED2
CALL DELAY_INT
GOTO PISCA_LED

DELAY_INT
MOVLW .100
MOVWF CONTADOR_A ;INICIALIZA O CONTADOR_A COM O VALOR DE W
MOVLW .100
MOVWF CONTADOR_B ;INICIALIZA O CONTADOR_B
DECFSZ CONTADOR_B,F ;DECREMENTA O CONTADOR_B, CASO CONTADOR_B=0
GOTO $-1 ; O SISTEMA DECREMENTARÁ O CONTADOR_A
DECFSZ CONTADOR_A,F ; E RECARREGARÁ O CONTADOR_B, ATÉ QUE
GOTO $-5 ; CONTADOR_A SEJA IGUAL A 0
RETURN

39. Diretriz #DEFINE

Sintaxe: #DEFINE <nome> [<texto>]

Sempre que o compilador encontrar <nome>, ele será substituído pelo texto associado a ele.

Exemplo:

#DEFINE LED PORTB,3

A aplicação deste recurso ficará clara no próximo programa que desenvolveremos.

40. Programa 02 – Piscando um LED ao pressionar um botão

Nesta prática o aluno deverá fazer um sistema que pisque um LED com a freqüência de 1Hz ao
pressionar um botão.

41. Programa 03 – Fechadura eletrônica

Nesta prática o aluno desenvolverá um sistema para acionar um LED se, e somente se, a seguinte
seqüência for pressionada: RA0, RA3, RA2, RA2 e RA1.

Caso qualquer botão seja pressionado fora da seqüência o sistema deverá reiniciar
automaticamente, bem como se houver um tempo maior que 10s entre o pressionamento de dois
botões.

O sistema deverá ainda acender um LED caso o usuário acerte a seqüência correta.

Aula 03 Pág. 40
42. Os Motores e o PIC

Nessa terceira aula iremos recordar de conceitos básicos de eletrônica sobre princípio de
funcionamento de motores, acionamento de motores e modulação PWM.

Não podemos imaginar a robótica sem os motores. Em geral, para girar uma roda, posicionar uma
câmera ou mesmo movimentar um braço robotizado são utilizados motores.

Porém, há diversos tipos de motores e, cada um, com finalidades e mecanismos de acionamento
diferente.

Em geral, para se acionar um motor, é necessário que o hardware esteja devidamente projetado
para isto uma vez que os motores consomem bastante corrente – alta demais para o PIC conseguir
suprir. Logo, nos próximos tópicos, explicaremos como funcionam os motores, como o PIC deve
operar para cada tipo de motor e como o hardware deve ser projetado para estes tipos de motores.

43. Tipos de motores

Em robótica, é muito comum o uso de três tipos de motores:

 Motores DC (escovados);

 Motores de Passo;

 Servomotores.

Nesse curso iremos abordar apenas os motores DC.

44. Motores DC

São os motores mais simples do ponto de vista elétrico e são também chamados de motores CC
ou de corrente contínua. Estes motores são largamente utilizados em aplicações que variam desde
brinquedos até a movimentação de uma esteira industrial. Os motores DC escovados são baratos,
fácil de controlar e estão disponíveis em diversos tamanhos e formas.

Princípio de funcionamento

O motor DC é composto por um ímã permanente e um eletroímã acoplado no eixo do motor. Ao se


energizar a bobina do eletroímã, o eixo do motor irá girar de modo que o norte da bobina encontre
o sul do ímã permanente, bem como o sul da bobina encontre o norte do ímã permanente.

Quando isto ocorre, devido detalhes de construção do motor, há uma inversão na polaridade da
tensão elétrica aplicada na bobina do eletroímã. O que antes era norte, agora é sul e,
analogamente, o que antes era sul, agora é norte. Com isso o motor continuará girando para mais
uma vez tentar aproximar o norte da bobina com o sul do ímã permanente e o sul da bobina com o
norte do ímã permanente.

Mais uma vez, quando o norte da bobina encontra o sul do ímã permanente e o sul da bobina
encontra o norte do ímã permanente, haverá uma nova inversão na polaridade da tensão aplicada

Aula 03 Pág. 41
na bobina fazendo com que o motor continue girando e repetindo mais uma vez o ciclo. Podemos
ver as principais partes do motor DC na Figura 16.

Figura 16: Princípio de funcionamento dos motores DC

No esquema do motor visto anteriormente é possível perceber que a pilha está ligada diretamente
no motor, sem elementos de chaveamento. Porém, se o microcontrolador quiser ligar ou desligar o
motor, será necessário uma eletrônica de acionamento de motor, pois, a saída do PIC não pode
alimentar o motor diretamente devido a baixa corrente que o PIC consegue suprir (ocasionaria a
queima do microcontrolador).

Eletrônica de acionamento

O Criatronics sugere uma montagem utilizando transistores MOSFET canal-N de potência para
chaveamento de cargas. Na Figura 17 pode-se observar o esquema elétrico da ligação de um
pequeno motor ao PIC. O diodo D1 tem a função de proteger o circuito contra tensões indesejadas
que surgem no momento do chaveamento do motor devido a indutância do mesmo.

Figura 17: Eletrônica de acionamento do motor DC

Para motores maiores é necessária a utilização de um DRIVER MOSFET no lugar dos resistores
R1 e R2 para que este possa carregar e descarregar o capacitor do PortA do MOSFET de maneira
adequada.
Aula 03 Pág. 42
Ponte H

Se for desejável girar o motor em dois sentidos e se só tivermos uma única fonte de alimentação
(como uma bateria, por exemplo), será necessária uma montagem mais elaborada e o dispositivo
necessário para tal é denominado Ponte H. Neste caso a corrente deverá fluir no motor em ambos
sentidos. Na Figura 18 pode-se ver o esquema elétrico de uma Ponte H.

Figura 18: Ponte H

No esquema percebemos que estão sendo utilizados DRIVERS MOSFET e transistores MOSFET
de potência sugerindo que o motor utilizado é de grande porte. Basicamente observamos que o
esquema elétrico é composto por quatro blocos de acionamento no qual para que o motor gire é
necessário o acionamento de dois destes blocos.

Não entraremos mais a fundo na eletrônica de potência envolvida na ponte H, pois, não é o
objetivo deste curso o desenvolvimento de sistemas de potência, e sim, o controle dos mesmos.

Modos de operação da ponte H

Para que um motor gire em um sentido é necessário acionar pelo PIC as saídas CTRL1 e CTRL4.
Para que o motor gire no sentido oposto ao anterior é necessário o acionamento das saídas CTR3
e CTRL2, conforme mostrado na Tabela 4.

Tabela 4: Modos de operação da ponte H

A principal preocupação que o programador deve ter em relação a ponte H é de não ligar
simultaneamente o Q1 e Q2 ou então o Q3 e Q4, pois, nestes casos, haverá uma alta corrente
passando pelos transistores ocasionando a queima dos transistores que foram ligados
erroneamente.

Aula 03 Pág. 43
45. Controle do torque em motores DC

A variação do torque em motores DC pode ser realizada variando a tensão média no motor. Esta
variação pode ser realizada de duas formas:

 Variando linearmente a tensão através de transistores bipolares de potência ou qualquer


outra eletrônica de potência (analogicamente - não estudado neste curso);

 Chaveando o motor rapidamente de modo a criar uma tensão média em seus terminais
(digitalmente – através do PWM);

Neste curso iremos explorar o controle do torque em motores DC a partir do PWM bastando
apenas variar a tensão média gerada pelo PWM para que o torque varie.

46. O PWM – Pulse Width Modulation

Este tipo de modulação é extremamente utilizada na robótica. Com ele podemos controlar torque
em motores DC, posição de servomotores (que será estudado na próxima aula), transmitimos
dados entre microcontroladores, interpretamos a distância entre um sensor ultrasom e um
obstáculo, etc.

O PWM consiste em modular um sinal de acordo com a largura de pulsos, ou seja, a largura do
pulso em um trem de pulsos irá carregar consigo alguma informação do sinal que se deseje
transmitir. Por exemplo, para o sensor ultrasom a largura do pulso em milisegundos emitida pelo
sensor pode representar, em centímetros, a distância do sensor ao obstáculo. Ou seja, se o PIC
recebe um sinal com largura de pulso de 10ms, isto poderá ser interpretado pelo PIC como se um
obstáculo estivesse a 10cm de distância do sensor ultrasom.

v (V)

TL TH
t (s)
T
Figura 19: Um sinal modulado em PWM

O Duty Cicle (D) consiste na razão entre o tempo alto (TH) e o período do sinal (T). Logo D = TH /
T. Quando TH = T temos D = 1, logo o Duty Cicle é de 100%, ou seja, o sinal está sempre em 1.
Quando TH = 0 temos D = 0, logo o Duty Cicle é de 0%, ou seja, o sinal está sempre em 0. O Duty
Cicle irá representar a tensão média do sinal PWM.

Em controle de LEDs, por exemplo, se aplicarmos um sinal com D = 70% nos LEDs, isto
ocasionará que estes dispositivos irão emitir luz com uma luminosidade = 70% da luminosidade
máxima, ou seja, pode-se variar a luminosidade dos LEDs linearmente com o Duty Cicle.
Aula 03 Pág. 44
O mesmo conceito de tensão média pode ser aplicado a motores DC para variação do torque,
como visto anteriormente. Observação: o PWM pode ser aplicado nas entradas da Ponte H para
fazer o motor variar o torque.

47. Programa 04 – Controlando um motor DC

Nesta prática deve ser feito um programa para controlar um motor através de uma Ponte-H com as
seguintes características:

 O sistema deverá esperar que o usuário pressione um botão para que o motor comece a
girar em sentido horário;

 Após a ativação do motor, este deverá permanecer acionado durante 10 segundos;

 Após os 10s, o motor deverá inverter o sentido de rotação e girar no sentido anti-horário
durante 5s;

 Após este tempo, o motor deverá frear;

 E, finalmente, esperar que o usuário pressione outra vez o botão.

O fluxograma e o código fonte deverão ser apresentados na próxima aula.

48. Módulo TMR0

Na aula 1 vimos que, dentre os módulos periféricos auxiliares que o PIC16F84 possui, está o
módulo TMR0.

Como visto anteriormente, o módulo TMR0 é um timer/contador que possui as seguintes


características:

 Timer/contador de 8 bits;

 Pode ser acessado para leitura e escrita pelo usuário;

 Pode ser aplicado um “prescaler”;

 Pode ser ativado através de um clock externo;

 Pode gerar uma interrupção em seu overflow;

 Pode ser incrementado na borda de subida ou decida.

Todos estas características serão melhor vistas neste capítulo.

Fisicamente, o timer/contador é um registrador de 8 bits que está continuamente sendo


incrementado, paralelamente e independentemente da execução do programa do microcontrolador.
Com isto podemos medir tempo ou contar pulsos no RA4/T0CKI no mesmo momento em que
executamos o programa principal.

O timer/contador incrementará de 0 até atingir 255. No próximo ciclo de instrução, o timer/contador


irá estourar e retornar a 0. Se soubermos quanto tempo passa para o timer/contador estourar e
contarmos quantas vezes o estouro ocorreu, poderemos medir o tempo que quisermos. Ou seja,
Aula 03 Pág. 45
multiplicando quantas vezes ocorreu o estouro (overflow) pelo tempo que o timer/contador leva
para estourar, teremos o tempo total que se pretende medir.

Sempre que ocorrer uma transição de 255 para 0 (estouro), o bit T0IF do registrador INTCON é
colocado em “1”. Se as interrupções estiverem habilitadas, como veremos ainda nesta aula, é
possível tirar proveito das interrupções geradas e da rotina de tratamento de interrupção. Cabe ao
programador zerar o bit T0IF quando desejado.

Além do oscilador do clock do microcontrolador, o contador/temporizador pode também ser


incrementado através de um clock externo ligado ao pino RA4/T0CKI. A escolha entre uma destas
opções (clock do oscilador ou clock externo) é feita no bit T0CS, do registrador OPTION. Se o bit
T0CS estiver em “0”, o TMR0 será incrementado a partir do clock do ciclo de instrução interno do
PIC. Se o bit T0CS estiver em “1”, o TMR0 será incrementado a partir da transição no pino
RA4/T0CKI. Se for selecionado o clock externo (através do RA4/T0CKI), é possível definir se o
contador irá ser incrementado na borda de subida ou de decida do sinal em RA4/T0CKI através do
bit T0SE de OPTION.

Se T0SE estiver em “0”, o incremento do TMR0 ocorrerá na mudança baixo para alto do pino
RA4/T0CKI. Se T0SE estiver em “1”, o incremento do TMR0 ocorrerá na mudança de alto para
baixo do pino RA4/T0CKI.

O valor atual do contador/timer pode ser modificado pelo programador a qualquer momento.

PRESCALE

O prescale é um contador interno (inacessível ao programador) do PIC que permite um incremento


mais lento do TMR0. Ou seja, se o prescale estiver selecionado em 1:8, isto significa que o TMR0
só irá ser incrementado a cada 8 ciclos de instrução.

A configuração do prescale é feito no PSA e PS2:PS0 do registrador OPTION.

Figura 20: Registrador OPTION

O bit PSA indica se o prescale vai ser aplicado no TMR0 ou no WDT. Não iremos estudar a fundo o
WDT neste curso, sendo necessário deixar este bit em “0” para que o prescale seja aplicado ao
TMR0. Se colocarmos em “1”, o prescale será aplicado ao WDT e o TMR0 ficará sem prescale.

A configuração da razão entre o incremento do TMR0 e o clock de instruções é realizado através


dos bits PS2:PS0 conforme a tabela a seguir.

Aula 03 Pág. 46
Tabela 5: Configuração do PS2:PS0 para prescale

49. Programa 05 – Sistema aquecimento de água

Nesta prática o aluno deverá, através de PWM, acionar uma resistência elétrica para aquecer a
água de um copo e observar como a variação do duty cicle irá modificar o tempo de aquecimento
da água.

Aula 03 Pág. 47
50. Interrupções

As interrupções são um mecanismo que o microcontrolador possui e que torna possível responder
a alguns acontecimentos no momento em que eles ocorrem, qualquer que seja a tarefa que o
microcontrolador esteja a executar no momento. É imprescindível que isto seja possível por que
alguns eventos do mundo real precisam ser tratados no exato momento em que eles ocorrem.

Geralmente, cada interrupção muda o fluxo de execução do programa, executando imediatamente


após o evento que gerou a interrupção uma subrotina para tratamento desta interrupção.

Após o tratamento da interrupção, ou seja, término da subrotina de tratamento, o microcontrolador


deverá voltar ao ponto onde a execução foi interrompida.

No PIC16F84 temos 4 tipos de interrupções:

 Interrupção externa no pino RB0/INT;

 Interrupção por overflow no TMR0;

 Interrupção por mudança nos pinos RB7:RB4

 Interrupção com finalização de gravação na memória EEPROM.

Interrupção externa no pino RB0/INT

A interrupção externa no pino RB0/INT é desencadeada por um impulso ascendente (se o bit
INTEDG = 1 no registro OPTION,6), ou por um impulso descendente (se INTEDG = 0). Quando o
sinal desejado para gerar a interrupção surge no pino INT, o bit INTF do registro INTCON é posto a
‘1’. O bit INTF (INTCON,1) tem que ser limpo na rotina de interrupção, afim de que a interrupção
não possa voltar a ocorrer de novo, quando do regresso ao programa principal. Esta é uma parte
importante do programa e que o programador não pode esquecer, caso contrário o programa irá
constantemente saltar para a rotina de interrupção. A interrupção pode ser desabilitada quando
colocamos ‘0’ no bit de controle INTE (INTCON,4).

Interrupção por overflow no TMR0

O estouro do timer/contador TMR0 (passagem de FFh para 00h) vai setar o bit TOIF (INTCON,2).
Esta é uma interrupção muito importante, uma vez que, muitos problemas da vida real podem ser
resolvidos utilizando esta interrupção. Um exemplo é o da medição de tempo. Se soubermos de
quanto tempo o contador precisa para completar um ciclo de 00h a FFh, então, o número de
interrupções ocorridas multiplicado por esse intervalo de tempo irá nos dar o tempo total decorrido.

Esta interrupção pode ser desabilitada colocando ‘0’ no bit T0IE (INTCON,5).

Interrupção por mudança nos pinos RB7:RB4

Qualquer variação em qualquer um das 4 portas de entrada do PORTB (bits 4 a 7), põe “1” no
RBIF (INTCON,0). A interrupção ocorre, PortAnto, quando os níveis lógicos em RB7, RB6, RB5 e
RB4 do PORTB, mudam do valor lógico “1” para o valor lógico “0” ou vice-versa.

Aula 04 Pág. 48
Para que estes pinos detectem as variações, eles devem ser definidos como entradas. Se qualquer
um destes for definido como saída, nenhuma interrupção será gerada quando surgir uma variação
do nível lógico. Esta interrupção pode ser habilitada/inibida colocando ‘1’ ou ‘0’ o bit RBIE do
registrador INTCON (INTCON,3).

Interrupção com finalização de gravação na memória EEPROM

Nós não estudaremos esta interrupção por que não utilizaremos a memória EEPROM do PIC neste
curso.

Registrador INTCON

O registrador especial que controla as interrupções é o INTCON.

Figura 21: Registrador INTCON

Bit 7 - GIE (Habilita todas as interrupões)

Este bit, quando em “1”, habilita as interrupções que serão selecionadas nos demais bits do
registrador INTCON.

Se este bit estiver em “0”, todas as interrupções serão desabilitadas.

Bit 5 - TOIE (bit de habilitação de interrupção por transbordo de TMR0)

Este bit habilita/desabilita a interrupção por estouro no contador TMR0.

Se o bit estiver em “1” = interrupção por estouro do TMR0 habilitada

Se o bit estiver em “0” = interrupção por estouro do TMR0 desabilitada.

Bit 4 - INTE (bit de habilitação da interrupção externa no pino RB0/INT)

Este bit que permite que uma interrupção externa no PortA RB0/INT seja tratada.

Se este bit estiver em “1” = interrupção externa habilitada;

Se este bit estiver em “0” = interrupção externa desabilitada.

Bit 3 - RBIE (bit de habilitação de interrupção por variação nas portas RB7:RB4)

Este bit permite que a interrupção por variação dos níveis lógicos nos pinos 4, 5, 6 e 7 do PORTBB
ocorra.

Se RBIE estiver em “1” = a interrupção por mudança no nível lógico no RB7:RB4 estará habilitada;

Se RBIE estiver em “0” = a interrupção por variação dos níveis lógicos em RB7:RB4 estará
desabilitada.

Aula 04 Pág. 49
Bit 2 - TOIF (Flag de interrupção por transbordo de TMR0).

Este bit indica que houve um estouro em TMR0.

Se este bit estiver em “1” = o contador mudou a contagem de FFh para 00h;

Se este bit estiver em “0” = o contador não estourou.

Para que esta interrupção seja detectada, o programador deve ter a preocupação de limpar este bit
antes de ligar o TMR0.

Bit 1 - INTF (flag que indica a ocorrência da interrupção externa em INT/RB0)

Este bit indica a ocorrência de uma interrupção externa.

Se o bit estiver em “1” = ocorreu uma interrupção externa;

Se o bit estiver em “0” = não ocorreu uma interrupção externa;

Este bit dever ser limpo pelo programador no tratamento da interrupção para que o programa não
volte para a interrupção imediatamente após o término do tratamento da interrupção.

Bit 0 - RBIF (flag que indica variação no porto B) Bit que informa que houve mudança nos níveis
lógicos nos pinos 4, 5, 6 e 7 do porto B. 1= pelo menos um destes pinos mudou de nível lógico 0=
não ocorreu nenhuma variação nestes pinos.

51. Programa 06 – Utilizando interrupção de tempo para


geração do PWM

Nesta prática deve ser feito um programa, similar ao Programa 05, substituindo a técnica de delay
utilizada anteriormente por interrupção no TMR0.

Aula 04 Pág. 50