Professional Documents
Culture Documents
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.
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
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).
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.
Pré-escalonador do Timer 1
O contador pré-escalonador é apagado quando são escritos valores para os registradores TMR1H
e TMR1L.
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).
4
Registrador de Controle do Timer 2 – T2CON
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 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);
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.
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 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:
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;
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
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” - |.
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.
12