Sie sind auf Seite 1von 21

REGISTRO TMR0

PIC - Microchip

Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/08


1/21
REGISTRO TMR0

Introdução

Os microcontroladores possuem um registro especial utilizado como um temporizador/contador interno. A


aplicação deste registro é bastante versátil e, no geral, é uma das ferramentas mais poderosas que o
microcontrolador possui.

A partir do registro do TMR0 é possível produzir bases de tempo bastante precisas (dependendo do tipo de
oscilador empregado), elaborar contagens com pré-determinação e outras aplicações que dependem apenas da
imaginação do programador.

Princípio de Funcionamento

O registro TMR0 possui os seguintes recursos:

- registro de 8 bits, permite contagens de 0 até 255 (ou até 256 incrementos).
- opera como temporizador (clock interno) ou contador (clock externo ou fonte de sinal para contagem),
selecionável por meio do código_fonte.
- registro permite leitura (verifica o valor dentro do registro e comparação com outro valor) e escrita (é
possível iniciar a contagem a partir de qualquer valor entre 0 e 255, isto é, o registro conta o restante dos
incrementos disponíveis).
- seleção da transição (positiva ou negativa) no modo contador externo.
- prescaler programável pelo código_fonte controlando a velocidade que o registro incrementa uma
unidade.
- requisição de interrupção quando o valor do registro exceder 255 (FFh) e retornar para 0 (00h) - overflow
- utilizável ou não através de alteração dos bits correspondentes ao controle de interrupções no registro
INTCON durante a execução do código_fonte.

Diagrama de Blocos

O diagrama de blocos simplificado do funcionamento do TMR0 está esquematizado na fig.1:

Fig.1 – Diagrama de Blocos – TMR0

A fonte de incrementos do TMR0 pode ser selecionada a partir da chave T0CS entre fonte interna (Fosc/4), ou
fonte externa (T0CKI pin - normalmente multiplexado com outras funções). A forma como o TMR0 vai
incrementar pela fonte externa pode ser selecionada a partir do nível lógico de T0SE (para incrementar no
flanco de subida ou descida do sinal externo). A velocidade que o TMR0 incrementa pode ser determinada pelo
uso de um divisor de frequencia (Programmable Prescaler), cuja divisão pode ser determinada por PS2, PS1 e
PS0. A utilização do Prescaler pode ser selecionada pela chave PSA. O sinal de saída do Prescaler (Psout) é
entregue a um circuito que se encarrega de sincronizar os pulsos com os sistemas internos (Sync with internal
Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/08
2/21
clocks) do processador para o caso de o valor contido no registro TMR0 seja modificado pelo código_fonte
(Data bus). A conexão do registro com o Data-Bus permite que os valores contidos sejam lidos ou escritos
através do código_fonte e, ao mesmo tempo, quando houver “overflow”, ocorre o desvio para o vetor de
interrupção (quando habilitado), colocando 1 (um - set) automáticamente no bit T0IF (Set interrupt flag bit T0IF
on overflow).

Configuração

A configuração de uso do TMR0 é feita a partir dos bits de controle existentes nos dois registros especiais:

OPTION: permite estabelecer a origem do sinal de contagem, a forma de incremento e com qual
velocidade o registro será incrementado (Prescaler).

INTCON: permite utilizar o recurso da interrupção sempre que o registro TMR0 retornar a zero (0) -
overflow.

Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/08


3/21
OPTION
Permite configurar a origem do sinal de contagem, a forma de incremento e com qual velocidade o registro será
incrementado (Prescaler).

O endereço e a descrição da função dos bits de configuração estão detalhados (realçado) abaixo:

R/W 7 R/W 6 R/W 5 R/W 4 R/W 3 R/W 2 R/W 1 R/W 0


/RBPU INTDEG T0CS T0SE PSA PS2 PS1 PS0
MSB LSB

BIT OPER INÍCIO CÓDIGO FUNÇÃO


7 R/W 1 /RBPU Resistores Internos de Pull-Up do PORTB – Habilitação

1 = Resistores Internos não habilitados


0 = Resistores Internos habilitados
6 R/W 1 INTDEG Seleção de Transição p/ requisição de Interrupção por mudança de
estado do pino RB0/INT:

1 = interrupção na transição positiva (0 → 1) no pino RB0/INT


0 = interrupção na transição negativa (1 → 0) no pino RB0/INT
5 R/W 1 T0CS Seleção da fonte de incremento do TMR0

