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 “http://www.dee.ufcg.edu.br/~aco/Lab_Arquitetura/Regs_PIC.zip”
no
endereço
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