Вы находитесь на странице: 1из 64

Aula de Microcontrolador

Pgina 1







Prof. Ms. Alcinei Moura Nunes





Curso: Ps-Graduao em Mecatrnica






Apostila
de
Microcontroladores

PIC16F877A









Aula de Microcontrolador
Pgina 2
Metodologia

- 3 primeiras aulas Expositivas e Prticas
- 2 ltimas Apresentao dos Trabalhos

OBS.: O Aluno ter que despertar interesse para alguma aplicao do Microcontrolador
estudado e dever ao longo do curso (4 primeiras aulas) tirar as dvidas com o professor.
Na ltima aula, far uma apresentao de seu desenvolvimento. Sua nota final ser
composta pela participao (presena) e apresentao do projeto.


Material de Apoio

- Livros sobre microcontroladores da Linha PIC (pesquisar pelo Google)
- site: www.microchip.com (datasheet e application note)
- Gravadores (internet): ATM (mercado livre) e Labtools (Mcflash ou ICD2BR)


Aula 1
Conhecendo o Processador

Tpicos:

Caractersticas Gerais do PIC16F877A
Perifricos
Arquitetura
Organizao da Memria
Registrador STATUS
Pinagem
Ambiente de Desenvolvimento (MPLAB)
Organizao de um Programa
Clock do PIC (ciclo de mquina)
Primeiro Programa: Acionamento de um Motor de Passo


Caractersticas Gerais do PIC16F877A

- Arquitetura RISC (set de instrues reduzidas);
- 35 instrues apenas;
- Velocidade de Operao: at 20MHz;
- Memria de Programa (Flash): 8K x 14 words;
- Memria de Dados (RAM): 368 x 8 bytes;
- Memria EEPROM: 256 x 8 bytes;
- 8 nveis de STACK;
- 14 tipos de interrupes;
- WDT (WatchDogTimer);
Aula de Microcontrolador
Pgina 3
- Proteo do Cdigo;
- In-Circuit Serial Programming (ICSP) atravs de 2 pinos;
- Opo de selecionar o oscilador;
- Ampla faixa de tenso de Operao: 2,0V 5,5V;
- Capacidade de corrente por pino: 25mA.



Perifricos

Timer0: 8-bit timer/counter
Timer1: 16-bit timer/counter
Timer2: 8-bit timer/counter
Modo PWM (10-bit de resoluo)
8 canais analgicos (10-bit de resoluo)
Modo SSP (Synchronous Serial Port) com protocolos SPI e I2C
Modo de Comunicao USART (Universal Synchronous Asynchronous Receiver
Transmitter)
Comunicao Paralela (Parallel Slave Port PSP).



Arquitetura

Pgina 6 do Datasheet PIC16F87X





















Aula de Microcontrolador
Pgina 4
Organizao da Memria

Memria de Programa














Aula de Microcontrolador
Pgina 5
Memria de Dados




Aula de Microcontrolador
Pgina 6



Registrador STATUS




Aula de Microcontrolador
Pgina 7
Pinagem




















Aula de Microcontrolador
Pgina 8
Ambiente de Desenvolvimento (MPLAB)


Gerenciador de projeto MPLAB






Um compilador converte o cdigo fonte em instrues de mquina.




Liguagem C,
Assembly ou
Pascal.
Linguagem
de Mquina
Aula de Microcontrolador
Pgina 9
Todos os Projetos tero os seguintes passos bsicos:

Seleo do Dispositivo
Criao do Projeto
Seleo da Ferramenta de Linguagem
Criao do Cdigo-Fonte
Construo do Projeto (Montagem e Ligao)
Teste do Cdigo com Simulador







Ambiente de Trabalho










Aula de Microcontrolador
Pgina 10


Configure> Select Device

Seleo do Dispositivo


As luzes indicam quais componentes o MPLAB IDE suporta para este dispositivo.

Verde: indica suporte completo
Amarelo: indica suporte parcial
Vermelho: indica nenhum suporte para esse dispositivo.












Aula de Microcontrolador
Pgina 11
Project > Project Wizard

Criando um Novo projeto


Seleo do PIC

Aula de Microcontrolador
Pgina 12

Seleo da Linguagem




Nome do Projeto
Aula de Microcontrolador
Pgina 13


Adio de arquivos existentes para seu projeto


Resumo da criao do projeto

Aula de Microcontrolador
Pgina 14
Caso no tenha adicionado nenhum arquivo, ento clique no File>New para escrever o
cdigo fonte.


Janela para escrever o programa






Programa

Aula de Microcontrolador
Pgina 15
Project>Build All

Assembler do Programa



Neste passo, criamos os arquivos de sada (.HEX, .LST e .ERR) a partir do arquivo .ASM.
Quando aparecer a mensagem BUILD SUCCEEDED no final da compilao, significa que os
arquivo de sada foram gerados corretamente, ou seja, as instrues do programa foram
compreendidas e convertidas em sistema binrio. Caso aparea a mensagem BUILD FAILED,
deve-se dar duplo clique sobre o erro na janela de sada para o erro ser apontado na janela do
cdigo-fonte.


Se o Construdo com Sucesso foi alcanado, pode-se realizar a simulao do
programa, funcionando no MPLAB como se estivesse gravado na memria do CHIP.
















Aula de Microcontrolador
Pgina 16
Debugger>Select Tool>MPLAB SIM

Simulao

Na simulao podemos verificar como dever ser a execuo do programa quando este
estiver gravado na memria FLASH do PIC. Para verificarmos os valores que so lidos ou
escritos na memria de dados ou outros componentes do microcontrolador clicamos no menu
View.

View>Watch

Verificao dos valores dos registradores
Aula de Microcontrolador
Pgina 17
Com o Watch possvel verificar alguns valores de alguns registradores especficos.


Organizao de um programa

;***************************************************************
#include<P16F877A> ;regio para incluso de bibliotecas e macros.
;***************************************************************
__CONFIG ;regio de habilitao/desabilitao dos fusveis.
;***************************************************************
#define BANK1 BSF Status,RP0 ;regio para definio de mini-macros.
;***************************************************************
CBLOCK 0x20 ;regio para definio de variveis
Tempo1 ;os registradores de propsito geral
Tempo2 ;comeam do endereo 0x20 da RAM.
Endc
;***************************************************************
tempo1_value EQU .10 ;regio para associao de valores nomes
tempo2_value EQU .50
;***************************************************************
ORG 0x0000 ;incio da memria de programa
Goto INICIO
;***************************************************************
ORG 0X0004 ;incio da regio de interrupo
Goto INT
;***************************************************************
DELAY_LCD ;regio de sub-rotinas chamadas pela
.... ;instruo CALL
RETURN

ATUALIZA_LCD
....
RETURN

MULTIPLICACAO
....
RETURN
;***************************************************************
Inicio ;incio do programa
BANK1
MOVLW B00000001 ;regio para carregamento dos registradores
MOVWF TRISA ;especiais conforme aplicao prtica
MOVLW B00000000
MOVWF TRISB
BANK0

....
Aula de Microcontrolador
Pgina 18


Principal ;regio lgica do programa
;atuao dos registradores de
.... ;entrada e sada


Goto Principal
;***************************************************************
END ;Final do Programa
;***************************************************************


Clock do PIC (ciclo de mquina)

O Pic16F877A possui dois osciladores internos do tipo RC de 4MHz, com precises
de 1 e 5, as quais dependem das condies de tenso e temperatura do sistema. Estes
osciladores no so to precisos, mas dispensam a utilizao de osciladores externos,
liberando 2 pinos de I/Os.
De um modo geral, osciladores externos so utilizados, e sua escolha depender
da preciso e custos envolvidos; dentre eles podemos destacar: circuito RC, ressoador,
cristal e circuitos de oscilao. Abaixo temos a ligao de um oscilador cristal.



Aula de Microcontrolador
Pgina 19




Nos microcontroladores da famlia PIC, o clock internamente dividido por quatro.
Sendo assim, para um cristal de 4MHz, teremos um clock interno de 1MHz, ou seja, o
tempo de execuo de cada instruo ser de 1us (micro-segundo). Este tempo
chamado de ciclo de mquina e menor quanto maior for o cristal externo utilizado.
Em cada perodo de 1us (para o caso de um cristal de 4MHz), uma nova
informao buscada na memria de programa enquanto a informao anterior
executada. Essa caracterstica de buscar a informao em um ciclo de mquina e
execut-la no prximo conhecida como PIPELINE.
De um modo geral, as instrues so executadas no perodo de 1 ciclo de mquina;
apenas as instrues que indicam salto, tais como: CALL, RETURN e GOTO, perdem 2
ciclos de mquina.


Primeiro Programa: Acionamento de um Motor de Passo

Aprendizado

- Estrutura de um Programa
- Declarao de variveis
- Estrutura de Deciso (botes)
- Carregamento de Registradores
- Delay
- Deboucing (filtro para botes)


Aula de Microcontrolador
Pgina 20
Funcionamento do Motor de Passo