1 = transição no pino RA4/T0CKI


0 = ciclo de máquina (CM) interno
4 R/W 1 T0SE Seleção de Transição no pino T0CKI p/ incremento do TMR0

1 = incremento na transição negativa (1 → 0) no pino T0CKI


0 = incremento na transição positiva (0 → 1) no pino T0CKI
3 R/W 1 PSA Aplicação do Prescaler

1 = Prescaler aplicado no WDT


0 = Prescaler aplicado no TMR0
2-0 R/W 1 PS2-PS0 Configuração do divisor do Pre-scaler

Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/08


4/21
Bit 2, 1, 0
TMR0
WDT

000
1:2
1:1

001
1:4
1:2

010
1:8
1:4

011
1:16
1:8

100
1:32
1:16

101
1:64
1:32

110
1:128
1:64

111
1:256
1:128

Obs.: Se PSA=1 (Prescaler aplicado no WDT), o divisor do TMR0


será 1:1.

Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/08


5/21
Descrição da Configuração

Os bits são do tipo Leitura/Escrita (R/W – Read/Write) e podem ser modificados durante a execução do
código_fonte (on-the-fly) de acordo com as necessidades de uso e operação dos recursos disponíveis.

T0CS (TMR0 Clock Source): Seleção da fonte de sinal de incremento para o TMR0 – bit 5

Este bit permite selecionar a fonte de sinal que o registro TMR0 utiliza como incremento, de acordo com as
duas opções:

T0CS = 1 → a origem do sinal de incremento é a transição do nível lógico no pino externo RA4/T0CKI
- o TMR0 funciona como um contador. Nesta opção as funções I/Odo bit RA4 e CMP1
do comparador ficam desligadas.

T0CS = 0 → a origem do sinal de incremento é o ciclo de máquina (CM) interno - o TMR0 funciona
como um temporizador (timer), que depende da frequencia do oscilador escolhido (Fosc)
pelo projeto. Nesta opção as funções I/Odo bit RA4 e CMP1 do comparador estão ativas.

A fig.2 mostra o diagrama lógico do circuito de seleção da fonte do sinal de incremento dot TMR0,
onde o bit T0CS aciona a chave seletora entre o sinal externo (entrada RA4) e o sinal interno (Fosc). A
fig.3 mostra um exemplo da localização física da entrada RA4 – pino 3 do microcontrolador modelo
P16F628A, encapsulamento PDIP (plastic, dual in line, 18 pins). O projetista deve consultar a folha de
dados (data sheet) do dispositivo escolhido antes da aplicação.

Fig.2 – Circuito Lógico Fonte de Sinal Fig.3 – Pino RA4/T0CKI no modelo P16F628A

O projetista pode empregar as duas fontes (interna ou externa) de acordo com a necessidade de
aplicação mudando os valores do bit T0CS por meio do código_fonte. Observar que não é possível o
uso simultaneo das duas opções.

T0SE (TMR0 Source Edge): Seleção da transição do sinal de incremento para o TMR0 – bit 4

O projetista pode selecionar com qual tipo de transição do sinal de entrada externo que o TMR0 realiza um
incremento de contagem, de acordo com as opções:

T0SE = 1 → incremento do TMR0 na transição negativa (1 → 0) no pino RA4/T0CKI (fig.4)

T0SE = 0 → incremento do TMR0 na transição positiva (0 → 1) no pino RA4/T0CKI (fig.5)

Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/08


6/21
Fig.4 – Transição Negativa no pino RA4/T0CKI Fig.5 – Transição Positiva no pino RA4/T0CKI

O projetista pode empregar as duas transições (negativa ou positiva) de acordo com a necessidade de aplicação
mudando os valores do bit T0SE por meio do código_fonte. Para que não ocorram erros de execução do
código_fonte, as instruções das duas transições devem ser separadas por um período de tempo não menor que
10 CM, suficiente para que a ALU atualize os valores internos dos registros. Portanto, a frequencia do sinal de
entrada determina a possibilidade de uso das instruções encadeadas. Observar que não é possível o uso
simultaneo das duas opções.

PSA (Pre Scaler Assignment): Seleção da aplicação do Pre Scaler – bit 3

O Pre Scaler é um registro divisor de frequencia cuja função é diminuir a velocidade de incrementos do registro
TMR0. Como pode ser visto no diagrama lógico da fig.6, a chave seletora PSA determina o emprego do divisor
do Pre Scaler.

