You are on page 1of 12

PIC: Blocos Timer, Capture/Compare/PWM

e Interrupção

OBJETIVOS
• Compreender a operação dos três timer´s implementados no PIC;
• Compreender como funciona o bloco Capture/Compare/PWM;
• Compreender como os timer´s 1 e 2 estão associados com o bloco Capture/Compare/PWM;
• Utilizar as interrupções dos Timer´s e do bloco Capture/Compare/PWM para identificar
eventos/gerar eventos;

TIMER 0
O módulo do Timer 0 possui as seguintes características:
• Contador/Timer de 8 bits;
• Registrador de contagem de escrita e leitura;
• Pré-escalonador (divisor de freqüência) programável;
• Utiliza sinal de clock interno ou externo;
• Gera interrupção quando a contagem muda de FF para 00;
• Permite selecionar o tipo de transição quando usa clock externo (Borda de subida ou
descida).

O modo de operação do Timer 0 é definido a partir do bit T0CS (bit 5 do Reg. OPTION). No
modo timer, o Timer 0 incrementa a cada ciclo de instrução (sem pré-escalonador). Se ocorrer
uma escrita no registrador TMR0, o incremento é inibido pelos dois ciclos de instrução seguintes.

O modo de contagem é selecionado setando o bit T0CS. No modo de contagem , o Timer 0


incrementará a cada subida ou descida do sinal no pino RA4/TOCKL. A borda é definida pelo bit
T0SE (bit 4 do Reg. OPTION).

Interrupção do Timer 0
A interrupção TMR0 é gerada quando o registrador TMR0 estoura (overflow), conta de FF para
00. Este overflow seta o bit T0IF (bit 2 do Reg. INTCON). A interrupção pode ser mascarada
resetando o bit T0IE (bit 5 do Reg. INTCON). O bit T0IF deve ser apagado por software (na
rotina de serviço de interrupção do Timer 0) antes de reabilitar a própria.

Pré-escalonador
Há um único pré-escalonador que é compartilhado com o WatchDogTimer de forma mutuamente
excludente (se o Timer 0 usa o pré-escalonador o WatchDog não pode usar e vice versa). Os bits
PSA e PS2:PS0 (bits 3 a 0 do Reg. OPTION) determinam o fator de escalonamento da freqüência
do sinal de clock do Timer 0. Quando atribuído ao Timer 0, todas as instruções que escrevem
para o registrador TMR0 (CLRF 1, MOVWF 1, BSF 1,x...) apagarão o contador do pré-
escalonador mas não alterarão a sua configuração.

1
Registrador OPTION

Registradores associados ao Timer 0

TIMER 1
O módulo Timer 1 é um timer/contador de 16 bits, dividido em dois registradores de 8 bits
(TMR1H e TMR1L), que são de escrita e leitura. O par de registradores (TMR1H e TMR1L)
incrementa de 0000h a FFFFh e retorna a 0000h (overflow). A interrupção TMR1, se habilitada,
seta o bit de flag TMR1IF (bit 0 do Reg. PIRI) quando ocorre o overflow. Essa interrupção pode
ser habilitada/desabilitada setando/resentando, respectivamente, o bit de habilitação de
interrupção TMR1IE (bit 0 do Reg. PIE1).

O Timer 1 pode operar de dois modos:


• Como timer: Neste modo o Timer 1 incrementa a cada ciclo de instrução;
• Como contador: Neste modo o Timer 1 incrementa a cada transição do sinal de clock externo.
O modo de operação é determinado pelo bit de seleção de clock, TMR1CS (bit 1 do Reg.
T1CON).

2
O Timer 1 pode ser habilitado/desabilitado setando/resetando, respectivamente, o bit de controle
TMR1ON (bit 0 do registrador). O Timer também possui um reset interno que pode ser gerado
pelos módulos “Capture/Compare/PWM - CCP”. Quando o oscilador do Timer 1 está habilitado
(T1OSCEN setado), os pinos RC1/T1OSI/CCP2 e RC0/T1OSO/T1CKL tornam-se entradas
independente do valor dos bits 1 e 0 do registrador TRIS, que são ignorados.

Resetando o Timer 1 usando uma saída de Trigger do módulo CCP


Se o módulo CCP1 ou CCP2 (este apenas no PIC 16F877) é configurado no modo de comparação
para gerar um “special event trigger” (CCP1M3:CCP1M0 = 1011), esse sinal resetará o Timer 1.
Nos casos em que uma escrita coincide com um “special event trigger” de CCP1 ou CCP2, a
escrita terá precedência. Nesse modo de operação os registradores CCPRxH:CCPRxL tornam-se
os registradores de período do Timer 1.

