Ir ao conteúdo

Posts recomendados

Postado

Pessoal, estou usando o MPLab onde, para habilitar uma interrupção qualquer usa-se "enable_interrupts(INT_XXX)". Preciso habilitar o Timer1, então neste caso ficaria "enable_interrupts(INT_TIMER1)". Isso funciona perfeitamente. Porém, com objetivo de tornar o código compatível com outros compiladores, estou tentando usar sempre os registradores diretamente para habilitar/setar/desabilitar as coisas. Neste meu caso a habilitação do Timer1 seria por meio do registrador T1CON (ENDEREÇO 10h) conforme mostra a figura anexa. Meu código fica mais ou menos assim, indicado abaixo:

 

Alguém sabe o motivo disso não funcionar com o registrador diretamente?

#include <16f73>
#include <...>...
#fuses HS, NOWDT
.
.
.
// Registrador em questão
#byte T1CON = 0x10
.
.
.
void main()
{
    // Setando o bit de T1CON que DEVERIA habilitar o Timer1, mas não habilita
    T1CON = 0x01;

    // Se colocar isso abaixo, aí sim habilita o Timer1. Mas "T1CON = 0x01;" também deveria habilitar...
    enable_interrupts(INT_TIMER1)

    while (true) {

    }
}

 

 

timer1.png

  • Membro VIP
Postado

legal que você está a mexer nas entranhas do mc e querendo entender seu cicruito e não simplesmente engolindo os mastigados dos compiladores...

De fato T1CON você controla o prescaler, habilita o pino pra osc externo, sinc externa, origem da entada do pulso e liga o timer mas quem controla se interrupt habilitada é outro registro. Por gentileza consute no d.s. a parte de interrupções. Lá você vai ver os enable/disable interrupts

  • Curtir 1
Postado

Olá @ViniciusKruz . Obrigado, mas não consegui ver uma solução por meio desse link que você indicou.

 

@Isadora Ferraz , obrigado...

Até onde li no manual o timer1 é habilitado exclusivamente pelo bit do registrador que indiquei: T1CON, bit zero.

OK, tem outros registradores envolvidos e o principal deles é o INTCON (endereço 0Bh no meu caso), em que os bits 7 e 6, respectivamente "GIE: Global Interrupt Enable bit" e "PEIE: Peripheral Interrupt Enable bit" tem que estar em 1. Mas estes bits já estão em "1".

OBS.: apesar de não estar indicado no meu código, eu disse "Meu código fica mais ou menos assim".

 

Portanto ficaria da seguinte forma (para ser mais exato):

#include <16f73>
#include <...>...
#fuses HS, NOWDT
.
.
.
// Registrador em questão
#byte T1CON  = 0x10
// Registrador de habilitação Global, Periféricos, Timer0, Interrupção Externa
#byte INTCON = 0x0B
.
.
.
void main()
{
    // Setando o bit de T1CON que DEVERIA habilitar o Timer1, mas não habilita
    T1CON = 0x01;

    // Se colocar isso abaixo, aí sim habilita o Timer1. Mas "T1CON = 0x01;" também deveria habilitar...
    enable_interrupts(INT_TIMER1)
  
    // Habilita interrupções
    INTCON = 0xC0; // 0b11000000
                   // Habilita a interrupção Global (bit7)
                   // Habilita a interrupção por periféricos (bit6)

    while (true) {

    }
}

 

  • Curtir 1
Postado

Olá,

Uma dica: tente uma forma de visualizar o programa compilado em assembly, veja como o compilador traduz a linha: "enable_interrupts(INT_TIMER1)"

 

Dessa forma você saberá qual bit de qual registrador está sendo manipulado.

 

O bit para habilitar a interrupção por estouro do timer1 NÃO está no registrador T1CON.

 

 

Postado

Obrigado @Philippe Henrique e @Fervolt

Fiz uns testes aqui no protoboard e pude observar que na verdade este uC exige a habilitação de bits em dois registradores diferentes para que o Timer1 funcione: T1CON e PIE1. Habilitar apenas o bit em T1CON ou apenas em PIE1, não faz o Timer1 funcionar. Além disso o estouro do Timer1 é sinalizado em um terceiro registrador. São eles:

// HABILITAR TIMER1==========================================
T1CON = 0x31;	//0011 0001
                // Prescale nos bits 5-4, 1:8 neste caso
                // Habilitação do Timer1 bit0
                // ds:"Timer1 can be enabled/disabled by setting/clearing 
                //     control bit TMR1ON (T1CON<0>)"

PIE1_TMR1IE = 1; // bit0 do registrador PIE1
                 // ds: "This interrupt can be enabled/disabled by 
                 //      setting/clearing TMR1 interrupt enable bit 
                 //      TMR1IE (PIE1<0>)"

PIR1_TMR1IF = 0; // Flag de indicação de estouro do Timer1. Registrador PIR1, bit0

Fui levado ao engano por conta dos textos no datasheet que citei nos comentários dos registradores acima, de onde conclui inicialmente, que apenas o bit0 de T1CON seria suficiente para habilitar o Timer1, tal como se tivesse usando a função "enable_interrupts(INT_TIMER1)".

 

Ok. Obrigado!

 

  • Curtir 1
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...