Fig.6 – Diagrama de Blocos Pre Scaler – TMR0

Pode ter sua utilização direcionada para duas aplicações distintas

PSA = 1 → Prescaler aplicado no WDT


Selecionado para o WDT, o divisor programável (Programmable Prescaler) não será
utilizado, e o TMR0 será incrementado na proporção de 1:1, como mostra a fig.7:

CM
0 t

1 CM

TMR0
0 t

1 INCREMENTO

Fig.7 – Incremento 1:1 do TMR0

Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/08


7/21
PSA = 0 → Prescaler aplicado no TMR0
Selecionado para o TMR0 (PSA = 0), o divisor programável (Programmable Prescaler)
pode ser utilizado, e o TMR0 será incrementado na proporção da Tabela Verdade:

SELEÇÃO
PS2 PS1 PS0 TMR0 Incremento do TMR0
0 0 0 1:2 Incrementa após 2 pulsos externos ou 2CM
0 0 1 1:4 Incrementa após 4 pulsos externos ou 4CM
0 1 0 1:8 Incrementa após 8 pulsos externos ou 8CM
0 1 1 1:16 Incrementa após 16 pulsos externos ou 16CM
1 0 0 1:32 Incrementa após 32 pulsos externos ou 32CM
1 0 1 1:64 Incrementa após 64 pulsos externos ou 64CM
1 1 0 1:128 Incrementa após 128 pulsos externos ou 128CM
1 1 1 1:256 Incrementa após 256 pulsos externos ou 256CM

A fig.8 mostra um exemplo de aplicação do divisor programável na proporção de 1:4 onde


o registro TMR0 incrementa após 4 pulsos externos ou 4CM:

CM
0 t

4 CM

TMR0
0 t

1 INCREMENTO

Fig.8 – Incremento 1:4 do TMR0

Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/08


8/21
Mecanismo de Contagem

A análise do mecanismo de contagem do registro pode ser feita a partir de dois exemplos práticos indicando o
comportamento dos valores contidos no registro.

Primeiro Exemplo: incremento do valor contido no registro é feito a cada 1CM - Prescaler 1:1.

Considerando a configuração do registro OPTION:

/RBPU INTDEG T0CS T0SE PSA PS2 PS1 PS0

1 0 0 0 1 0 0 0

O registro TMR0 deve operar de acordo com os seguintes parametros:

T0CS = 0 fonte de incremento interno (CM)


T0SE = 0 transição de incremento positiva (0 →1)
PSA = 1 divisor do Prescaler designado para o WDT
PS2:PS0 divisão 1:1 (os valores dos bits são irrelevantes - Prescaler designado para o WDT)

A fig.9 mostra o diagrama de tempo da operação do registro TMR0 de acordo com esta configuração:

Fig.9 – Diagrama de Tempo – TMR0 - Fonte Interna, Prescaler=1:1

Primeira linha: mostra os ciclos de pipeline Q1, Q2, Q3 e Q4 - o intervalo de tempo de cada ciclo depende da
frequencia do oscilador interno ou externo.

Segunda linha: mostra a posição do registro PC (Program Counter), iniciando em PC-1 (o valor de PC menos a
unidade) até PC+6, totalizando 6 CM - o valor do registro PC é atualizado sempre no final do ciclo Q4.

Terceira linha: mostra o conjunto de instruções para colocar um novo valor dentro do registro TMR0 e sua
leitura conforme o código-fonte abaixo - a instrução é executada sempre no final do ciclo Q1:

MOVWF TMR0 ; MOVE O VALOR CONTIDO NO REGISTRO W PARA


; O REGISTRO TMR0
MOVF TMR0,W ; MOVE O VALOR CONTIDO EM TMR0 PARA O REGISTRO W
; (LEITURA DO VALOR)

Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/08


9/21
Quarta linha: mostra o valor contido no registro TMR0 - atualizado sempre no final do ciclo Q3:

T0 valor contido em TMR0 em PC-1


T0+1 valor contido em TMR0 em PC
T0+2 valor contido em TMR0 em PC+1
NT0 novo valor contido em TMR0 após instrução MOVF em PC+1 até PC+4
NT0+1 novo valor contido em TMR0 em PC+5
NT0+2 novo valor contido em TMR0 em PC+6

Quinta linha: mostra a instrução executada no CM.

