Ir ao conteúdo
  • Cadastre-se

PIC Timer com tempo errado PIC18F4520


Visitante

Posts recomendados

Boa noite. Estou tentado usar o timer 0 do PIC18F4520 para gerar uma interrupção, mas estou com algumas problemas.

  • Fiz os cálculos para o tempo de interrupção do timer, ou seja quando ocorre o overflow do registrador
    • Fosc = 10MHz ~> Tosc = 1/(Fosc/4) = 0,4 us (não estou usando prescaler) estou carregando o TMR0 com 0x00, ou seja, a cada 0,4 us o registrador TMR0 é incrementado. Para o timer de 8 bits tenho o valor de: 0,4 [us]*256 = 0,1024 [ms]. Dessa forma ocorre o overflow e o  microcontrolador deveria gerar uma interrupção a cada 0,1024 ms, mas ele não gera. Estou usando a função de interrupção para inverter o estado de um pino, mas o pino demora 26 ms para inverter. Tem alguma coisa errada com os meus cálculos?

Essa são as funções de  interrupção e timer, estou usando o MPlab x ide.

// Função para tratamento da interrupção
void __interrupt () __ISR_TIMER(void)
{
    if(INTCONbits.TMR0IF == 0x01)
    {
        LATBbits.LATB0 = ~ LATBbits.LATB0;
    }
    /* Clear interrupt flag*/
    TMR0 = 0x00;
    INTCONbits.T0IF = 0x00;
    Timer_OnOff(1);
    
}
// Função para configuração da interrupção
void Interrupts_Configure(void)
{
  /*REGISTER INTCON*/
  /* Ativa as interrupções globais*/
  INTCONbits.GIE = 0x01;

  /* Ativa as interrupções de perifericos*/
  INTCONbits.PEIE = 0x01;
    
  /* Ativa as interrupções do timer 0*/
  INTCONbits.TMR0IE = 0x01;
    
  /* Define a prioridade de interrupção do timer 0 como alta*/
  INTCON2bits.TMR0IP = 0x00;
}

// Função de configuração do timer 0
void Timer_Init(void)
{
  TMR0 = 0x00;
  /* Configura o timer 0 como 8 bits */
  T0CONbits.T08BIT = 0x01;
  T0CONbits.T016BIT = 0x00;
    
  /* Fonte de clock como ciclo de maquina interno */
  T0CONbits.T0CS = 0x00;
    
  /* Borda de incremento do contador */
  T0CONbits.T0SE = 0x00;
  /* Não usar o prescaler para o clock*/
  T0CONbits.PSA = 0x01;
  
  /*Ativa o timer 0*/
  T0CONbits.ON = 0x01;
}

Se algo não ficou claro pode me falar. 

Muito obrigado!

 

 

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Eu (eu) gosto de usar a imagem e porque não a imaginação. Deixa eu conferir...

Timer0_Block_Diagram.png

Digamos que você quer 0.1024mS de interrupt ou 9765.625Hz na saída, certo?

Se clk=10000000... entra 2500000 no contador sem prescaler, certo?

2500000/9.765625=256, certo?

Se você alimentar o timer0 com 0x00, a cada 256 contadas ele vai dar um rollover e gerar a interrupt, certo?

Então sua teoria teoricamente está certa.

Ah ... não vi onde você programa PS2:PS0 pra 000. Talvez seja bom não contar os os valores zerados dele após o reset. Caso eles passem a ter 'vida própria', zere-os na interrupt também. E também veja se seu cristal está mesmo a 10000000Hz.

abç

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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!