Você está na página 1de 29

Sumário

Microcontroladores...............................................................................................................................2
Arquitetura.......................................................................................................................................4
Pinagem...........................................................................................................................................6
Organização da memória.................................................................................................................7
Principais registradores especiais..................................................................................................10
Registrador STATUS.................................................................................................................10
Registrador OPTION_REG.......................................................................................................11
Registrador INTCON................................................................................................................12
Portas de entrada e saída................................................................................................................12
PORTA e o registrador TRISA..................................................................................................13
PORTB e o registrador TRISB..................................................................................................15
PORTC e o registrador TRISC..................................................................................................18
Comunicação I²C.......................................................................................................................19
Timer e contadores.........................................................................................................................20
Módulo TIMER0.......................................................................................................................20
Pré-escaler............................................................................................................................21
Conversor Analógico para Digital (A/D).......................................................................................25
Configurando o tempo de aquisição..........................................................................................27
Configurando pinos da porta.....................................................................................................28
Passo a passo para executar a conversão A/D...........................................................................29

1
Microcontroladores

Os microcontroladores são sistemas digitais microprocessados que possuem não só as


unidades básicas, como ULA e memórias, como também interfaces para dispositivos especializados
como: portas de entrada e saída, conversores A/D, conversores D/A, UARTs, PWM, I²C, SPI, USB,
Ethernet, etc...

Os microcontroladores PIC, fabricados pela Microchip (www.microchip.com), se


popularizaram devido à sua facilidade de programação, baixo custo, diversidade de dispositivos e
facilidade de aquisição. Os microcontroladores PICs são organizados em famílias: PIC12, PIC16,
PIC18, PIC24, PIC32, RFPIC, DSPIC e continuam aumentando... Esta organização possibilitou a
criação de dispositivos compactos em tamanho e custo, fazendo com que a relação custo benefício
seja alta. Atualmente existem PIC com 5 pinos até 144 pinos.

Em uma aplicação embarcada ou embutida, é desejável que a capacidade computacional não


seja nem maior nem menor do que a necessária. Ou seja, se usarmos um processador do i5 em um
forno de micro-ondas, este realizará suas operações de forma extremamente eficiente porém custará

2
muito mais do que estamos acostumados a ver no mercado e portanto este aparelho não fará sucesso
devido ao custo elevado. Por outro, se usarmos um processador de baixíssima capacidade o projeto
atenderá ao requisito custo, porém seu desempenho poderá deixar a desejar levando o projeto ao
fracasso do mesmo jeito. Portanto, o microcontrolador a ser utilizado deve estar no meio dos dois
extremos, deve ter os recursos de hardware necessários com um custo compatível com o produto.

A grande razão do sucesso dos microcontroladores é que estes tem “tudo em um”.

3
Arquitetura
O diagrama do microcontrolador PIC16F877A pode ser vista na figura abaixo:

4
Como pode ser observado na figura acima, a arquitetura desta família é do tipo Harvard,
pois existem duas memórias, uma de programa e outra de dados, além disto, temos também uma
memória não volátil (EEPROM) para armazenar dados para fins de relatório, por exemplo.

A tabela abaixo nos mostra um resumo das caracterícticas dos microcontroladores desta
série, a PIC16F877X.

5
Pinagem
podem ter diversos tipos de pinagem:

6
Na figura acima podemos ver os tipos muito comuns de pacotes de microcontroladores
disponíveis no mercado. O pacote DIP, mais comum e vias de extinção, muito utilizado em
prototipação e kits didáticos, e o SMD, utilizado em produção automatizada, para aumentar a
produção sem utilizar mão-de-obra humana. Pode ser visto nas figuras que os pinos normalmente
tem mais de uma função, ou seja, as funções são multiplexadas nos pinos.

Organização da memória
Os microcontroladores desta série possuem três áreas distintas de memória e com barramentos
separados que possibilitam acessos concorrentes.

7
A memória de programa destes dispositivos é dividida em páginas de aproximadamente 2
kbytes, como pode ser vista na figura acima. Já a memória de dados (RAM), é dividida em bancos
de 128 bytes cada.