A sequencia da fig.9 indica o comportamento do valor contido no registro TMR0:

CICLO GRÁFICO AÇÃO

- o registro TMR0 contém o valor T0 até o final do ciclo Q3, quando é


PC-1
atualizado para o valor T0+1

- a instrução MOVWF TMR0 é extraída da memória de programa e decodificada.


PC - o valor do TMR0 contém o valor T0+1 até o final do ciclo Q3, quando é
atualizado para T0+2 no final do ciclo Q3.

- a instrução MOVF TMR0,W é extraída da memória de programa e


decodificada.
PC+1 - a instrução MOVWF TMR0 é executada no final do ciclo Q1.
- o valor do TMR0 contém o valor T0+2 até o final do ciclo Q3, quando é
atualizado para NT0 no final do ciclo Q3 (execução da instrução).
- a instrução MOVF TMR0,W é extraída da memória de programa e
decodificada.
PC+2
- a instrução MOVF TMR0,W é executada no final do ciclo Q1 - lê o valor NT0.
- o valor do TMR0 é mantido NT0 no final do ciclo Q3.

Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/08


10/21
CICLO GRÁFICO AÇÃO
- a instrução MOVF TMR0,W é extraída da memória de programa e
decodificada.
PC+3
- a instrução MOVF TMR0,W é executada no final do ciclo Q1 - lê o valor NT0.
- o valor do TMR0 é mantido NT0 no final do ciclo Q3.
- a instrução MOVF TMR0,W é extraída da memória de programa e
decodificada.
PC+4 - a instrução MOVF TMR0,W é executada no final do ciclo Q1 - lê o valor NT0.
- o valor do TMR0 contém o valor NT0 até o final do ciclo Q3, quando é
atualizado para NT0+1 no final do ciclo Q3.
- a instrução MOVF TMR0,W é extraída da memória de programa e
decodificada.
PC+5 - a instrução MOVF TMR0,W é executada no final do ciclo Q1 - lê o valor
NT0+1.
- o valor do TMR0 é atualizado para NT0+2 no final do ciclo Q3.
- a instrução MOVF TMR0,W é extraída da memória de programa e
decodificada.
PC+6
- a instrução MOVF TMR0,W é executada no final do ciclo Q1 - lê o valor
NT0+2.

Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/08


11/21
Segundo Exemplo: incremento do valor contido no registro é feito a cada 2CM - Prescaler 1:2.

Considerando a configuração do registro OPTION:

/RBPU INTDEG T0CS T0SE PSA PS2 PS1 PS0

1 0 0 0 0 0 0 0

O registro TMR0 deve operar de acordo com os seguintes parametros:

T0CS = 0 fonte de incremento interno (CM)


T0SE = 0 transição de incremento positiva (0 →1)
PSA = 0 divisor do Prescaler designado para o TMR0
PS2:PS0 Prescaler ajustado para divisão 1:2 (2CM para um incremento do TMR0)

A fig.10 mostra o diagrama de tempo da operação do registro TMR0 de acordo com esta configuração:

Fig.10 – Diagrama de Tempo – TMR0 - Fonte Interna, Prescaler=1:2

Primeira linha: mostra os ciclos de pipeline Q1, Q2, Q3 e Q4 - o intervalo de tempo de cada ciclo depende da
frequencia do oscilador interno ou externo.

Segunda linha: mostra a posição do registro PC (Program Counter), iniciando em PC-1 (o valor de PC menos a
unidade) até PC+6, totalizando 6 CM - o valor do registro PC é atualizado sempre no final do ciclo Q4.

Terceira linha: mostra o conjunto de instruções para colocar um novo valor dentro do registro TMR0 e sua
leitura conforme o código-fonte abaixo - a instrução é executada sempre no final do ciclo Q1:

MOVWF TMR0 ; MOVE O VALOR CONTIDO NO REGISTRO W PARA


; O REGISTRO TMR0
MOVF TMR0,W ; MOVE O VALOR CONTIDO EM TMR0 PARA O REGISTRO W
; (LEITURA DO VALOR)

Quarta linha: mostra o valor contido no registro TMR0 - atualizado sempre no final do ciclo Q3:

T0 valor contido em TMR0 em PC-1


T0+1 valor contido em TMR0 em PC+1
NT0 novo valor contido em TMR0 após instrução MOVF em PC+1 até PC+5
NT0+1 novo valor contido em TMR0 em PC+5
Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/08
12/21
Quinta linha: mostra a instrução executada no CM.