O motor de passo se difere dos demais motores devido a duas caractersticas
principais: preciso (sem a necessidade sensores de final de curso) e modo de
acionamento.

A maioria dos motores de passo so acionados atravs de sinais seqenciais e
independentes para cada uma de suas 4 bobinas. Sua velocidade dada atravs do delay
entre um sinal e outro.

O ngulo do motor de passo pode variar de motor para motor, mas no geral de
1,8 por passo. Dependendo do modo de acionamento possvel reduzir este valor pela
metade.

Abaixo mostramos o modo de acionamento, considerando um sinal de 1 byte (8
bits) para um motor de 4 bobinas.

Sinal Bobinas
00000001 Bobina 1
00000010 Bobina 2
00000100 Bobina 3
00001000 Bobina 4

Em cada instante, apenas uma bobina est acionada. O sinal deve ser seqencial
para que o motor gire para o mesmo sentido. Se a seqncia correta no for alcanado o
motor girar um passo para um sentido e outro para o sentido contrrio, ou seja, ele
vibrar, mas no sair do lugar.

Identificao do Comum do Motor de passo

Normalmente os motores de passo possuem seis fios, sendo que dois deles devem
ser conectados no mesmo ponto. Estes dois devem ser identificados e so chamados de
comum. Quando temos a configurao a cinco fios, quer dizer que os dois fios j esto
conectados juntos no interior do motor e, portanto, temos um fio comum.


Aula de Microcontrolador
Pgina 21

Para identificao dos comuns, devemos medir os fios de dois em dois na escala de
resistncia. Quando estivermos com o fio comum em uma das pontas de prova do
multmetro a resistncia dever ser lida pela metade (vide figura abaixo).

Motor de 5 fios Motor de 6 fios


Analisando o caso do motor a cinco fios acima, temos que a medida entre
quaisquer dois fios excluindo o fio 1, resultar sempre o dobro da medida entre o fio 1 e
qualquer outro fio (2, 3, 4 e 5).
O mesmo vale para o motor a seis fios, apenas que o comum, neste caso,
formado pela conexo dos fios 1 e 2.

Identificao da seqncia das Bobinas


Tendo j descoberto o fio comum, para identificarmos a seqncia das bobinas
devemos aplicar 12 volts em seus terminas. O positivo da fonte deve ser conectado ao
comum do motor, e o negativo deve ser triscado em cada uma das quatro bobinas at
alcanar uma combinao que resulte no giro do motor para um mesmo sentido.
















Aula de Microcontrolador
Pgina 22
Drivers para acionamento do Motor de Passo



ULN2803














Aula de Microcontrolador
Pgina 23




TIP31C



















Aula de Microcontrolador
Pgina 24
Esquema de Ligao utilizando Transistores (TIP122 ou TIP31C)



Hardware do Boto






Programa


#INCLUDE<P16F877A.INC>

__CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF
& _BODEN_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

Aula de Microcontrolador
Pgina 25
#DEFINE BANK1 BSF STATUS,RP0
#DEFINE BANK0 BCF STATUS,RP0
#DEFINE BT_HOR PORTB,7
#DEFINE BT_ANTIHOR PORTB,6

CBLOCK 0X20
T1
T2
T3
FILTRO1
FILTRO2
ENDC

FILTRO1_VALUE EQU .180
FILTRO2_VALUE EQU .20

ORG 0X0000
GOTO CONFIGURA

ORG 0X0004
GOTO CONFIGURA

;********************************************
DELAY
MOVLW .255
MOVWF T1
MOVLW .255
MOVWF T2
MOVLW .8
MOVWF T3

DELAYAUX
DECFSZ T1
GOTO DELAYAUX
DECFSZ T2
GOTO DELAYAUX
DECFSZ T3
GOTO DELAYAUX

RETURN
;********************************************

CONFIGURA
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
Aula de Microcontrolador
Pgina 26
CLRF PORTE

BANK1
MOVLW B'00000000'
MOVWF TRISA
MOVLW B'11110000'
MOVWF TRISB
MOVLW B'00000000'
MOVWF TRISC
MOVLW B'00000000'
MOVWF TRISD
MOVLW B'00000000'
MOVWF TRISE

MOVLW B'10000100'
MOVWF OPTION_REG
MOVLW B'00000111'
MOVWF ADCON1

BANK0
MOVLW B'00000000'
MOVWF INTCON

HORARIO
BTFSS BT_ANTIHOR
GOTO FILTRO_ANTIHOR

BSF PORTC,7
CALL DELAY
BCF PORTC,7
BSF PORTC,6
CALL DELAY
BCF PORTC,6
BSF PORTC,5
CALL DELAY
BCF PORTC,5
BSF PORTC,4
CALL DELAY
BCF PORTC,4

MOVLW FILTRO1_VALUE
MOVWF FILTRO1
MOVLW FILTRO2_VALUE
MOVWF FILTRO2

GOTO HORARIO

Aula de Microcontrolador
Pgina 27
FILTRO_ANTIHOR
DECFSZ FILTRO1
GOTO HORARIO

MOVLW FILTRO1_VALUE
MOVWF FILTRO1

DECFSZ FILTRO2
GOTO HORARIO

MOVLW FILTRO2_VALUE
MOVWF FILTRO2

GOTO ANTI_HORARIO



ANTI_HORARIO
BTFSS BT_HOR
GOTO FILTRO_HOR

BSF PORTC,4
CALL DELAY
BCF PORTC,4
BSF PORTC,5
CALL DELAY
BCF PORTC,5
BSF PORTC,6
CALL DELAY
BCF PORTC,6
BSF PORTC,7
CALL DELAY
BCF PORTC,7

MOVLW FILTRO1_VALUE
MOVWF FILTRO1
MOVLW FILTRO2_VALUE
MOVWF FILTRO2

GOTO ANTI_HORARIO

FILTRO_HOR
DECFSZ FILTRO1
GOTO ANTI_HORARIO

MOVLW FILTRO1_VALUE
MOVWF FILTRO1
Aula de Microcontrolador
Pgina 28

DECFSZ FILTRO2
GOTO ANTI_HORARIO

MOVLW FILTRO2_VALUE
MOVWF FILTRO2

GOTO HORARIO

END

*********************************************FIM AULA 1********************************************



Aula 2
Interrupes do PIC16F877A



Tpicos:

Interrupes
Timers (temporizadores)
Temporizao de 1 segundo (TIMER1)
Display de Cristal Lquido (LCD 2x16)
Segundo Programa: Relgio Digital



Interrupes


Interrupo uma poderosa ferramenta dos microcontroladores. Os registradores
responsveis pela interrupo do PIC16F877A so: INTCON, PIE1, PIE2, PIR1 e PIR2. O
principal Registrador o INTCON, pois os bits 6 (PEIE) e 7 (GIE) deste registrador so
responsveis pela habilitao da interrupo.
Para este microcontrolador especfico, todas interrupes so apontadas para o
endereo 0x0004 da Memria de Programa (FLASH). Portanto, quando uma interrupo
ocorrer o contador de programa (PCLATH:PCL) apontar para a posio 0x0004, ficando
por conta do programador a escolha das prioridades.





Aula de Microcontrolador
Pgina 29
REGISTRADOR INTCON
7 6 5 4 3 2 1 0
R/W R/W R/W R/W R/W R/W R/W R/W
GIE PEIE T0IE INTE RBIE T0IF INTF RBIF







GIE = Habilitao geral das interrupes.
PEIE = Habilita/Desabilita interrupo por perifricos.
T0IE = Habilita/Desabilita interrupo por Timer 0.
INTE = Habilita/Desabilita interrupo pelo pino RB0/INT.
RBIE = Habilita/Desabilita interrupo por mudana de estado.
T0IF = Sinalizador de estouro do TMR0.
INTF = Sinalizador de interrupo pelo pino RB0/INT.
RBIF = Sinalizador de interrupo por mudana de estado.




REGISTRADOR PIE1
7 6 5 4 3 2 1 0
R/W R/W R/W R/W R/W R/W R/W R/W
PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE


PSPIE = Habilita interrupo por Escrita/Leitura da Porta Paralela.
ADIE = Habilita interrupo por trmino da converso A/D.
RCIE = Habilita interrupo por dado recebido (USART)
TXIE = Habilita interrupo por dado transmitido(USART).
SSPIE = Habilita interrupo por dado recebido/transmitido por Porta Serial Sncrona
CCP1IE = Habilita interrupo do mdulo CCP1.
TMR2IE = Habilita interrupo por estouro do Timer 2.
TMR1IE = Habilita interrupo por estouro do Timer 1.









