Prévia do material em texto
INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECOLOGIA DO CEARÁ
TECNOLOGIA EM MECATRÔNICA INDUSTRIAL
Programação de Microcontroladores PIC em BASIC
para Iniciantes: Utilizando o Proton IDE
Marcelo Vieira do Nascimento de Freitas
Limoeiro do Norte-CE
Março de 2015
Prefácio
Este trabalho é destinado a proporcionar uma noção básica sobre programação de
microcontroladores PIC em linguagem BASIC. Elaborado na disciplina de Projeto Social tem como
objetivo final a inclusão social daqueles que iniciam a aprendizagem na programação e utilização de
microcontroladores PIC em linguagem BASIC. Será discutido questões básicas de hardware,
software e assuntos correlacionados.
A princípio será abordado conceitos sobre softwares utilizados na programação, compilação
e simulação de programações. Em seguida será mostrado conceitos sobre microcontroladores PIC,
em especial o PIC16F877A, que será o utilizado para simulações. Dado o conhecimento adquirido
anteriormente se fará necessário a explanação de alguns conceitos sobre eletroeletrônica, assim
auxiliando na melhor compreensão das estruturas utilizadas para o funcionamento correto dos
microcontroladores. Por último será abordado a estrutura de programação em BASIC, mostrando
quais são as principais funções e como elas funcionam, mostrando aplicações e exemplos.
O software de programação e compilação utilizado para programação em Basic será o Proton
IDE. Para a simulação será utilizado o ISIS Proteus.
Vale ressaltar que apesar de apresentar conceitos básicos sobre hardware o foco deste
trabalho será a apresentação de modo básico da linguagem de programação BASIC aplicado em
microcontroladores PIC.
Sumário
1 - SOFTWARES UTILIZADOS .............................................................................................................. 1
1.1 – ISIS PROTEUS ............................................................................................................................... 1
1.2 – PROTON IDE ................................................................................................................................. 1
1.3 – GRAVAÇÃO E COMPILAÇÃO DA PROGRAMAÇÃO ............................................................... 2
1.3.1 - Gravação de Programas Fisicamente ..................................................................................... 2
1.3.2 – Gravação de Programas por simulação ................................................................................. 3
2 - O PIC 16F877A ..................................................................................................................................... 4
3 - CONCEITOS BÁSICOS SOBRE ESTRURAS INTERNAS DOS MICROCONTROLADORES .... 7
3.1 - Memórias........................................................................................................................................ 7
3.2- Unidades de memória ..................................................................................................................... 7
3.3 – Memória de Programa (FLASH) .................................................................................................. 8
3.4 – Memória de Dados (RAM) ............................................................................................................ 8
3.5 - Registo ............................................................................................................................................ 8
3.6 - SFR – Registo de Função Especial ................................................................................................. 8
3.7 - Portas de Entrada/Saída – I/O ....................................................................................................... 9
3.8 - Interrupções ................................................................................................................................... 9
3.9 - CPU – Unidade Central de Processamento ................................................................................... 9
3.10 - Oscilador ...................................................................................................................................... 9
3.11 - Arquitetura Interna ....................................................................................................................10
4 - CONCEITOS DE ELETRÔNICA ......................................................................................................11
4.1 – Oscilador Externo ........................................................................................................................11
4.2 – Estado Lógico de pinos I/O ..........................................................................................................12
4.3 – Optoacopladores ...........................................................................................................................12
4.4 - PWM .............................................................................................................................................13
4.5 – Analógico x Digital .......................................................................................................................14
5 – BASIC: PRINCIPAIS COMANDOS E SUAS ESTRUTURAS NO PROTON IDE .........................15
6 – EXEMPLOS E APLICAÇÕES ..........................................................................................................22
6.1 – Primeiros Programas com o PIC 16F877A ..................................................................................22
6.2.1 – Projeto 1: Fazendo um LED piscar. .........................................................................................23
6.2.2 – Projeto 2: Ligar e Desligar 2 LEDs alternadamente. ................................................................24
6.2.3 - Projeto 3: Fazer uma contagem binaria começando com 0, 1 e depois com potencias de 2 (2x) até
128......................................................................................................................................................25
6.2.4 – Projeto 4: Utilizando botões nas entradas para acionar saídas. Utilizando as instruções IF –
THEN. ................................................................................................................................................26
6.2.5 - Projeto 5: Contagem de 0 a 9 com display de 7 segmentos. ......................................................28
6.2.6 - Projeto 6: Utilizando o Display de Cristal Líquido (LCD). .......................................................30
6.2.7 - Projeto 7: Utilizando conversor Analógico/Digital (A/D). ........................................................34
6.2.8 - Projeto 8: Utilizando Sensor de Temperatura para Medições. ...................................................42
6.2.9 – Projeto 9: Acionamento de Servo-Motores. .............................................................................44
6.2.10 – Projeto 10: Usando o PWM. .................................................................................................47
7 – REFERENCIAS BIBLIOGRÁFICAS ...............................................................................................49
1
1 - SOFTWARES UTILIZADOS
1.1 – ISIS PROTEUS
O ISIS Proteus é um software da linha Proteus ASM capaz de simulações de diversos
componentes/equipamentos eletroeletrônicos, adotando simbologias destes. De grande utilidade para
aqueles que desejam realizar testes em elaborações de circuitos, auxilia na observação de
características de funcionamento, parâmetros e possíveis defeitos de projeto.Este software será utilizado para a simulação de circuitos e programação do PIC, ajudando
assim na observação do funcionamento destes e ainda em possíveis erros.
Figura 1: Área de Trabalho do ISIS Proteus.
1.2 – PROTON IDE
O Proton IDE é um programador de microcontroladores PIC muito simples e eficiente
baseado na linguagem de programação BASIC.
O software é poderoso a ponto de Escrever, Depurar e Compilar programas em um único
ambiente de trabalho, ou seja, é composto por uma área de edição de texto onde se fará a elaboração
e utilização da linguagem de programação BASIC para obtenção de algoritmos que serão inseridos
no PIC, a Depuração é consiste na procura de erros ou falhas na programação que são indicadas nas
linhas de comando do algoritmo e visualizadas na tela de trabalho do editor de texto para que se possa
ser corrigido pelo programador e o Compilador nada mais é que uma ferramenta de conversão de
linguagem de programação onde exclusivamente no Proton IDE se faz da linguagem BASIC para
linguagem de máquina e assim possa ser inserido no PIC.
2
Figura 2: Área de trabalho do Proton IDE.
1.3 – GRAVAÇÃO E COMPILAÇÃO DA PROGRAMAÇÃO
1.3.1 - Gravação de Programas Fisicamente
Para se carregar um programa no PIC, tem-se que usar um Gravador Programador de PIC.
Porém existe uma maneira de fazer está gravação sem a necessidade de sempre ter que dispor de um
Gravador. Isto se faz usando um bootloader.
O bootloader é um pequeno programa que roda ao ligar o microcontrolador, fazendo tarefas
de inicialização do sistema e depois rodando o programa principal. Além disso, o bootloader pode ser
usado para gravar o próprio PIC através da linha série RS232 dado que esse pequeno programa
controla a comunicação com o PC e transfere a informação recebida para a memória de programa do
PIC.
Figura 3: Gravador de PIC USB (40zif).
A gravação da programação feita no Proton IDE para PIC, utilizando o Programador ou a
comunicação RS232 (conexão serial), se dá pela opção Compiler and Program ou pela tecla F10.
O software fará a depuração do programa a procura de algum erro na elaboração, se não encontrado
nenhum erro um arquivo hexadecimal será gerado pelo compilador na pasta fonte onde o programa
foi salvo.
3
Ao conectar o PIC à alimentação e ao cabo de gravação de dados e em seguida resetar o PIC,
o programa é gravado e executado pelo mesmo.
Figura 4: Gravação de programação no PIC.
1.3.2 – Gravação de Programas por simulação
Uma forma de visualizar o funcionamento das instruções feitas no Proton IDE quando
introduzidas no PIC é a simulação virtual. Para isso utilizaremos o ISIS Proteus.
A simulação no ISIS Proteus se dá pela introdução do código hexadecimal no PIC virtual,
presente na biblioteca do simulador. Para gerar esse código hexadecimal é só clicar em Compile no
Proton IDE ou F9. Assim o código será gerado na pasta fonte onde o programa está salvo, ‘nome.hex’.
Figura 5: Gerando arquivo hexadecimal do programa.
Após gerar arquivo hexadecimal do programa e com o PIC introduzido no ISIS Proteus, é
só dá um duplo clique no componente e na linha “Program File:” clica no ícone de uma ‘pasta’ e
indicar o caminho do arquivo hexadecimal referente ao programa que se quer simular.
Figura 6: Inserindo arquivo hexadecimal no PIC virtual do ISIS Proteus.
4
2 - O PIC 16F877A
A escolha do microcontrolador PIC 16F877A se dá pelo fato de tal componente abranger
todas as características dos demais componentes da família PIC de modo que ao aprender a utiliza-lo
lhe dará meios de utilizar os demais.
De modo geral os PIC são uma família de microcontroladores desenvolvido e fabricado pela
Companhia Microchip Technologies Inc. De certo modo podemos comparar esses dispositivos a um
computador, porém bem menores, dado que assim como estes possuem memória de programa,
memória RAM entre outras coisas semelhantes. Dada suas características de funcionamento se pode
assemelha-lo ao coração dos circuitos controlados, ou seja, o microcontrolador é o responsável pela
operação de controle de todos os processos de um dado circuito eletrônico baseado nas instruções e
rotinas que definem funções de controle.
Microcontroladores x Microprocessadores: apesar de funcionamento semelhantes no
funcionamento são diferentes em vários aspectos construtivos. Para se usar um microprocessador
vários outros componentes externos devem ser adicionados, memória e componentes de envio e
recebimento de dados. Em seu projeto o microcontrolador foi confeccionado para se ter tudo num só
equipamento, não necessitando de componentes externos para seu funcionamento.
A elaboração de projetos com microcontroladores requer um estudo prévio da estrutura do
hardware a que se fará necessário para a confecção de programas e com isso saber qual será a função
especifica de cada pino, qual dos Portes I/O (IN/OUT) será utilizado para que possam ser
configurados de maneira correta e etc. Estes detalhes servirão para a correta utilização e controle de
dispositivos como Botões, LCD, teclados, motores de passo, LEDs, servomotores e outros.
Figura 7: PIC 16F877A com a nomenclatura de seus pinos (funções).
Algumas características do componente são descritas abaixo.
Microcontrolador de 40 pinos;
Via de programação com 14 bits e 35 instruções;
33 portas configuráveis como entrada ou saída;
15 interrupções disponíveis;
5
Memória de programação E²PROM FLASH, que permite a gravação rápida do
programa diversas vezes no mesmo chip, sem a necessidade de apaga-lo por meio de
luz ultravioleta;
Conversores analógicos de 10 bits (8x) e comparadores analógicos (2x);
Para o melhor entendimento da identificação dos pinos do PIC será mostrado abaixo uma
tabela com o significado de cada nomenclatura.
Tabela 1: Identificação dos pinos e PORTs do PIC 16F877A
Nome do Pino
Nº
Pino
I/O/
P
Tipo Descrição
OSC1/CLKIN 13 I
ST/
CMOS(4)
Entrada para cristal.
Entrada para osciladores externos. (híbridos ou RC)
OSC2/CLKOU
T
14 O -
Saída para cristal. Os cristais ou ressonadores devem ser
ligados ao OSC1 e OSC2.
Saída com onda quadrada em ¼ da frequência imposta em
OSC1 quando em modo RC. Essa frequência equivale aos
ciclos de máquina internos.
MCLR/Vpp 1 I/p ST
Master Clear (reset) externo. O microcontrolador só
funciona quando este pino encontra-se em nível alto.
Entrada para tensão de programação (13V)
Vss 12/3 p - GND
Vdd 11/3 p - Alimentação positiva
RA0/AN0
RA1/AN1
RA2/AN2/
Vref/C Vref
RA3/AN3/VREF+
RA4/T0CKI/
C1OUT
RA5/SS/AN4/
C2OUT
2
3
4
5
6
7
I/O
I/O
I/O
I/O
I/O
I/O
TTL
TTL
TTL
TTL
ST
TTL
PORTA (I/Os digitais bidirecionais e sistema analógico):
RA0: I/O digital ou entrada analógica AN0.
RA1: I/O digital ou entrada analógica AN1.
RA2: I/O digital ou entrada analógica AN2 ou tensão
negativa de referência analógica.
RA3: I/O digital ou entrada analógica AN3 ou tensão
positiva de referência analógica.
RA4: I/O digital (quando saída é open drayn, isto é, não
consegue impor nível alto) ou entrada externa do contador
TMR0 ou saída do Comparador 1.
RA5: I/O digital ou entrada analógica AN4 ou habilitação
externa (Slave select) para comunicação SPI ou saída do
comparador 2.
RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGCRB7/PGD
33
34
35
36
37
38
39
40
I/O
I/O
I/O
TTL/ST
TTL
TTL
TTL
TTL
TTL
TTL/ST
TTL/ST
PORTB (I/Os digitais bidirecionais). Todos os pinos
deste PORT possuem pull-up interno que podem ser
ligados/desligados pelo software:
RB0: I/O digital com interrupção externa.
RB1: I/O digital.
RB2: I/O digital.
RB3: I/O digital ou entrada para programação em baixa
tensão (5V).
RB4: I/O digital com interrupção por mudança de estado.
RB5: I/O digital com interrupção por mudança de estado.
RB6: I/O digital com interrupção por mudança de estado
ou clock da programação serial ou pino de
in-circuit debugger.
RB7: I/O digital com interrupção por mudança de estado
Ou data da programação serial ou pino de in-circuit
Debugger.
6
RC0/T10SO/
T1CKI
RC1/T10SI/
CCP2
RC2/CCP1
RC3/SCK/SCL
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT
15
16
17
18
23
24
25
26
I/O
I/O
I/O
I/O
I/O
I/O
I/O
I/O
ST
ST
ST
ST
ST
ST
ST
ST
PORTC (I/Os digitais bidirecionais):
RC0: I/O digital ou saída do oscilador externo para TMR1
ou entrada de incremento para TMR1
RC1: I/O digital ou entrada do oscilador externo para
TMR1 ou entrada do Capture2 ou saídas para
Compare2/PWM2.
RC2: I/O digital ou entrada do Capture1 ou saídas para
Compare1/PWM1.
RC3: I/O digital ou entrada/saída de clock para
comunicação serial SPI/I²C.
RC4: I/O digital ou entrada de dados para SPI ou via de
dados (entrada/saída) para I²C.
RC5: I/O digital e saída de dados para SPI.
RC6: I/O digital ou TX (transmissão) para comunicação
USART assíncrona ou clock para comunicação síncrona.
RC7: I/O digital ou RX (recepção) para comunicação
USART assíncrona ou data para comunicação síncrona.
RD0/PSP0
RD1/PSP1
RD2/PSP2
RD3/PSP3
RD4/PSP4
RD5/PSP5
RD6/PSP6
RD7/PSP7
19
20
21
22
27
28
29
30
I/O
I/O
I/O
I/O
I/O
I/O
I/O
I/O
TTL/ST(3)
TTL/ST(3)
TTL/ST(3)
TTL/ST(3)
TTL/ST(3)
TTL/ST(3)
TTL/ST(3)
TTL/ST(3)
PORTD (I/Os digitais bidirecionais) ou porta de
comunicação paralela.
RD0: I/O digital ou dado 0 (comunicação paralela).
RD1: I/O digital ou dado 1 (comunicação paralela).
RD2: I/O digital ou dado 2 (comunicação paralela).
RD3: I/O digital ou dado 3 (comunicação paralela).
RD4: I/O digital ou dado 4 (comunicação paralela).
RD5: I/O digital ou dado 5 (comunicação paralela).
RD6: I/O digital ou dado 6 (comunicação paralela).
RD7: I/O digital ou dado 7 (comunicação paralela).
RE0/RD/AN5
RE1/WR/AN6
RE2/CS/AN7
8
9
10
I/O
I/O
I/O
TTL/ST(3)
TTL/ST(3)
TTL/ST(3)
PORTE (I/Os digitais bidirecionais e sistema analógico):
RE0: I/O digital ou controle de leitura da porta paralela ou
entrada analógica AN5.
RE1: I/O digital ou controle de leitura da porta paralela ou
entrada analógica AN6.
RE2: I/O digital ou controle de leitura da porta paralela ou
entrada analógica AN7.
Legenda: I = Input (entrada)
O = Output (saída)
I/O = Input/Output (entrada ou saída)
P = Power (alimentação)
- = Não-utilizado
TTL = Entrada tipo TTL
ST = Entrada tipo Schmitt Trigger
7
3 - CONCEITOS BÁSICOS SOBRE ESTRURAS INTERNAS DOS
MICROCONTROLADORES
3.1 - Memórias
Figura 8: Estrutura ilustrativa de uma memória de dados.
Resumidamente uma memória é uma estrutura de armazenamento de bits em um
determinado endereço de memória, onde cada endereço pode ser composto por uma quantidade
definida de bits que assumem valor de 1 ou 0. Como mostra a figura 8 onde o endereço W1 é composto
pelos bits de 0 a 7 (8 bits), ou seja, esse endereço pode assumir 28 resultados diferentes como resposta
de saída.
3.2- Unidades de memória
É usada para o armazenamento de dados. Cada endereço de memória corresponde a uma
posição de memória. O conteúdo dessa posição, é conhecido através do seu endereçamento. A
memória tato pode ser lida de, como pode ser escrita para.
Figura 9: Alocação de dados em unidades de memorias.
ROM – Read Only Memory: Apenas de Leitura, é usada para gravar permanentemente o
programa a executar.
OTP ROM – One Time Programmable ROM: ROM onde só se pode escrever o programa
na memória apenas uma vez.
UV EPROM – Ultra Violet Erasable Programmable ROM: ROM que permite apagar o
programa, usando luz Ultravioleta.
FLASH: O seu conteúdo pode ser escrito/apagado quase que infinitamente, usado na maioria
dos microcontroladores.
RAM – Random Acess Memory: Memória volátil, quando se desliga a alimentação do chip
as informações desaparecem. Usada para armazenamento temporário de dados.
EEPROM – Electrically Erasable Programmable ROM: ROM programável, que se pode
apagar eletricamente. Seu conteúdo não é perdido ao se desligar a alimentação do microcontrolador.
8
3.3 – Memória de Programa (FLASH)
Memória não volátil que serve para armazenar o programa escrito no microcontrolador.
Como já citado ela pode ser limpa e escrita por várias, adequando-se ao desenvolvimento de novos
programas e mudança de dispositivos.
3.4 – Memória de Dados (RAM)
Usada pelo programa durante sua execução, são guardados todos os resultados intermédios
ou dados temporais durante a execução do programa que não cruciais para o dispositivo. Os dados
contidos nessa memoria são perdidas quando cessada a alimentação.
3.5 - Registo
Um registo é um circuito eletrônico que consegue memorizar o estado de um byte.
Figura 10: Estrutura de um Registo.
3.6 - SFR – Registo de Função Especial
Nos microcontroladores os seus bits estão interligados fisicamente aos circuitos internos,
tais como temporizadores, conversores A/D, osciladores, portas série e outros. Como um byte tem
oito bits, é como se fossem oito interruptores que comandam outros pequenos circuitos dentro do chip
e os SFR têm exatamente essa função de alocar 8 bits para cada tipo de aplicação existente
internamente.
Figura 11: SFR.
9
3.7 - Portas de Entrada/Saída – I/O
São Registos ligados aos pinos do microcontrolador e são chamados de Portas ou PORT.
Onde cada pino pode ser configurado como entrada ou saída através de software. Como normalmente
cada porta I/O é controlado por um SFR cada bit desse registo determina o estado do pino
correspondente do microcontrolador.
Figura 12:SFR de PORTs I/O.
3.8 - Interrupções
É uma característica do microcontrolador em que só se fará a leitura de suas entradas no
momento em que elas estiverem em modo de ativação e assim poder executar uma ação. Se essa
característica não fosse usada o microcontrolador ficaria a todo momento fazendo a leitura do estado
da sua entrada tornando impraticável sua utilização. Essa característica é de certo modo delega pelo
microcontrolador a um ‘perito’ da estrutura interna que reage ao haver necessidade.
3.9 - CPU – Unidade Central de Processamento
É unidade que memoriza e controlatodos os processos dentro do microcontrolador, sendo
subdividida em: Decodificador de Instruções parte eletrônica que reconhece as instruções de
programa fazendo os outros circuitos funcionarem com base nisso. ALU é a Unidade Lógica e
Aritmética, sendo responsável por todas as operações lógicas e matemáticas. Acumulador é um SFR
responsável pela operação da ALU, usado para armazenar todos os dados de execução de uma
operação e também os resultados de uso de continuação do processamento.
3.10 - Oscilador
O módulo oscilador se trata de componentes que oferecem uma oscilação continua de sinal,
normalmente configurado para usar um cristal de quartzo e as vezes em conjunto com um ressoador
(capacitor) cerâmico para melhor estabilidade de oscilação, possibilita a operação síncrona do
microcontrolador advinda dos pulsos dados pelo oscilador. A não necessidade de estabilidade de
oscilação dada por uma dada aplicação abre a possibilidade de um oscilador RC
(resistência/Capacitor).
10
3.11 - Arquitetura Interna
É a forma de troca de informação entre o CPU e a Memória. Os microcontroladores mais
modernos usam duas formas distintas de arquitetura:
Von-Neumann
Se tem uma única zona de memória disponível e um barramento de dados de 8 bits de modo
a ser sobrecarregado por ter todos os dados trocados usando somente estas 8 linhas e isso deixa a
comunicação lenta e sem eficiência. A CPU só pode ler ou escrever dados de/para a memória sendo
impossível ambas ao mesmo tempo devido a utilização do barramento com os dados.
Figura 13: Arquitetura von-Neumann.
Harvard
Os microcontroladores detentoras desta arquitetura é composto de dois barramentos, um de
8 bits que liga a CPU à RAM, e outro com várias linhas (12, 14 ou 16) ligando a CPU à ROM. Desse
modo a CPU pode fazer a leitura de uma instrução ao mesmo tempo que acessa a memória de dados.
Figura 14: Arquitetura Harvard.
11
4 - CONCEITOS DE ELETRÔNICA
Devido à grande necessidade da utilização de estruturas e componentes de circuitos
eletrônicos usado no correto funcionamento dos microcontroladores faremos aqui um estudo destes.
4.1 – Oscilador Externo
É um circuito indispensável para o funcionamento do microcontrolador e que também define
a velocidade a que ele vai funcionar podendo operar entre quatro opções:
Oscilador LP: Oscilador de baixo consumo (Low Power);
Oscilador XT: Cristal / Ressonador (Capacitor);
Oscilador HS: Oscilador de alta Velocidade (High Speed);
Oscilador RC: Resistencia/Condensador (Capacitor).
Cada tipo de oscilador é caracterizado pela frequência de oscilação e consequentemente pelo
cristal/capacitores usados como mostra a tabela 1.
Tabela 2: Tipos de Osciladores e seus componentes
Tipo Frequência Capacitor 1 Capacitor 2
LO
32 kHz
200 kHz
68 – 100 pF
15 – 33 pF
68 – 100 pF
15 – 33 pF
XT
2 MHz
4 MHz
15 – 33 pF
15 – 33 pF
15 – 33 pF
15 – 33 pF
HS
4 MHz
10 MHz
15 – 33 pF
15 – 33 pF
15 – 33 pF
15 – 33 pF
Figura 15: Conexão de Osciladores com Crystal/Capacitor e outro com RC.
Figura 16: Tipos de Crystal de Quartzo.
12
Esses cristais são de mesma frequência, mas diferem na sua construção e funcionamento.
Em quanto o primeiro gera um trem de pulsos com 200mV em 100ns o segundo gera pulsos com 2V
no mesmo período de tempo.
Os pinos do cristal 2 tem as seguintes nomenclaturas:
Pin 1: NC (pino sem conexão interna);
Pin 7: GND;
Pin 8: Saída TTL;
Pin 14: +5Vdc.
O oscilador externo RC tem com resultado ser mais sensível e mais econômico de todos. Sua
precisão se deve a tolerância de erro dos seus componentes e a temperaturas que o podem afetar.
4.2 – Estado Lógico de pinos I/O
Quando se deseja introduzir um estado logico baixo ou alto (0V ou 5V) a uma entrada através
de botões de pulso temos que considerar a utilização de duas logicas de estado.
Figura 17: Pinos configurados com: a) Logica Negativa e b) Logica Positiva.
Lógica Negativa – nesse estado logico o Pino I/O é alimentado com tensão (5V), ao
pressionar o botão de pulso a tensão estará agora sobre o resistor pois a corrente passa toda por ele e
com isso o pino fica sem tensão (0V). Resumindo: inicial o pino está com tensão e ao pressionar o
botão esse fica sem tensão.
Lógica Positiva – nesse estado lógico o Pino I/O está sem alimentação (0V), ao pressionar
o botão de pulso o pino é alimentado com tensão (5V) devido ao resistor ser um caminho menos
favorável para a corrente. Resumindo: inicialmente o pino está sem tensão e ao pressionar o botão
esse fica com tensão.
4.3 – Optoacopladores
Os optoacopladores são componentes muito uteis quando se deseja separar a parte de
comando da parte de potência de um circuito. Em uma de suas versões, se trará basicamente de um
LED que ao ser acionado ilumina a base de um fototransistor, fazendo este conduza corrente entre o
coletor emissor.
Figura 18: Circuito utilizando optoacoplador, com saída negativa quando ativo.
13
Na configuração da figura 18, quando aplicado no pin I/O um nível lógico alto (5V) o LED
do optoacoplador e o fototransistor conduzem corrente a terra e assim se tem um nível lógico baixo
(0V) na Saída. Ao desativar o LED o fototransistor não conduz fazendo com que se tenha um nível
lógico alto (5V) na Saída.
Já na configuração da figura 19, quando aplicado um nível lógico alto (5V) no pin I/O, o
LED do optoacoplador acende e o fototransistor conduz para pino de saída um nível lógico alto (5V).
Porem havendo um nível lógico baixo (0V) na entrada, o fototransistor permanecerá aberto entre
coletor e emissor, tendo como resultado um nível lógico baixo (0V) na Saída.
Figura 19: Circuito utilizando optoacoplador, com saída positiva quando ativo.
4.4 - PWM
É um recurso muito poderoso pois com ele se pode obter uma tensão analógica a partir de
um sinal digital, porem sendo essa saída na verdade meramente digital, ou seja, podendo assumir os
estados 0 e 1.
O nome PWM é uma sigla originada do inglês (Pulse Width Modulation), que significa
Modulação por Largura de Pulso. Trata-se de uma onda com frequência constante (período fixo) e
largura de pulso (duty cycle) variável.
Figura 20: PWM.
Este é um tipo de geração de sinal muito importante, através dele é possível implementar um
conversor digital analógico com um único pino do microcontrolador, uma vez que controlando a
largura do pulso é possível obter uma tensão analógica variável.
14
4.5 – Analógico x Digital
Sistema analógico: é um tipo de sinal contínuo que varia em função do tempo,
podendo assumir qualquer valor dentro de um intervalo de máximo e mínimo.
Sistema digital: é um sinal com valores discretos (descontínuos) no tempo, só podem
assumir valores alto e baixo (0 ou 1, 0V ou 5V, etc.).
Figura 21: Sinais digital e analógico.
15
5 – BASIC: PRINCIPAIS COMANDOS E SUAS ESTRUTURAS NO PROTON IDE
VARIÁVEIS
As variáveis são dados temporariamente armazenados em um programa BASIC. Elas são
criadas usando a palavra-chave DIM. Como o espaço de uma memória RAM em PIC é um pouco
limitado em tamanho, a escolha do tamanho certo de uma variável para uma tarefa especifica é
importante. As variáveis podem ser do tipo BITS, BYTES, WORDS, DWORDS ou FLOATS.
FLOAT – são variáveis que podem conter números com casas decimais podendo conter um
valor ente -1e37até +1e38, mas por causa da arquitetura do compilador de 32 bits, deve-se pensar no
uso de um valor máximo e mínimo entre -2147483646,999 a 2147483646,999, o que torna a mais
precisa dos tipos de variáveis. Porém, mais do que o tipo DWORD, e isso tem um preço quando se
faz cálculos e comparações com uma variável FLOAT, pois usará mais espaço de código dentro do
PIC.
DWORD – Essas variáveis podem conter um valor entre -2147483648 a 2147483647
tornando este a maior dos tipos da família de variáveis, no entanto usará mais espaço de código do
PIC.
WORD – Essas variáveis podem conter valores entre 0 e 65535, que normalmente é grande
o suficiente para a maioria das aplicações. Ela usa bastante memória, mas não tanto como o tipo
DWORD.
BYTE – Podem conter um valor entre 0 e 255, sendo menor, mais rápido e mais eficiente
do que os outros tipos de variáveis citado.
BIT – Essas variáveis podem conter valor 0 ou 1, são criadas sempre 8 de cada vez devido
ao tamanho dos registradores, portanto não se poupa espaço na RAM ao declara-la.
REPRESENTAÇÕES NUMÉRICAS
Binário usa o prefixo %. Exemplo: %0101;
Hexadecimal usa o prefixo $. Exemplo $0A;
Caracteres é um byte cercado por aspas. Ex. “a” representando o valor 97;
Decimal esses valores não usam prefixo.
Pontos Flutuantes são criadas usando o ponto decimal. Ex. 3.14(3,14).
OPERADORES RELACIONAIS
São usados para comparar dois valores. O resultado pode ser usado para tomar uma decisão
sobre o fluxo do programa.
Operador Relação Tipo de Expressão
= Igualdade X=Y
== Igualdade X==Y (mesmo que acima Igualdade)
< > Desigualdade X< >Y
!= Desigualdade X != Y (mesmo que acima Desigualdade)
< Menor que X < Y
> Maior que X > Y
<= Menor ou igual a X <= Y
>= Maior ou Igual a X >= Y
OPERADORES LOGICOS BOOLEANOS
As funções IF-THEN-ELSE-ENDIF, WHILE-WEND, e REPEAT-UNTIL são as condições
que suportam os operadores lógicos NOT, AND, OR e XOR.
NOT – inverte o resultado de uma condição, mudando falso para verdadeiro e vice-versa.
AND, OR e XOR – junta os resultados de duas condições e produz um único
verdadeiro/falso resultado.
16
OPERADORES MATEMÁTICOS
Addition '+'.
Subtraction '-'.
Multiply '*'.
Multiply HIGH '**'.
Multiply MIDDLE '*/'.
Divide '/'.
Modulus '//'.
Bitwise AND '&'.
Bitwise OR '|'.
Bitwise XOR '^'.
Bitwise SHIFT LEFT '<<'.
Bitwise SHIFT RIGHT '>>'.
Bitwise Complement '~'.
ABS.
ACOS
ASIN
ATAN
COS.
DCD.
DIG.
EXP
LOG
LOG10
MAX.
MIN.
NCD.
POW
REV.
SIN.
SQR.
TAN
DIV32.
Adiciona variáveis e / ou constantes.
Subtrai variáveis e / ou constantes.
Multiplica variáveis e / ou constantes.
Retorna os 16 bits do resultado multiplicar 16-bit.
Retorna os 16 bits do meio o resultado multiplicar 16-bit.
Divide as variáveis e / ou constantes.
Retorna o resto da divisão um valor por outro.
Retorna o bit E de dois valores.
Retorna o bit OR de dois valores.
Retorna o XOR bit a bit de dois valores.
Desloca os bits de um valor deixou um número especificado de casas.
Desloca os bits de um valor certo um determinado número de lugares.
Inverte os bits em uma variável.
Retorna o valor absoluto de um número.
Retorna a ARC cosseno de um valor em radianos.
Retorna o arco seno de um valor em radianos.
Retorna o arco tangente de um valor em radianos.
Retorna o cosseno de um valor em radianos.
Descodificador 2 n -Alimentação de um valor de quatro bits.
Retorna o dígito decimal especificado de um valor positivo.
Deduzir a função exponencial de um valor.
Retorna o logaritmo natural de um valor.
Retorna o LOG de um valor.
Retorna o máximo de dois números.
Retorna o mínimo de dois números.
Codificador de prioridade de um valor de 16 bits.
Calcula uma variável para o poder do outro.
Inverte a ordem dos menores bits em um valor.
Retorna o seno de um valor em radianos.
Retorna a raiz quadrada de um valor.
Retorna a tangente de um valor em radianos.
15-bit divide x 31 bit.
17
DECLARE
Sintaxe: [DECLARE] código da diretiva a alterar = valor da modificação
Visão geral: Ajusta certos aspectos do código produzido, frequência de cristal, porta LCD e
pinos de transmissão de série.
Exemplo: DECLARE XTAL 4 ou DECLARE XTAL = 4 (Declara que o cristal é de
4MHz).
DELAYMS
Sintaxe: DELAYMS duração
Visão geral: Atrasa a execução em x milissegundos (ms). Os atrasos podem ser até 65535ms
(65,535 segundos) de duração.
Exemplo: DELAYMS 100 (Atrasa a execução em 100ms).
DEVICE
Sintaxe: DEVIDE digito do dispositivo
Visão geral: Informa ao compilador qual o microcontrolador PIC está sendo usado.
Exemplo: DEVICE = 16F877A.
DIM
Sintaxe: DIM Variável {as} {Extensão ou tamanho}
Visão geral: Todas as variáveis definidas pelo usuário devem ser declaradas usando a
instrução DIM.
Exemplo: DIM NUM AS BYTE (declara a variável NUM como sendo Byte (8bits)).
END
Sintaxe: END
Visão geral: A declaração END faz parar a compilação de origem, e cria um loop infinito.
GOTO
Sintaxe: GOTO rótulo
Visão geral: Ira para um rótulo definido e continua a execução de lá.
Exemplo: GOTO LA (pula para a execução do rótulo LA) ... LA: (executa as instruções
contidas no rótulo LA).
HIGH
Sintaxe: HIGH PORT ou PORT.Bit
Visão geral: Coloca um PORT ou um bit em estado lógico alto. Para um PORT, isso
significa preenche-lo de 1´s. Para um bit isso significa defini-lo como 1.
Exemplo: HIGH PORTB.4 (Coloca o pino 4 do PORT B em nível lógico alto).
18
LOW
Sintaxe: LOW PORT ou PORT.Bit
Visão geral: Coloca um PORT ou um bit em estado lógico baixo. Para um PORT, isso
significa preenche-lo com 0’s. Para um bit isso significa defini-lo como 0.
Exemplo: LOW PORTB.4 (Coloca o pino 4 do PORT B em nível lógico baixo).
SYMBOL
Sintaxe: SYMBOL Nome {=} Valor
Visão geral: Atribui um codinome para um registro, varável, ou valores constantes.
Exemplo: SYMBOL LED =PORTB.4 (atribui ao pino 4 do PORT B o nome LED).
INPUT
Sintaxe: INPUT PORT ou PORT.Pin
Visão geral: Faz com que um PORT especifico ou um pino seja utilizado como entrada.
Exemplo: INPUT PORTA.0 (faz o pino 0 do PORT A uma entrada).
OUTPUT
Sintaxe: OUTPUT PORT ou PORT.Pin
Visão geral: Faz com que um PORT especifico ou um pino seja utilizado como saída.
Exemplo: OUTPUT PORTA.0 (faz o pino 0 do PORT A uma saída).
TRIS
Sintaxe: TRIS PORT ou PORT.Pin
Visão geral: Configura os pinos ou PORT’s como entrada ou saída. Faz Registro de
configuração I/O de PORT ou um pino especifico, que pode se dar de modo binário (8bits),
hexadecimal ou decimal, sendo os dois primeiros mais comuns.
1 = Entrada
0 = Saída
Exemplos:
TRISA = %11110 (% para expressar a configuração em binário, desse modo o pino
0 do PORT A é configurado como saída e os pinos 1, 2, 3 e 4
como entradas).
TRISA = $1E ($ para expressar a configuração em hexadecimal).
TRISA = 30 (Ao converter o binário ou hexadecimal temos que o valor em
decimal é 30, essas 3 formas para o compilador não será
problema pois ao converte para linguagem de máquina o
resultado será sempre binário em relação aos pinos do PORT
configurado).
FOR...NEXT...STEP
Sintaxe: FOR Variável = Contagem inicial TO contagem final {STEP {+ -} incremento}
Visão geral: A instrução FOR...NEXT se encarrega de fazer repetições de instruções que
permanecem dentro do laço FOR...NEXT. O parâmetro STEP afeta o incremento segundoo valor
declarado depois desta palavra, ao omiti-lo o incremento é de uma unidade.
Exemplo: FOR i = 0 TO 9 STEP 3
NEXT
19
IF – THEN - ELSE
Sintaxe: If expressão 1 {AND / OR expressão 2} Then rótulo
Visão geral: Com a instrução IF – THEN podemos tomar decisões ao longo de um programa,
baseado em condições específicas definidas pelo programador.
Exemplo: If PORTA.0 = 1 Then PORTB.0 =1
SELECT – CASE - ENDSELECT
Sintaxe: SELECT Expressão
CASE Condição
Instrução
CASE ELSE
Instrução
ENDSELECT
Visão geral: Avalia uma expressão então executa continuamente um bloco de código
BASIC com base nas comparações, com Condição(s). Depois de executar um bloco de código, o
programa continua a linha seguinte até chegar a ENDCASE. Se não houver casos verdadeiros
encontrados e nem um ELSE CASE, o código levará a execução do ENDSELECT.
Exemplo: SELECT VAR1
CASE 1
RESUL=1
CASE 2
RESUL=2
CASE ELSE
RESUL=0
ENDSELECT
ALL_DIGITAL = TRUE
Visão geral: Esta instrução define todos os pinos como digitais, inclusive os analógicos.
ADCON1
Visão geral: Esta instrução define a configuração de pinos como Analógicos.
Exemplo: ADCON1=%10000001 o bit 7 configura a justificação, os bits 6/5/4 não
tem função, 3/2/1/0 configuram os canais
utilizados.
EREAD
Sintaxe: variável = EREAD endereço
Visão geral: Ler as informações contidas na EEPROM on-board, disponível em alguns tipos
de PIC.
Exemplo: DIM VAR1 AS BYTE ‘uma variável é declara e o seu conteúdo é o
VAR1 = EREAD 0 contido na posição 0 da memória EEPROM.’
20
EWRITE
Sintaxe: EWRITE endereço, [conteúdo]
Visão geral: Escreve informações na memória eeprom on-board disponível em alguns PIC.
Exemplo: EWRITE 0, [“MECATRONICA”]
‘Escreve na memória os caracteres da palavra MECATRONICA, de modo que cada letra
equivale a uma posição começando de 0.’
PRINT
Sintaxe: PRINT Item {, Item}
Visão geral: Envia texto um módulo LCD. Item pode ser uma constante, varável, expressão,
modificador ou lista de string. Os operadores modificadores não agem para modificar, mas sim para
indicar o que se quer escrito no LCD. Para textos se deve seguir a tabela ASCII para caracteres
especiais e entre aspas (“ texto”).
Modificadores:
AT – Indica a posição do curso no LCD [AT Xpos (1 to n), Ypos (1 to n)], ou seja,
[PRINT AT nºlinha, nºcoluna].
CLS – Limpa o LCD.
BIN{1...32} – mostra dígitos binários no display
DEC{1...10} – mostra dígitos decimais no display
HEX{1...8} – mostra dígitos hexadecimais no display
Outros ...
Exemplo: PRINT AT 1, 1, “MINHA NOTA=”, DEC 10
Este exemplo faz com que se escreva a frase “MINHA NOTA=” a partir da
primeira linha e primeira coluna e após o igual, o número 10 em decimal, ficando ‘MINHA
NOTA=10’ no LCD.
Existe ainda comandos padronizados para controlar e manipular o LCD como mostrado
abaixo na tabela 3.
Tabela 3: Comandos para LCD.
Comando Operação
$FE, 1 Limpa o LCD e move o cursor para a posição home.
$FE, 2 Move o cursor para a primeira linha da primeira coluna.
$FE, $10 Move o cursor uma posição à esquerda.
$FE, $14 Move o cursor uma posição a direita.
$FE, $18 Desloca todo os caracteres do display a esquerda.
$FE, $1C Desloca todo os caracteres do display a direita.
$FE, $0C Desliga o cursor.
$FE, $0E Cursor sublinhado.
$FE, $0F Cursor piscando.
$FE, $C0 Move o cursor para o início da segunda linha.
$FE, $94 Move o cursor para o início da terceira linha.
$FE, $D4 Move o cursor para o início da quarta linha.
21
ADIN
Sintaxe: Variável = ADIN n°canal
Visão geral: Ler o valor do conversor A/D on-board.
Exemplo: VAR = ADIN 0 Coloca o valor da conversão do canal 0 na variável VAR.
SERVO
Sintaxe: SERVO Pino, Valor da Rotação
Visão geral: Controla o centro de controle de um servo motor. Pino equivale ao pino do
PORT escolhido em que o servo é conectado. Valor de Rotação é uma constante ou variável WORD
dedicada ao posicionamento do motor podendo assumir valores entre 500 a 2500, sendo 1500 o valor
central de posicionamento.
Exemplo: SERVO PORTD.0, 1500 Posiciona o servo ligado ao pino 0 do PORT
centralmente.
PWM
Sintaxe: PWM Pino, Nível, Ciclo
Visão geral: Gera uma saída com Modulação por Largura de Pulso em pino, em seguida,
retorna o pino para o estado de entrada.
22
6 – EXEMPLOS E APLICAÇÕES
Fazer um programa é simplesmente elaborar uma lista de instruções para o microcontrolador
executa-las sequencialmente. Ao escrever o programa se faz extrema importância que essa sequência
de execução esteja bem defina para se atingir o objetivo desejado. É como uma receita de bolo:
1 – Pega os Ingredientes;
2 – Mistura os Ingredientes;
3 – Coloca a Mistura na Forma;
4 – Leva a Forma ao Forno;
5 – Tira a Forma do Forno e espera esfriar;
6 – Come o Bolo.
Claramente essa seria a sequência correta de programação para se fazer um bolo. Mas e se
fosse feito uma sequência como abaixo?
1 – Leva a Forma ao Forno;
2 – Come o Bolo;
3 – Tira a Forma do Forno e espera esfriar;
4 – Mistura os Ingredientes;
5 – Coloca a Mistura na Forma;
6 – Pega os Ingredientes.
Certamente todas as instruções foram informadas, porém com ordenamento incorreto. Na
primeira instrução se pode até levar a Forma ao Forno, mas sem a mistura dos ingredientes e assim
não tem como comer o bolo antes de fazê-lo, é obvio, e isso causará um erro de execução. Por isso se
faz de grande importância o conhecimento correto da sequência de instruções dada ao
microcontrolador.
6.1 – Primeiros Programas com o PIC 16F877A
Para se aprender a programar um microcontrolador é importante começar o assunto com
exemplos práticos e simples, isso ajuda a entender como a arquitetura do PIC e as instruções do
programa estão sendo usados.
Os circuitos estarão baseados nos conhecimentos mostrados em páginas anteriores.
Para melhorar a compreensão dos projetos que faremos na sequencia desse material,
utilizaremos uma sequência simples de elaboração dos programas, como mostrado abaixo
Declaração do Microcontrolador;
Declaração do Oscilador;
Nomear os pinos ou PORTs a serem usados;
Configurar os pinos ou PORTs como entradas ou saídas;
Configuração dos PORTs como Digitais ou Analogicos;
Declaração de Varáveis;
*Declaração de outros componentes (se necessário);
Instruções e/ou rotinas.
Obs.: Vale ressaltar que o Proton IDE ler as linhas de programação sequencialmente e que
comentários no programa são feitos com a adição do acento grave ( ` ) à frente das palavras da linha.
23
6.2.1 – Projeto 1: Fazendo um LED piscar.
Circuito
Figura 22: Circuito do Projeto 1.
Programa
Device = 16F877A 'Declara qual o Microcontrolador
Xtal 4 'Declara o Oscilador
Symbol LED = PORTB.0 'Nomeia o pino 0 do PORT B como LED
TRISB.0 = 0 'Declara o pino o do PORT B como saída
AQUI: 'Rótulo da rotina
High LED 'Coloca o LED em nível lógico Alto
DelayMS 1000 'Atrasa a execução do programa em 1000ms
Low LED 'Coloca o LED em nível lógico Baixo
DelayMS 1000 'Atrasa a execução do programa em 1000ms
GoTo AQUI 'Manda o programa executar a rotina do rótulo AQUI
End 'Informa o fim do programa
ComentandoDevice = 16F877A declara qual o microcontrolador usado. Xtal 4 declara qual o oscilador
usado. Symbol LED = PORTB.0 nomeia o pino do PORT B como LED facilitando. TRISB.0 = 0
declara que o pino 0 do PORT B será usado como saída. AQUI: é o rótulo de uma rotina a ser
executada. High LED coloca 5V no pino 0 do PORT B. DelayMS 1000 atrasa o programa em 1000
milissegundos ou 1 segundo. Low LED coloca 0V no pino 0 do PORT B. Goto AQUI faz com que
a rotina do rótulo AQUI seja executada. End informa ao compilador o fim do programa.
Assim o LED ascenderá, permanecendo assim por 1 segundo e apagará por mais 1 segundo
até que a rotina seja repetida.
24
6.2.2 – Projeto 2: Ligar e Desligar 2 LEDs alternadamente.
Circuito
Figura 23: Circuito do Projeto 2.
Programa
Device = 16F877A 'Declara qual o Microcontrolador
Xtal 4 'Declara o Oscilador
TRISB = %00000000 'Declara o PORT B como saída
PORTB = 0 'Coloca 0V em todos os pinos do PORT B
AQUI: 'Rótulo da rotina
High PORTB.0 'Coloca o 5V no pino 0 do PORT B
Low PORTB.7 'Coloca o 0V no pino 7 do PORT B
DelayMS 500 'Atrasa a execução do programa em 500ms
Low PORTB.0 'Coloca 0V no pino 0 do PORT B
High PORTB.7 'Coloca 5V no pino 7 do PORT B
DelayMS 500 'Atrasa a execução do programa em 500ms
GoTo AQUI 'Manda o programa executar a rotina do rótulo AQUI
End 'Informa o fim do programa
Comentando
A maioria das instruções são bem parecidas com o do projeto 1. Neste projeto
TRISB=%00000000 declara de forma binaria que todos os pinos do PORT B serão usados como
saídas. PORTB=0 faz com que todos pinos do PORT B fiquem com 0V. A rotina executada dentro
do rótulo AQUI: faz com que enquanto o pino 0 tenha 5V o pino 7 tenha 0V e vice-versa, de modo
que na simulação da figura 23 os led’s ascendam e apaguem alternadamente, ou seja, enquanto um
ascende o outro apaga e vice-versa.
25
6.2.3 - Projeto 3: Fazer uma contagem binaria começando com 0, 1 e depois com potencias
de 2 (2x) até 128.
Circuito
Figura 24: Circuito do Projeto 3.
Programa
Device = 16F877A 'Declara qual o Microcontrolador
Xtal 4 'Declara o Oscilador
TRISB = %00000000 'Declara o PORT B como saída
PORTB = 0 'Coloca 0V em todos os pinos do PORT B
AQUI: 'Rótulo da rotina
PORTB = %00000000 'PORT B igual a 0
DelayMS 150 'Atrasa a execução do programa em 150ms
PORTB = %00000001 'PORT B igual a 1
DelayMS 150 'Atrasa a execução do programa em 150ms
PORTB = %00000010 'PORT B igual a 2
DelayMS 150 'Atrasa a execução do programa em 150ms
PORTB = %00000100 'PORT B igual a 4
DelayMS 150 'Atrasa a execução do programa em 150ms
PORTB = %00001000 'PORT B igual a 8
DelayMS 150 'Atrasa a execução do programa em 150ms
PORTB = %00010000 'PORT B igual a 16
DelayMS 150 'Atrasa a execução do programa em 150ms
PORTB = %00100000 'PORT B igual a 32
DelayMS 150 'Atrasa a execução do programa em 150ms
PORTB = %01000000 'PORT B igual a 64
DelayMS 150 'Atrasa a execução do programa em 150ms
PORTB = %10000000 'PORT B igual a 128
DelayMS 150 'Atrasa a execução do programa em 150ms
GoTo AQUI 'Manda o programa executar a rotina do rótulo AQUI
End 'Informa o fim do programa
26
Comentando
O que se tem de diferente nesse programa em relação aos demais é a configuração do nível
lógico dos pinos do PORT B de forma binária. PORTB = %00000001 é uma forma binaria (o
símbolo ‘%’ é a representação binária na programação) de indicar quais os pinos estarão com 0V ou
5V, nível lógico baixo ou alto, assim a configuração citada anteriormente faz com que o pino 0 do
PORT B fique com 5V e os demais pinos do PORT fiquem com 0V, com representação decimal igual
a 1. O programa faz uma contagem binaria com as saídas, de modo que comece com 0, depois 1 e em
seguida faça a contagem da potencias de 2 até 128. Isto fará com que os led’s ascendam de forma
crescente.
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
6.2.4 – Projeto 4: Utilizando botões nas entradas para acionar saídas. Utilizando as
instruções IF – THEN.
Circuito
Figura 25: Circuito do Projeto 4.
27
Programa
Device = 16F877A 'Declara qual o Microcontrolador
Xtal 4 'Declara o Oscilador
Symbol LED1 = PORTB.0 'Nomeia pino 0 do PORT B
Symbol LED2 = PORTB.1 'Nomeia pino 1 do PORT B
Symbol BOTAO = PORTD.0 'Nomeia pino 0 do PORT D
TRISB = 0 'Configura o PORT B como saída
TRISD.0 = 1 'Configura o pino 0 do PORT D como entrada
PORTB=0 'Coloca os pinos do PORT B em nível lógico alto
TEST: 'teste do botão
If BOTAO = 0 Then LIGAR1 'Condição 'Se' 1 para o botão
If BOTAO = 1 Then LIGAR2 'Condição 'Se' 2 para o botão
LIGAR1:
High LED1 'Liga LED1
Low LED2 'Desliga LED2
DelayMS 50 'Atraso de execução
GoTo TEST 'Retorna para teste do botão
LIGAR2:
Low LED1 'Desliga LED1
High LED2 'Liga LED2
DelayMS 50 'Atraso de execução
GoTo TEST 'Retonar para teste de botão
End
Comentando
Nesta programação temos três pontos importantes a se analisar. A primeira coisa que na
figura 25 se observa é o botão B1 no MCLR que servirá como reset, ou seja, numa lógica positiva
que enquanto o botão B1 não for pressionado o microcontrolador não tem alimentação (0V) e
consequentemente não executara nenhuma instrução, mas ao pressioná-lo uma tensão de 5V fará a
alimentação e colocará o microcontrolador em funcionamento. O segundo ponto importante é o outro
botão B2 no pino 0 do PORT D (configurado como entrada no TRISD.0=1 enomeado como
BOTAO) que servirá como uma entrada digital (sensor) que tem a função de ligar e desligar as saídas
referentes ao LED1 e LED2. A última coisa a se relatar é a utilização da instrução IF – THE dentro
rótulo TEST:, que tem a função de impor uma condição de análise e de ação dentro do programa
para assim saber qual a resposta a se dar dependendo do estado lógico do botão B2.
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
28
6.2.5 - Projeto 5: Contagem de 0 a 9 com display de 7 segmentos.
Os displays que será utilizado nesta parte da programação e simulação será o Display de
Leds de sete segmentos, dado que os números são compostos através de sete traços cada qual com
seu respectivo Led que ao combina-los podemos formar números de 0 a 9.
A figura 26, mostra como é a nomenclatura de cada traço do display. Desta forma temos um
pino para controlar cada um dos segmentos (A à G). Vale ressaltar que se tem diferentes tipos desse
display, mas utilizaremos um genérico, dado que essa explicação trata de uma simples explicação do
seu funcionamento para que assim se possa ter a possibilidade de utiliza-lo na programação e
simulação.
Figura 26: Display de 7 segmentos genérico.
Circuito
Figura 27: Circuito do Projeto 5.
29
Programa
Device = 16F877A 'Declara qual o Microcontrolador
Xtal 4 'Declara o Oscilador
Symbol DISPLAY = PORTB 'Nomeia pino 0 do PORT B
TRISB = 0 'Configura o PORT B como saída
Dim CONT As Byte 'Declara a variável CONT como Byte
PORTB=0 'Coloca os pinos do PORT B em nível lógico alto
INICIO:
For CONT = 0 To 9 'Faz um laço com a variável CONT indo de 0 a 9
If CONT=0 Then DISPLAY=%00111111 'coloca 0 no display
If CONT=1 Then DISPLAY=%00000110 'coloca 1 no display
If CONT=2 Then DISPLAY=%01011011 'coloca 2 no display
If CONT=3 Then DISPLAY=%01001111 'coloca 3 no display
If CONT=4 Then DISPLAY=%01100110 'coloca 4 no display
If CONT=5 Then DISPLAY=%01101101 'coloca 5 no display
If CONT=6 Then DISPLAY=%01111101 'coloca 6 no display
If CONT=7 Then DISPLAY=%00000111 'coloca 7 no display
If CONT=8 Then DISPLAY=%01111111 'coloca 8 no display
If CONT=9 Then DISPLAY=%01100111 'coloca 9 no display
DelayMS 150
If CONT=9 Then INICIO 'Volta ao início da contagem indo de 0 a 9
Next 'continua o laço de contagem até a variável alcançar o valor final
End
Comentando
Para essa aplicação temos uma instrução nova que a FOR – NEXT que se trata de um laço
onde a variável tem uma contagem de início e um fim, sendo que a cada contagem a rotina dentro
desse laço é executada até que o laço chegue à sua contagem final. A contagem no display é feita
colocando 0V ou 5V nos pinos referentes a cada segmento a que se quer acionar para representar o
número escolhido, onde tal procedimento é feito pela indicação do nível lógico de cada pino do PORT
B nomeado como DISPLAY, de forma binaria, como por exemplo em DISPLAY=%00111111
indicando os pinos 0 a 6 como 5V e 7 a 8 como 0V, mostrando 0 no display.
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
30
6.2.6 - Projeto 6: Utilizando o Display de Cristal Líquido (LCD).
Os LCD’s são muito mais poderosos que os displays de 7 segmentos, dado que possuem
muito mais caracteres e são alfanuméricos. Porém são mais caros e com uma visualização inferior,
pois os caracteres não possuem iluminação própria e são de tamanho bem reduzido.
Os módulos LCD são ideais para aplicações alfanuméricas ou com gráficos. Os
alfanuméricos têm disponibilidade de grande variedade de configurações, como: uma linha, duas
linhas e quatro linhas sendo as mais comuns. A quantidade de colunas tem são variáveis, sendo
comumente encontrada com 16, 20 e 40 colunas por linha.
Como podemos ver existem muitos displays de cristal líquido (LCD) no mercado, mas
utilizaremos o modelo padrão em aplicações, o de duas linhas e 16 caracteres cada uma. Uma
característica importante desse display é que ele possui um drive de controle interno. Assim a
comunicação será feita com ele através de uma comunicação paralela, passando comando e os
caracteres que desejamos escrever, diretamente em código ASCII.
Figura 28: Display LCD com 2 linhas e 16 colunas cada uma, total de 32 caracteres.
Pinagem
Os pinos 1 e 2 (VSS e VDD) do LCD corresponde a alimentação GND e Vdc
respectivamente, onde a tensão máxima suportada é de 5 Vdc. Já o pino 3 VEE corresponde ao
controle de contraste, assim um potenciômetro é conectado a ele para ter esse controle.
O pino 4 ‘RS’ (Register Select) é utilizado para definir o tipo de informação passada através
da comunicação paralela. Quando o RS é 0 a informação enviada é um comando ou instrução. Se RS
for 1 A informação enviada é um registro de dados ou caractere alfanumérico.
O pino 5 ‘R/W’ (Read/Write), é um pino utilizado para ler dados a partir da tela do LCD ou
escrever uma entrada no LCD. Se R/W=0 o LCD está habilitado para se poder escrever dados na tela.
Se R/W=1 o LCD habilita a leitura de seus dados. Em muitos casos esse pino não é utilizado, ficando
permanentemente ligado ao Vss, assim o LCD opera somente em modo de escrita. Por isso é preciso
garantir o térmico das operações internas do módulo de LCD através de tempos pré-estabelecidos.
O pino 6 ‘E’ (Enable), é um pino de habilitação, ou seja, se E=0 o LCD é desativado para
receber dados, mas se E=1 então o LCD é capaz de trabalhar de modo a podermos escrever ou ler
dados no mesmo.
Os pinos 7 a 14 (D0 a D7) equivalem ao barramento de dados paralelo. Apesar da existência
de 8 vias de dados, esses displays podem operar com 4 vias (D4 a D7) já que as demais vias ficam
semfunções, assim as informações são enviadas em dois pacotes de 4 bits cada um.
31
Ao se trabalhar com 8 bits, estes deverão ser conectados em um só PORT e nunca em PORTs
diferentes do microcontrolador. Ao se trabalhar com somente 4 bits mais significativos do LCD, estes
devem ser conectados aos quatro bits menos significativos ou aos quatro bits mais significativos do
PORT escolhido.
Os pinos E (pino 6) e RS (pino 4) podem ser conectados em qualquer PORT do
microcontrolador. O pino R/W deve estar conectado à terra (GND) para indicar ao LCD que se está
trabalhando com escrita de dados.
No Proton IDE é necessário fazer algumas declarações para o uso de displays alfanuméricos
para o uso do comando PRINT.
1 – DECLARE LCD TYPE 1 ou 0 - Informa ao compilador o tipo de display a ser utilizado
pelo comando PRINT, se (Gráfico ou Alfanumérico)
2 – DECLARE LCD_DTPIN PORT.PIN – identifica o PORT e os pinos que as vias de
dados do LCD está ligada. Por exemplo: Se utilizado uma via de dados de 8 bits o comando seria
“DECLARE LCD_DTPIN PORTB.0” ou Se utilizado uma via de 4 bits seria “DECLARE LCD_DTPIN PORTB.4”.
3 – DECLARE LCD_ENPIN PORT.PIN – Identifica o PORT e o pino que a via de
habilitação (enable) LCD está ligada.
4 – DECLARE LCD_RSPIN PORT.PIN – Identifica o PORT e o pino que a via RS do
LCD está ligada.
5 – DECLARE LCD_INTERFACE 4 ou 8 – Informa ao compilador o tamanho da via de
dados do LCD utilizada.
6 – DECLARE LCD_LINES 1, 2 ou 4 – Informa ao compilador o número de linhas do
LCD utilizada.
Circuito
Figura 29: Circuito do Projeto 6.
32
Programa 1
Device = 16F877A
Xtal 4
Declare LCD_Type 0 'Informa que o LCD é Alfanumerico
Declare LCD_DTPin PORTB.4 'Informa os pinos de Dados
Declare LCD_ENPin PORTB.3 'Informa o pino do Enable
Declare LCD_RSPin PORTB.2 'Informa o pino RS
Declare LCD_Interface 4 'Informa a quantidade de bits em um pacote de dados
Declare LCD_Lines 2 ' Informa o numero de linhas do LCD
Print At 1, 1, "MECATRONICA" 'Imprime no LCD
Comentando
Neste programa é feito os declares para o LCD funcionar com a instrução Print e depois está
função imprime no LCD a mensagem ‘MECATRONICA’, o Modificador At faz com que o primeiro
caractere do texto inicie na primeira linha e primeira coluna do LCD.
Programa 2
Device = 16F877A
Xtal 4
Dim INDICE As Byte 'declara a variável
Dim CHAR As Byte 'declara a variável
EWrite 0, [" IFCE LIMOEIRO "] 'coloca na memoria das pos. 0 a 16
EWrite 17, [" MECATRONICA "] 'coloca na memoria das pos. 17 a 32
Declare LCD_Type 0 'Informa que o LCD é Alfanumerico
Declare LCD_DTPin PORTB.4 'Informa os pinos de Dados
Declare LCD_ENPin PORTB.3 'Informa o pino do Enable
Declare LCD_RSPin PORTB.2 'Informa o pino RS
Declare LCD_Interface 4 'Informa a quantidade de bits em um pacote de dados
Declare LCD_Lines 2 ' Informa o numero de linhas do LCD
INICIO:
Cls 'Limpa o LCD
For INDICE = 0 To 15
CHAR = ERead INDICE 'Ler a memoria na posição INDICE e coloca em CHAR
DelayMS 100
Print $FE, 14, $FE, $0C, CHAR 'Move uma pos. a direita, desliga cursor
Next 'e imprime o caractere de CHAR
DelayMS 300
Print $FE, 2 'Retorna inicio primeira linha
For INDICE = 0 To 15
CHAR = ERead INDICE 'Ler a memoria na posição INDICE e coloca em CHAR
DelayMS 100
Print $FE, $1C, CHAR 'Move os caracteres p/ direita
Next
DelayMS 300
33
For INDICE = 15 To 0 Step -1
CHAR = ERead INDICE
DelayMS 100
Print $FE, $18, CHAR 'Move os caracteres p/ esquerda
Next
DelayMS 300
Print $FE, $C0 'desliga o cursor
For INDICE = 17 To 32
CHAR = ERead INDICE
DelayMS 100
Print $FE, 14, $FE, $0C, CHAR 'Move uma pos. direita, desl. cursor
Next 'e imprime CHAR
DelayMS 300
GoTo INICIO
Comentando
Neste programa foi usado a escrita e leitura de memória onde cada caractere dos textos
equivale colocados nela equivale a uma posição. Na impressão dos caracteres no LCD, as letras foram
colocadas uma de cada vez para a primeira linha, movidas da esquerda para direita e em seguida da
direita para a esquerda. Depois o segundo texto foi impresso no LCD também uma letra por vez.
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
34
6.2.7 - Projeto 7: Utilizando conversor Analógico/Digital (A/D).
O conceito de sinais analógicos e digitais foram descritos anteriormente, dado a
característica do PIC só processar sinais digitais e muitas vezes termos que trabalhar com variáveis
analógicas agora temos que utilizar o conversor A/D, eles são necessários para o processamento de
sinais como de temperatura, corrente e tensão elétrica, posicionamento ou sinal de um sensor. Por
tudo isso é que se faz importante saber suas características e seu funcionamento.
Para melhor entendimento da teoria da conversão dos sinais analógicos em dados digitais,
um exemplo prático com o sensor de temperatura ira nos ajudar. Sensores de temperatura fornecem
informações analógicas (tensão) proporcional a temperatura, assim, para que se possa ser analisado
pelo microcontrolador, se faz necessárioum conversor A/D.
O PIC 16F877A possui um conversor A/D de 10 bits com 8 entradas independentes. É do
tipo aproximações sucessivas.
O menor passo, ou resolução, é o menor valor da grandeza analógica medica que causará
mudança de leitura do estado digital pelo conversor à medida que o valor anterior é lido pelo A/D. É
dado diretamente pelo seu número de bits e pode ser expresso por:
𝑟𝑒𝑠𝑜𝑙𝑢çã𝑜 =
𝑉𝑅𝐸𝐹
2𝑛
Em que VREF é uma tensão de referência e n é o número de bits do conversor.
Cada um dos n bits que compõem a informação digital representa uma parcela da tensão
analógica a ser convertida, de forma que a soma de todas as contribuições de cada um dos n bits forma
a tensão de entrada do conversor A/D. Assim a parcela de tensão proporcional ao bit m do conversor
A/D é dada por:
𝑉𝑒𝑛𝑡𝑟𝑎𝑑𝑎 =
𝑏𝑚2
(𝑚−1)
2𝑛
𝑉𝑟𝑒𝑓
Em que: bm é o valor do bit m, ou seja, 0 ou 1.
Vamos supor que o A/D para o exemplo da temperatura e que seja de 4 bits, a tensão de
referencia seja de 5V e o valor da conversão em binário seja 1101. A tensão de entrada, é:
𝑉𝑒𝑛𝑡𝑟𝑎𝑑𝑎 =
(1𝑥23 + 1𝑥22 + 0𝑥21 + 1𝑥20)
24
(5) = 4,0625𝑉
Este valor de tensão é equivalente a uma dada temperatura, e por isso o valor convertido
(1101) equivale a mesma temperatura. Assim, temos que duas conversões devem ser feitas, uma para
o sinal analógico em digital e a outra de digital para a unidade desejada que representa a grandeza a
ser medida como por exemplo °C.
35
Figura 30: Relação entre sinal analógico, digital e grandeza medida.
Existem muitas maneiras de implementar um A/D. O estudo aqui será do sistema de
conversão chamado de aproximação sucessiva.
Nesse tipo de conversor, a conversão é realizada do bit mais significativo (Msb) para o
menos significativo (Lsb). Dado que o Msb por se só representa metade da tensão de referência,
conhecer o estado deste bit (0 ou 1) significa saber se a tensão de entrada é maior ou menor que a
metade da referência. Conhecido o Msb, representa metade da metade (1/4) da tensão de referência.
Assim até o Lsb.
Supondo um A/D de 4 bits e Vref de 5V:
Tabela 4: Valor de cada bit para o exemplo.
Bit Tensão
4 (Msb) 2,5000 V
3 1,2500 V
2 0,6250 V
1 (Lsb) 0,3250 V
Supondo uma tensão de entrada de 3,3V. a conversão então seria:
1 – Testa-se o bit mais significativo, ou seja, a tensão de entrada é maior do que 2,5? Sim,
então este bit vale 1.
2 – Testa-se o próximo bit, ou seja a tensão de entrada é maior do que 3,75V (2,5V+1,25V)?
Não, então o bit é 0.
3 – Testa o próximo bit, a tensão de entrada é maior do que 3,125V (2,5V+0,625V)? Sim,
então o bit é 1.
4 – Por fim o bit menos significativo, a tensão de entrada é maior do que 3,4375V
(2,5V+0,625V+0,3125V)? Não, então o bit é 0.
Desse modo o valor final da conversão de 3,3V de entrada em binário é 1010.
É uma forma de conversão rápida e para um conversor de n bits são necessárias interações,
“que independem do valor a ser convertido”.
36
Quatro registradores controlam a operação do conversor:
ADRESH – byte mais significativo da conversão;
ADRESL – byte menos significativo da conversão;
ADCON0 – registrador de controle 0;
ADCON1 – registrador de controle 1.
O conversor gera um resultado binário de 10 bits e armazena o resultado nos registros
ADRESL e ADRESH.
Apesar do microcontrolador possuir diversos canais analógicos, internamente só existe um
sistema de conversão. Por isso, somente um canal pode ser utilizado de cada vez. Para começar a
utiliza-lo temos que aprender a configurar os canais de maneira correta.
Inicialmente se deve definir, conforme as necessidades do projeto, qual a quantidade de
canais analógicos que serão necessários. Em um microcontrolador que possui vários canais, se pode
utilizar todos ou parte deles, deixando os outros pinos configurados como I/O digitais. É impossível
configurar individualmente cada canal. Existem valores padrões de configuração que devem ser
respeitados.
Primeiro passo é configurar os canais de entrada que serão utilizados para introduzir o sinal
analógico do conversor A/D e os canais para tensões de referência. Isto se faz selecionando a
combinação correspondente aos bits PCFG3, PCFG2, PCFG1 e PCFG0 do registro de controle
ADCON1.
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
ADFM --- --- --- PCFG3 PCFG2 PCFG1 PCFG0
Figura 31: Dados de configuração do registrador ADCON1.
Para esta configuração se deve analisar a tabela 5, que defini quais pinos do PORT A ou E
serão entradas do conversor A/D.
Tabela 5: Pinos de entrada analógicas e tensão de referência.
PCFG3:
PCFG0
AN7
RE2
AN6
RE1
AN5
RE0
AN4
RA5
AN3
RA3
AN2
RA2
AN1
RA1
AN0
RA0
VREF+
VREF-
0000 A A A A A A A A VDD VSS
0001 A A A A VREF+ A A A RA3 VSS
0010 D D D A A A A A VDD VSS
0011 D D D A VREF+ A A A RA3 VSS
0100 D D D D A D A A VDD VSS
0101 D D D D VREF+ D A A RA3 VSS
0110 D D D D D D D D VDD VSS
0111 D D D D D D D D VDD VSS
1000 A A A A VREF+ VREF- A A RA3 RA2
1001 D D A A A A A A VDD VSS
1010 D D A A VREF+ A A A RA3 VSS
1011 D D A A VREF+ VREF- A A RA3 RA2
1100 D D D A VREF+ VREF- A A RA3 RA2
1101 D D D D VREF+ VREF- A A RA3 RA2
1110 D D D D D D D A VDD VSS
1111 D D D D VREF+ VREF- D A RA3 RA2
37
Além da configuração dos pinos analógicos, conforme a tabela apresentada, não se pode
esquecer de configurar os registradores TRISA e TRISE, de forma que os canais utilizados estejam
ajustados para entrada (TRIS = 1). Estando o canal analógico como saída, o sistema de conversão
continuará funcionando, mas os valores convertidos serão equivalentes aos níveis alto (1 = VDD) e
baixo (0=VSS).
Outra questão importante de se observar é o fato da utilização das tensões de referência. A
conversão é feita ao se comparar a tensão do pino de entrada analógica em relação as tensões de
referencia VREF + e VREF -. Assim, quando a tensão de entrada for igual a tensão VREF +, a conversão
tem como resultado o valor máximo (1024) e sendo a tensão de entrada igual a VREF – o resultado
será zero (0). Pode-se ter quatro tipos de referências, sendo duas internas (VDD e VSS), e duas externas,
ligadas aos pinos RA2 (VREF -) e RA3 (VREF +). Ao exemplificarmos com a aplicação de uma tensão
variando de 0V a 5V na entrada analógica e utilizando referencias internas onde VREF + = VDD(5V) e
VREF - = VSS(0V) e em outra aplicação um sensor varia de 1V a 4V. Para que não se perca a resolução
do A/D, então trabalha-se com tensões de referências externas com VREF +(RA3) = 4V e VREF – (RA2)
= 1V. É importante respeitar os limites elétricos impostos a essas referências:
Tabela 6: Limites elétricos.
Referência Mínimo (V) Máximo (V)
VREF + VDD – 2,5 VDD + 0,3
VREF - VSS – 0,3 VREF + - 2,0
(VREF + = VREF -) 2,0 VDD + 0,3
O próximo fato a ser aprendido é a importância da velocidade e consequentemente aos
tempos de amostragem que devem ser respeitados para uma correta utilização do conversor A/D.
Inicia-se entendo o funcionamento interno do sistema de conversão.
Para se evitar problemas de ruído e varações da entrada analógica durante o processo de
inversão (vale lembrar que nada é absolutamente instantâneo), Internamento o PIC utiliza uma
estrutura chamada Sample and Hold (S/H), com tradução ‘amostragem e retenção’. O PIC possui
internamente, um capacitor (120pF) ligado ao canal analógico em uso. Assim, ele fica carregadocom
a tensão proveniente do canal de amostra. Quando o processo de conversão é iniciado, este capacitor
é desligado, automaticamente, do canal analógico, mantendo a tensão sobre o capacitor constante
(retém). Por isso, durante todo o processo de conversão, a tensão utilizada é a existente no capacitor
e não mais a do canal analógico. Assim, mesmo que a tensão externa no canal varie, a conversão não
será afetada.
Durante o tempo da conversão, o valor da tensão no capacitor interno não foi alterado; porém
quando terminado a conversão ele será religado a entrada analógica, que pode ter sofrido uma
variação brusca e por isso que entre conversões é necessária uma adequação da carga do capacitor.
Sendo recomendado um tempo mínimo de 40µs a 50µs.
Entendido um pouco das características e conceitos do A/D, a gora se tem que saber como
fazer sua operação.
Sendo anteriormente configurado os canais utilizados pelos registros ADCON1 e TRIS,
agora é a vez de se configurar o ADCON0.
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE --- ADON
Figura 32: Dados de configuração do registrador ADCON0.
38
Deve-se ajustar 2 bits em ADCON0<ADCS1:ADCS0> pois é aqui que configuramos a
frequência de trabalho.
Tabela 7: Bits de configuração da frequência de trabalho do A/D.
ADCS1 ADCS0 Frequência
0 0 Fosc /2
0 1 Fosc /8
1 0 Fosc /32
1 1 RC Interno
Para os três primeiros ajustes, a frequência de trabalho do A/D será a frequência do oscilador
externo do PIC (Fosc) dividida por uma das opções (2, 8 ou 32). Obtendo assim o valor do TAD.
Imagine um cristal externo de 4 MHz e uma opção de Fosc /8, temos que:
TAD = 8/4.000.000
TAD = 0,000002s ou 2µs
Neste caso, o TAD é de 2µs. Quando se escolhe o cristal e da opção de divisão da frequência
é importante respeitar os valores de TAD aceitos pelo PIC. No PIC 16F877A (Standard) este valor
deve ser maior que 1,6µs. Valores muito altos para o TAD também não são muito aconselháveis, e por
isso se recomenda o limite de 20µs.
A última opção de escolha para o clock do A/D se refere a um RC interno dedicado para essa
finalidade. Neste caso o valor nominal para TAD é de 4µs (com variação entre 2µs e 6µs). Esta opção
pode ser utilizada para que o sistema de conversão continue funcionando mesmo em modo SLLEP.
Este RC pode ser usado a qualquer momento, mas é recomendado que para sistemas que operem com
frequências superiores a 4MHz este oscilador seja uado somente em modo SLEEP.
A última configuração necessária quanto a característica de funcionamento do conversor
A/D está relacionada com o modo de armazenamento do resultado nos registradores específicos.
Dado que a conversão gera um resultado de 10 bits, se faz necessário o uso de dois registradores para
armazenar este valor, o ADRESH e o ADRESL, que equivalem a parte alta e parte baixa do resultado.
Somados esses registradores resultam em 16 bits, com isso o resultado pode ser armazenado neles
justificando pela esquerda ou direita com o bit de configuração ADCON1<ADFM>.
Tabela 8: Seleção da justificação do armazenamento.
ADFM OPÇÃO
1
Justificado pela direita.
Utiliza todos os bits de
ADRESL [7:0] e somente
2 bits de ADRESH [1:0]
0
Justificado pela esquerda.
Utiliza todos os bits de
ADRESH [7:0] e somente
2 bits de ADRESL [1:0]
Tal justificação se faz valida quando queremos trabalhar com somente 8 bits do conversor,
assim se pode justificar pela esquerda e acessarmos somente a parte mais significativa através de
ADRESH. Com isso se cria um filtro, onde se joga fora os 2 bits menos significativos do ADRESL.
Ajustadas as configurações agora é hora de efetuar a conversão.
39
Começa-se ligando o sistema de conversão através de ADCON0<ADON>:
Tabela 9: Ligar ou desligar o sistema de conversão.
ADON Estado do A/D
0 Sistema Desligado
1 Sistema Ligado
O sistema pode ser mantido desligado quando não utilizado, para redução de consumo.
A próxima ação é a escolha do canal a ser utilizado, entre os oito disponíveis, através de
ADCON0<CHS2:CHS0>:
Tabela 10: Configuração do canal utilizado.
CHS2 : CHS0 Canal Selecionado
000 Canal 0 (RA0/AN0)
001 Canal 1 (RA1/AN1)
010 Canal 2 (RA2/AN2)
011 Canal 3 (RA3/AN3)
100 Canal 4 (RA5/AN4)
101 Canal 5 (RE0/AN5)
110 Canal 6 (RE1/AN6)
111 Canal 7 (RE2/AN7)
O último passo é iniciar a conversão por meio do bit ADCON0<GO/DONE>:
Tabela 11: Configura o estado da conversão.
GO/DONE Estado do A/D
1 Inicia a Conversão
0
Indica o termino da conversão.
Se forçado manualmente, cancela a conversão atual.
Para fazermos a leitura do canal A/D escolhido utilizaremos da instrução ADIN, mas para
usa-la é necessário alguns declares.
DECLARE ADIN_RES 10 – Informa o número de bits usado para o resultado da
conversão.
DECLARE ADIN_TAD FRC – Informa qual a fonte de clock para o sistema de conversão
A/D, configurando os bits do ADCON0<ADCS1:ADCS0>.
DECLARE ADIN_STIME 50 a 100 – Determina o tempo de carga total do capacitor de
amostragem, mais comumente adotado entre 50µs a 100µs.
Obs.: Só por motivo de precaução é importante lembrar que se faz muito importante a
configuração do PORT ou pino escolhido como entrada através do da instrução TRIS.
40
Circuito
Figura 33: Circuito do Projeto 7.
Programação
Device = 16F877A
Xtal 4
Dim VALOR As Word 'Declara a variavel
Dim TENSAO As Float 'Declara a variavel
Dim RESOLUCAO As Float 'Declara a variavel
RESOLUCAO = 0.0049 'Declara uma constante
TRISA.0 = 1 'Declara o pino como entrada
TRISB = 0 'Declara o PORT como saída
Declare LCD_Type 0 'Informa que o LCD é Alfanumerico
Declare LCD_DTPin PORTB.4 'Informa os pinos de Dados
Declare LCD_ENPin PORTB.3 'Informa o pino do Enable
Declare LCD_RSPin PORTB.2 'Informa o pino RS
Declare LCD_Interface 4 'Informa a quantidade de bits em um pacote de dados
Declare LCD_Lines 2 ' Informa o numero de linhas do LCD
Declare Adin_Res 10 'Bits usado na conversão
Declare Adin_Tad FRC 'Fonte do clock da conversão
Declare Adin_Stime 50 'tempo de carga do capacitor de amostragem
ADCON1=%10001110
INICIO:
Cls 'Limpa o LCD
VALOR = ADIn 0 'Coloca o valor do canal 0 no variavel VALOR
TENSAO = VALOR * RESOLUCAO 'Converte de Bits p/ valor real de tensão
Print "VALOR = ", Dec4 VALOR 'imprime o valor do canal 0
Print At 2, 1, "TENSAO = ", Dec4 TENSAO 'Imprime o valor de tensão
DelayMS 500
GoTo INICIO
41
Comentando
Neste programa temos que em ADCON1=%10001110 configuramos a leitura do A/D com
justificação a direita e ativamos o pino RA0/AN0 como o canal analógico a ser usado na conversão.
A variável VALOR recebe a conversão A/D em binário através da instrução ADIn 0 (canal 0). Como
VALOR recebe o valor da conversão em binário, temos que converter esse valor para que se possa
fazer a leitura real de tensão analógica na entrada do pino. Essa conversão se faz multiplicando
VALOR pela constante RESOLUCAO (que indica quanto vale cada bit da conversão A/D). Por
último imprimimos VALOR e TENSAO no LCD para que possamos visualizar os dados da
conversão.
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
42
6.2.8 - Projeto 8: Utilizando Sensor de Temperatura para Medições.
A medição de temperatura é uma pratica muito importante, principalmente em industrias e
em atividades ambientais.
Para medir temperatura através do PIC16F877A. É necessário o uso de um transdutor de
temperatura como o LM35 e um programa que auxilie na interpretação do resultado. Esses
transdutores têm sua leitura feita na escala de temperatura em graus Celsius com Range entre -55° C
e 150°C.
O LM35 tem uma família que diferem entre suas características, o que usaremos neste
projeto será o LM35DZ. Nele temos 3 pinos: O pino +Vs que recebe a tensão de entrada que pode
variar entre 4V e 30V, o pino GND que é ligado a terra ou ao negativo e o pino Vout é o pino de
saída do sensor e será ligado ao pino de entrada do microcontrolador. O LM35DZ tem uma variação
de tensão na sua saída dado por 10mV/°C, ou seja, para cada 1°C de variação o pino de saída tem um
incremento de 10mV. O LM35DZ mede temperatura entre 0°C e 100°C.
Para a leitura da temperatura utilizaremos o conversor A/D do PIC16F877A. Analisando os
parâmetros temos que: utilizando tensões de referência 0V e 5V no PIC e 10 bits de conversão, a
resolução será 0,004883 V/bit, sendo está a menor variação de tensão sentida pelo conversor e
equivalente a 1 bit. Com isso podemos dizer que se 10mV equivalem a 1°C então por regra de três
simples podemos dizer que a resolução equivale a 0,4883°C e assim podemos definir 1 bit do A/D
como sendo 0,4883°C.
Circuito
Figura 34: Circuito do Projeto 8.
43
Programa
Device = 16F877A
Xtal 4
Dim VALOR As Word 'Declara a variavel
Dim TEMPERATURA As Float 'Declara a variavel
Dim CONVERSAO As Float 'Declara a variavel
CONVERSAO = 0.4883 'Declara uma constante
TRISA.0 = 1 'Declara o pino como entrada
TRISB = 0 'Declara o PORT como saída
Declare LCD_Type 0 'Informa que o LCD é Alfanumerico
Declare LCD_DTPin PORTB.4 'Informa os pinos de Dados
Declare LCD_ENPin PORTB.3 'Informa o pino do Enable
Declare LCD_RSPin PORTB.2 'Informa o pino RS
Declare LCD_Interface 4 'Informa a quantidade de bits em um pacote de dados
Declare LCD_Lines 2 ' Informa o numero de linhas do LCD
Declare Adin_Res 10 'Bits usado na conversão
Declare Adin_Tad FRC 'Fonte do clock da conversão
Declare Adin_Stime 50 'tempo de carga do capacitor de amostragem
ADCON1=%10001110
INICIO:
Cls 'Limpa o LCD
VALOR = ADIn 0 'Coloca o valor do canal 0 no variavel VALOR
TEMPERATURA = VALOR * CONVERSAO 'Converte de Bits p/ temperatura
Print "VALOR = ", Dec4 VALOR 'imprime o valor do canal 0
Print At 2, 1, "Temperatura=", Dec4 TEMPERATURA, 'Imprime o valor
DelayMS 500 'de TEMPERATURA
GoTo INICIO
Comentando
Neste projeto o valor convertido no canal 0 do A/D proveniente do sensor de temperatura
LM35DZ é colocado na variável VALOR e depois com a constante de conversão CONVERSAO, o
valor da variável VALOR é convertido para o valor de temperatura graus Celsius registrada pelo
sensor. E por último é impresso no LCD, VALOR e TEMPERATURA.
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
44
6.2.9 – Projeto 9: Acionamento de Servo-Motores.
Os servos motores são usados em várias aplicações quando se deseja movimentar algo de
forma precisa e controlada.
Sua característica mais marcante é a sua capacidade de movimentar o seueixo até uma posição
e mantê-lo, mesmo quando sofre uma força em outra direção.
Para entendimento de seu funcionamento é necessário o conhecimento de sua parte interna
como mostra a figura abaixo:
Figura 35: Componentes internos do servo motor (Fonte: Desconhecida).
<<<Partes do Servo Motor>>>
Circuito de Controle – responsável pelo monitoramento do potenciômetro e acionamento do
motor visando obter uma posição pré-determinada.
Potenciômetro – ligado ao eixo de saída do servo, monitora a posição do mesmo.
Motor – Movimenta as engrenagens e o eixo principal do servo.
Engrenagens – reduzem a rotação do motor, transferem mais torque ao eixo principal de saída
e movimentam o potenciômetro junto com o eixo.
Estes componentes estão posicionados internamente a caixa do servo da forma mostrada na
figura 36:
Figura 36: Vista do servo motor (Fonte: Desconhecida).
45
<<<Controle do Servo Motor>>>
O servo motor é alimentado com tensões de 5V e recebe um sinal no formato PWM (Pulse
Width Modulation). Este sinal é 0V ou 5V. O circuito de controle do servo fica monitorando este
sinal em intervalos de 20ms. Se neste intervalo de tempo, o controle detecta uma alteração do sinal
na largura o sinal, ele altera a posição do eixo para que a sua posição coincida com o sinal recebido.
Como mostra a Figura 37:
Um sinal com largura de pulso de 1ms corresponde a posição do servo todo a esquerda ou 0
graus.
Um sinal com largura de pulso de 1,5ms corresponde a posição central do servo ou de 90
graus.
Um sinal com largura de pulso de 2ms corresponde a posição do servo todo a direita ou 180
graus.
Figura 37: Sinais de controle do servo motor (Fonte: Desconhecida)
Uma vez que o servo recebe um sinal de 1,5ms (por exemplo), ele verifica se o potenciômetro
encontra-se na posição correspondente, se ele estiver nada é feito. Se o potenciômetro não estiver na
posição correspondente ao sinal recebido, o circuito de controle aciona o motor até que o
potenciômetro esteja na posição correta. A direção de rotação do servo motor depende da posição do
potenciômetro. O motor vai girar na direção levando o potenciômetro mais rapidamente na posição
correta.
46
Circuito
Figura 38: Circuito do Projeto 9.
Programa
Device 16F877A
Xtal 4
TRISB=%00000000
TRISD=%11100000
Dim POS As Word
Symbol SERVO1 = PORTB.0 'Nomeia pino do servo
Symbol BOTAO1 = PORTD.5 'Nomeia pino do Botão 1
Symbol BOTAO2 = PORTD.6 'Nomeia pino do Botão 2
Symbol BOTAO3 = PORTD.7 'Nomeia pino do Botão 3
PORTB=0
PORTD=0
POS=1500 'Coloca o valor 1500 na variavel POS
TEST:
If BOTAO1=1 Then If POS<2000 Then POS=POS+1 'Gira p/ direita
If BOTAO2=1 Then POS=1500 'Centraliza
If BOTAO3=1 Then If POS>0 Then POS=POS-1 'Gira p/ esquerda
Servo SERVO1, POS 'Instrução para controle do Servo Motor
DelayMS 20
GoTo TEST
Comentando
Esse é um programa bem simples onde a instrução Servo controla a posição do servo motor
através de pulsos entre 1ms e 2ms de duração, sendo esse tempo controlado pela instrução IF-THEN
relacionando os valores com 3 botões ligados ao PORTD, onde o BOTAO1 incrementa uma unidade
no tempo do pulso de controle do servo, assim acrescentando 0,001ms de duração ao sinal de pulso,
fazendo o servo girar para a direita. O BOTAO2 centraliza o servo motor com pulso do sinal de
controle em 1,5ms e o BOTAO3 decrementa 0,001ms de duração do sinal de controle do pulso e com
isso o servo gira para a esquerda.
47
6.2.10 – Projeto 10: Usando o PWM.
A instrução PWM Pino, Duty (ou Nível), Ciclo, produz um trem de pulsos em modulação
por largura de pulso em um pino. Cada ciclo de PWM consistem de 256 passos.
O Duty (Nível) é uma variável ou constante que determina a duração do pulso em seu nível
mais alto indo de 0 até 255. Quando o Nível for 0, a saída se mantem em 0% da tensão de entrada e
quando o Nível for 255, a saída se mantem em 100% da tensão de entrada.
O Ciclo é uma variável ou constante onde se define o número de ciclos em um pino
especifico, ou seja, o ciclo PWM é repetido ciclo vezes.
O tempo do Ciclo do PWM depende da frequência do oscilador. Se um oscilador de 4MHz
é usado, cada Ciclo duraria cerca de 5ms. Se um oscilador de 20MHz é usado, cada Ciclo teria cerca
de 1ms. A definição do valor do Oscilador não terá efeito no PWM.
Podem ser usados quantos Pinos quiser dentro do limite do microcontrolador. O Pino será
fixado como saída logo antes da geração dos pulsos e será revertido para entrada após parar a geração.
A saída PWM em pino se parece com uma distorção de sinais e não com uma linha série de ondas
quadradas. Para melhor estabilidade do sinal ó necessário algum tipo de filtro e assim tornar o sinal
em algo que possa ser utilizado. Um circuito RC pode ser usado como um simples conversor
Digital/Analógico (D/A), como mostra a figura 39. Esse filtro é utilizado no pino do microcontrolador
quando se quer utilizar a própria tensão do microcontrolador para obter a tensão analógica de saída,
quando se quer outras tensões então o PWM será usado para gerar o sinal para outro circuito gerar o
sinal analógico e agora este é que necessitara do filtro.
Figura 39: Filtro RC.
O PWM é muito usado para regular tensões em fontes. Este controle se faz modificando
Nível da largura de pulso de trabalho do sinal gerado. Pode-se aplicar a formula a baixo para obter o
Nível dos pulsos ou a tensão de saída.
𝑉𝑜𝑢𝑡 =
𝑉𝑓𝑜𝑛𝑡𝑒 ∗ 𝑁í𝑣𝑒𝑙
255
𝑜𝑢 𝑁í𝑣𝑒𝑙 =
𝑉𝑜𝑢𝑡 ∗ 255
𝑉𝑓𝑜𝑛𝑡𝑒
Onde:
Vout: tensão de saída
Vfonte: tensão da fonte de alimentação do circuito
Nível: constante entre 0 a 255.
48
Circuito
Figura 40: Circuito do Projeto 10.
Programa
Device 16F877A
Xtal 4
TRISB=%00000000
INICIO:
PWM PORTB.7, 128, 100 'PWM para 50% do sinal
GoTo INICIO
End
Comentando
Nesse projeto o intuito foi adquirir na saída um sinal com metade da fonte de tensão, que
nesse caso seria 5V proveniente do microcontrolador PIC. Utilizando a formula anteriormente citada
se pode calcula o valor do Nível: Nível=(2,5*255)/5=127,5 ou 128. O Ciclo foi de 100 ciclos do PWM.
Na saída analógica temos 2,5V na saída analógica para a configuração da figura 40, com a
configuração do PWM, 128, 100.
49
7 – REFERENCIAS BIBLIOGRÁFICAS
SOUSA, David José de. Nicolás César L. Conectando o PIC-Recursos Avançados. 3a Edição –
Editora Erica, 2002.
SENA, António Sérgio. Microcontroladores PIC. SENAC
ESTEVA, Christian Bodington. BASIC PARA MICROCONTROLADORES PIC.
JERÔNIMO, Alberto. Microcontroladores PIC Para Iniciantes.
SOUSA, Vitor Amadeu. Programação em BASIC para o PIC.
MECANIQUE. Pronto ds userguide. 2004.
microEngineering Labs, Inc. PicBasic Pro Compiler.