21
REGISTRO TMR0 PIC - Microchip Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/08 1/21

8342063-Registro-TMR0

Embed Size (px)

Citation preview

Page 1: 8342063-Registro-TMR0

REGISTRO TMR0

PIC - Microchip

Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/081/21

Page 2: 8342063-Registro-TMR0

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/082/21

Page 3: 8342063-Registro-TMR0

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/083/21

Page 4: 8342063-Registro-TMR0

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 habilitados0 = 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/INT0 = 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/T0CKI0 = 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 T0CKI0 = incremento na transição positiva (0 → 1) no pino T0CKI

3 R/W 1 PSA Aplicação do Prescaler

1 = Prescaler aplicado no WDT0 = 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/084/21

Page 5: 8342063-Registro-TMR0

Bit 2, 1, 0TMR0WDT

0001:21:1

0011:41:2

0101:81:4

0111:161:8

1001:321:16

1011:641:32

1101:1281:64

1111:2561: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/085/21

Page 6: 8342063-Registro-TMR0

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 ( T MR 0 C lock S ource): 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 ( T MR 0 S ource E dge): 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/086/21

Page 7: 8342063-Registro-TMR0

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 ( P re S caler A ssignment): 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 WDTSelecionado 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:

Fig.7 – Incremento 1:1 do TMR0

Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/087/21

TMR0

0

1 INCREMENTO

1

CM

0

1

1 CM

t

t

Page 8: 8342063-Registro-TMR0

PSA = 0 → Prescaler aplicado no TMR0Selecionado 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 2CM0 0 1 1:4 Incrementa após 4 pulsos externos ou 4CM0 1 0 1:8 Incrementa após 8 pulsos externos ou 8CM0 1 1 1:16 Incrementa após 16 pulsos externos ou 16CM1 0 0 1:32 Incrementa após 32 pulsos externos ou 32CM1 0 1 1:64 Incrementa após 64 pulsos externos ou 64CM1 1 0 1:128 Incrementa após 128 pulsos externos ou 128CM1 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:

Fig.8 – Incremento 1:4 do TMR0

Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/088/21

1 INCREMENTO

4 CM

TMR0

0

1

CM

0

1

t

t

Page 9: 8342063-Registro-TMR0

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 WDTPS2: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/089/21

Page 10: 8342063-Registro-TMR0

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

T0 valor contido em TMR0 em PC-1T0+1 valor contido em TMR0 em PCT0+2 valor contido em TMR0 em PC+1NT0 novo valor contido em TMR0 após instrução MOVF em PC+1 até PC+4NT0+1 novo valor contido em TMR0 em PC+5NT0+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

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

atualizado para o valor T0+1

PC- a instrução MOVWF TMR0 é extraída da memória de programa e decodificada.- 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.

PC+1

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

- 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).

PC+2

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

- 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/0810/21

Page 11: 8342063-Registro-TMR0

CICLO GRÁFICO AÇÃO

PC+3

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

- 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.

PC+4

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

- 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.

PC+5

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

- 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.

PC+6

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

- 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/0811/21

Page 12: 8342063-Registro-TMR0

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 TMR0PS2: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-1T0+1 valor contido em TMR0 em PC+1NT0 novo valor contido em TMR0 após instrução MOVF em PC+1 até PC+5NT0+1 novo valor contido em TMR0 em PC+5

Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/0812/21

Page 13: 8342063-Registro-TMR0

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

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

atualizado para o valor T0+1

PC- a instrução MOVWF TMR0 é extraída da memória de programa e decodificada.- 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).

PC+1

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

- 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).

PC+2

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

- 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.

PC+3

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

- 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/0813/21

Page 14: 8342063-Registro-TMR0

CICLO GRÁFICO AÇÃO

PC+4

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

- 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.

PC+5

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

- 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.

PC+6

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

- 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/0814/21

Page 15: 8342063-Registro-TMR0

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/0815/21

Page 16: 8342063-Registro-TMR0

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 selecionadas0 = 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éricas0 = 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 TMR00 = 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/INT0 = 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 PORTB0 = 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/INT0 = 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 PORTB0 = não ocorreu Interrupção por Mudança de Estado no PORTB

Bento Alves Cerqueira Cesar Filho - R 1.0 - FEV/0816/21

Page 17: 8342063-Registro-TMR0

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 ( G eneral I nterrupt E nable): 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 ( T MR 0 I nterrupt E nable): 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 ( T MR 0 I nterrupt F lag): 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/0817/21

Page 18: 8342063-Registro-TMR0

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 WDTPS2: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/0818/21

Page 19: 8342063-Registro-TMR0

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

PC

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

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↓

PC+1

Transição posição de Memória PC → PC+1:- o registro TMR0 mantém o valor 255 (FFh).- 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/0819/21

Page 20: 8342063-Registro-TMR0

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).

PC+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

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).

PC+1↓

PC+1 (Dummy Cycle)

Transição posição de Memória PC+1 → PC+1 (Dummy Cycle - Ciclo Perdido):- o registro TMR0 mantém o valor 0 (00h).- o bit de flag T0IF permanece no estado 1 no início do ciclo Q1.- o bit de controle GIE permanece igual a 1 (uso das interrupções

habilitado)- contador de programa permanece igual a PC+1

PC+1 (Dummy Cycle)

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.

Execução de Instrução:- 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 (Dummy Cycle)

↓0004h

Transição posição de Memória PC+1 (Dummy Cycle - Ciclo Perdido)→ 0004h:- o registro TMR0 mantém o valor 1 (01h).- 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

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/0820/21

Page 21: 8342063-Registro-TMR0

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

0004h

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)

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).

0004h↓

0005h

Transição posição de Memória 0004h → 0005h:- o registro TMR0 mantém o valor 2 (02h).- 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

não habilitado)- contador de programa avança de 0004h → 0005h

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

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/0821/21