Pré-escalonador do Timer 1
O contador pré-escalonador é apagado quando são escritos valores para os registradores TMR1H
e TMR1L.

Registrador de controle do Timer 1 – T1CON

3
Registradores associados ao Timer 1 como Timer/Contador

TIMER 2
O Timer 2 é um timer de 8 bits com um pré-escalonador e pós-escalonador. O mesmo pode ser
usado como a base de tempo no modo PWM dos módulos CCP. O TMR2 é um registrador de
escrita e leitura e é apagado em qualquer evento de reset.

A entrada de clock (Fosc/4) possui uma opção de escalonamento de 1:1, 1:4 ou 1:16, selecionada
pelos bits de controle T2CKPS1:T2CKPS0 (bits 1 e 0 do Reg. T2CON), que faz com que o sinal
de clock do timer 2 seja dividido, respectivamente, por 1, 4 e 16. O módulo do Timer 2 possui um
registrador de período de 8 bits PR2, que indica o valor máximo que pode ser atingido pelo
TMR2, assim o timer 2 incrementa de 00h até atingir PR2 e então reseta para 00h no ciclo de
incremento seguinte. PR2 é um registrador de escrita e leitura e é inicializado com FFh após
qualquer RESET.
O sinal de saída resultante da comparação do PR2 com o TMR2 passa por um pós-escalonador
(escalas de 1:1, 1:4 e 1:16) para gerar a interrupção TMR2 (quando ocorre, o bit 1 (TMR2IF) do
Reg. PIR1 é setado), ou seja, quando a interrupção está habilitada a mesma ocorrerá após 1, 2, 3,
4, ..... ou 16 vezes em que o valor do contador do timer 2 (TMR2) atingir o valor gravado no
registrador PR2.
O Timer 2 pode ser desligado resetando o bit de controle TMR2ON (bit 2 do registrador
T2CON).

Pré-Escalonador e Pós-Escalonador do Timer 2


Os contadores do pré-escalonador e do pós-escalonador são apagados quando algum dos eventos
abaixo ocorre:
• Uma escrita para o registrador TMR2;
• Uma escrita para o registrador T2CON;
• Qualquer reset do dispositivo (POR, MCLR reset, WDT reset ou BOR).
O Timer 2 não é apagado quando ocorre uma escrita para registrador de configuração do timer 2
T2CON.

4
Registrador de Controle do Timer 2 – T2CON

Registradores associados com o Timer 2 como timer/contador

Módulo de Captura, Comparação e PWM


OS módulos CCP (Captura/Comparação/PWM) são formados por um registrador de 16 bits que
pode operar como:
• Registrador de captura de 16 bits;
• Registrador de comparação de 16 bits
• Registrador de “duty cycle” no modo PWM Mestre/Escravo.

Ambos os módulos CCP1 e CCP2 (apenas o PIC16F877 possui dois CCPs) são idênticos em
operação , com exceção do “special event trigger”

Módulo CCP1
O registrador CCP do módulo CCP1 (CCPR1) é formado por dois registradores de 8 bits:
CCPR1L (byte menos significativo) e CCPR1H (byte mais significativo). O “special event
trigger” é gerado quando o conteúdo deste registrador e o conteúdo do registrador de contagem
do Timer 1 são iguais, resetando este último.

5
Módulo CCP2
O registrador CCP do módulo CCP2 (CCPR2) é formado por dois registradores de 8 bits:
CCPR2L (byte menos significativo) e CCPR2H (byte mais significativo). O registrador
CCP2CON controla a operação do CCP2. Da mesma forma como para o CCP1, o “special event
trigger” é gerado quando o conteúdo deste registrador e o conteúdo do registrador de contagem
do Timer 1 são iguais, resetando este último. No caso do CCP2, além de resetar o Timer 1,
também é iniciada uma conversão A/D.

Modo de operação do módulo CCP e recursos de Timer necessários

Interação entre dois módulos CCP

Registradores de Controle CCP1CON e CCP2CON

Modo Captura

6
No modo captura o valor de 16 bits do registrador TMR1 é copiado para os registradores
CCPR1H:CCPR1L e/ou CCPR2H:CCPR2L (apenas PIC 16F877), quando um dos eventos ocorre
no pino RC2/CCP1 e/ou RC1/CCP2 (PIC16F877) ou no pino RB3/CCP1 (PIC 16F628):
• A cada borda de descida do sinal no pino RC2, RC1 (PIC 16F877) ou RB3 (PIC
16F628);
• A cada borda de subida do sinal no pino RC2, RC1 (PIC 16F877) ou RB3 (PIC 16F628);
• A cada 4 bordas de subida do sinal no pino RC2, RC1 (PIC 16F877) ou RB3 (PIC
16F628);
• A cada 16 bordas de subida do sinal no pino RC2, RC1 (PIC 16F877) ou RB3 (PIC
16F628);

