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
/RBPU INTDEG T0CS
R/W 4
T0SE
R/W 3
R/W 2
R/W 1
R/W 0
PSA
PS2
PS1
PS0
MSB
LSB
BIT OPER INÍCIO CÓDIGO 7
6
5
4
3
2-0
R/W
R/W
R/W
R/W
R/W
R/W
1
1
1
1
1
1
/RBPU
FUNÇÃO Resistores Internos de Pull-Up do PORTB – Habilitação
1 = Resistores Internos não habilitados 0 = Resistores Internos habilitados INTDEG Seleção de Transição p/ requisição de Interrupção por mudança de estado do pino RB0/INT:
T0CS
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 Seleção da fonte de incremento do TMR0
T0SE
1 = transição no pino RA4/T0CKI 0 = ciclo de máquina (CM) interno Seleção de Transição no pino T0CKI p/ incremento do TMR0
PSA
1 = incremento na transição negativa (1 → 0) no pino T0CKI 0 = incremento na transição positiva (0 → 1) no pino T0CKI Aplicação do Prescaler
1 = Prescaler aplicado no WDT 0 = Prescaler aplicado no TMR0 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:
1
CM t
0
1 CM 1
TMR0 t
0
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 0 0 0 0 1 1 1 1
PS1 0 0 1 1 0 0 1 1
PS0 0 1 0 1 0 1 0 1
TMR0 1:2 1:4 1:8 1:16 1:32 1:64 1:128 1:256
Incremento do TMR0 Incrementa após 2 pulsos externos ou 2CM Incrementa após 4 pulsos externos ou 4CM Incrementa após 8 pulsos externos ou 8CM Incrementa após 16 pulsos externos ou 16CM Incrementa após 32 pulsos externos ou 32CM Incrementa após 64 pulsos externos ou 64CM Incrementa após 128 pulsos externos ou 128CM 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:
1
CM t
0
4 CM 1
TMR0 t
0
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
1
0
0
T0SE
PSA
PS2
PS1
PS0
0
1
0
0
0
O registro TMR0 deve operar de acordo com os seguintes parametros: T0CS = 0 T0SE = 0 PSA = 1 PS2:PS0
fonte de incremento interno (CM) transição de incremento positiva (0 →1) divisor do Prescaler designado para o WDT 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
MOVF
TMR0,W
; MOVE O VALOR CONTIDO NO REGISTRO W PARA ; O REGISTRO TMR0 ; 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 T0+1 T0+2 NT0 NT0+1 NT0+2
valor contido em TMR0 em PC-1 valor contido em TMR0 em PC valor contido em TMR0 em PC+1 novo valor contido em TMR0 após instrução MOVF em PC+1 até PC+4 novo valor contido em TMR0 em PC+5 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
PC-1
PC
PC+1
PC+2
GRÁFICO
AÇÃO
- o registro TMR0 contém o valor T0 até o final do ciclo Q3, quando é atualizado para o valor T0+1
- 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.
- 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). - 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/08 10/21
CICLO PC+3
PC+4
PC+5
PC+6
GRÁFICO
AÇÃO - 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. - 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. - 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. - 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/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
1
0
0
T0SE
PSA
PS2
PS1
PS0
0
0
0
0
0
O registro TMR0 deve operar de acordo com os seguintes parametros: T0CS = 0 T0SE = 0 PSA = 0 PS2:PS0
fonte de incremento interno (CM) transição de incremento positiva (0 →1) divisor do Prescaler designado para o TMR0 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
MOVF
TMR0,W
; MOVE O VALOR CONTIDO NO REGISTRO W PARA ; O REGISTRO TMR0 ; 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 T0+1 NT0 NT0+1
valor contido em TMR0 em PC-1 valor contido em TMR0 em PC+1 novo valor contido em TMR0 após instrução MOVF em PC+1 até PC+5 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 PC-1 PC
PC+1
PC+2
PC+3
GRÁFICO
AÇÃO - o registro TMR0 contém o valor T0 até o final do ciclo Q3, quando é atualizado para o valor T0+1 - 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). - 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). - 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. - 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/08 13/21
CICLO PC+4
PC+5
PC+6
GRÁFICO
AÇÃO - 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. - 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. - 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/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 1:1 1:2 1:4 1:8 1:16 1:32 1:64 1:128 1:256
ATRASO (CM) 2 4 8 16 32 64 128 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
GIE
R/W 6
PEIE
R/W 5
T0IE
R/W 4
INTE
R/W 3
RBIE
R/W 2
T0IF
R/W 1
INTF
R/W 0
RBIF
MSB
LSB
BIT OPER INÍCIO CÓDIGO 7
6
5
4
3
2
1
0
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
0
0
0
0
0
0
0
X
FUNÇÃO
GIE
Chave Geral de Habilitação das Interrupções
PEIE
1 = habilita as interrupções selecionadas 0 = não habilita as interrupções selecionadas Chave de Habilitação das Interrupções Periféricas
T0IE
1 = habilita as interrupções periféricas 0 = não habilita as interrupções periféricas Habilitação da Interrupção por Retorno a Zero do TMR0
INTE
1 = habilita Interrupção por Retorno a Zero do TMR0 0 = não habilita Interrupção por Retorno a Zero do TMR0 Habilitação da Interrupção Externa no pino RB0/INT
RBIE
1 = habilita Interrupção Externa no pino RB0/INT 0 = não habilita Interrupção Externa no pino RB0/INT Habilitação da Interrupção por Mudança de Estado no PORTB
T0IF
INTF
RBIF
1 = habilita Interrupção por Mudança de Estado no PORTB 0 = não habilita Interrupção por Mudança de Estado no PORTB 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 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 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
1
0
T0SE
PSA
PS2
PS1
PS0
0
1
0
0
0
0
O registro TMR0 deve operar de acordo com os seguintes parametros: T0CS = 0 T0SE = 0 PSA = 1 PS2:PS0
fonte de incremento interno (CM) transição de incremento positiva (0 →1) divisor do Prescaler designado para o WDT 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
PC
PC ↓ PC+1
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 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). 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/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).
PC+1
PC+1 ↓ PC+1 (Dummy Cycle)
PC+1 (Dummy Cycle)
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). 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 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/08 20/21
Observação: - o valor 0004h é colocado no PC (Program Counter) pela ALU.
0004h
0004h ↓ 0005h
0005h
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). 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 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/08 21/21