·

Ciência da Computação ·

Organização de Computadores

Send your question to AI and receive an answer instantly

Ask Question

Preview text

INTERUPÇÃO DO TIMER Datasheet httpsdatasheetspdfcompdf665231ATMELCo rporationATmega168PA1 Timers do ATmega328 A biblioteca do Arduino abstrai o uso destes temporizadores em muitas de suas funções Por exemplo as funções delay millis micros tone analogWrite utilizam os de timers esperaocupada Existem três maneiras de usar os timers para interrupções Interrupção de estouro de temporizador Timer Overflow Interrupt Interrupção por comparação do temporizador Timer Compare Interrupt e Interrupção de captura do temporizador Timer Capture Interrupt Timers do ATmega328 O Atmega328 utilizado no Arduino UNO possui 3 timers TIMER0 e TIMER2 são de 8 bits contam de 0 a 255 TIMER1é de 16 bits conta de 0 de 65535 Esses temporizadores são importantes para diversas funcionalidades Temporizar e fazer interrupções periódicas Contagem de eventos externos Geração de sinais PWM Medida de intervalos de pulsos Interrupção por estouro do temporizador O estouro do temporizador é uma condição em que o temporizador contou além do seu número máximo Para o Timer0 e Timer2 o estouro ocorre quando a contagem passa de 255 e volta para 0 Para o Timer1 o estouro ocorre quando a contagem passa de 65535 e volta para 0 Interrupção por estouro do temporizador Timer Interrupt Mask Register A configuração do bit TOIE em cada Timer Interrupt Mask Register TIMSKx ativa a interrupção por estouro do temporizador Interrupção por estouro do temporizador A fórmula do tempo de estouro é A placa Arduino UNO tem um oscilador de 16 MHz Assumimos que o divisor do clock é 64 por padrão esse valor pode ser alterado Para o Timer2 o tempo de estouro do timer com divisão do clock por 64 será Toverflow 1 Fosc 2bitsclock div Toverflow 1 160000002864 0001024s Registrador TCCRxA O controle do modo de operação do TIMERx é feito nos registradores TCCRxA e TCCRxB Os registradores TCCRxA só são utilizados em Interrupção por comparação do temporizador Por isso no caso da interrupção de estouro de temporizador os valores devem ser sempre zeros operação normal Registrador TCCRxA O controle do modo de operação do TIMERx é feito nos registradores TCCRxA e TCCRxB Os registradores TCCRxA só são utilizados em Interrupção por comparação do temporizador Por isso no caso da interrupção de estouro de temporizador os valores devem ser sempre zeros operação normal MUITO IMPORTANTE Registrador TCCRxB O divisor do clock pode ser ajustado via os três bits menos significativos do registrador TCCRxB TimerCounter Control Register B Prescaler Valores para o divisor do clock prescaler Timer1 Prescaler Valores para o divisor do clock prescaler Timer2 Rotina de interrupção Quando o temporizador estoura o vetor de interrupção TIMERxOVF deve ser chamado pela CPU do ATMega328 Exemplos ISRTIMER1OVFvect ISRTIMER2OVFvect Exemplo Blink do LED via Timer2 const int ledPin 13 volatile byte state LOW void setup pinModeledPin OUTPUT move 1 para o bit menos significativo bit TOIE2 habilita interrupção por overflow TIMSK2 10 bit 0 1 move 1 para os três bits menos significativos bits CS22 CS21 CS20 111 clk1024 TCCR2B 0x07 TCCR2A 0 void loop digitalWriteledPin state ISRTIMER2OVFvect state state Tinkercad httpswwwtinkercadcomthings2dopVSu6UaU Interrupção por estouro do temporizador O código anterior chama a interrupção a cada 255 incrementos do registrador sendo que o clock é divido por 1024 Outra opção é mover um valor para o registrador TCNT2 há também o TCNT0 e TCNT1 Interrupção por estouro do temporizador A fórmula do cálculo do valor a ser movido para o registrador TCNTx deve ser Para o caso de usarmos o Timer1 16 MHz com divisão de 1024 e Frequência de overflow 1Hz Voverflow 2bits Fosc clock div Foverflow Voverflow 6553616000000 1024 1 49911 0xC2F7 Exemplo Blink do LED via Timer2 const int ledPin 13 volatile byte state LOW void setup pinModeledPin OUTPUT move 1 para o bit menos significativo bit TOIE2 habilita interrupção por overflow TIMSK2 10 move 1 para os três bits menos significativos bits CS22 CS21 CS20 111 clk1024 TCCR2B 0x07 Timer inicia com o valor 100 TCNT2 0x64 TCCR2A 0 allways zero in overflow interrupt void loop digitalWriteledPin state ISRTIMER2OVFvect state state Tinkercad httpswwwtinkercadcomthingsjsPB0B4wYUb Exemplo 3 Vamos usar o Timer2 para contar um valor maior que 255 Alternar um LED a cada 2s 05Hz Frequência CPU 16MHz Prescaler 256 Valor máximo do contador 256 8bits Dividir a frequência da CPU pelo prescaler 16000000256 62500 Dividir o resultado pela frequência desejada 6250005Hz 125000 Como o valor 125000 é maior do que o valor máximo do contador do timer temos que dividir por 256 48828 488 contar 488 estouros Exemplo 3 int cont 0 void setup cli desabilita interrupcao global TCCR2A 0 zera registrador TCCR2A DDRD 1PD2 PD2 saida digital PORTD 1PD2 PD2 nivel LOW TCNT2 0x00 Inicia o Timer2 em 0 TCCR2B TCCR2B B11111000 B00000110 prescaler 256 TIMSK2 0x01 Seta o Bit menos significativo sei habilita interrupcao global void loop ISRTIMER2OVFvect cont if cont 488 PORTD 1PD2 Inverte o Bit PD2 cont 0 Zera o contador Tinkercad httpswwwtinkercadcomthings9fm2KpGXZ82 Exemplo 4 No exemplo anterior a contagem do tempo não foi muito precisa Assumindo os mesmos valores vamos melhorar a precisão 116M 00000000625 00000000625 256 prescaler 0000016 0000016 256 2bits 0004096 Esse valor vai dar quebrado Vamos assumir um valor próximo de 0004096 por exemplo 0004 Exemplo 4 00040000016 250 ou seja se contar 250 e não 256 vai atingir o tempo de 0004s Portanto o valor a ser movido para o registrador TCNT2 é 256250 6 E a quantidade de estouros tem que ser 2s0004s 500 esse 2 é o 2 segundos Exemplo 4 int cont 0 void setup cli desabilita interrupcao global TCCR2A 0 zera registrador TCCR2A DDRD 1PD2 PD2 saida digital PORTD 1PD2 PD2 nivel LOW TCNT2 0x06 Inicia o Timer2 em 6 TCCR2B TCCR2B B11111000 B00000110 prescaler 256 TIMSK2 0x01 Seta o Bit menos significativo sei habilita interrupcao global void loop ISRTIMER2OVFvect cont TCNT2 0x06 Inicia o Timer2 em 6 if cont 500 PORTD 1PD2 Inverte o Bit PD2 cont 0 Zera o contador Tinkercad httpswwwtinkercadcomthingsf3BF9wbbSJp Exemplo 5 Vamos usar o Timer1 para contar um valor maior que 65535 para alternar um LED a cada 5s 02Hz Frequência CPU 16MHz Prescaler 256 Valor máximo do contador 65536 16bits Dividir a frequência da CPU pelo prescaler 16000000256 62500 Dividir o resultado pela frequência desejada 6250005Hz 312500 Como o valor 312500 é maior do que o valor máximo do contador do timer temos que dividir por 65536 47 5 contar 5 estouros Exemplo 5 int cont 0 void setup cli desabilita interrupcao global DDRD 1PD2 PD2 saida digital PORTD 1PD2 PD2 nivel LOW TCCR1A 0 seta TCCR1A igual a 0 TCCR1B 0 seta TCCR1B igual a 0 TCNT1 0x00 Inicia o Timer1 em 0 TCCR1B 1 CS12 prescaler 256 TIMSK1 0x01 Habilita estouro Timer2 sei habilita interrupcao global void loop ISRTIMER1OVFvect cont if cont 5 PORTD 1PD2 Inverte o Bit PD2 cont 0 Zera o counter Tinkercad httpswwwtinkercadcomthingsaBOXiigpu9A Exemplo 6 No exemplo anterior a contagem do tempo não foi muito precisa Assumindo os mesmos valores vamos melhorar a precisão 116M 00000000625 00000000625 256 prescaler 0000016 0000016 65536 216 1048576s Esse valor vai dar quebrado Vamos tentar o valor igual a 1s 10000016 62500 ou seja se contar 62500 e não 65536 vai atingir o tempo de 1s Portanto o valor a ser movido para o registrador TCNT1 é 6553662500 3036 E a quantidade de estouros tem que ser 5s1s 5 Exemplo 6 int cont 0 void setup cli desabilita interrupcao global DDRD 1PD2 PD2 saida digital PORTD 1PD2 PD2 nivel LOW TCCR1A 0 seta TCCR1A igual a 0 TCCR1B 0 seta TCCR1B igual a 0 TCNT1 3036 Inicia o Timer1 em 0xBDC TCCR1B 1 CS12 prescaler 256 TIMSK1 0x01 Habilita estouro Timer2 sei habilita interrupcao global void loop ISRTIMER1OVFvect cont TCNT1 3036 Inicia o Timer1 em 0xBDC if cont 5 PORTD 1PD2 Inverte o Bit PD2 cont 0 Zera o counter Tinkercad httpswwwtinkercadcomthingsj6YkVsyk3rn Referências httpswwwteachmemicrocomarduinotimer interrupttutorial httpsarduinodiywordpresscom20120228ti merinterrupts httpsdatasheetspdfcompdf665231ATMELCo rporationATmega168PA1