13
Manipulação de Timers no PIC18F4520 Prof. Ilton L Barbacena O microcontrolador PIC18F4520 tem quatro temporizadores programáveis que podem ser utilizados em muitas tarefas, como a geração de sinais de temporização, causando interrupções para ser gerada em intervalos de tempo específicos, em intervalos de medição de frequência e tempo, e assim por diante. Os bits de configurações de interrupções dos microcontroladores seguem a seguinte legenda: Enable bit: São sufixos IE (Interrupt Enable) para representar um bit que pode hablitar ou não o atendimento a uma interrupção. Ex: Se TMR0IE =1 está habilitado atendimento a interrupção de timer0 ; Flag Bit: Estes bits que são setados automaticamente quando ocorre a condição de atendimento a interrupção. Ex: Se TMR0IF = 1, indica estouro do tempo do timer 0. Priority Bit: Existe 2 níveis de prioridades no atendimento a interrupções. Ex: TMR0IP = 1, indica que esta interrupção tem prioridade máxima no atendimento (pula p/ end. 0x0008). TIMER0 O Timer0 funciona similar aos pics da linha PIC16, exceto que pode operar com 8 ou 16 bits: 8 ou 16 bits 8 bits de prescaler (divisões do tempo) Fonte de clock pode ser interna ou externa (funciona como contador de eventos) Gera uma interrupção no overflow (estouro de contagem) O registrador de controle é o T0CON. Neste o 6 bits menos significativos é similar a linha PIC16 que trabalha com o registrador OPTION. Os outros 2 bits são usados para selecionar contagem de 8 ou 16 bits e habilitar ou inibir a contagem. Na série PIC18 o prescaler não é compartilhado com WDT como acontece na série PIC16.

Manipulação de Timers no PIC18F4520

Embed Size (px)

Citation preview

Page 1: Manipulação de Timers no PIC18F4520

Manipulação de Timers no PIC18F4520

Prof. Ilton L Barbacena

O microcontrolador PIC18F4520 tem quatro temporizadores programáveis que podem ser utilizados em muitas tarefas, como a geração de sinais de temporização, causando interrupções para ser gerada em intervalos de tempo específicos, em intervalos de medição de frequência e tempo, e assim por diante.

Os bits de configurações de interrupções dos microcontroladores seguem a seguinte legenda:

Enable bit: São sufixos IE (Interrupt Enable) para representar um bit que pode hablitar ou não o atendimento a uma interrupção.

◦ Ex: Se TMR0IE =1 está habilitado atendimento a interrupção de timer0 ;

Flag Bit: Estes bits que são setados automaticamente quando ocorre a condição de atendimento a interrupção.

◦ Ex: Se TMR0IF = 1, indica estouro do tempo do timer 0. Priority Bit: Existe 2 níveis de prioridades no atendimento a interrupções.

◦ Ex: TMR0IP = 1, indica que esta interrupção tem prioridade máxima no atendimento (pula p/ end. 0x0008).

TIMER0

O Timer0 funciona similar aos pics da linha PIC16, exceto que pode operar com 8 ou 16 bits:

8 ou 16 bits

8 bits de prescaler (divisões do tempo)

Fonte de clock pode ser interna ou externa (funciona como contador de eventos)

Gera uma interrupção no overflow (estouro de contagem)

O registrador de controle é o T0CON. Neste o 6 bits menos significativos é similar a linha PIC16 que trabalha com o registrador OPTION. Os outros 2 bits são usados para selecionar contagem de 8 ou 16 bits e habilitar ou inibir a contagem. Na série PIC18 o prescaler não é compartilhado com WDT como acontece na série PIC16.

Page 2: Manipulação de Timers no PIC18F4520

Registrador T0CON (reset: 1111 1111)

A Figura 1 e 2 ilustram o funcionamento do Timer0 no modo 16 e 8 bits.

Figura 1 – Timer0 em modo 16 bits

Figura 2 – Timer0 em modo 8 bits

Em qualquer modalidade do Timer0, uma interrupção é gerada quando o contador ultrapassar o limite de seu valor máximo (FFH para o 8-bit e FFFFH para os 16-bit) ou overflow, se o bit TMR0IE do registrador INTCON estiver habilitado. O mesmo flag

Page 3: Manipulação de Timers no PIC18F4520