A sequencia da fig.10 indica o comportamento do valor contido no registro TMR0:

CICLO GRÁFICO AÇÃO


- o registro TMR0 contém o valor T0 até o final do ciclo Q3, quando é
PC-1
atualizado para o valor T0+1
- a instrução MOVWF TMR0 é extraída da memória de programa e decodificada.
PC - o valor do TMR0 contém o valor T0+1 e não é modificado após o final do
ciclo Q3 (são necessários 2CM para atualizar o TMR0).
- a instrução MOVF TMR0,W é extraída da memória de programa e
decodificada.
PC+1 - a instrução MOVWF TMR0 é executada no final do ciclo Q1.
- o valor do TMR0 contém o valor T0+1 até o final do ciclo Q3, quando é
atualizado para NT0 no final do ciclo Q3 (execução da instrução).
- a instrução MOVF TMR0,W é extraída da memória de programa e
decodificada.
PC+2
- a instrução MOVF TMR0,W é executada no final do ciclo Q1 - lê o valor NT0.
- o valor do TMR0 é mantido NT0 e não é modificado após o final do ciclo Q3.
- a instrução MOVF TMR0,W é extraída da memória de programa e
decodificada.
PC+3
- a instrução MOVF TMR0,W é executada no final do ciclo Q1 - lê o valor NT0.
- o valor do TMR0 é mantido NT0 e não é modificado após o final do ciclo Q3.

Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/08


13/21
CICLO GRÁFICO AÇÃO
- a instrução MOVF TMR0,W é extraída da memória de programa e
decodificada.
PC+4
- a instrução MOVF TMR0,W é executada no final do ciclo Q1 - lê o valor NT0.
- o valor do TMR0 é mantido NT0 e não é modificado após o final do ciclo Q3.
- a instrução MOVF TMR0,W é extraída da memória de programa e
decodificada.
PC+5
- a instrução MOVF TMR0,W é executada no final do ciclo Q1 - lê o valor NT0.
- o valor do TMR0 é atualizado para NT0+1 no final do ciclo Q3.
- a instrução MOVF TMR0,W é extraída da memória de programa e
decodificada.
PC+6
- a instrução MOVF TMR0,W é executada no final do ciclo Q1 - lê o valor
NT0+1.

Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/08


14/21
OBSERVAÇÕES:

1 - o valor contido no TMR0 pode ser modificado pelo código_fonte a qualquer momento - o programador
pode colocar qualquer valor (entre 0 e 255) no TMR0 - o registro incrementa a partir deste novo valor
de acordo com as configurações feitas.

2 - existe um atraso (latency - latencia) entre o ciclo em que o registro TMR0 é modificado pelo
código_fonte e o início dos incrementos a partir do CM. De acordo com a fig.9 e fig.10, o atraso é
equivalente ao ajuste do divisor do Prescaler (bits PS2:PS0) e igual a 2 x PSA (duas vezes o divisor
PSA), ou seja:
PSA ATRASO (CM)
1:1 2
1:2 4
1:4 8
1:8 16
1:16 32
1:32 64
1:64 128
1:128 256
1:256 512

O programador deve ficar atento a este atraso que afeta contagens de tempo ou eventos - se o atraso
provocar erros de contagem, o código_fonte deve conter os ajustes necessários para prevenção do
atraso.

3 - o valor contido no TMR0 pode ser lido e transferido para o registro W, mas o programador deve levar
em conta a constante atualização do valor do TMR0 de acordo com o CM e a divisão do Prescaler
sempre que utilizar o valor encontrado no TMR0 para tomada de decisões.

Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/08


15/21
INTCON
Permite configurar a aplicação do recurso da requisição de interrupção e identificar a sua chamada para tomada
de providencias.

O endereço e a descrição da função dos bits de configuração estão detalhados (realçado) abaixo:

R/W 7 R/W 6 R/W 5 R/W 4 R/W 3 R/W 2 R/W 1 R/W 0


GIE PEIE T0IE INTE RBIE T0IF INTF RBIF
MSB LSB

BIT OPER INÍCIO CÓDIGO FUNÇÃO


7 R/W 0 GIE Chave Geral de Habilitação das Interrupções

1 = habilita as interrupções selecionadas


0 = não habilita as interrupções selecionadas
6 R/W 0 PEIE Chave de Habilitação das Interrupções Periféricas