O tipo de evento é selecionado pelos bits de controle CCP1M3:CCP1M0 (bits de 3 a 0 do Reg.


CCP1CON). Quando uma captura é realizada, o flag de requisição de interrupção, bit CCP1IF
(bit 2 do Reg. PIR1) é setado. Este bit deve ser apagado por software. Se uma outra captura
ocorrer antes que o valor no registrador CCPR1 for lido, o valor anterior será perdido.

No modo captura os pinos RC2/CCP1, RC1/CCP2 (PIC 16F877) e RB3/CCP1 (PIC 16F628)
devem ser configurados como uma entrada, setando o bit 1 e 2 do registrador TRISC (PIC
16F877) ou o bit 3 do registrador TRISB (PIC 16F628). O Timer 1 deve estar operando no modo
timer ou no modo contador com sincronização do sinal de clock externo com o clock interno.

Pré-escalonador do módulo CCP


Há quatro ajustes do pré-escalonador, especificados pelos bits CCP1M3:CCP1M0. Sempre que o
módulo CCP é desligado, ou o módulo CCP não está no modo captura, o contador do pré-
escalonador é apagado. Também, qualquer Reset apagará o pré-escalonador.

OBSERVAÇÃO: Se os pinos RC2/CCP1, RC1/CCP2 e RB3/CCP1 são configurados como


uma entrada, uma escrita para a porta pode causar uma condição de captura.

Modo Comparação
No modo comparação o valor do registrador CCPR1 (16 bits) e/ou CCPR2 (16 bits) (apenas para
o PIC 16F877) é (são) constantemente comparado(s) com o valor do registrador TMR1. Quando
os valores se igualam, o pino RC2/CCP1 e/ou RC1/CCP2 (PIC 16F877) ou o pino RB3/CCP1
(PIC 16F628) é (são):
• Ativado;
• Desativado
• Permanece inalterado
A ação no(s) pino(s) é definida pelos bits de controle CCP1M3:CCP1M0 (bits de 3 a 0 do Reg.
CCP1CON). Ao mesmo tempo o flag de interrupção é setado, bit CCP1IF, gerando uma
interrupção, se habilitada.

No modo comparação os pinos RC2/CCP1, RC1/CCP2 e RB3/CCP1 devem ser configurados


como saídas, resetando os bits 1 e 2 do registrador TRISC (PIC 16F877) ou o bit 3 do registrador
TRISB (PIC 16F628). O Timer 1 deve estar operando no modo timer ou no modo contador com
sincronização do sinal de clock externo com o clock interno.

No modo de comparação pode ser gerado um “special event trigger”, a partir de um trigger
interno. Este evento, no módulo CCP1, reseta o par de registradores que forma o TMR1. No
módulo CCP2 (apenas PIC 16F877), a mesma operação é realizada, além de iniciar uma
conversão A/D (se o módulo A/D está habilitado).

7
Modo PWM
No modo PWM o pino CCPx produz um sinal de PWM com uma resolução de até 10 bits. Como
os pinos RC2/CCP1 e RC1/CCP2 são multiplexados com o latch de dados da porta C no PIC
16F877 e o pino RB3/CCP1 é multiplexado com o latch de dados da porta B no PIC 16F628, os
bits 1 e 2 de TRISC, PIC 16F877 e bit 3 de TRISB, PIC 16F628, devem ser resetados para tornar
os pinos RC2/CCP1, RC1/CCP2 e/ou RB3/CCP1 uma saída.

Um sinal PWM é caracterizado pelo seu período e um o “duty cycle”, que corresponde ao tempo
em que o sinal permanece em nível alto. O período do sinal PWM é especificado pelo registrador
PR2, sendo calculando segundo a fórmula: Período PWM = [(PR2) + 1] • 4 • TOSC • (TMR2
prescale value).
Quando TMR2 é igual a PR2, os seguintes eventos ocorrem:
• O TMR2 é apagado;
• O pino CCP1 é setado (exceto se o duty cycle do PWM = 0%, quando o CCP1 não será
setado);
• O PWM duty cycle é copiado de CCPR1L para CCPR1H.