bit, TMR0IF, do registrador INTCON, é usado para indicar a ocorrência da interrupção ou estouro de contagem.

Na Tabela 1 são apresentados os detalhes de configuração do registrador T0CON.

TMR0ON (Liga o timer) 1: habilita ou dispara o timer0 0:desabilita

T08BIT 1: 8bits 0: 16bits

TOCS (fonte do clock contagem) 1:transição no pino T0CK1(pin 6 do CI) 0: contagem interna (clock/4)

T0SE ( transição) 1: incrementa H_L 0: incrementa L_H (no pino T0ck1 ou pino 6 do CI)

PSA (prescaler) 1: sem prescaler 0: habilita prescaler

TOP (seleciona prescaler) S2:S1:S0 111: 1/256 011: 1/16 110: 1/128 010: 1/8 101: 1/64 001: 1: 4 100: 1/32 000: 1/ 2

No Compilador PIC CCS, temos os seguintes recursos:

1 – Interface de entrada do PIC CCS

Ao escolher um projeto novo (PIC Wizard) tem-se várias abas de configurações. Na aba general, pode-se escolher o microcontrolador, o valor do clock e os fusíveis de configurações. No caso do kit Acepic, devemos escolher PIC18F4520, clock de 8MHz e configurar no mínimo o fusível referente a fonte do clock, com clock externo > 4MHz.

Na aba Timers, devemos configurar o(s) timer(s) a ser escolhido(s). No caso timer0 devemos escolher o valor de overflow, ou o valor que indica o tempo de quando deve ocorrer o atendimento a interrupção. Durante a escolha do tempo de overflow pode-se mudar os valores de prescaler a direita, como também habilitar 8 ou 16 bits até obter o tempo de overflow desejado.

Feito isso o compilar CCS automaticamente calcula e gera linhas de códigos que aparecem no arquivo com o código fonte, conforme ilustrado no exemplo abaixo:

ENABLE_INTERRUPTS(M1);

M1 é o valor a ser gravado no registrador INTCON (GIE=1, TMR0IE=1) end. 0xFF2 Exemplo: M1 = GLOBAL | INT_TIMER0

SETUP_TIMER_0(M2);

M2 é o valor a ser gravado no registrador T0CON (End. 0xFD5) Exemplo: M2 = RTCC_INTERNAL | RTCC_DIV_16 |RTCC_8_BIT

SET_TIMER0(M3);

M3 é o valor de contagem inicial a ser gravado no registrador TMR0 (End. 0xFD6 e 0xFD7) Exemplo: M3 = 100

Page 4: Manipulação de Timers no PIC18F4520

A primeira linha habilita o atendimento ao pedido de interrupção em decorrência do estouro de contagem ou overflow. A segunda linha configura o modo de atuação do timer0: 8 ou 16 bits e o valor do prescaler. A terceira linha atualiza o valor inicial da contagem em TMR0: No caso de 8 bits atualiza o TMR0L e no caso de 16 bits atualiza os registradores TMR0L e TMR0H.

◦ Defines no arquivo 18F4520.h:

#define RTCC_INTERNAL 0 #define RTCC_EXT_L_TO_H 32 #define RTCC_EXT_H_TO_L 48 #define RTCC_DIV_1 8 #define RTCC_DIV_2 0 #define RTCC_DIV_4 1 #define RTCC_DIV_8 2 #define RTCC_DIV_16 3 #define RTCC_DIV_32 4 #define RTCC_DIV_64 5 #define RTCC_DIV_128 6 #define RTCC_DIV_256 7 #define RTCC_OFF 0x80 #define RTCC_8_BIT 0x40

O valor de overflow pode ser calculado com a seguinte fórmula:

Tempo de overflow = 4*Prescaler*(Tmax - TMR0) / Clock (Equação. 1)

Onde:

Clock é o valor do cristal da placa (No caso do Acepic é 8 MHz)

Prescaler é o valor para divisão do clock {1, 2, 4, 8, 16, 32, 64, 128, 256}

Tmax é o valor final de contagem: 256 para 8 bits e 65536 para 16 bits

TMR0 é o valor de inicio de contagem (qdo 16 bits, utiliza-se 2 registradores TMR0L e TMR0H)

2 – Situação 1: overflow com valor exato (TRM0 = 0)