1 = habilita as interrupções periféricas


0 = não habilita as interrupções periféricas
5 R/W 0 T0IE Habilitação da Interrupção por Retorno a Zero do TMR0

1 = habilita Interrupção por Retorno a Zero do TMR0


0 = não habilita Interrupção por Retorno a Zero do TMR0
4 R/W 0 INTE Habilitação da Interrupção Externa no pino RB0/INT

1 = habilita Interrupção Externa no pino RB0/INT


0 = não habilita Interrupção Externa no pino RB0/INT
3 R/W 0 RBIE Habilitação da Interrupção por Mudança de Estado no PORTB

1 = habilita Interrupção por Mudança de Estado no PORTB


0 = não habilita Interrupção por Mudança de Estado no PORTB
2 R/W 0 T0IF Flag de Sinalização da Ocorrência de Interrupção por Retorno a Zero
do TMR0

1 = TMR0 retornou a Zero


0 = TMR0 não retornou a Zero
1 R/W 0 INTF Flag de Sinalização da Ocorrência de Interrupção Externa no pino
RB0/INT

1 = ocorreu Interrupção Externa no pino RB0/INT


0 = não ocorreu Interrupção Externa no pino RB0/INT
0 R/W X RBIF Flag de Sinalização da Ocorrência de Interrupção por Mudança de
Estado no PORTB

1 = ocorreu Interrupção por Mudança de Estado no PORTB


0 = não ocorreu Interrupção por Mudança de Estado no PORTB

Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/08


16/21
Descrição da Configuração

Os bits são do tipo Leitura/Escrita (R/W – Read/Write) e podem ser modificados durante a execução do
código_fonte (on-the-fly) de acordo com as necessidades de uso e operação dos recursos disponíveis.

GIE (General Interrupt Enable): Chave Geral de Habilitação das Interrupções – bit 7

Este bit permite utilizar as interrupções (qualquer uma, desde que habilitada), de acordo com as duas opções:

GIE = 1 → o uso das interrupções está habilitado. A interrupção do TMR0 só será empregada se o bit
correspondente à habilitação do TMR0 (T0IE) estiver com valor 1 (um).

GIE = 0 → o uso das interrupções não está habilitado. A interrupção do TMR0 não será empregada
mesmo que o bit correspondente à habilitação do TMR0 (T0IE) esteja com valor 1 (um).

T0IE (TMR0 Interrupt Enable): Chave de Habilitação da Interrupção TMR0 – bit 5

Este bit permite utilizar a interrupção do TMR0, desviando o código_fonte da posição que se encontrar na
memória de programa sempre que o registro retornar a zero, para o Vetor de Interrupção (endereço da memória
de programa 0x04), de acordo com as duas opções:

T0IE = 1 → o uso da interrupção do TMR0 está habilitado. A interrupção do TMR0 só será empregada
se o bit correspondente à habilitação geral (GIE) estiver com valor 1 (um).

T0IE = 0 → o uso da interrupção do TMR0 não está habilitado. A interrupção do TMR0 não será
empregada mesmo que o bit correspondente à habilitação geral (GIE) esteja com valor 1
(um).

T0IF (TMR0 Interrupt Flag): Sinalização da Ocorrencia da Interrupção TMR0 – bit 2

Este bit sinaliza a ocorrencia ou não da interrupção do TMR0, de acordo com as duas opções:

T0IF = 1 → sinaliza que a interrupção do TMR0 foi requisitada indicando que o registro retornou a
zero e o código_fonte foi desviado da posição que se encontra na memória de programa
para o Vetor de Interrupção (endereço 0x04),

T0IF = 0 → sinaliza que a interrupção do TMR0 não foi requisitada. O registro TMR0 ainda não
retornou a zero.

O bit T0IF é automaticamente colocado no valor 1 (um) - “setado” - pela Unidade Lógica-Aritmética (ULA)
quando o registro TMR0 retorna a zero (overflow).

NOTA: É possível “forçar” uma requisição de interrupção colocando o valor 1 (um) no bit T0IF, obrigando o desvio automático para o
endereço do Vetor de Interrupção (endereço 0x04 da Memória de Programa). Pode ser bastante útil durante a realização de um
programa para iniciar ou reiniciar um contador ou temporizador.

