Altana Tubes > Blog > PIC16F627A/628A/648A > Módulo Timer0

6.0 Módulo Timer0 dos microcontroladores PIC16F627A, PIC16F628A e PIC16F648A

Tradução: Maria Elisa - Assessoria em Inglês e Alemão 

Revisão: Renato Kodaira

O módulo temporizador/contador Timer0 dos microcontroladores PIC16F627APIC16F628A e PIC16F648A possui as seguintes características:

  • Temporizador/contador de 8 bits
  • Capacidades de leitura e escrita
  • Pré-scaler de 8 bits programável por software
  • Seleção de clock interno ou externo
  • Interrupção no overflow de FFh a 00h
  • Seleção de borda para o clock externo

Na Figura 6.1 há um diagrama de blocos simplificado do módulo Timer0. Informações adicionais estão disponíveis no "Manual de Referência da Família de MCUs de Média Ordem PIC®" (DS33023).

O modo Timer é selecionado apagando-se o bit T0CS (OPTION<5>). No modo Timer, o valor do registrador TMR0 irá incrementar cada ciclo de instrução (sem pré-scaler). Se o registrador TMR0 é escrito, o incremento será inibido pelos próximos dois ciclos. O usuário pode contornar este fato escrevendo um valor inicial no registrador TMR0.

O modo Counter (contador) é selecionado ativando-se o bit T0CS. Neste modo, o valor do registrador TMR0 irá incrementar em cada borda de subida ou de descidado pino RA4/T0CKI/CMP2. A borda a incrementar é determinada pelo bit de controle da borda da fonte (T0SE) (OPTION<4>). Apagando-se o bit T0SE, a borda de subida é selecionada. Restrições na entrada do clock externo são discutidas na Seção 6.2 "Utilizando o Timer0 com Clock Externo".

O pré-scaler é dividido entre o módulo Timer0 e o Temporizador Cão-de-Guarda. A atribuição do pré-scaler é controlada pelo software através do bit de controle PSA (OPTION<3>). Apagando-se o bit PSA, o pré-scaler será atribuído ao Timer0. O pré-scaler não é acessível para leitura ou escrita. Quando o pré-scaler está atribuído ao módulo Timer0, o valor do pré-scaler pode ser selecionado dentre 1:2, 1:4, ..., 1:256. A Seção 6.3 "Pré-Scaler do Timer0" detalha a operação do pré-scaler.

6.1 Interrupção do Timer0

A interrupção do Timer0 é gerada quando o registrador temporizador/ contador TMR0 sofre overflow do FFh ao 00h. Este overflow ativa o bit T0IF. A interrupção pode ser mascarada apagando-se o bit T0IE (INTCON<5>). O bit T0IF (INTCON<2>) pode ser apagado pelo software através da rotina de serviço de interrupção do módulo Timer0, antes de reabilitar esta interrupção. A interrupção do Timer0 não pode acordar o processador da hibernação, pois o temporizador é desligado durante a hibernação.

6.2 Utilizando o Timer0 com Clock Externo

Quando uma entrada de clock externo é utilizada para o Timer0, ela deve atender a certos requisitos. O requisito do clock externo se deve à sincronização do clock de fase interno (Tosc). Além disso, há um delay na incrementação atual do Timer0 depois da sincronização.

6.2.1 SINCRONIZAÇÃO DO CLOCK EXTERNO

Quando não é utilizado nenhum pré-scaler, a entrada do clock externo é a mesma que a saída do pré-scaler. A sincronização do T0CKI com o clock de fase interno é realizada amostrando-se a saída do pré-scaler nos ciclos Q2 e Q4 dos clocks de fase internos (Figura 6.1). Portanto, é necessário que o T0CKI esteja alto por pelo menos 2 Tosc (e um pequeno delay de 20ns do RC) e baixo por pelo menos 2 Tosc (e uma pequeno delay de 20ns do RC). Consulte a especificação elétrica do dispositivo desejado.

