Ir ao conteúdo

Posts recomendados

Postado

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!

 

 

 

  • Membro VIP
Postado

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ç

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!