8
Na memória RAM residem os Registradores de uso Geral (GPR – General Purpose
Registers ) e os Registradores de Funções Especiais (SFR – Special Function Registers).
Como a RAM é organizada em 4 bancos existem 2 bits localizados no registrador STATUS
(5 e 6) que selecionam o banco desejado como mostra a tabela abaixo:

Os Registradores de Funções Especiais são usados pela CPU e periféricos para controlar o
funcionamento do microcontrolador como um todo. Veremos a configuração destes registradores
nas seções seguintes.

9
Principais registradores especiais
Dentre os diversos registradores presentes, começaremos analisando os 3 mais importantes:
STATUS, OPTION_REG e INTCON. Estes são responsáveis pelas configurações mínimas
necessárias para que o dispositivo funcione corretamente.

Registrador STATUS
Este registrador contém os estados da ULA, inicialização e os bits de seleção do banco da RAM.

10
Registrador OPTION_REG
É um registrador que controla principalmente o modo de operação do TIMER 0 além da interrupção
externa no pino RB0.

Os demais registradores serão vistos ao longo da disciplina.

11
Registrador INTCON
Este registrador controla a geração de interrupções no dispositivo e também indica em alguns bits
quando algumas interrupções ocorreram.

Portas de entrada e saída


Os pinos dos microcontroladores da microchip são organizados em portas. Estas podem
mais de uma função, pelo menos duas e até cinco, normalmente. São através das portas que um
dispositivo digital tem acesso ao mundo exterior e vice-versa. Um pino de uma porta pode
funcionar executando uma função durante o programa inteiro ou mais de uma função, isto depende
da aplicação.
Esta possibildade dá a estes microcontroladores a flexibilidade de executarem diversas
aplicações com uma pequena quantidade de pinos ou portas disponíveis. A esta característica de ter
mais de uma função por pino é dada o nome de multiplexagem.

12
PORTA e o registrador TRISA
A porta, PORTA é bidirecional e tem 6 bits/pinos de largura. A direção da porta é definida no
registrador TRISA.
Todas as portas de um PIC possuem um registrador TRIS associado que controla a direção dos
dados.
Setando um bit do registrador TRISA tornará o pino correspondente no registrador PORTA
em uma entrada digital. Resetando um bit do registrador TRISA tornará o pino correspondente no
registrador PORTA em uma saída digital.
Código exemplo para inicializar PORTA:
BCF STATUS, RP0
BCF STATUS, RP1 ; Bank0
CLRF PORTA ; Initialize PORTA by
; clearing output
; data latches
BSF STATUS, RP0 ; Select Bank 1
MOVLW 0x06 ; Configure all pins
MOVWF ADCON1 ; as digital inputs
MOVLW 0b00000001 ; Value used to
; initialize data
; direction
MOVWF TRISA ; Set RA<3:0> as inputs
; RA<5:4> as outputs
; TRISA<7:6>are always
; read as ’0’.
Código exemplo em assembly.
void main()
{
TRISA=0XCF;
ADCON1=6;

while(1)
{
instruções...
}
}
Código exemplo em C.

Exemplo 1: escreva um programa em linguagem assembly para monitorar uma chave conectada ao
pino RA0 e acenda o led conectado ao pino RA1, quando esta chave estiver pressionada. Como na
figura abaixo:

13
Fluxograma do programa:

Comandos Comentário
LIST P=16F877 Seleciona o processador usado

#INCLUDE<P16F877.INC> Indica o arquivo de definições

ORG 0 Diz para o compilador que a instrução seguinte deve ser


armazenada na posição 0 da memória de programa.
BCF STATUS, RP0 Reseta o bit RP0 do registrador STATUS

BCF STATUS, RP1 Reseta o bit RP1 do registrador STATUS

As duas instruções anteriores selecionam o banco 0 da RAM.

CLRF PORTA Esta instrução apaga o conteúdo do registrador PORTA.

BSF STATUS, RP0 Seta o bit RP0, selecionando o banco 1.

MOVLW 0x06 Carrega o registrador W com o valor 6

14
MOVWF ADCON1 Move o conteúdo de W para o registrador ADCON1, habilitando a
função digital da PORTA.
MOVLW .1 Carrega o registrador W com o valor 1

