m09 - o que é um microcontrolador

50
Aula 01 Pág. 1 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.

Upload: glauberviero

Post on 30-Jun-2015

5.798 views

Category:

Documents


19 download

TRANSCRIPT

Aula 01 Pág. 1

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. 2

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

microcontrolador foi projetado para ter tudo num só CI1. 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. 3

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)

proporciona um set2 de apenas 35 instruções para a maioria dos modelos (família MidRange3), 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. 4

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 externoOSC2 / CLKOUT 15 Saída do oscilador / Saída para clock externo/MCRL 4 Master Clear ResetRA0 17 PortA - Porta bi-direcional de entrada e saídaRA1 18RA2 1RA3 2

RA4 / T0CKI 3pode ser selecionado como entrada de clock para o TMR0. A saída é do tipo "open drain"

RB0 / INT 6 PortB - Porta bi-direcional de entrada e saídaRB1 7 Estas portas podem ser configuradas individualmenteRB2 8 com pull-ups nas entradasRB3 9 RB0 pode também ser configurada como entradaRB4 10 para interrupção externaRB5 11 RB4:RB7 podem ser configurados como entradaRB6 12 para interrupção por mudança de nívelRB7 13Vss 5 Referência do TerraVdd 14 Alimentação positiva

Aula 01 Pág. 5

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. 6

Podemos observar que a saída (I/O pin) está conectado a dois transistores mosfet4 e a um buffer TTL5

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

devemos ter atenção ao utilizar este pino como saída, pois este é do tipo “open drain”6 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. 7

RA4

Q1D1

LED1

R11k

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

PortB (RB7:RB0)

Uma característica interessante do PortB é a possibilidade da configuração de um “pull-up”7 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. 8

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. 9

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

no funcionamento sendo necessário um maior esforço no design da PCI8.

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. 10

Tabela 2: Capacitores recomendados para utilização com o cristal

Modo Frequência Capacitores

32 kHz 68 - 100 pF200 kHz 15 - 33 pF100 kHz 100 - 150 pF2 MHz 15 - 33 pF4 MHz 15 - 33 pF4 MHz 15 - 33 pF20 MHz 15 - 33 pF

LP

XT

HS

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. 11

9. Resets

Estudaremos neste tópico três tipos de Resets9 que o PIC diferencia:

Power-on Reset;

MCRL Reset;

WDT Reset.

Não serão vistos os resets MCRL e WDT ocorridos durante o modo SLEEP10 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. 12

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

prescaler11). 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. 13

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. 14

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

Para gravar um programa feito no MPLAB12 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. 15

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

fontes e bibliotecas, debugger13 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. 16

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. 17

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 02 Pág. 18

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. 19

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. 20

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. 21

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. 22

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:

SPI (Serial Peripheral Interface)16;

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. 23

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. 24

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. 25

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

seguinte cálculo: nº de combinações = 2n. 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. 26

Tabela 3: Equivalências entre sistemas de numeração

Binário Hexadecimal Decimal

0000 0 00001 1 10010 2 20011 3 30100 4 40101 5 50110 6 60111 7 71000 8 81001 9 91010 A 101011 B 111100 C 121101 D 131110 E 141111 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. 27

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. 28

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. 29

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. 30

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. 31

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. 32

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. 33

;******************************************************************** ;* 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. 34

;******************************************************************** ;* 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. 35

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. 36

;******************************************************************** ;* 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 03 Pág. 37

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. 38

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. 39

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. 40

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. 41

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. 42

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. 43

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. 44

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.

t (s)

v (V)

TL

T

TH

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. 45

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. 46

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. 47

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 04 Pág. 48

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. 49

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. 50

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.