【发布时间】:2015-09-26 10:14:48
【问题描述】:
我使用 mplab 代码配置器生成了计时器 (timer2) 的代码。在组合中,我选择了计时器周期的最长时间。所以我在 T2OUTPS (1111) 中使用 1:16 的后分频器,在 T2CKPS (1x) 中使用 16 的预分频器 周期应该是几秒钟,但它每半秒触发一次(大约)。我不明白是什么问题,因为我给预分频器和后分频器赋予什么价值并不重要,周期是一样的
这里是相关代码。这就是我初始化计时器的方式:
void TMR2_Initialize(void) {
// Set TMR2 to the options selected in the User Interface
T2CON = 0b01111011;
//T2CON = 0x3A;
//T2CON.T2OUTPS = 0b0000;
// PR2 255;
PR2 = 0xFF;
// TMR2 0x0;
TMR2 = 0x00;
// Clearing IF flag before enabling the interrupt.
PIR1bits.TMR2IF = 0;
// Enabling TMR2 interrupt.
PIE1bits.TMR2IE = 1;
// Start TMR2
TMR2_StartTimer();
}
void TMR2_StartTimer(void) {
// Start the Timer by writing to TMRxON bit
T2CONbits.TMR2ON = 1;
}
这就是我处理中断的方式:
void interrupt SYS_InterruptHigh(void)
{
if (PIE1bits.TMR2IE == 1 && PIR1bits.TMR2IF == 1) {
TMR2_ISR();
}
......
void TMR2_ISR(void) {
// clear the TMR2 interrupt flag
PIR1bits.TMR2IF = 0;
if (colorUpdate%4 == 1)
{
LED_Color(0xFFFF,0x0000,0xFFFF);
}
else if (colorUpdate%4 == 2)
{
LED_Color(0x0000,0xFFFF,0xFFFF);
}
else if (colorUpdate%4 == 3)
{
LED_Color(0xFFFF,0xFFFF,0x0000);
}
else if (colorUpdate%4 == 0)
{
LED_Color(0x0000,0xFFFF,0x0000);
}
colorUpdate++;
if (colorUpdate>1000)
colorUpdate = 0;
LED_UpdateImage();
LATCbits.LATC6 = 1;
LATCbits.LATC6 = 0;
}
【问题讨论】:
-
您使用什么 PIC,您的系统时钟频率是多少?是否有单独的位可以启用后/预分频器 - 其中一个未启用会使您的大约 0.5 秒变为大约 8 秒,这似乎与您的预期相似。
-
我使用 pic18f24k50。我认为没有位可以启用缩放器,但我一回家就看起来很糟糕
-
你的图片运行频率是多少?
-
是否启用了 PLL?如果是这样,它是否已计入计时器计算?
-
频率为 16 MHz。选择 3x PLL 比率模式时启用 PLL