O duty cycle do PWM é definido escrevendo para o registrador CCPR1L e para os bits 5 e 4 do
registrador CCP1CON, onde os 8 bits do registrador CCPR1L representa os 8 bits mais
significativos e os bits 5 e 4 de CCP1CON, representam os dois bits menos significativos. A
partir da equação abaixo é possível determinar o duty cycle em termos de tempo:

Duty Cycle do PWM = (CCPR1L:CCP1CON<5:4>) • Tosc • (TMR2 prescale value)

Os valores podem ser copiados para o registrador CCPR1L e para os bits 5 e 4 do registrador
CCP1CON em qualquer instante, mas o novo valor do duty cycle só será copiado para o
CCPR1H, quando os valores dos registradores PR2 e TMR2 coincidirem (ao fim do período
PWM). No modo PWM CCPR1H é um registrador apenas de leitura.

Os seguintes passos devem ser seguidos quando ajustando o módulo CCP para funcionar no
modo PWM:
1. Ajustar o período do sinal PWM, escrevendo um valor adequado no registrador PR2;
2. Ajustar o duty cycle do sinal PWM, escrevendo um valor adequado para o registrador
CCPR1L e para os bits 5 e 4 do registrador CCP1CON;
3. Configurar o pino RC2/CCP1, RC1/CCP2 (PIC 16F877) ou RB3/CCP1 (PIC 16F628) como
uma saída (resetar o bit 1 e/ou 2 do reg. TRISC, PIC 16F877 ou o bit 3 do reg. TRISB, PIC
16F628);
4. Ajustar o valor do pré-escalonador e habilitar o Timer 2 configurando o registrador T2CON;
5. Configurar o módulo CCP1 e/ou CCP2 (apenas PIC 16F877) para operação no modo PWM;

Registradores associados com o PWM e Timer 2

8
9
Registradores associados com o Capture, Compare e Timer 1

PREPARAÇÃO

1. Descreva a operação realizada por cada uma das funções abaixo e também o que representa
cada opção dos parâmetros da função em termos do funcionamento do bloco ao qual a função
está associada:
SETUP_TIMER_0 (mode)
mode: RTCC_INTERNAL, RTCC_EXT_L_TO_H or RTCC_EXT_H_TO_L

RTCC_DIV_2, RTCC_DIV_4, RTCC_DIV_8, RTCC_DIV_16, RTCC_DIV_32,


RTCC_DIV_64, RTCC_DIV_128, RTCC_DIV_256

SETUP_TIMER_1 (mode)
mode: T1_DISABLED, T1_INTERNAL, T1_EXTERNAL, T1_EXTERNAL_SYNC
T1_CLK_OUT
T1_DIV_BY_1, T1_DIV_BY_2, T1_DIV_BY_4, T1_DIV_BY_8
Constantes de grupos diferentes podem ser associadas usando o operador “OR” - |.

SETUP_TIMER_2 (mode, period, postscale)


mode: T2_DISABLED, T2_DIV_BY_1, T2_DIV_BY_4, T2_DIV_BY_16
period: É um inteiro entre 0 e 255 que determina quando o valor do contador do Timer 2 é
zerado;
postscale: É um número entre 1 e 16 que determina quantos resetes do contador do Timer 2 devem
ocorrer para que uma interrupção seja ativada (1 indica um resete, 2 indica dois resetes).

SET_TIMERx (value)
GET_TIMERx ( )

SETUP_CCPx (mode)

10
mode: É uma constante. Valores válidos para “mode” são:
Desabilita o bloco CCP: CCP_OFF
Configura o bloco CCP para o modo captura:
CCP_CAPTURE_FE - Capture on falling edge
CCP_CAPTURE_RE - Capture on rising edge
CCP_CAPTURE_DIV_4 - Capture after 4 pulses
CCP_CAPTURE_DIV_16 - Capture after 16 pulses
Configura o bloco CCP para o modo comparação:
CCP_COMPARE_SET_ON_MATCH
CCP_COMPARE_CLR_ON_MATCH
CCP_COMPARE_INT
CCP_COMPARE_RESET_TIMER
Configura o bloco CCP para o modo PWM
CCP_PWM

SET_PWMx_DUTY (value)

SETUP_WDT (mode)
mode: DT_18MS, WDT_36MS, WDT_72MS, WDT_144MS,WDT_288MS, WDT_576MS,
WDT_1152MS, WDT_2304MS

RESTART_WDT ( )

