我想配置PIC24F16KA102的timer1来计算它。时钟源必须是8 MHz的内部时钟。我将寄存器T1CON配置为高电平并将TON位设置为启动定时器。 Timer1设置为每100 us溢出一次,然后在一段时间内我将增加变量计数。我不理解因为计时器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;
}
}
}
答案 0 :(得分:1)
尝试设置定时器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参考手册: Here