O retorno a 0 (zero) do bit T0IF deve ser feito pelo manualmente pelo código_fonte, principalmente antes de
sair de uma rotina de tratamento de interrupção (antes da execução da instrução RETFIE), caso contrário a ULA
considera a existencia de uma IRQ (requisição de interrupção) pendente e provoca novo desvio para o Vetor de
Interrupção.

Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/08


17/21
Mecanismo de Interrupção

O uso da interrupção por excesso (overflow) do registro TMR0 depende da configuração dos bits
correspondentes no registro INTCON. Como o registro é acessível pelo código_fonte, é possível modificá-lo
sempre que necessário durante a execução do programa.

O uso da interrupção exige alguma atenção por parte do programador, uma vez que o simples excesso do TMR0
não acarreta a chamada da interrupção de forma imediata (desde que devidamente configurada).

Para análise da forma como a interrupção é requisitada, vamos fazer a execução de um exemplo com o arranjo
do registro INTCON abaixo:

GIE PEIE T0IE INTE RBIE T0IF INTF RBIF

1 0 1 0 0 0 0 0

Nestas condições:

GIE = 1 → o uso das interrupções está habilitado.


T0IE = 1 → o uso da interrupção do TMR0 está habilitado.
T0IF = 0 → não ococrreu interrupção do TMR0.

Para a configuração do registro OPTION:

/RBPU INTDEG T0CS T0SE PSA PS2 PS1 PS0

1 0 0 0 1 0 0 0

O registro TMR0 deve operar de acordo com os seguintes parametros:

T0CS = 0 fonte de incremento interno (CM)


T0SE = 0 transição de incremento positiva (0 →1)
PSA = 1 divisor do Prescaler designado para o WDT
PS2:PS0 divisão 1:1 (os valores dos bits são irrelevantes)

A fig.11 mostra o diagrama de tempo para a requisição de interrupção do TMR0:

Primeira linha: mostra os ciclos de pipeline Q1, Q2, Q3 e Q4 - o intervalo de tempo de cada ciclo depende da
frequencia do oscilador interno ou externo.

Segunda linha: saída do sinal de Clock (CLKOUT).

Terceira linha: valor contido no registro TMR0, iniciando com o valor 254 (FEh).

Quarta linha: estado do bit T0IF no registro INTCON.

Quinta linha: estado do bit GIE no registro INTCON.

Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/08


18/21
Fig.11 – Diagrama de Tempo para Requisição de InterrupçãoTMR0 - Fonte Interna, Prescaler=1:1

Sexta linha: Fluxo de instruções (Instruction Flow) - sétima linha em diante

Sétima linha: Program Counter (PC) - Contador do Programa - endereço na memória de programa onde a
instrução é extraída da memória (instruction fetched) e executada (instruction executed).

A análise da requisição da interrupção por excesso (overflow) do registro TMR0 pode ser feita, passo a passo,
de acordo com a descrição abaixo:

CICLO GRÁFICO AÇÃO


Posição de Memória PC:
- o registro TMR0 contém o valor 254 (FEh) até o final do ciclo Q3,
quando é atualizado para o valor 255 (FFh)
- o bit de flag T0IF tem seu estado verificado no final do ciclo Q1
(permanece igual a 0 até o final do ciclo Q4).
- o bit de controle GIE permanece igual a 1 (uso das interrupções
PC
habilitado)

Execução de Instrução:
- busca da instrução Inst(PC) no endereço PC da memória de
programa (Instruction fetched).
- execução da instrução Inst(PC-1) (Instruction executed).
PC Transição posição de Memória PC → PC+1:
↓ - o registro TMR0 mantém o valor 255 (FFh).
PC+1 - o bit de flag T0IF muda de estado de 0 → 1 no final do ciclo Q4
indicando que o TMR0 atingiu o valor limite (overflow) - aqui
inicia o processo do desvio para tratamento da interrupção.
- o bit de controle GIE permanece igual a 1 (uso das interrupções
habilitado)
- contador de programa avança de PC → PC+1
Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/08
19/21
Observação:
- com a mudança de estado do bit T0IF de 0 → 1, o processo de
desvio para o Vetor de Interrupção é iniciado, desde que o bit de
GIE esteja habilitado (igual a 1).

Posição de Memória PC+1:


- o registro TMR0 contém o valor 255 (FFh) até o final do ciclo Q3,
quando é atualizado para o valor 0 (00h)
- o bit de flag T0IF tem seu estado verificado no final do ciclo Q1
(igual a 1 neste ciclo).
- o bit de controle GIE permanece igual a 1 (uso das interrupções
PC+1
habilitado)