{
Chave Geral para interrupo de perifricos
Porta Paralela, Conversor A/D,
USART (recepo e transmisso),
CCP1, CCP2, SSP (SPI ou I2C), Timer
1 (TMR1) e Timer 2 (TMR2).
Aula de Microcontrolador
Pgina 30

REGISTRADOR PIE2
7 6 5 4 3 2 1 0
R/W R/W R/W R/W R/W R/W R/W R/W
EEIE BCLIE CCP2IE


EEIE = Habilita interrupo por Escrita/Leitura na EEPROM.
BCLIE = Habilita interrupo por Coliso no Barramento.
CCP1IE = Habilita interrupo do mdulo CCP2.




REGISTRADOR PIR1
7 6 5 4 3 2 1 0
R/W R/W R/W R/W R/W R/W R/W R/W
PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF


PSPIF = Sinalizador de trmino de Escrita/Leitura na Porta Paralela.
ADIF = Sinalizador de trmino da converso A/D.
RCIF = Sinalizador de dado recebido (USART)
TXIF = Sinalizador de dado transmitido(USART).
SSPIF = Sinalizador de dado recebido/transmitido por Porta Serial Sncrona
CCP1IF = Sinalizador da interrupo do mdulo CCP1.
TMR2IF = Sinalizador de estouro do Timer 2.
TMR1IF = Sinalizador de estouro do Timer 1.


REGISTRADOR PIR2
7 6 5 4 3 2 1 0
R/W R/W R/W R/W R/W R/W R/W R/W
EEIF BCLIF CCP2IF

EEIF = Sinalizador de trmino de Escrita/Leitura na EEPROM.
BCLIF = Sinalizador de Coliso no Barramento.
CCP1IF = Sinalizador de interrupo do mdulo CCP2.


TIMERS (Temporizadores)

Cada um dos Timers possui uma capacidade de temporizao que se diferem uns
dos outros conforme a quantidade de bits, os registradores de controle e o PRESCALER
(divisor de freqncia). O Prescaler um divisor de freqncia que torna possvel um
aumento no tempo de incremento do registrador (contador).
Aula de Microcontrolador
Pgina 31
Os registradores dos TIMERS podem ser incrementados de duas maneiras: atravs
do clock interno (ciclo de mquina) ou atravs da borda de subida ou descida de um sinal
de entrada externo.
O tempo obtido atravs da multiplicao entre: a contagem dos incrementos no
registrador (da inicializao at o estouro), o Prescaler, e, o clico de mquina ou o tempo
do pulso externo.


TMR0

O TMR0 um contador automtico de 8bits (256 valores); seu registrador de
controle o OPTION_REG. O TMR0 incrementado em cada ciclo de mquina quando o
T0CS=0, ou incrementado em cada pulso externo pelo pino RA4/T0CKI quando T0CS=1
(T0CS configurado no registrador OPTION, onde tambm configurado se o incremento
ser na borda de subida, 0, ou descida, 1, atravs de T0SE).
Se a interrupo por estouro de TMR0 estiver habilitada no INTCON (T0IE=1), ao
final da contagem (255) o contador de programa (PCLATH:PCL) apontar para a posio
0x0004.
Atravs do PRESCALER, tambm configurado no OPTION, possvel aumentar o
tempo de estouro do TMR0 dividindo a freqncia, isto , quanto menor a freqncia,
maior o tempo. A tabela do PRESCALER mostrada abaixo.


PS 2 / 1 / 0 TMR0 WDT
000 1:2 1:1
001 1:4 1:2
010 1:8 1:4
011 1:16 1:8
100 1:32 1:16
101 1:64 1:32
110 1:128 1:64
111 1:256 1:128



Por exemplo, se utilizarmos a configurao 111, para os bits PS2, PS1 e PS0, o
TMR0 ser incrementado a cada 256s. Importante lembrar que, o bit 3 (PSA) do OPTION
seleciona o PRESCALER para WDT (PSA=1) ou para TMR0 (PSA=0). O registrador
OPTION mostrado abaixo.







Aula de Microcontrolador
Pgina 32
REGISTRADOR OPTION
7 6 5 4 3 2 1 0
R/W R/W R/W R/W R/W R/W R/W R/W
RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0

RBPU = Ativao dos resistores de pull-ups internos do PORTB.
0: Resistores de pull-ups ativados (apenas para os pinos configurados como
entrada)
1: Resistores de pull-ups desativados

INTEDG = Configurao da borda que gerar a interrupo externa no RB0.
0: Interrupo ocorrer na borda de descida.
1: Interrupo ocorrer na borda de subida.

T0CS = Configurao do incremento para o TMR0.
0: TMR0 ser incrementado internamente pelo clock de mquina.
1: TMR0 ser incrementado externamente pelo pino RA4/T0CKI.

T0SE = Configurao da borda que incrementar o TMR0 no pino RA4/T0CK, quando
T0CS=1.
0: borda de subida
1: borda de descida

PSA = Configurao de aplicao do Pre-Scale
0: O Pre-Scale ser aplicado ao TMR0.
1: O Pre-Scale ser aplicado ao WDT.

PS2:PS0 = Configurao do valor do Pre-Scale (a tabela j foi mostrada acima)



TMR1

O TMR1 um contador automtico de 16 bits; seu registrador de controle o
T1CON. No TMR1 so utilizados dois registradores (TMR1L e TMR1H) para armazenar o
valor de inicializao da contagem. Assim como no Timer 0, o TMR1 pode trabalhar com o
incremento pelo clock interno ou externo, e tambm possui um prescaler independente,
configurado no registrador T1CON (T1CKPS1:T1CKPS0), o qual mostrado abaixo.









Aula de Microcontrolador
Pgina 33
REGISTRADOR T1CON
7 6 5 4 3 2 1 0
U U R/W R/W R/W R/W R/W R/W
- - T1CKPS1 T1CKPS0 T1OSCEN /T1SYNC TMR1CS TMR1ON


T1CKPS1:T1CKPS0 = Ajuste do prescaler do Timer 1 (tabela abaixo).


PS1 / 0 TMR1
00 1:1
01 1:2
10 1:4
11 1:8


T1OSCEN = Habilitao de um oscilador externo para os pinos T1OSO e T1OSI (12 e 13).
0: Oscilador desabilitado.
1: Oscilador externo habilitado.

/T1SYNC = Controle de sincronismo interno. Quando TMR1CS=0 este bit ignorado.
0: Sincronismo ligado.
1: Sincronismo desligado (modo assncrono).

TMR1CS = Seleo da origem do clock para Timer 1.
0: Clock interno
1: Clock externo no pino T1OSO/T1CKI

TMR1ON = Habilitao do Timer 1.
0: Timer 1 desabilitado. Paralisa o contador do Timer 1.
1: Timer 1 habilitado.


Temporizao de 1 segundo (TIMER1)

Os registradores que devem ser carregados com o valor inicial da contagem so:
TMR1L e TMR1H.

Para podermos obter um tempo de 1 segundo apresentaremos uma maneira das
vrias possibilidades possveis, isto depende dos valores iniciais de TMR1L e TMR1H, e
do Prescaler do Timer 1, configurado atravs do T1CON.

Temporizao de 1 segundo:

TMR1_HIGH EQU HIGH (.65536-.62500) ;parte alta do valor do temporizador
TMR1_LOW EQU LOW (.65536-.62500) ;parte baixa do valor do temporizador
Aula de Microcontrolador
Pgina 34

MOVLW B00110000 ;Prescaler 1:8
MOVWF T1CON

Efetuando a configurao acima temos um tempo de 0,5 segundo, por isto preciso
um registrador auxiliar carregado com o valor 2 para que somente na segunda interrupo
esta rotina seja executada. Isto obtido atravs das instrues abaixo.

DECFSZ Divisor_TMR1
Goto SAI_INT_TMR1

INT_TMR1 ;rotina de interrupo por TMR1

.....


SAI_INT_TMR1
BCF PIR1,TMR1IF

RETFIE


Display de Cristal Lquido (LCD 2x16)





O modelo de display que estaremos utilizando
um de duas linhas com 16 caracteres cada uma.
Sua pinagem mostrada abaixo:


Pino Funo Pino Funo
1 V
SS
9 DB2
2 V
DD
10 DB3
3 V
0
11 DB4
4 RS 12 DB5
5 R/W 13 DB6
6 E 14 DB7
7 DB0 15 A
8 DB1 16 K


V
SS
e V
DD
: alimentao do componente (5V)
V
o
: potencimetro de 10K (controle de contraste)
Aula de Microcontrolador
Pgina 35
RS: Tipo de informao (0=comando; 1=dado)
R/W: Leitura (0) / Escrita (1) - comando ou dado e verificao do trmino de uma
operao
E: habilita leitura da informao no barramento de dados
DB0 a DB7: barramento de dados paralelo
A e K: usados para ligao do Backlight (iluminao de fundo)


Existem basicamente duas maneiras para se trabalhar com o LCD: uma a
deteco do instante exato no qual a operao j foi executada, onde fazemos a leitura do
BUSY FLAG utilizando o pino RW como leitura, atravs da operao READ STATUS, e a
outra a utilizao de rotinas de atraso que garante o trmino das operaes internas do
mdulo LCD.
Apesar de o barramento ser de 8 vias, possvel trabalhar com o mdulo com
comunicao de 4 vias, o que valoriza sua utilizao principalmente nos PICs com
quantidade pequena de pinos (18 pinos).
Para enviarmos uma informao ao LCD precisamos primeiramente ajustar RS para
informar se um comando ou um dado. Em seguida, devemos escrever a informao no
barramento de dados, e depois setar o pino E.


Inicializao do LCD

Toda vez que a alimentao for ligada, deve ser executado o procedimento de
inicializao do LCD.

1. Aguardar 15ms
2. Com RS em 0, enviar 0x30 para o display (inicializao)
3. Aguardar pelo menos 4ms.
4. Com RS em 0, enviar 0x30 para o display (inicializao)
5. Aguardar pelo menos 100s.
6. Com RS em 0, enviar 0x30 para o display (inicializao)
7. Aguardar pelo menos 40s.
8. Com RS em 0, enviar B00111000 (comunicao por 8 vias)
9. Aguardar pelo menos 40s.
10. Com RS em 0, enviar B00000001 (limpar display e posicionar o cursor na
1linha/1coluna)
11. Aguardar pelo menos 1,8ms.
12. Com RS em 0, enviar B00001100 (liga o display sem cursor)
13. Aguardar pelo menos 40s.
14. Com RS em 0, enviar B00000110 (deslocamento automtico do cursor para a
direita)
15. Aguardar pelo menos 40s.



Aula de Microcontrolador
Pgina 36
Lista de Comandos do LCD

Tabela. Comandos do LCD.
RS RW D7 D6 D5 D4 D3 D2 D1 D0 Instruo/Descrio
4 5 14 13 12 11 10 9 8 7 Pinos

0

0

0

0

0

0

0

0

0

1
Limpa Display e retorna a 1
posio

0

0

0

0

0

0

0

0

1

*
Retorna Cursor a 1 posio

0

0

0

0

0

0

0

1

ID

S
Estabelece sentido de
deslocamento

0

0

0

0

0

0

1

D

C

B
Ativa/Desativa display,
ativa/desativa cursor,
ativa/desativa cursor piscante.
0 0 0 0 0 1 SC RL * * Move Cursor/Desloca Display

0

0

0

0

1

DL

N

F

*

*
Estabelece o n de bits da
interface, estabelece o n de
linhas, e tipo de informao dos
caracteres.
0 0 0 1 A A A A A A Enderea a CGRAM

0

0

1

A

A

A

A

A

A

A

Enderea a DDRAM

0

1

BF

*

*

*

*

*

*

*
L o contedo do contador de
endereos, e a Busy Flag.

1

0

D

D

D

D

D

D

D

D
Escreve dados na CG ou
DDRAM.

1

1

D

D

D

D

D

D

D

D

L dados da CG ou DDRAM.


ID 0: o cursor desloca-se automaticamente para a esquerda (decremento) aps uma
operao de escrita ou leitura.
1: o cursor desloca-se automaticamente para a direita (incremento) aps uma
operao de escrita ou leitura.

S 0: desliga o deslocamento da mensagem.
1: Liga o deslocamento da mensagem. Serve para implementar as funes de insert
e backspace.

D 0: Inibe a visualizao dos caracteres no display. A memria interna do LCD
permanece inalterada.
1: Habilita a visualizao dos caracteres no display, conforme os dados existentes
na memria interna.

C 0: o cursor no visvel.
Aula de Microcontrolador
Pgina 37
1: o crusor visvel como uma linha embaixo do caractere (oitava linha da matriz),
como se fosse um sublinhado.

B 0: desativa o cursor piscante.
1: ativa o cursor piscante.

SC e RL00: o cursor desloca-se para a esquerda. Decrementa o endereo da memria
interna DDRAM.
01: o cursor desloca-se para a direita. Incrementa o endereo da memria interna
DDRAM.
10: desloca-se a mensagem e o cursor para a esquerda, em relao posio
atual do cursor. Funo Insert.
11: desloca-se a mensagem e o cursor para a direita, em relao posio atual
do cursor. Funo Backspace.

DL 0: comunicao feita pelas 8 vias de dados, de DB0 DB7.
1: comunicao feita em 4 vias de dados, de DB4 DB7. Inicialmente deve ser
enviado, a parte alta do byte e, em seguida, a parte baixa.

N e F 00: 1 linha com matriz de 7x5 + cursor
01: 1 linha com matriz de 10x5 + cursor
1-: 2 linhas com matriz de 7x5 + cursor

Escrevendo Caracteres no Display

Posicionamento do Cursor na DDRAM:

RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 1 A A A A A A A

O valor acima enviado com RS em 0.
Para isto, basta posicionar corretamente o cursor antes da operao de escrita do
dado. Abaixo, mostramos a tabela com os 32 caracteres do display e seus endereos
absolutos (em hexadecimal).

Coluna 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Linha0 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
Linha1 C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF

Com o cursor na posio correta, basta enviar a letra (cdigo ASCII) que se deseja
escrever para o display. Lembrando que neste caso, RS deve ser igual a 1.

RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1 D D D D D D D D

Aula de Microcontrolador
Pgina 38
No se pode esquecer tambm do pulso em E (utilizado para efetivar a leitura da
informao escrita no barramento de dados).



Segundo Programa: Relgio Digital


#include<p16f877a.inc>

__CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF
& _BODEN_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC

ERRORLEVEL -302
ERRORLEVEL -305

#DEFINE BANK1 BSF STATUS,RP0 ;definies de bancos
#DEFINE BANK0 BCF STATUS,RP0

#DEFINE BT_UP PORTB,0 ;incremento do contador do Display
#DEFINE BT_DOWN PORTB,1 ; decremento do contador do Display
#DEFINE BT_ZERO PORTB,2 ;boto para zerar relgio
#DEFINE BT_LIGA_DESLIGA PORTB,3 ;boto para inicar relgio e parar relgio

#DEFINE DISP_LCD PORTD ;define LCD
#DEFINE RS PORTE,0 ;RS=0 - comando, RS=1 - dado
#DEFINE ENABLE PORTE,1 ;habilita o LCD para pegar os dados

#DEFINE FLAG_TMR1 PORTA,0 ;aciona LED quando o relgio liga

CBLOCK 0X20
UNI_SEG
DEZ_SEG
UNI_MIN
DEZ_MIN
HORAS
FILTRO_BOTOES
TEMPO_TURBO
DIVISOR_TMR1 ;varivel auxiliar para contagem de 1 segundo exato
CONV_DEZ_HORAS
CONV_UNI_HORAS
TEMPO0 ;delay do LCD
TEMPO1 ;delay do LCD
AUX ;varivel auxiliar usada na conv binrio para decimal
DISP_LCD_TEMP ;varivel temporria que conter o valor do dado ou
;comando que ser enviado ao LCD
ENDC
Aula de Microcontrolador
Pgina 39

FILTRO_TECLA EQU .200 ;filtro para evitar rudos dos botes
TURBO_TECLA EQU .25

TMR1_HIGH EQU HIGH (.65536-.62500) ;parte alta do valor do temporizador
TMR1_LOW EQU LOW (.65536-.62500) ;parte baixa do valor do temporizador

ORG 0x00
GOTO CONFIG

ORG 0X04

INT_TMR1 ;interrupo por TMR1
MOVLW TMR1_HIGH ;atualiza contadores alto e baixo referente ao
MOVWF TMR1H ;tempo do TMR1.
MOVLW TMR1_LOW
MOVWF TMR1L

DECFSZ DIVISOR_TMR1,F ;varivel auxiliar (DIVISOR_TMR1) para dar
;1 segundo exato.
;DIVISOR_TMR1 = 0 ?
GOTO SAI_INT_TMR1 ;NO
;SIM

MOVLW .2 ;atualiza varivel auxiliar do TMR1
MOVWF DIVISOR_TMR1

CALL INCREMENTA_TIMER ;chama rotina para incrementar contador

CALL ATUALIZA_HORARIO

SAI_INT_TMR1 ;nome da rotina
BCF PIR1,TMR1IF ;Limpa flag para ocorrer interrupo por TMR1.
RETFIE

INCREMENTA_TIMER ;rotina para incrementar displays
INCF UNI_SEG,F ;incrementa o display referente unidade

MOVLW .10 ;teste para ver se chegou 10.
XORWF UNI_SEG,W ;UNIDADE=10?
BTFSS STATUS,Z
RETURN ;NO

CLRF UNI_SEG ;SIM
INCF DEZ_SEG,F ;incrementa o display referente dezena


Aula de Microcontrolador
Pgina 40
MOVLW .6 ;teste para ver se chegou 10.
XORWF DEZ_SEG,W ;DEZENA=10?
BTFSS STATUS,Z
RETURN ;NO

CLRF DEZ_SEG ;SIM
INCF UNI_MIN,F ;incrementa o display referente centena

MOVLW .10
XORWF UNI_MIN,W
BTFSS STATUS,Z
RETURN

CLRF UNI_MIN
INCF DEZ_MIN,F ;incrementa o display referente milhar

MOVLW .6
XORWF DEZ_MIN,W
BTFSS STATUS,Z
RETURN

CLRF DEZ_MIN
INCF HORAS,F ;incrementa o display referente milhar

MOVLW .24
XORWF HORAS,W
BTFSC STATUS,Z
CLRF HORAS
RETURN

DECREMENTA_TIMER ;rotina para decrementar contador

DECF UNI_SEG,F ;decrementa varivel UNI_SEG e guarda o valor nela mesma
;daqui para baixo, preciso saber se o ltimo valor foi 0x00.
;Se foi 0x00, ento UNI_SEG vale 0xFF, onde fazendo a
;mscara (XORWF) teremos,
;0x00 como resultado em W_REG, setando o bit Z do STATUS.
;Com isto, o valor da UNI_SEG deve ser atualizado novamente
;para 0x09.
MOVLW 0XFF ;teste para ver se UNIDADE j chegou ao 0xFF
XORWF UNI_SEG,W ;mascaramento.
BTFSS STATUS,Z ;bit Z do STATUS igual a 1 ?
RETURN ;NO
;SIM
MOVLW .9 ;atualiza UNIDADE para comear do 0x09.
MOVWF UNI_SEG

Aula de Microcontrolador
Pgina 41
DECF DEZ_SEG,F ;decrementa varivel DEZENA e guarda o valor
;nela mesma
MOVLW 0XFF ;teste para ver se DEZENA j chegou ao 0xFF
XORWF DEZ_SEG,W ;mascaramento.
BTFSS STATUS,Z ;bit Z do STATUS igual a 1 ?
RETURN ;NO
;SIM
MOVLW .5 ;atualiza DEZENA para comear do 0x09.
MOVWF DEZ_SEG

DECF UNI_MIN,F ;decrementa varivel CENTENA e guarda o valor
;nela mesma
MOVLW 0XFF
XORWF UNI_MIN,W
BTFSS STATUS,Z
RETURN

MOVLW .9
MOVWF UNI_MIN

DECF DEZ_MIN,F ;decrementa varivel MILHAR e guarda o valor
;nela mesma
MOVLW 0XFF
XORWF DEZ_MIN,W
BTFSS STATUS,Z
RETURN

MOVLW .5
MOVWF DEZ_MIN

DECF HORAS,F
MOVLW 0XFF
XORWF HORAS,W
BTFSS STATUS,Z
RETURN

MOVLW .23
MOVWF HORAS
RETURN

ATUALIZA_HORARIO
MOVF HORAS,W
CALL CONV_BIN8_DEC

BCF RS ;display setado para comando
MOVLW 0XC8 ;dado ser atualizado a partir do endereo 0xC3
CALL ATUALIZA ;atualiza LCD
Aula de Microcontrolador
Pgina 42
BSF RS ;display setado para dados

MOVF CONV_DEZ_HORAS,W
ADDLW 0X30
CALL ATUALIZA

MOVF CONV_UNI_HORAS,W ;resultado da converso binrio para
;decimal
ADDLW 0X30 ;SOMA 0x30 ao resultado para enviar
;o dado
CALL ATUALIZA

MOVLW ':' ;CA
CALL ATUALIZA

MOVF DEZ_MIN,W
ADDLW 0X30
CALL ATUALIZA

MOVF UNI_MIN,W
ADDLW 0X30
CALL ATUALIZA

MOVLW ':' ;CA
CALL ATUALIZA

MOVF DEZ_SEG,W ;resultado da converso binrio para decimal
ADDLW 0X30 ;SOMA 0x30 ao resultado para enviar o dado
;em cdigo ASCII para o LCD
CALL ATUALIZA ;atualiza LCD

MOVF UNI_SEG,W
ADDLW 0X30
CALL ATUALIZA

RETURN

CONV_BIN8_DEC
MOVWF AUX
CLRF CONV_UNI_HORAS
CLRF CONV_DEZ_HORAS
BIN8_DEC_1
MOVLW .10
SUBWF AUX,W
BTFSS STATUS,C
GOTO BIN8_DEC_2
MOVWF AUX
Aula de Microcontrolador
Pgina 43
INCF CONV_DEZ_HORAS,F
GOTO BIN8_DEC_1
BIN8_DEC_2
MOVF AUX,W
MOVWF CONV_UNI_HORAS
RETURN

;atraso para garantir que uma operao do LCD termine
DELAY_LCD
MOVWF TEMPO1
DELAY_ATU
MOVLW .250
MOVWF TEMPO0
DELAY_ATU1
CLRWDT
DECFSZ TEMPO0,F
GOTO DELAY_ATU1

DECFSZ TEMPO1,F
GOTO DELAY_ATU

RETURN

;atualiza dado ou comando no LCD
ATUALIZA
BSF ENABLE ;habilita LCD para pegar info no barramento
MOVWF DISP_LCD_TEMP ;guarda informao atual no temporrio
MOVLW 0X0F ;zera o barramento de 4 vias (DB4 DB7)
ANDWF DISP_LCD,F ;atualiza LCD: zera o barramento
MOVLW 0XF0 ;mscara para informao de DB4 DB7

ANDWF DISP_LCD_TEMP,W ;envia parte alta primeiro
IORWF DISP_LCD,F ;atualiza LCD
BCF ENABLE ;desabilita LCD
NOP ;atraso
BSF ENABLE ;habilita LCD para pegar info no barramento
SWAPF DISP_LCD_TEMP,F ;inverte parte alta com parte baixa
MOVLW 0X0F ;zera o barramento de 4 vias (DB4 DB7)

ANDWF DISP_LCD,F ;atualiza LCD: zera o barramento
MOVLW 0XF0 ;mscara para informao de DB4 DB7

ANDWF DISP_LCD_TEMP,W ;envia parte baixa da informao original
IORWF DISP_LCD,F ;atualiza LCD
BCF ENABLE ;desabilita LCD

MOVLW .1
Aula de Microcontrolador
Pgina 44
CALL DELAY_LCD ;garante o trmino da operao no LCD
RETURN

CONFIG
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE

BANK1
MOVLW B'11111110'
MOVWF TRISA

MOVLW B'11111111'
MOVWF TRISB

MOVLW B'11111111'
MOVWF TRISC

MOVLW B'00001111'
MOVWF TRISD

MOVLW B'00000100'
MOVWF TRISE

MOVLW B'11011011'
MOVWF OPTION_REG

MOVLW B'01000000'
MOVWF INTCON ;interrupes de perifricos sero tratadas

MOVLW B'00000001' ;liga interrupo por TMR1
MOVWF PIE1

MOVLW B'00000111' ;PORTA e PORTE configs como I/O's digitais
MOVWF ADCON1 ;conversor A-D desligado

BANK0

MOVLW B'00110000'
MOVWF T1CON

BTFSC STATUS,NOT_TO ;aguarda estouro do watchdog timer
GOTO $

MOVLW 0X20 ;limpa memrio RAM disponvel
Aula de Microcontrolador
Pgina 45
MOVWF FSR

LIMPA_RAM
CLRF INDF
INCF FSR,F
MOVF FSR,W
XORLW 0X80
BTFSS STATUS,Z
GOTO LIMPA_RAM

MOVLW .2
MOVWF DIVISOR_TMR1 ;atualiza varivel aux para contagem de 1 segundo

BSF INTCON,GIE ;habilita chave geral da interrupo
BCF FLAG_TMR1 ;apaga LED, pois o TMR1 no foi ainda habilitado

INICIALIZACAO_DISPLAY

BCF RS ;display setado para comandos

MOVLW 0X30 ;inicializao do display
CALL ATUALIZA

MOVLW .3
CALL DELAY_LCD ;delay exigido pelo display

MOVLW 0X30 ;inicializao do display
CALL ATUALIZA

MOVLW 0X30 ;inicializao do display
CALL ATUALIZA

MOVLW 0X02 ;zera o contador de caracteres e retorna posio 0x80
CALL ATUALIZA

MOVLW 0X28 ;trabalhando com 4 vias de dados
CALL ATUALIZA

MOVLW B'00000001' ;limpa todo o display
CALL ATUALIZA

MOVLW .1 ;delay de 1ms
CALL DELAY_LCD

MOVLW B'00001100' ;liga o display sem cursor
CALL ATUALIZA

Aula de Microcontrolador
Pgina 46
MOVLW B'00000110' ;incrementa automtico direita
CALL ATUALIZA

MOVLW 0X81 ;endereo do LCD
CALL ATUALIZA

BSF RS ;display setado para dados

MOVLW 'R' ;81
CALL ATUALIZA
MOVLW 'E' ;82
CALL ATUALIZA
MOVLW 'L' ;83
CALL ATUALIZA
MOVLW 'O' ;84
CALL ATUALIZA
MOVLW 'G' ;85
CALL ATUALIZA
MOVLW 'I' ;86
CALL ATUALIZA
MOVLW 'O' ;87
CALL ATUALIZA
MOVLW ' ' ;88
CALL ATUALIZA
MOVLW ' ' ;89
CALL ATUALIZA
MOVLW ' ' ;8A
CALL ATUALIZA
MOVLW ' ' ;8B
CALL ATUALIZA
MOVLW ' ' ;8C
CALL ATUALIZA
MOVLW ' ' ;8D
CALL ATUALIZA
MOVLW ' ' ;8E
CALL ATUALIZA
MOVLW ' ' ;8F
CALL ATUALIZA

BCF RS
MOVLW 0XC8 ;endereo do LCD
CALL ATUALIZA

BSF RS ;display setado para dados

MOVLW '0' ;C8
CALL ATUALIZA
Aula de Microcontrolador
Pgina 47
MOVLW '0' ;C9
CALL ATUALIZA
MOVLW ':' ;CA
CALL ATUALIZA
MOVLW '0' ;CB
CALL ATUALIZA
MOVLW '0' ;CC
CALL ATUALIZA
MOVLW ':' ;CD
CALL ATUALIZA
MOVLW '0' ;CE
CALL ATUALIZA
MOVLW '0' ;CF
CALL ATUALIZA

VARRE ;testa botes
CLRWDT ;limpa o WDT para o programa no ser
;reinicializado em condies normais

BTFSS BT_UP
GOTO TRATA_BT_UP ;boto para incrementar valor dos displays

BTFSS BT_DOWN
GOTO TRATA_BT_DOWN ;boto para decrementar valor dos displays

BTFSS BT_ZERO ;boto para zerar relgio
GOTO TRATA_BT_ZERO

BTFSS BT_LIGA_DESLIGA ;liga/desliga Relgio
GOTO TRATA_BT_LIGA_DES

MOVLW FILTRO_TECLA ;deboucing
MOVWF FILTRO_BOTOES

MOVLW .40
MOVWF TEMPO_TURBO

GOTO VARRE

TRATA_BT_UP
DECFSZ FILTRO_BOTOES,F
GOTO VARRE

DECFSZ TEMPO_TURBO,F
GOTO VARRE

MOVLW TURBO_TECLA ;diminui a velocidade do incremento
Aula de Microcontrolador
Pgina 48
MOVWF TEMPO_TURBO ;BT_UP permanecer pressionado

CALL INCREMENTA_TIMER

CALL ATUALIZA_HORARIO

GOTO VARRE

TRATA_BT_DOWN
DECFSZ FILTRO_BOTOES,F
GOTO VARRE

DECFSZ TEMPO_TURBO,F
GOTO VARRE

MOVLW TURBO_TECLA ;diminui a velocidade do decremento
MOVWF TEMPO_TURBO ;BT_DOWN permanecer pressionado

CALL DECREMENTA_TIMER

CALL ATUALIZA_HORARIO

GOTO VARRE

TRATA_BT_LIGA_DES
DECFSZ FILTRO_BOTOES,F
GOTO VARRE

DECFSZ TEMPO_TURBO,F
GOTO VARRE

MOVLW TURBO_TECLA
MOVWF TEMPO_TURBO

BTFSS FLAG_TMR1 ;ESTADO_TIMER=1?
GOTO LIGA_TMR1 ;NO

DESLIGA_TMR1 ;SIM
BCF FLAG_TMR1 ;desliga varivel referente ao TIMER
BCF T1CON,TMR1ON ;desabilita a contagem
GOTO VARRE ;volta para varredura de botes.

LIGA_TMR1
BSF FLAG_TMR1 ;liga varivel referente ao TIMER

MOVLW TMR1_HIGH ;atualiza valores do TMR1
MOVWF TMR1H
Aula de Microcontrolador
Pgina 49
MOVLW TMR1_LOW
MOVWF TMR1L

MOVLW .2 ;atualiza varivel auxiliar para contagem de
;1 segundo.
MOVWF DIVISOR_TMR1

BSF T1CON,TMR1ON ;habilita a contagem

GOTO VARRE


TRATA_BT_ZERO
DECFSZ FILTRO_BOTOES,F
GOTO VARRE

DECFSZ TEMPO_TURBO,F
GOTO VARRE

MOVLW TURBO_TECLA
MOVWF TEMPO_TURBO

CLRF UNI_SEG
CLRF DEZ_SEG
CLRF UNI_MIN
CLRF DEZ_MIN
CLRF HORAS

CALL ATUALIZA_HORARIO

GOTO VARRE

END



Aula 3
Conversor Analgico Digital

Tpicos:

CAD (Conversor A/D)
Programao Tabela
Terceiro Programa: Sensor de Temperatura


Aula de Microcontrolador
Pgina 50
CAD (Conversor A/D)


No mundo exterior podemos dizer que tudo est na forma analgica, ou seja,
utilizamos a base 10 (decimal) para efetuarmos todos os clculos matemticos do dia-a-
dia, isto linguagem cotidiana. Para que o mundo dos microprocessadores ou
microcontroladores possam nos ajudar a resolver problemas, tal como clculos
necessrio converter sinais analgicos em sinais digitais, ou seja, linguagem de mquina.

O Conversor Analgico/Digital tem a funo de pegar este nvel de tenso, codific-
lo em base binria, e aps um certo tempo de processamento, decodific-lo em decimal
para podermos entend-lo.

Nesta seo, referiremos ao mdulo A/D do 16F877A, caractersticas e
registradores utilizados, sero discutidos em detalhe.

As frmulas mais importantes para este sistema de converso so mostradas
abaixo.

Resoluo = Vref
2
n

V
entrada
= ( Bm 2
(m)
Vref )
2
n


n = nmero de bits do conversor
Vref = tenso de referncia
m = posio do bit (0 a 9)
Bm = valor do bit m, 0 ou 1.

Um ponto importante, diz respeito velocidade e, conseqentemente, aos tempos
de amostragem para a converso A/D. Abaixo mostramos a tabela com os tempos e
etapas do sistema de converso A/D.

Cdigo Nome Tempo
A Adequao do Capacitor 40s
B Desligamento do Capacitor 100ns
C Converso 12T
AD
D Religamento do Capacitor 2T
AD
E Nova adequao do Capacitor 40s

T
AD
= tempo de converso de 1 bit.

Para que o sistema de converso funcione corretamente, um clock deve ser
aplicado a ele. Cada perodo deste clock ser chamado de T
AD
. Este clock escolhido por
software conforme configurao dos bits ADCS1 e ADCS0 do registrador ADCON0; isto
ser detalhado mais adiante.


Aula de Microcontrolador
Pgina 51
Em PICs de 28 pinos (por exemplo: 16F873), temos 5 deles reservados para o
mdulo A/D, so eles: RA0/AN0, RA1/AN1, RA2/AN2, RA3/AN3 e RA5/AN4. No
P16F877A (40 pinos) temos 8 pinos dedicados ao mdulo A/D, quais sejam: 2, 3, 4, 5, 7,
8, 9 e 10. Estes trs ltimos se referem ao PORTE (bits 0, 1 e 2), os 5 primeiros so os
mesmos do PIC de 28 pinos citado.
O mdulo A/D possui 4 registradores: ADRESH, ADRESL, ADCON0 e ADCON1.

Os registradores: ADRESH e ADRESL contm o resultado dos 10 bits da
converso AD. Com isto, verificamos que 6 bits destes registradores sero descartados.
Quais bits sero descartados, pode ser escolhido atravs do registrador ADCON1,ADFM,
o qual ser mostrado na seqncia. A figura abaixo mostra as duas maneiras de
configurar os 10 bits que contm o resultado da converso AD: justificado pela direita ou
justificado pela esquerda.



REGISTRADOR ADCON0
7 6 5 4 3 2 1 0
R/W R/W R/W R/W R/W R/W U R/W
ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE\ - ADON

ADCS1:ADCS0 Bit de seleo do clock de converso A/D

ADCS1 / 0 Clock
00 F
OSC
/2
01 F
OSC
/8
10 F
OSC
/32
11 F
RC
oscilador RC
interno (Sleep)

Aula de Microcontrolador
Pgina 52
CHS2:CHS0 Bit de seleo do Canal Analgico

CHS2/0 Canal PORT
000 0 RA0/AN0 (pino 2)
001 1 RA1/AN1 (pino 3)
010 2 RA2/AN2 (pino 4)
011 3 RA3/AN3 (pino 5)
100 4 RA5/AN4 (pino 7)
101 5 RE0/AN5 (pino 8)
110 6 RE1/AN6 (pino 9)
111 7 RE2/AN7 (pino 10)


GO/DONE\ - Bit de Status da Converso A/D
1: Converso A/D em andamento
0: Converso A/D terminada/parada.

ADON Bit de ligao do Mdulo
1: Mdulo de converso AD est operando
0: Mdulo de converso AD est desligado (no consome corrente).


REGISTRADOR ADCON1
7 6 5 4 3 2 1 0
R/W U U U R/W R/W R/W R/W
ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0

ADFM Bit de seleo do formato do resultado de AD
1: Justificado pela direita (os 6 bits mais significativos de ADRESH sero
descartados).
0: Justificado pela esquerda (os 6 bits menos significativos de ADRESL sero
descartados).

PCFG3:PCFG0 Bits de controle da configurao dos Pinos do Mdulo AD

Aula de Microcontrolador
Pgina 53


Aps termos verificado a configurao dos registradores referente ao mdulo A/D,
vamos discutir um pouco seu funcionamento.
Como vimos o ADCON1 o registrador responsvel por configurar os pinos do
PORTA e do PORTE como entradas analgicas ou digitais. Os pinos dos PORTs que so
escolhidos como entradas analgicas devem ter seu bit correspondente do TRIS
configurado como entrada.
Basicamente temos duas maneiras diferentes de operao do mdulo A/D: com
interrupo ou com verificao do Bit 0 (GO/DONE\) do registrador ADCON0.
O modo de verificao do bit GO/DONE\ muito mais simples, veja cdigo de
exemplo abaixo:


LOOP
BSF ADCON0,GO
BTFSC ADCON0,GO
GOTO $-1
MOVF ADRESH,W
...
GOTO LOOP


J no modo de funcionamento por interrupo (um pouco mais minucioso) devemos
proceder da seguinte forma:



Aula de Microcontrolador
Pgina 54
CONFIG
BCF STATUS,RP0 ;seleciona banco 0
MOVLW B01000000 ;chave geral para interrupo por perifricos
MOVWF INTCON
BSF STATUS,RP0 ;seleciona banco 1
MOVLW B01000000 ;habilita interrupo por trmino de converso A/D
MOVWF PIE1 ;ADIE habilitado
BCF STATUS,RP0 ;seleciona banco 0
BSF INTCON,GIE ;liga chave geral para tratar interrupes
...


Aps ocorrer a interrupo, o contador de programa (PCL) ser apontado para o
endereo 0X04. No trmino do tratamento da interrupo, no podemos esquecer de
limpar o bit 6 (flag ADIF) do registrador PIR1.

O mdulo A/D aceita ainda uma operao durante SLEEP (economia de energia),
mas a seleo de clock deve ser F
RC
interno, ou seja, os bits ADCS0 e ADCS1 do
ADCON0 devem estar configurados com nvel 1 lgico. Uma observao importante
vlida aqui, se utilizarmos a instruo SLEEP com outra opo de clock (no RC), a
converso ser abortada, mdulo A/D desligado, embora o bit ADON esteja setado.


Exemplo de cdigo com SLEEP:


Config
...
MOVLW B11000000 ;configura clock F
RC
interno
MOVWF ADCON0
...

New_ad
BSF ADCON0,GO ;inicia nova converso AD
SLEEP
MOVF ADRESH,W ;quando a converso AD terminar, continuar daqui.
...
GOTO New_ad









Aula de Microcontrolador
Pgina 55
Programao Tabela


ORG 0X300
RADIX DEC

TABELA_TEMPERATURA
MOVLW HIGH TABELA_TEMP
MOVWF PCLATH
MOVLW LOW TABELA_TEMP
ADDWF conv_bin_temp,W
BTFSC STATUS,C
INCF PCLATH,F
MOVWF PCL

TABELA_TEMP
DT 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;15
DT 004,004,004,004,004,004,004,004,004,004,004,004,004,004,004,004 ;31
DT 008,008,008,008,008,008,008,008,008,008,008,008,008,008,008,008 ;47
DT 012,012,012,012,012,012,012,012,012,012,012,012,012,012,012,012 ;63
DT 016,016,016,016,016,016,016,016,016,016,016,016,016,016,016,016 ;79
DT 020,020,020,020,020,020,020,020,020,020,020,020,020,020,020,020 ;95
DT 022,022,022,022,022,022,022,022,022,022,022,022,022,022,022,022 ;111
DT 024,024,024,024,024,024,024,024,024,024,024,024,024,024,024,024 ;127
DT 026,026,026,026,026,026,026,026,026,026,026,026,026,026,026,026 ;143
DT 028,028,028,028,028,028,028,028,028,028,028,028,028,028,028,028 ;159
DT 030,030,030,030,030,030,030,030,030,030,030,030,030,030,030,030 ;175
DT 031,031,031,031,031,031,031,031,031,031,031,031,031,031,031,031 ;191
DT 032,032,032,032,032,032,032,032,032,032,032,032,032,032,032,032 ;207
DT 033,033,033,033,033,033,033,033,033,033,033,033,033,033,033,033 ;223
DT 034,034,034,034,034,034,034,034,034,034,034,034,034,034,034,034 ;239
DT 035,035,035,035,035,035,035,035,035,035,035,035,035,035,035,035 ;255




Terceiro Programa: Sensor de Temperatura

#include<p16f877a.inc>
#include<multipli.asm> ; inclui MACROs

__CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF
& _BODEN_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC

ERRORLEVEL -302
ERRORLEVEL -305

Aula de Microcontrolador
Pgina 56
#DEFINE BANK1 BSF STATUS,RP0 ;definies de bancos
#DEFINE BANK0 BCF STATUS,RP0

#DEFINE DISP_LCD PORTD ;define LCD
#DEFINE RS PORTE,0
#DEFINE ENABLE PORTE,1

#DEFINE BT1 PORTB,0
#DEFINE BT2 PORTB,1
#DEFINE BT3 PORTB,2
#DEFINE BT4 PORTB,3

CBLOCK 0X20
PARTE_ALTA ;parte alta do resultado da multiplicao
PARTE_BAIXA ;parte baixa do resultado da multiplicao
conv_bin_temp ;resultado da converso A/D
fator_multi ;tenso de referncia, neste caso, foi de 5V.
TEMPO0 ;delay do LCD
TEMPO1 ;delay do LCD
AUX ;varivel auxiliar usada na conv binrio para decimal
MOSTRADOR_AV ;varivel que ser mostrada no LCD antes da vrgula
MOSTRADOR_DV ;varivel que ser mostrada no LCD depois da vrgula
DISP_LCD_TEMP ;varivel temporria que conter o valor do dado ou
;comando que ser enviado ao LCD
AUX_DEC_DV
AUX_DEC_AV
TEMP_CELSIUS

ENDC

ORG 0x00
GOTO INICIO

;atraso para garantir que uma operao do LCD termine
DELAY_MS
MOVWF TEMPO1
MOVLW .250
MOVWF TEMPO0

CLRWDT
DECFSZ TEMPO0,F
GOTO $-2

DECFSZ TEMPO1,F
GOTO $-6

RETURN
Aula de Microcontrolador
Pgina 57

;atualiza dado ou comando no LCD
ATUALIZA
BSF ENABLE
MOVWF DISP_LCD_TEMP ;guarda informao atual no temporrio
MOVLW 0X0F ;zera o barramento de 4 vias (DB4 DB7)
ANDWF DISP_LCD,F ;atualiza LCD: zera o barramento
MOVLW 0XF0 ;mscara para informao de DB4 DB7

ANDWF DISP_LCD_TEMP,W ;envia parte alta primeiro
IORWF DISP_LCD,F ;atualiza LCD
BCF ENABLE ;desabilita LCD
NOP ;atraso
BSF ENABLE ;habilita LCD para pegar info no barramento
SWAPF DISP_LCD_TEMP,F ;inverte para alta com parte baixa no temp
MOVLW 0X0F ;zera o barramento de 4 vias (DB4 DB7)

ANDWF DISP_LCD,F ;atualiza LCD: zera o barramento
MOVLW 0XF0 ;mscara para informao de DB4 DB7

ANDWF DISP_LCD_TEMP,W ;envia parte baixa da informao original
IORWF DISP_LCD,F ;atualiza LCD
BCF ENABLE ;desabilita LCD

MOVLW .1
CALL DELAY_MS ;garante o trmino da operao no LCD
RETURN

CONV_BIN8_DEC
MOVWF AUX
CLRF AUX_DEC_DV
CLRF AUX_DEC_AV
BIN8_DEC_1
MOVLW .10
SUBWF AUX,W
BTFSS STATUS,C
GOTO BIN8_DEC_2
MOVWF AUX
INCF AUX_DEC_AV,F
GOTO BIN8_DEC_1
BIN8_DEC_2
MOVF AUX,W
MOVWF AUX_DEC_DV
RETURN

MULTIPLICA8X8
CLRF PARTE_ALTA
Aula de Microcontrolador
Pgina 58
CLRF PARTE_BAIXA
MOVF fator_multi,W
BCF STATUS,C

MULT8 0
MULT8 1
MULT8 2
MULT8 3
MULT8 4
MULT8 5
MULT8 6
MULT8 7
RETURN

INICIO
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE

BANK1
MOVLW B'11111111'
MOVWF TRISA

MOVLW B'11101111'
MOVWF TRISB

MOVLW B'00000000'
MOVWF TRISC

MOVLW B'00001111'
MOVWF TRISD

MOVLW B'00000100'
MOVWF TRISE

MOVLW B'11011011'
MOVWF OPTION_REG

MOVLW B'00000000'
MOVWF INTCON ;interrupes no sero tratadas


MOVLW B'00000100' ;ADFM justificado direita
MOVWF ADCON1 ;Canais analgicos 1, 2 e 4

Aula de Microcontrolador
Pgina 59
BANK0

MOVLW B'00001001'
MOVWF ADCON0

BTFSC STATUS,NOT_TO ;aguarda estouro do watchdog timer
GOTO $

MOVLW 0X20 ;limpa memrio RAM disponvel
MOVWF FSR

LIMPA_RAM
CLRF INDF
INCF FSR,F
MOVF FSR,W
XORLW 0X80
BTFSS STATUS,Z
GOTO LIMPA_RAM

INICIALIZACAO_DISPLAY

BCF RS ;display setado para comandos

MOVLW 0X30 ;inicializao do display
CALL ATUALIZA

MOVLW .3
CALL DELAY_MS ;delay exigido pelo display

MOVLW 0X30 ;inicializao do display
CALL ATUALIZA

MOVLW 0X30 ;inicializao do display
CALL ATUALIZA

MOVLW 0X02 ;zera o contador de caracteres e retorna
;posio 0x80
CALL ATUALIZA

MOVLW 0X28 ;trabalhando com 4 vias de dados
CALL ATUALIZA

MOVLW B'00000001' ;limpa todo o display
CALL ATUALIZA

MOVLW .1 ;delay de 1ms
CALL DELAY_MS
Aula de Microcontrolador
Pgina 60

MOVLW B'00001100' ;liga o display sem cursor
CALL ATUALIZA

MOVLW B'00000110' ;incrementa automtico direita
CALL ATUALIZA

MOVLW 0X82 ;endereo do LCD
CALL ATUALIZA

BSF RS ;display setado para dados

MOVLW 'M' ;82
CALL ATUALIZA
MOVLW 'E' ;83
CALL ATUALIZA
MOVLW 'D' ;84
CALL ATUALIZA
MOVLW 'I' ;85
CALL ATUALIZA
MOVLW 'D' ;86
CALL ATUALIZA
MOVLW 'O' ;87
CALL ATUALIZA
MOVLW 'R' ;88
CALL ATUALIZA
MOVLW ' ' ;89
CALL ATUALIZA
MOVLW ' ' ;8A
CALL ATUALIZA
MOVLW 'D' ;8B
CALL ATUALIZA
MOVLW 'E' ;8C
CALL ATUALIZA


BCF RS
MOVLW 0XC2
CALL ATUALIZA
BSF RS

MOVLW 'T' ;C2
CALL ATUALIZA
MOVLW 'E' ;C3
CALL ATUALIZA
MOVLW 'M' ;C4
CALL ATUALIZA
Aula de Microcontrolador
Pgina 61
MOVLW 'P' ;C5
CALL ATUALIZA
MOVLW 'E' ;C6
CALL ATUALIZA
MOVLW 'R' ;C7
CALL ATUALIZA
MOVLW 'A' ;C8
CALL ATUALIZA
MOVLW 'T' ;C9
CALL ATUALIZA
MOVLW 'U' ;CA
CALL ATUALIZA
MOVLW 'R' ;CB
CALL ATUALIZA
MOVLW 'A' ;CC
CALL ATUALIZA

LOOP
CLRWDT ;limpa WDT
BSF ADCON0,GO ;inicia converso
BTFSC ADCON0,GO
GOTO $-1

MOVF ADRESH,W ;resultado da converso A/D
MOVWF conv_bin_temp ;varivel temporria

MOVLW .50 ;tenso de referncia de 5 Volts
MOVWF fator_multi

CALL MULTIPLICA8X8 ;executa multiplicao

DIV_256 ;macro de diviso por 256

CALL CONV_BIN8_DEC ;executa um ajuste decimal

MOVFW AUX_DEC_DV
MOVWF MOSTRADOR_DV
MOVFW AUX_DEC_AV
MOVWF MOSTRADOR_AV

CALL MOSTRA_TENSAO_LCD

CALL TABELA_TEMPERATURA

MOVWF TEMP_CELSIUS

CALL CONV_BIN8_DEC
Aula de Microcontrolador
Pgina 62

CALL MOSTRA_TEMP_LCD

GOTO LOOP

MOSTRA_TENSAO_LCD
BCF RS
MOVLW 0X80
CALL ATUALIZA
BSF RS

MOVLW ' ' ;0
CALL ATUALIZA
MOVLW 'T' ;1
CALL ATUALIZA
MOVLW 'E' ;2
CALL ATUALIZA
MOVLW 'N' ;3
CALL ATUALIZA
MOVLW 'S' ;4
CALL ATUALIZA
MOVLW 'A' ;5
CALL ATUALIZA
MOVLW '0' ;6
CALL ATUALIZA
MOVLW ' ' ;7
CALL ATUALIZA
MOVLW '=' ;8
CALL ATUALIZA
MOVLW ' ' ;9
CALL ATUALIZA

MOVF MOSTRADOR_AV,W ;resultado da conv binrio para decimal
ADDLW 0X30 ;SOMA 0x30 ao resultado
CALL ATUALIZA ;em cdigo ASCII para o LCD
;atualiza LCD

MOVLW ',' ;cdigo ASCII da vrgula
CALL ATUALIZA

MOVF MOSTRADOR_DV,W ;resultado da conv binrio para decimal
ADDLW 0X30 ;SOMA 0x30 ao resultado.
CALL ATUALIZA

MOVLW ' '
CALL ATUALIZA
MOVLW 'V'
Aula de Microcontrolador
Pgina 63
CALL ATUALIZA
MOVLW ' '
CALL ATUALIZA

RETURN

MOSTRA_TEMP_LCD
BCF RS ;display setado para comando
MOVLW 0XC0
CALL ATUALIZA
BSF RS

MOVLW 'T' ;0
CALL ATUALIZA
MOVLW 'E' ;1
CALL ATUALIZA
MOVLW 'M' ;2
CALL ATUALIZA
MOVLW 'P' ;3
CALL ATUALIZA
MOVLW '(' ;4
CALL ATUALIZA
MOVLW 'o' ;5
CALL ATUALIZA
MOVLW 'C' ;6
CALL ATUALIZA
MOVLW ')' ;7
CALL ATUALIZA
MOVLW '=' ;8
CALL ATUALIZA
MOVLW ' ' ;9
CALL ATUALIZA

MOVF AUX_DEC_AV,W ;resultado da converso binrio para decimal
ADDLW 0X30 ;SOMA 0x30 ao resultado para enviar o dado
CALL ATUALIZA ;em cdigo ASCII para o LCD
;atualiza LCD

MOVF AUX_DEC_DV,W ;resultado da converso binrio para decimal
ADDLW 0X30 ;SOMA 0x30 ao resultado para enviar o dado
CALL ATUALIZA

MOVLW ' ' ;cdigo ASCII da vrgula
CALL ATUALIZA
MOVLW 'o'
CALL ATUALIZA
MOVLW 'C'
Aula de Microcontrolador
Pgina 64
CALL ATUALIZA
MOVLW ' '
CALL ATUALIZA

RETURN

ORG 0X300
RADIX DEC

TABELA_TEMPERATURA
MOVLW HIGH TABELA_TEMP
MOVWF PCLATH
MOVLW LOW TABELA_TEMP
ADDWF conv_bin_temp,W
BTFSC STATUS,C
INCF PCLATH,F
MOVWF PCL

TABELA_TEMP
DT 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;15
DT 004,004,004,004,004,004,004,004,004,004,004,004,004,004,004,004 ;31
DT 008,008,008,008,008,008,008,008,008,008,008,008,008,008,008,008 ;47
DT 012,012,012,012,012,012,012,012,012,012,012,012,012,012,012,012 ;63
DT 016,016,016,016,016,016,016,016,016,016,016,016,016,016,016,016 ;79
DT 020,020,020,020,020,020,020,020,020,020,020,020,020,020,020,020 ; 95
DT 022,022,022,022,022,022,022,022,022,022,022,022,022,022,022,022 ;111
DT 024,024,024,024,024,024,024,024,024,024,024,024,024,024,024,024 ;127
DT 026,026,026,026,026,026,026,026,026,026,026,026,026,026,026,026 ;143
DT 028,028,028,028,028,028,028,028,028,028,028,028,028,028,028,028 ;159
DT 030,030,030,030,030,030,030,030,030,030,030,030,030,030,030,030 ;175
DT 031,031,031,031,031,031,031,031,031,031,031,031,031,031,031,031 ;191
DT 032,032,032,032,032,032,032,032,032,032,032,032,032,032,032,032 ;207
DT 033,033,033,033,033,033,033,033,033,033,033,033,033,033,033,033 ;223
DT 034,034,034,034,034,034,034,034,034,034,034,034,034,034,034,034 ;239
DT 035,035,035,035,035,035,035,035,035,035,035,035,035,035,035,035 ;255

END

Вам также может понравиться