Na figura 3 é apresentada a tela que aparece no PIC CCS para escolha do overflow do timer0. Optando-se por um dos divisores da direita ou prescaler, e escolhendo

Page 5: Manipulação de Timers no PIC18F4520

contagem com 8 ou 16 bits, pode-se obter até 16 valores diferentes para overflow. Neste caso, valores exatos.

Figura 3 – Tela de escolha do valor de overflow em Timer0

Exemplo: Overflow de 4mS com clock de 8 MHz para o PICF4520.

Tempo de Instrução (Ti):

clock / 4 = 2 MHz Logo Ti = 1/2M = 0,5 uS

Prescaler 1 : 256 0.5 * 256 = 128 uS Prescaler 1 : 128 0.5 * 128 = 64 uS Prescaler 1 : 64 0.5 * 64 = 32 uS Prescaler 1 : 32 0.5 * 32 = 16 uS Prescaler 1 : 16 0.5 * 16 = 8 uS Prescaler 1 : 8 0.5 * 8 = 4 uS Prescaler 1 : 4 0.5 * 32 = 2 uS Prescaler 1 : 2 0.5 * 2 = 1 uS Prescaler 1 : 1 0.5 * 1 = 0,5 uS

Page 6: Manipulação de Timers no PIC18F4520

Da equação1:

Para: clock = 8 MHz / Prescaler = 32 / Tmax = 256 (8 bits) / TMR0 = 0;

Tempo de overflow = 4*32*(256 - 0) / 8M = 4,096 mS

No compilador são gerados os seguintes códigos, correspondentes aos timers da Figura 3:

setup_wdt(WDT_OFF);

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32|RTCC_8_bit); // 0x00 || 0x04 || 0x40

setup_timer_1(T1_DISABLED);

setup_timer_2(T2_DISABLED,0,1);

Também é gerada pela interface, na aba de interrupções e escolhendo Timer0, a função correspondente às habilitações de interrupções: global e do timer0:

ENABLE_INTERRUPTS(GLOBAL | INT_TIMER0)

3 – Situação 2: overflow com valor não exato (TRM0 ≠ 0) ou com casas decimais

Neste é necessário o cálculo do inicial de contagem (TRM0). Para exemplificar vamos supor um overflow de 3 mS. Neste caso devemos verificar qual seria o valor acima de overflow mais próximo e pegar os valores do prescaler e verificar e 8 ou 16 bits. Em seguida substituir estes valores na equação 1, para calcular-se o valor de início de contagem.

No caso de 3 mS, temos o valor de 4 ms, que tem Prescaler 32 com contagem de 8 bits

Utilizando a equação 1:

Adotaremos: Prescaler =32 e contagem com 8 bits em timer0

3m = 4*32*(256 - TMR0) / 8M

TMR0 = 69 = 0x45

Testando o resultado: overflow = 4*32*(256 – 69)/8M = 2,99 mS

No programa deve ser acrescentado, além das funções mencionadas anteriormente a função abaixo para estabelecer o valor de início de contagem (TMR0). Esta mesma

Page 7: Manipulação de Timers no PIC18F4520

função também deve ser acrescentada na última linha da rotina de atendimento a interrupção:

SET_TIMER0(69); // programa principal

SET_TIMER0( 69 - get_timer0() ); // na última linha da rotina de atendimento a interrupção

Na situação 2, o valor incial de contagem é 0. Não havendo necessidade deste comando na rotina de atendimento a interrupção.

Junto a este arquivos tem um exemplo de implementação (timer0_31ms.c)

4 – Situação 3: overflow com valor múltiplo de outros valores de overflow

Neste caso utilizam-se os códigos provenientes do overflow conhecido e uma variável na rotina de atendimento a interrupção, para contagem de estouros.

Por exemplo: overflow de 24ms

Neste caso, utiliza-se um overflow de 4 mS e a cada estouro uma variável é incrementada até atingir 6 estouros e quando a variável é novamente inicializada e quando é executada as rotinas decorrentes do overflow de 24 mS.

TIMER1

O Timer1 possui as seguintes características:

Contagem ou timer apenas de 16 bits com prescaler; O Timer1 é projetado para uso de cristais externos de baixas frequências

(32KHz), permitindo sua utilização para relógios de precisão ou RTC, com adição mínima de componentes;