MOVWF TRISA Move o conteúdo de W para o registrador TRISA, configurando a


direção dos pinos da PORTA
BCF STATUS, RP0 Reseta o bit RP0 do registrador STATUS, selecionando o banco 0
da RAM novamente.
INICIO “label” que indica o início do programa.

BTFSC PORTA,0 Esta função testa se o valor do bit 0 da PORTA é igual à 0. Caso
sim, o PC pula a instrução seguinte. Caso não, executa a instrução
seguinte.
BSF PORTA,1 Seta o pino RA1, fazendo com que o LED acenda.

BTFSS PORTA,0 Esta função testa se o valor do bit 0 da PORTA é igual à 1. Caso
sim, o PC pula a instrução seguinte. Caso não, executa a instrução
seguinte.
BCF PORTA,1 Reseta o pino RA1, fazendo com que o LED apague.

GOTO INICIO Salta imediatamente para o label INICIO.

END Fim de programa. Esta palavra é obrigatória

Tabela de funções da porta PORTA.

PORTB e o registrador TRISB


A porta, PORTB é bidirecional e tem 8 bits/pinos de largura. A direção da porta é definida
no registrador TRISB. A diferença desta porta para a anterior está nas funções que esta possui.

15
Cada pino da PORTB possui um resistor pull-up que pode ser habilitado somente quando o
pino está configurado como entrada. Isto facilita o monitoramento de chaves para teclados, por
exemplo.

Circuito sem usar o Pull-up.

Circuito usando o pull-up.

Código em C Código em assembly


void main() LIST P=16F877

16
{ #INCLUDE<P16F877.INC>
TRISB=1;
ORG 0
BCF STATUS, RP0
while(1) BCF STATUS, RP1
{ CLRF PORTB
if(PORTB.F0==1)
PORTB.F1=1; BSF STATUS, RP0
else MOVLW .1
PORTB.F1=0; MOVWF TRISB
} BCF STATUS, RP0
}
INICIO
BTFSS PORTB,0
BSF PORTB,1
BTFSC PORTB,0
BCF PORTB,1
GOTO INICIO
END

Os dois circuitos vistos acima, realizam a mesma função, monitorar uma chave. Porém no
primeiro, não foi usada opção do resistor interno da porta, sendo assim o resistor deve ser posto por
fora. Já no segundo circuito, foi usado o resistor interno, sua vantagem é óbvia, menos um
componente na placa.
Para habilitar os resistores basta resetar o bit RBPU, bit 7 do registrador OPTION_REG. Ao
habilitá-lo, todos os pinos configurados como entrada terá o resistor pull-up habilitado também.
Quando um pino é configurado como saída o resistor é automaticamente desabilitado.
Quatro pinos desta porta, RB4-RB7, permitem a geração de uma interrupção na mudança de
nível lógico. Esta funcionalidade facilita ao programador na escrita do programa.

Exemplos
void interrupt() #include <16f877A.h>
{
PORTB.RB1=PORTB.RB5; #byte PORTB =0x6
INTCON.RBIF=0; #byte INTCON=0x0b
} #bit RBIE=INTCON.3
void main() { #bit GIE=INTCON.7
TRISB=0X20; #byte OPTION_REG =0x81
OPTION_REG.F7=0; #byte TRISB =0x86
#bit CHAVE=PORTB.5
PORTB=0; #bit LED=PORTB.1

RBIE_bit=1; #int_RB
GIE_bit=1; void intrb()
while(1) {

17
{ LED=CHAVE;
}
}
} void main()
{
TRISB=0X20;
OPTION_REG.F7=0;
PORTB=0;
RBIE=1;
GIE=1;
while(1)
{
}
}

Outra fonte de interrupção muito útil que esta porta fornece está no pino RB0. Semelhante a
anterior, porém está gera a interrupção ou na borda de descida ou na borda de subida. Esta
interrupção é chamada de interrupção externa, é a segunda função deste pino, como pode ser vista
nos exemplos anteriores. Esta função é muito usada para realizar a comunicação com outros
dispositivos como expansores de porta, por exemplo, como no caso do MCP23016.