Execução de Instrução:
- busca da instrução Inst(PC+1) no endereço PC+1 da memória de
programa (Instruction fetched).
- execução da instrução Inst(PC) (Instruction executed).
Transição posição de Memória PC+1 → PC+1 (Dummy Cycle -
PC+1 Ciclo Perdido):
↓ - o registro TMR0 mantém o valor 0 (00h).
PC+1 - o bit de flag T0IF permanece no estado 1 no início do ciclo Q1.
(Dummy - o bit de controle GIE permanece igual a 1 (uso das interrupções
Cycle) habilitado)
- contador de programa permanece igual a PC+1
Posição de Memória PC+1 (Dummy Cycle - Ciclo Perdido):
- o registro TMR0 contém o valor 0 (00h) até o final do ciclo Q3,
quando é atualizado para o valor 1 (01h)
- o bit de flag T0IF permanece no estado 1 no início do ciclo Q1.
- o bit de controle GIE muda de estado 1 → 0 (uso das interrupções
não habilitado) para impedir que a ocorrencia de qualquer outra
interrupção provoque novo desvio de endereço.
PC+1
(Dummy Execução de Instrução:
Cycle) - nenhuma instrução é buscada na memória ou executada - o ciclo é
perdido.

Observação:
- neste ciclo o valor PC+1 é armazenado no Stack para retorno a esta
posição quando ocorrer a execução da instrução RETFIE - o desvio
é realizado pela ALU.

PC+1 Transição posição de Memória PC+1 (Dummy Cycle - Ciclo


(Dummy Perdido)→ 0004h:
Cycle) - o registro TMR0 mantém o valor 1 (01h).
↓ - o bit de flag T0IF permanece no estado 1 no início do ciclo Q1.
0004h - o bit de controle GIE permanece igual a 0 (uso das interrupções
não habilitado)
- contador de programa é direcionado para o Vetor de Interrupção
PC+1 → 0004h

Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/08


20/21
Observação:
- o valor 0004h é colocado no PC (Program Counter) pela ALU.

Posição de Memória 0004h (Vetor de Interrupção):


- o registro TMR0 contém o valor 1 (01h) até o final do ciclo Q3,
quando é atualizado para o valor 2 (02h)
- o bit de flag T0IF de mantém seu estado 1 no início do ciclo Q1.
- o bit de controle GIE permanece igual a 0 (uso das interrupções
não habilitado)
0004h
Execução de Instrução:
- busca da instrução Inst(0004h) no endereço 0004h da memória de
programa (Instruction fetched).
- nenhuma instrução é executada (Dummy Cycle) (Instruction
executed).
Transição posição de Memória 0004h → 0005h:
- o registro TMR0 mantém o valor 2 (02h).
0004h
- o bit de flag T0IF permanece no estado 1 no início do ciclo Q1.

- o bit de controle GIE permanece igual a 0 (uso das interrupções
0005h
não habilitado)
- contador de programa avança de 0004h → 0005h
Posição de Memória 0005h:
- o registro TMR0 contém o valor 2 (02h) até o final do ciclo Q3,
quando é atualizado para o valor 3 (03h)
- o bit de flag T0IF mantém seu estado 1 no início do ciclo Q1.
- o bit de controle GIE permanece igual a 0 (uso das interrupções
0005h não habilitado).

Execução de Instrução:
- busca da instrução Inst(0005h) no endereço 0005h da memória de
programa (Instruction fetched).
- execução da instrução Inst(0004h) (Instruction executed).

O processo de desvio para o Vetor de Interrupção (endereço 0004h da memória de programa) é iniciado quando
o valor do registro TMR0 é igual a 255 (FFh) e a ALU altera o valor do flag T0IF de 0 → 1, indicando a
ocorrencia de requisição de interrupção. No ciclo seguinte a ALU não executa nenhuma operação (Dummy
Cicle - Ciclo Perdido) enquanto a ALU armazena o valor do PC (Program Counter) no Stack para retorno
posterior (execução da instrução RETFIE). No ciclo seguinte, a instrução armazenada no endereço 0004h é
chamada da memória e executada no ciclo 0005h - que deve ser a primeira instrução para o tratamento da
requisição de interrupção.

Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/08


21/21

Das könnte Ihnen auch gefallen