Possui operação assíncrona, permitindo que o timer permaneça operando quando o chip se encontre em modo de baixo consumo;

Tem 2 registradores para valor inicial: TMR1L e TMR1H; Possui modos de leitura/escrita de 8 e 16 bits; Prescaler ou divisão de clock de: 1, 2, 4 e 8; Tem também T1CON para configuração e TMR1IF para indicar estouro; Possibilidade de operar com módulo de contagem programável, quando

utilizado em conjunto com um dos módulos CCP.

Os registradores associados a TIMER0 e TIMER1 são apresentados na Figura 4.

Page 8: Manipulação de Timers no PIC18F4520

Figura 4 – Registradores associados a Timer0 e Timer1

Na Figura 5 está ilustrado o funcionamento do timer1. O bit TMR1CS seleciona a fonte de clock: 0 para modo interno e 1 para clock externo, proveniente de um oscilador no pino RC0 / T1CK1. O registrador T1CON é detalhado em seguida.

Page 9: Manipulação de Timers no PIC18F4520

Figura 5 – Diagrama de blocos do Timer1

Registrador T1CON: TIMER1 CONTROL REGISTER

TMR1ON (Liga o timer) 1: habilita ou dispara o timer1 0:desabilita

TMR1CS: Timer1 Clock Source Select bit 1: Clock externo no pino RC0 (ativo na subida sinal) 0: Clock interno (clock / 4)

T1SYNC: Timer1 External Clock Input Synchronization Select bit

1: não sincroniza entrada de clock externa com clock interno 0: sincroniza clock externo com clock/4

T1OSCEN: Timer1 Oscillator Enable bit 1: habilita oscilador do timer1 – RC0 é saída do oscilador e RC1 entrada do oscilador 0: desligado

T1CKPS<1:0>: Timer1 Input Clock Prescale Select bits

Prescaler ={1, 2, 4 e 8}

0 0 1:1 1 0 1:4 0 1 1:2 1 1 1:8 T1RUN: Timer1 System Clock Status bit

1: clock do timer1 0: clock de outra fonte

RD16: 16-Bit Read/Write Mode Enable bit

1: habilita leitura e escrita em modo de 16 bits 0: idem, em modo de 8 bits

É possível escrever e ler o valor da contagem de duas formas: 8 e 16 bits.

Acesso em 8 bits para timer1 para leitura e escrita

Quando RD16=0, o timer1 operam em modo de leitura/escrita de 8 bits. Neste modo os registradores de inicio de contagem TMR1L e TMR1H são lidos / escritos separadamente e cada um reflete diretamente o estado da metade do contador time. A cada transbordo de TMR1L é incrementado 1 ao registrador TMR1H.

A única vantagem deste modo é poder alterar a parte alta da contagem sem a necessidade de alterar a parte baixa. Muito útil na implementação de relógios. A

Page 10: Manipulação de Timers no PIC18F4520

desvantagem é a possibilidade de transbordo dos registradores durante a leitura de uma das partes, o que pode ocasionar erros de leitura ou escrita. Isto pode ser evitado parando a contagem durante a leitura ou utilizando de uma rotina específica para evitar o erro.

Acesso em 16 bits para timer1

Quando RD16=1, o timer1 opera em modo de leitura/escrita de 16 bits. Este modo não é recomendado para utilização com clock externo assíncrono.

Ao utilizar o clock externo, temos a opção de utilizar o oscilador integrado do timer1, controlado pelo bit T1OSCEN. Quando T1OSCEN=1, o pino RC0 passa a operar como T1OSO ou saída de oscilador e o pino RC1 como T1OSI (entrada de oscilador). Neste caso os bits 0 e 1 do TRISC permanecem em zero. Na figura 6 encontra-se ilustrada a conexão de um cristal de precisão de 32.768 KHz aos pinos do oscilador do timer1. Esta configuração é utilizada para relógios de precisão. Uma vez ativado, o oscilador do timer1 pode operar mesmo durante os modos de baixo consumo de energia e pode também funcionar como fonte de clock (oscilador secundário) para o restante do sistema.

Caso o oscilador não seja utilizado, um sinal de clock pode ser fornecido externamente através do pino RC0. Este sinal pode ser utilizado como fonte de clock externo tanto para o timer1 quanto para o timer3.

