PIC24F16KA102 don'上的计时器1;行不通

PIC24F16KA102 don'上的计时器1;行不通,c,pic,mplab,pic24,C,Pic,Mplab,Pic24,我想配置PIC24F16KA102的定时器1来计数它。时钟源必须是8 MHz的内部时钟。我配置了寄存器T1CON,并将位TON设置为高电平,以启动计时器。定时器1设置为每100秒溢出一次,然后在一个周期内增加变量计数。我不理解,因为计时器1不工作,我观察到它不会增加。为什么? #include <xc.h> #include "config.h" int count = 0; void main(void) { TRISB = 0;

我想配置PIC24F16KA102的定时器1来计数它。时钟源必须是8 MHz的内部时钟。我配置了寄存器T1CON,并将位TON设置为高电平,以启动计时器。定时器1设置为每100秒溢出一次,然后在一个周期内增加变量计数。我不理解,因为计时器1不工作,我观察到它不会增加。为什么?

   #include <xc.h>
   #include "config.h"

   int count = 0;

   void main(void) {

        TRISB = 0;    

        T1CON = 0;      //TRM1 stopped, internal clock source, prescaler 1:1

        _TON = 1;
        TMR1 = 65135;   //overflow of TM1 every 100 us (400 counts)

        while (1) {

             if (TMR1 == 65535) {

             count++;       // increase every 100 us
             TMR1 = 65135;

             }

        }
   }
#包括
#包括“config.h”
整数计数=0;
真空总管(真空){
TRISB=0;
T1CON=0;//TRM1停止,内部时钟源,预分频器1:1
_吨=1;
TMR1=65135;//每100 us(400次计数)TM1溢出
而(1){
如果(TMR1==65535){
计数+++;//每100美元增加一次
TMR1=65135;
}
}
}

尝试设置定时器1周期寄存器(PR1)并使用中断,而不是尝试捕获并重新加载TMR1的最终计数。您正试图捕捉65535上的TMR1,但这几乎是行不通的,因为一旦TMR1命中65535,它将溢出并再次从0开始计数。 编辑:当然,这假设它根本不重要。我不知道当您将时段寄存器保留为0时,计时器的行为是什么。它可以简单地计数到其最大值65535,然后重置为0,或者它可能根本不会计数,并将PRx连续加载到TMRx中,因为它们在0处匹配

PRx用于定义给定计时器所需的周期,在本例中为100uS。PR1=400。一旦TMR1=PR1,计时器将自动复位,并发出中断,提醒您计时器已过

volatile unsigned int count = 0;   //Vars that change in an ISR should be volatile
PR1 = 400;          //Set Period for Timer1 (100us)
T1CON = 0x8000;     //Enable Timer1

IEC0bits.T1IE = 1;      //Enable Timer1 Interrupt
IPC0bits.T1IP = 0b011;  
将其与ISR函数配对,以便在计时器过期时增加计数:

void __attribute__ ((interrupt,no_auto_psv)) _T1Interrupt (void)
{
 count++;
 IFS0bits.T1IF = 0;  //Make sure to clear the interrupt flag
}
您也可以在没有任何中断的情况下尝试这样的操作:

void main(void){
unsigned int count = 0;
TMR1 = 0;
T1CON = 0x8000;   //TON = 1

    while(1){
         if (TMR1 >= 400){
          count++;
          TMR1=0;
         }
    }
}
但是,我建议使用PR注册和ISR。这就是它的本意

编辑:我还建议阅读PIC24F定时器参考手册: