Ir ao conteúdo
  • Cadastre-se

Dúvidas na configuração do timer2 do PIC


Ir à solução Resolvido por DFURLA,

Posts recomendados

Estou com algumas dúvidas na configuração do timer2, o pic que estou usando é o PIC16F88. Estou usando o timer2 pois preciso de overflow na casa dos microsegundos, 1 a 10 precisamente. O código que estou usando é o seguinte. O clock é interno de 8Mhz.

#include <main.h>

int32 cnt = 0;
 

 

#INT_TIMER2
void  TIMER2_isr(void) 
{
   cnt++;
}

 

void main()
{
   setup_adc_ports(sAN0);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_timer_2(T2_DIV_BY_1,2,1);
 
   enable_interrupts(INT_TIMER2);
   enable_interrupts(GLOBAL);
   
   while(TRUE);
}

 

 

Seguindo os cálculos conceituais, o ciclo de máquina estaria em 0,5us, então pra um overflow de 1us, precisaria de duas contagens no timer.
Se cada estouro do timer2 tiver 1us, 1.000.000 de estouros seria 1 segundo. Testando a lógica seguinte no proteus, para manter um led aceso meio segundo e meio segundo apagado. Acontece que esse efeito ocorre apenas em torno de 6 segundos, como se 1 milhão de estouros fossem 6 segundos e não 1 como o cálculo aponta.
 

#INT_TIMER2
void  TIMER2_isr(void) 
{

 

   cnt++;
   if(cnt < 1000000)
   {
      if(cnt < 500000)
      {
         output_high(PIN_B0);
      }
      else
     {
         output_low(PIN_B0);
      }
   }
   else
   {
      cnt = 0;
   }
}

Os cálculos:
                                            
ciclo de máquina em (us) = (1/(fosc/4))*1000000
(1/(8000000/4))*1000000 = 0,5us

Contagens necessárias = (tempo_requerido_us/(prescaler*clico_de_maquina))
(1/(1*0,5)) = 2
 
Alguma luz?
Link para o comentário
Compartilhar em outros sites

Isso pode ajudar.

 

 

 

int  conta_1000=0;    //variáveis de controle de tempo

                     

 

 

#INT_TIMER1                   

void TIMER1 (void)           

{

conta_1000++;               

if (conta_1000>=4)          

    {

    conta_1000 = 0;          

    output_toggle(PIN_D0);   

    }

set_timer1(3036);            ///Retorna o valor inicial aos registadores TMR1H e   TMR1L

                            

}

 

void main()

{

SETUP_TIMER_1(T1_INTERNAL|T1_DIV_BY_8);

 

SET_TIMER1(3036);             //Inicializa os registadores TMR1H e TMR1E

 

enable_interrupts(GLOBAL);         

enable_interrupts(INT_TIMER1);      

 

while(true);                         

}

Link para o comentário
Compartilhar em outros sites

int conta=0;

#INT_TIMER2
void trata_t2(){
conta++;
if (conta>=40){

 output_toggle(PIN_B0);  
conta=0;
}
SET_TIMER2(0);
}

void main (){

/* Configura o Timer 2 com prescaler 1:16 e postcaler de 1:13 e registrador PR2 com 195 */
SETUP_TIMER_2(T2_DIV_BY_16,240,13); //Ajusta prescale e  postcaler até chegar a estouto coreto, neste exemplo é de 1 segundo

SET_TIMER2(0);

enable_interrupts(GLOBAL); //Habilita interrupção global
enable_interrupts(INT_TIMER2); //Habilita interrupção do Timer 2

while(true);
}

 

////Tempo = prescaler x postcaler x PR2 x (1/(FOSC/4))
 

 

Link para o comentário
Compartilhar em outros sites

Show de bola @Valdeci_da_silva

O tempo de 1 segundo funciona perfeitamente.

 

O que eu preciso entender agora, é se existe algum limite mínimo pro estouro do timer, por exemplo, eu consigo um estouro em 5us? Se eu contar 200 mil estouros, vou ter 1 segundo? As operações executadas na função do timer2 podem levar mais de 5us bagunçando o tempo?

Qual o tempo do estouro do timer2 nessa configuração?

setup_timer_2(T2_DIV_BY_1,1,1);

 

Desde já agradeço o apoio e o interesse em ajudar.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

bom, dexeu pensar... 1ªmente não li o d.s. do mc ok?

1uS acho que é pouco pra overflow. digamos que entre 8MHz no contador dele (geralmente é clock/4) e ele é 8 bits. Pra dar uma rolada a cada 1uS, vai ter que contar até 8, correcto? então 256-8=248 é o que você vai ter que alimentar o timer com prescaler 1:1. Neste caso ele vai ter apenas 8 ciclos de clock pra fazer outras coisas ou seja a cada 8 ciclos o timer interrompe o bixo. Se puder conviver com isso, então ok. Resumindo, dê uma olhada no d.s. pra confirma a teoria acima. Sei lá... num tô raciocinando direito hoje

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

A desvantagem das bibliotecas mastigadas é que limitam nosso conhecimento e entendimento da problemática. Vamos deixar de lado o sw mastigado e tentar analisar o circuito do timer2 a nível de bit. Lembrando que o pic é um mc muito simples e um minimo de conhecimento de eletronica digital pode ajudar a esmiuçar suas entranhas. Além do + , sujeirinha na mão não machuca ninguém...Vejamos...
TIMER2_prescaler_postscaler.jpg

 

A figura mostra o PR2 que não faz parte de nossa análise. Consideremos apenas o transbordo do timer2.ok?

A 8MHz pelo que vemos, entra 2MHz no prescaler. Se 1:1 teremos 2MHz na entrada do contador. O máximo que podemos fazer é dividir por 1 ou seja alimentamos o timer2 com 255 (máximo).Se 1:1 no postcaler  teremos então uma interrupção a cada 0.5us (2MHz). Somando-se o tempo dentro da interrupt o qual vamos ter que realimentar o timer2, zerar o flag, fazer alguma coisinha (cnt++ ) , etc. Por isso seu tempo estava maior do que sua 'teoria' mostrava. Então intervalo de interrupção muito pequeno não faz sentido em mc de baixa frequência. Você deve usar mc de 100MHz ou + pra ter sucesso neste micro-tempo-desafio

Perdoe algum engano nas palavras supra digitadas. Afinal... herrar é umano
 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!