A vantagem no uso deste tipo de periférico é que a informação chega até o PIC por meio de
um canal serial. Isto facilita o layout da placa, diminuindo o número de vias. Podemos ter mais de
um expansor presente na placa, aumentando em muito a capacidade de portas da aplicação.

PORTC e o registrador TRISC


Semelhante à PORTB, a porta POTC é bidirecional e tem 8 bits/pinos de largura. A direção
da porta é definida no registrador TRISC. Esta porta é responsável pela comunicação do
microcontrolador com outros dispositivos digitais. Na figura anterior podemos ver um exemplo de
aplicação onde a porta é usada para efetuar a comunicação com o expansor de portas através do
barramento serial I²C.

18
Na tabela acima podem ser vistas todas as funções desta porta. Esta porta permite a
comunicação através de alguns barramentos seriais: I²C, SPI e UART. Além de comunicação esta
porta também possui o módulo PWM e os comparadores CCP1 e CCP2. Estes últimos serão
comentados nas seções seguintes.
Nesta seção será comentada a comunicação com outros dispositivos.

Comunicação I²C
Este barramento utiliza dois pinos da porta, os pinos RC3/SCL e RC4/SDA. Na placa do kit
didático há um relógio de tempo real, o PCF8583P, e uma memória serial 24LC256 que serão
usados como exemplo de comunicação. Na figura abaixo temos o diagrama de blocos, pinagem e
identificação dos pinos.
Estes dois periféricos compartilham o mesmo barramento, por ser tratar de um barramento
multi-ponto. Sendo assim, os pinos SCL e SDA são comuns. Na figura abaixo temos o desenho do
esquema de ligação destes com o microcontrolador.

SDA

SCL

PIC
SDA
SDA

SCL
SCL

0 A0 RTC 1 MEM
A0
0 A1 0 A1
0 A2 1 A2

Para que os dispositivos sejam corretamente identificados no barramento estes precisam ter
endereços distintos. O endereço é fixado nos pinos A2-A0 disponíveis nos dispositivos. Uma vez
fixados eles não precisam ser alterados, portanto, isto facilita o layout da placa. Para o
microcontrolador, o endereço do dispositivos desejado é informado na comunicação.
Antes de mais nada, é necessário configurar o microcontrolador para trabalhar no modo I²C.
Isto feito através do módulo MSSP (Master Synchronous Serial Port). Este módulo foi concebido
para realizar a comunicação com dispositivos periféricos que utilizam os barramentos I²C ou SPI.

19
Timer e contadores
O microcontrolador PIC16F877A possui 3 timer/contadores: timer0, timer1 e timer2. Estes
dispositivos podem ser usados para contar pulsos, controle de tempo, gerar bases de tempo para
processos, etc...O princípio de funcionamento é simples, cada timer possui um registrador o qual é
incrementado: a cada pulso recebido em sua entrada ou a cada ciclo de clock do relógio.
Cada timer será tratado em detalhes a seguir.

Módulo TIMER0
Este módulo possui as seguintes características:
• possui 8 bits de largura;
• pode ser lido ou escrito;
• possui um pré-escaler programável;
• o clock de incremento pode ser externo ou interno;
• gera uma interrupção quando a contagem passa de 255 para 0;
• permite selecionar a borda na qual será incrementado.

O modo timer é aquele onde o registrador TMR0 é incrementado a cada ciclo de clock do
relógio (sem préscaler=FOSC/4). Este modo é selecionado resetando o bit T0CS do registrador
OPTION_REG<5>.
OBS.:Se for feita uma escrita neste registrador o incremento é desabilitado por pelo menos 2 ciclos
de clock.

20
O modo contador é selecionado setando o bit T0CS (OPTION_REG<5>). Neste modo, o
registrador TMR0 será incrementado a cada borda de subida ou de descida no pino RA4/T0CKI. A
borda é selecionado pelo bit T0SE, também no registrador (OPTION_REG<4>). Escrevendo zero
em T0SE é selecionado a borda de subida.