Da mesma forma que o timer0 em modo 16 bits, uma vez disparado a contagem, ao atingir 65535 é setado o flag TMR1IF (agora, no registrador PIR1), podendo gerar uma interrupção, caso esteja habilitado o flag TMR1IE (do registrador PIE1) e o flag de interrupção global GIE, no registrador INTCON.

Podemos utilizar a mesma fórmula para cálculo de overflow do timer0 em 16 bits.

Figura 6 – Oscilador do timer1 (oscilador secundário)

Page 11: Manipulação de Timers no PIC18F4520

TIMER2

O timer2 é um temporizador de 8 bits com operação bem diferente dos demais. Este timer foi projetado para viabilizar a geração de sinais PWM em conjunto com os módulos CCP e opcionalmente pode funcionar como clock para o módulo MSSP (quando opera no modo SPI), além de poder também ser utilizado como temporizador para uso geral. Na Figura 7 estão ilustrados os registradores que o timer2 trabalha.

Figura 7 - Registradores que o timer2 trabalha

No timer2 o temporizador é programável. O contador inicia em zero e conta até um valor programado (não necessariamente 0xFF) no registrador de períodos (PR2). Esta característica é extremamente útil, pois torna desnecessário todo o trabalho de recarga da contagem por software.

A Figura 8 apresenta o diagrama de blocos do timer1.

Figura 8 – Diagrama de blocos do timer2

Page 12: Manipulação de Timers no PIC18F4520

O timer2 opera apenas com clock interno (clock/4) e prescaler de 1, 2, 4 e 8. Também com um poscaler que pode ser utilizado para retardar a geração do sinal de interrupção. Os fatores de poscaler podem ser 1, 2, 3, 4, 5, ...,16, conforme configuração do registrador T2CON.

Registrador T2CON (reset = 0x00)

T2CKPS1: T2CKPS0 Configuração do prescaler do timer2 00 1:1 01 1:4

10 1:16 11 1:16 TMR2ON 1: timer2 contando

0: timer2 parado T2OUTPS3: , :, : T2OUTPS0 Poscaler do timer2 0000 1:1 0001 1:2 0010 1:3 0011 1:4

0100 1:5 0101 1:6 0110 1:7 0111 1:81000 1:9 1001 1:10 1010 1:11 1011 1:12 1100 1:13 1101 1:14 1110 1:15 1111 1:16

Bit 7 x

FTMRINT = ( clock ) / ( 4*Prescaler * (PR2 + 1) * Poscaler )

Onde:

FTMRINT .. Frequência de interrupção (overflow) clock .. Clock do sistema PR2 .. Valor de fim da contagem

Page 13: Manipulação de Timers no PIC18F4520

TIMER3

O Timer3 possui as seguintes características:

Funcionamento semelhante ao timer1, diferenciando-se apenas pelo fato de não possuir um oscilador dedicado. Entretanto pode compartilhar o mesmo oscilador dedicado do timer1;

Contagem ou timer apenas de 16 bits com prescaler 1, 2, 4 e 8; O registrador de controle do timer3 é o T3CON. Não possui bits relacionados

ao controle e status do oscilador, mas inclui 2 bits para seleção da conexão entre timer1 e timer3 e os módulos CCP 1 e 2. Estes bits (T3CCP2 e T3CCP1) permitem selecionar o timer que é utilizado como base de tempo para cada módulo CCP.

Registrador T3CON (reset = 0x00)

RD16 (8 ou 16 bits) 1: 16 bits 0:8 bits

T3CCP2: T3CCP1

Conexão dos timer 1 e 3 aos CCP 00 timer1 com CCP1 e CCP2

01 timer1 com CCP1 e timer3 com CCP2 10 timer3 com CCP1 e CCP2 11 timer3 com CCP1 e CCP2

T3CKPS1:T3CKPS0: : Prescaler

00 1:1 01 1:2 10 1:4 11 1:8

sincronização do timer1 com clock sistema (p/ TMR3CS=1)

1: não sincroniza (modo assíncrono) 0: sincroniza

TMR3CS: fonte do clock 1 clock externo (oscilador do timer1 ou em RC0) 0 clock interno (clok / 4)

TMR3ON: habita timer3 1: liga ou dispara 0: para contagem