DISABLE_INTERRUPTS (level)
ENABLE_INTERRUPTS (level)
level: GLOBAL, INT_RTCC, INT_RB, INT_EXT, INT_AD, INT_TBE, INT_RDA,
INT_TIMER1, INT_TIMER2, INT_CCP1, INT_CCP2, INT_SSP, INT_PSP,
INT_BUSCOL, INT_EEPROM, INT_TIMER0

2. Determine o valor do byte a ser gravado no registrador PR2, para fazer o módulo CCP1 gerar
um sinal PWM, com um período de 512µs e o valor do “duty cycle”, para gerar um pulso alto
de 128µs, sabendo que: Fosc=4MHz.

3. Elabore uma rotina em C que habilite as interrupções dos Timers 0, 1 e 2 a cada 65,5ms,
524ms e 65,5ms, respectivamente. Em cada rotina faça o que é pedido abaixo:
Interrupção do Timer0 – A cada 8 entradas na rotina de interrupção do Timer0 o estado
do pino B0 deve ser trocado (0→1) e (1→0);
Interrupção do Timer1 – A cada 2 entradas na rotina de interrupção do Timer1 o estado
do pino B1 deve ser trocado (0→1) e (1→0);
Interrupção do Timer2 – A cada 4 entradas na rotina de interrupção do Timer2 o estado
do pino B2 deve ser trocado (0→1) e (1→0);

4. Elabore uma rotina em C que habilite a interrupção de captura do bloco CCP1. Na rotina da
interrupção de captura incremente um contador (uma variável int) e escreva o valor dessa
variável nos 8 bits da porta D. Utilize um botão da placa para ativar a interrupção de captura.

5. Elabore uma rotina em C que habilite a interrupção de comparação do bloco CCP2. Na rotina
da interrupção de comparação incremente um contador (uma variável LONG) e use o valor
do contador para atualizar o conteúdo do registrador CCPR2. O registrador CCPR2 é
acessado através da variável CCP_2, definida no arquivo 16F877A.h. Defina uma variável do
tipo “BIT” e faça com que o estado dela fique sendo trocado a cada vez que a interrupção de
comparação for executada. O valor dessa variável deve ativar um LED. Use o pino B0 para
isso.

11
OBS: O arquivo “regs_16.h”, pode ser encontrado no endereço
“http://www.dee.ufcg.edu.br/~aco/Lab_Arquitetura/Regs_PIC.zip”

6. Elabore uma rotina em C que ative o Watchdog e o configure para resetar o sistema a cada
2304ms. O programa deve habilitar as interrupções de captura do bloco CCP1 e do timer 2,
esta última com uma periodicidade de 65,5ms. Nas rotinas de interrupção implemente as
operações abaixo:
Interrupção de captura – A interrupção de captura será ativada por um botão da placa e
nela deve ser implementado o reset do watchdog de modo a evitar que o mesmo resete o
sistema;
Interrupção do Timer 2 – Incremente uma variável do tipo INT e escreva seu valor nos 8
bits da porta D.

7. Elabore uma rotina em C que habilite o modo PWM do bloco CCP1 e gere um sinal PWM
com as características descritas no item 2 da preparação.

OBS: A freqüência do clock interno do Timer 0, 1 e 2 é igual à freqüência do


oscilador que aciona o PIC, 4MHz, dividida por 4.

Labels definidos nos arquivos device.h


PIN_A0, PIN_A1, PIN_A2, PIN_A3, PIN_A4, PIN_A5 – Acesso aos pinos da porta A;
PIN_B0, PIN_B1, PIN_B2, PIN_B3, PIN_B4, PIN_B5, PIN_B6, PIN_B7 – Acesso aos pinos
da porta B;
PIN_C0, PIN_C1, PIN_C2, PIN_C3, PIN_C4, PIN_C5, PIN_C6, PIN_C7 – Acesso aos pinos
da porta C;
PIN_D0, PIN_D1, PIN_D2, PIN_D3, PIN_D4, PIN_D5, PIN_D6, PIN_D7 – Acesso aos pinos
da porta D;
PIN_E0, PIN_E1, PIN_E2 – Acesso aos pinos da porta E;
CCP_1 - Acessa o registrador CCP1 (todos os 16 bits);
CCP_1_LOW – Acessa os 8 bits menos significativos do registrador CCP1;
CCP_1_HIGH – Acessa os 8 bits mais significativos do registrador CCP1;
CCP_2 - Acessa o registrador CCP2 (todos os 16 bits);
CCP_2_LOW – Acessa os 8 bits menos significativos do registrador CCP2;
CCP_2_HIGH – Acessa os 8 bits mais significativos do registrador CCP2;

12

You might also like