Pré-escaler
Como dito anteriormente o timer0 permite efetuar controle de tempo, como por exemplo,
manter uma saída oscilando com um período de 1 ms. Sendo o timer0 um registrador de 8 bits, o n°
de contagens máximo que este pode efetuar são 256. Assim, a temporização máxima seria de 256 x
1/(Fosc/4)=51,2 us, considerando uma frequência de 20 Mhz. Certamente que esta temporização
seria pouco útil para aplicações comuns, como por exemplo, um forno de micro-ondas onde as
temporiações estão na ordem de segundos e minutos. Então, para aumentar a eficiência dos
temporizadores, estes normalmente possuem um dispositivo chamado pré-escaler.
O pré-escaler é basicamente um divisor de frequência capaz de dividir esta por 1, 2, 8, 16,
32, 64, 128 ou 256. Sendo assim, os limites possíveis para o timer0, considerando uma frequência
de 20 Mhz, passam para:
Pré-escaler Temporização
1 51,2 us
2 102,4 us
8 409,6 us
16 819,2 us
32 1,63 ms
64 3,28 ms
128 6,56 ms
256 13,1 ms

Por exemplo, se precisamos de uma temporização de 1 ms, seguindo a tabela acima,


precisamos então:
1. Programar o pré-escaler com 32.
2. carregar o TMR0 o valor apropriado. Considerando que o ciclo para o timer0 será T TMR0= 1/
(FOSC/4)*32=6,4 us. Então para executarmos uma temporização de 1 ms precisamos de n°
contagens=1 ms/6,4 us=156,25. Como o timer trabalha apenas com números inteiros então
temos de optar por carregar o registrador TMR0 com 156 ou 157. Se optarmos por 156, a
temporização final será igual à 998,4 us, caso optarmos por 157, será igual à 1,0048 ms.
OBS.: o erro será menor se optarmos por 156.

Podemos usar a fórmula prática a seguir para calcular a temporização que podemos obter
com o timer0:
4× N × preescaler
T=
Fclock
onde:

21
N → nº de contagens.
prescaler → valor do pré-escaler ajustado.
Fclock → valor da frequência do relógio do microcontrolador (ex.: 20 Mhz).
T → período em segundos obtido.

Como mostrado na tabela anterior, a temporização máxima obtida é de 13,1 ms. Então,
como podemos realizar uma temporização de 1 s ? A solução é a de contar a quantidade de estouros
do timer0. Podemos fazer isto de duas maneiras: através de interrupções ou monitorar o estouro do
timer0. O exemplo a seguir mostra como realizar a temporização para que o LED pisque com uma
frequência 1 Hz.

void main() {
int i_conta=0;

TRISB=0;//configura a PORTB como saída


RB1_bit=0;
TMR0=0; //zera o timer0

OPTION_REG=0b11000111;//seleciona o
modo timer, com pré-escaler para o TMR0
//estouro do timer em 13,1 ms
while(1)
{
if(TMR0IF_bit==1)
{
i_conta++;
TMR0IF_bit=0;
if(i_conta>75)
{
i_conta=0;
RB1_bit^=1;
}
}

}
}
Código escrito para MikroC.

22
Como pode ser observado no código acima, escrito em linguagem C, a variável i_conta
contabiliza o número de estouros de contagem do timer 0. para realizar uma temporização de 1 s, a
variável precisa contabilizar então: i_conta= 1
=76,34 contagens . Optamos por 76
13,1 ms
contagens. Quando este número é alcançado devemos alterar o estado do Led de apagado para
aceso. A instrução “RB1_bit^=1;” realiza isto através da instrução XOR. O estouro do timer0 é
verificado por pooling do bit TMR0IF_bit, que indica em nível quando ocorre o estouro do timer.
O código abaixo, em assembly, realiza a mesma função.
1 LIST P=16F877
2 #INCLUDE<P16F877.INC>
3 CBLOCK 0X20
4 CONTA
5 ENDC
6 ORG 0
7 BCF STATUS,RP0
8 BCF STATUS,RP1
9 CLRF PORTB
10 CLRF CONTA
11 BSF STATUS,RP0
12 MOVLW .1
13 MOVWF TRISB
14 MOVLW .7
15 MOVWF OPTION_REG
16 BCF STATUS,RP0
17 CLRF TMR0
18 INICIO
19 BTFSS INTCON,T0IF
20 GOTO $-1
21 BCF INTCON,T0IF
22 INCF CONTA
23 MOVLW .76
24 SUBWF CONTA,0
25 BTFSS STATUS, Z
26 GOTO INICIO
27 MOVF PORTB,W
28 XORLW .2
29 MOVWF PORTB
30 CLRF CONTA
31 GOTO INICIO
32 END