Quando um pré-scaler é utilizado, a entrada do clock externo é dividida pelo pré-scaler do tipo ripple-counter (contador-ripple ou contador por pulsação) assíncrono, de forma que a saída do pré-scaler seja simétrica. Para que o clock externo atenda ao requisito de amostragem, o contador-ripple deve ser levado em conta. Portanto, é necessário que o T0CKI tenha um período de pelo menos 4 Tosc (e um pequeno delay de 40ns do RC) dividido pelo valor do pré-scaler. O único requisito para os tempos do T0CKI alto e baixo é que eles não ultrapassem o limite mínimo de amplitude de pulsação de 10ns. Consulte os parâmetros 40, 42 e 42 na especificação elétrica do dispositivo desejado. Veja a Tabela 17.8.

6.3 Pré-Scaler do Timer0

Um contador de 8 bits está disponível como pré-scaler para o módulo Timer0, ou como pós-scaler para o Temporizador Cão-de-Guarda. A atribuição de pré-scaler para o módulo Timer0 implica em não haver pós-scaler para o Temporizador Cão-de-Guarda, e vice-versa.

Os bits PSA e PS<2:0> (OPTION<3:0>) determinam a atribuição do pré-scaler, bem como sua escala.

Quando atribuído ao módulo Timer0, todas as instruções escritas no registrador TMR0 (p. ex. CLRF 1, MONWF 1, BSF 1, x... etc.) apagarão o pré-scaler. Quando atribuído ao WDT (Watchdog Timer = Temporizador Cão-de-Guarda), uma instrução CLRWDT apagará o pré-scaler juntamente com o Temporizador Cão-de-Guarda. O pré-scaler não é acessível para leitura ou escrita.

FIGURA 6.1: DIAGRAMA DE BLOCOS DO TIMER0/WDT

6.3.1 ALTERANDO A ATRIBUIÇÃO DO PRÉ-SCALER

A atribuição do pré-scaler está sob controle total do software (i.e. ela pode ser alterada "na hora" durante a execução do programa). Utilize as sequências de instruções apresentadas no Exemplo 6.1 para alterar a atribuição do pré-scaler do Timer0 para o WDT, a fim de evitar uma reinicialização não intencional do dispositivo.

EXEMPLO 6.1: ALTERANDO O PRÉ-SCALER (TIMER0 → WDT)

  
  BCF STATUS, RP0    ;Pular se já está no banco 0
  CLRWDT             ;Apaga WDT
  CLRF TMR0          ;Apaga TMR0 e o pré-scaler
  BSF STATUS, RP0    ;Muda para banco 1

  MOVLW '00101111'b  ;Estas 3 linhas são necessárias  
  MOVWF OPTION_REG   ;somente se os bits PS<2:0>  
  CLRWDT             ;forem 000 ou 001

  MOVLW '00101xxx'b  ;Configura o pós-scaler para
  MOVWF OPTION_REG   ;a proporção desejada de WDT
  BCF STATUS, RP0    ;Retorna ao Banco 0
  

Para alterar o pré-scaler do WDT para o módulo Timer0, utilize a sequência apresentada no Exemplo 6.2. Esta precaução deve ser tomada mesmo que o WDT esteja desabilitado.

EXEMPLO 6.2: ALTERANDO O PRÉ-SCALER (WDT → TIMER0)

  
  CLRWDT              ;Apaga WDT e o pré-scaler
  BSF STATUS, RP0
  MOVLW b'xxxx0xxx’   ;Seleciona TMR0, o novo valor 
                      ;do pré-scale e fonte de clock  
  MOVWF OPTION_REG
  BCF STATUS, RP0
   

TABELA 6.1: REGISTRADORES ASSOCIADOS AO TIMER0

Endereço Nome Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor na POR Valor em Todas as Outras Reinicializações
01h, 101h TMR0 Registrador Módulo Timer0 xxxx xxxx uuuu uuuu
0Bh, 8Bh, 10Bh, 18Bh INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x 0000 000u
81h, 181h OPTION (2) RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 1111 1111 1111 1111
85h TRISA TRISA7 TRISA6 TRISA5 TRISA4 TRISA3 TRISA2 TRISA1 TRISA0 1111 1111 1111 1111

Legenda:
- = posições não implementadas, lidas como "0"
u = inalterado
x = desconhecido
células sombreadas = não utilizadas para o Timer0

Nota 1: O registrador Option é referido como OPTION_REG no Software MPLAB® IDE.

<-Anterior Índice Próximo->