23
A porção de código entre as linhas 1 e 17, representa as configurações necessárias para o
microcontrolador funcionar conforme a especificação dada. Entre as linhas 18 e 32, temos o
programa que realiza a tarefa. Na linha 19 temos a instrução que monitora o timer0, caso haja um
“estouro” deste, o PC passará para a linha 21. Enquanto o timer0 não “estourar” o PC saltará para
linha 20, que manda o PC volta uma linha de código, que é o signficado do termo “$-1” visto como
parâmetro do comando GOTO.
Havendo o “estouro” do timer 0 o bit T0IF, do registrador INTCON, vai para nível alto para
indicar este evento. A primeira coisa a ser feita é apagar este bit, para evitar que ele permaneça nesta
condição causando um erro de funcionamento do programa. Como o timer 0 não consegue
temporizar 1 s, então utilizamos a variável CONTA para armazenar a quantidade de estouros deste
timer, quando o valor desta variável atingir 76, então terá passado 1 s. O incremento da variável é
feito na linha 22 e o trecho entre as linhas 3 e 5, mostra como alocamos espaço na memória RAM
do microcontrolador. Note que na linha 3 o valor 0x20, indica a posição da memória que será
alocada e que este valor está no banco 0. Se precisarmos alocar mais posições podemos
simplesmente declarar na linha seguinte o nome da variável desejado. Além disto, podemos alocar
mais de 1 byte, digitando a seguinte instrução:
CBLOCK 0X20
CONTA
MATRIZ:4
ENDC

A declaração MATRIZ:4, ocupa 4 posições de memória, este caso poderia ser usado para
receber dados da porta serial e armazená-los temporariamente nesta matriz.
Para detectar quando a variável CONTA atingi o valor desejado, precisamos comparar o
valor da variável com o valor desejado. No assembly não há uma instrução deste tipo, portanto,
precisaremos usar o método usado no trecho de código entre as linhas 23 e 25, vistas abaixo.

MOVLW .76

SUBWF CONTA,0

BTFSS STATUS, Z

Este método utiliza a operação de subtração e o bit ZERO, do registrado STATUS, para
verificar se houve o resultado da operação foi igual à 0 (zero). Primeiramente carrega-se o
registrador W com o valor 76 (linha 23), a seguir realiza-se a operação W=CONTA-W. A operação
foi assim realizada somente porque o valor usado no segundo parâmetro foi igual à 0 (zero). Caso
este fosse igual a um a operação realizada teria sido CONTA=CONTA-W.
Para este caso, sempre que o resultado da operação for diferente de zero, o bit Z será igual à
0 (zero). Caso contrário, Z será igual à 1 (um), indicando que o valor de CONTA é igual à 76. Este é
o método utilizado em programação assembly para verificar se uma variável atingiu um certo valor.
Para verificarmos se a temporização está correta basta utilizarmos o osciloscópio para
verificar o período do sinal gerado no pino RB1.

24
Conversor Analógico para Digital (A/D)
Um dos mais importantes periféricos de um microcontrolador é o conversor analógico para
digital, mais conhecido como conversor A/D ou ADC. Este periférico é responsável pela
comunicação do mundo exterior (analógico) com o mundo digital.
Por que usar um conversor A/D? Porque é muito caro processar sinais analogicamente. Os
circuitos são grandes e podem ser complexos além de ficarem sujeitos às interferências dos
ambientes onde estão localizados. Após converter um sinal para digital, este valor não se altera
mais, ficando imune à interferências. Além deste fato, o processamento do sinal pode ser feito
matematicamente, sem ocupar espaço em placa, sem gerar aquecimento, sendo menos complexo, e
finalmente, custando mais barato.
Um conversor A/D é um circuito que gera uma representação numérica digital de um valor
de tensão analógica. Por exemplo, o conversor A/D do microcontrolador PIC16F877A possui 10
bits de resolução e é preparado para um sinal de entrada analógica de tensão variável de 0V a 5V
(VDD). Portanto, ele pode gerar os valores binários de 0 (00000000002) a 1023 (11111111112), ou
seja, é capaz de capturar 1024 níveis discretos de um determinado sinal. Se o sinal de entrada do
suposto conversor A/D estiver em 2,5V, por exemplo, o valor binário gerado será 51210.
O PIC16F877A(40 pinos) possui 8 canais de entrada, já o PIC16F876A(28 pinos) possui 5,
estes multiplexados com um módulo conversor. Além destas, estes microcontroladores possuem
entradas de referência para tensões máxima e mínima (VDD e VSS) nos pinos RA2 e RA3. O
conversor tem 4 registradores, ADRESH, ADRESL, ADCON0 e ADCON1.

25
O registrador ADCON0 controla a operção do conversor. O registrador ADCON1 configura
os pinos da PORTA, que podem ser usados como entradas analógicas ou entrada e saídas digitais,
vistas anteriormente. O resultado da conversão fica armazenado nos registradores ADRESH e
ADRESL.

Como estes microcontroladores possuem mais de uma entrada, precisamos selecionar qual
entrada será usada pelo módulo conversor. Esta seleção é feita no registrador ADCON0, como pode
ser vista na tabela abaixo.

26
Configurando o tempo de aquisição
Para que o conversor consiga funcionar corretamente é necessário que o capacitor de
holding seja carregado completamente. Para isto ocorrer, devemos esperar o tempo de setup
adequado. Este tempo é afetado pelas impedâncias de entrada e da chave interna. A impedância de
entrada não pode ser superior a 10 kΩ.

Ao selecionar um canal, este tempo de setup deve ser esperado para garantir a precisão do
conversor.
O tempo de conversão por bit é definido como TAD. Para este conversor de 10 bits, são
necessários 12 TAD para executar uma conversão completa. A origem de TAD é selecionável via
software e pode ter 7 origens diferentes: 2 T OSC, 4 TOSC, 8 TOSC, 16 TOSC, 32 TOSC, 64 TOSC e o
oscilador interno (2-6 us). A exigência do conversor é que TAD seja de pelo menos 1,6 us.

Na tabela abaixo temos alguns exemplos de configuração do tempo de aquisição.


Operação ADCS2:ADCS1:ADCS0 Frequência máxima TAD (us)
(MHz)
2 TOSC 000 1,25 1,6

4 TOSC 100 2,5 1,6

8 TOSC 001 5 1,6

16 TOSC 101 10 1,6

32 TOSC 010 20 1,6

64 TOSC 110 20 3,2

27
Configurando pinos da porta
Os registradores ADCON1 e TRIS são usados para configurar os pinos desejados a serem
usados como canais de entrada analógicos. Os pinos desejados devem ser configurados como
entradas, no registrador TRIS e a seguir os bits PCFG3: PCFG0, no registrador ADCON1, de
acordo com a tabela abaixo.

28
Passo a passo para executar a conversão A/D
Para executar uma ou mais conversões, basta seguir os passos a seguir:
1. Configure os pinos a serem usados como entradas analógicas (ADCON1);
2. Selecione TAD (ADCON0, ADCON1);
3. Ligue o módulo ADON=1 (ADCON0);
4. Configure a interrupção, se desejado (ADIF=0, ADIE=1, PEIE=1 e GIE=1);
5. Selecione o canal desejado (ADCON0);
6. Espere o tempo de aquisição;
7. Inicie a conversão DO/GONE=1;
8. Espere pelo fim da aquisição esperando o bit DO/GONE ir para zero ou aguardando a
interrupção.
9. Ler o par de registradores ADRESH:ADRESL e apagar o bit ADIF, se estiver usando
interrupção.
10. Para uma nova conversão vá para o passo 5 novamente.

29

Você também pode gostar