【发布时间】:2026-02-10 01:00:01
【问题描述】:
最初我让 Timer0 在运行模式下工作正常。唯一的问题是当设备进入睡眠模式时,Timer0 停止计数直到唤醒。在数据表中,它说使用 Timer1 能够在睡眠模式下监控时间。 我将 timer0 现有代码修改为 timer1 新配置,其他代码几乎相同。但是,我可能错过了一些关于 timer1 与 timer0 的不同之处,因为 timer1 根本没有计数。我使用的 PIC 是带有 MPLAB C18 的 PIC18F87J11。
我将分享看起来相关的代码,并根据需要添加更多代码。
Timer0 片段代码(来自头文件)
#define TMR_IF INTCONbits.TMR0IF
#define TMR_IE INTCONbits.TMR0IE
#define TMR_IP INTCON2bits.TMR0IP
#define TMR_ON T0CONbits.TMR0ON
#define TMR_CON T0CON
#define TMR_L TMR0L
#define TMR_H TMR0H
Timer0(来自 C 文件)
TMR_CON = 0b00000000 | CLOCK_DIVIDER_SETTING;
TMR_IP = 1;
TMR_IF = 0;
TMR_IE = 1;
TMR_ON = 1;
Timer0(我在其中增加时间)
if(TMR_IF)
{
printf("\r\n Passed here");
timer_counter_high++;
}
输出:通过这里
Timer1 片段代码(来自头文件)
#define TMR_IF PIR1bits.TMR1IF
#define TMR_IE PIE1bits.TMR1IE
#define TMR_IP IPR1bits.TMR1IP
#define TMR_ON T1CONbits.TMR1ON
#define TMR_CON T1CON
#define TMR_L TMR1L
#define TMR_H TMR1H
Timer1(来自 C 文件)
TMR_CON = 0b11101101 | CLOCK_DIVIDER_SETTING;
TMR_IP = 1;
TMR_IF = 0;
TMR_IE = 1;
TMR_ON = 1;
Timer1(我在其中增加时间)
if(TMR_IF)
{
printf("\r\n Passed here");
timer_counter_high++;
}
else
{
printf("\r\n Did not come through");
}
输出:没有通过
编辑:按要求添加了 CLOCK_DIVIDER_SETTING 代码。这被用于 timer0 和 timer1
#elif(CLOCK_FREQ <= 8000000)
#define CLOCK_DIVIDER 32
#define CLOCK_DIVIDER_SETTING 0x04
#define SYMBOL_TO_TICK_RATE 8000000
我仍然没有将设备置于睡眠模式以在这种情况下测试 timer1,首先我必须弄清楚为什么 timer1 在运行模式下不计数。我将不胜感激与我的问题相关的任何帮助或想法,谢谢!
编辑 2:我喜欢回答的一些问题
Q1:Timer1 还能像 timer0 一样与内部振荡器一起使用吗?
Q2:您如何计算 T1CON 的正确 CLOCK_DIVIDER_SETTING ? (如果设置了 T1SYNC 和预分频器,我需要它吗?)
【问题讨论】:
-
我需要外部晶体来让 timer1 工作还是发生了什么?
-
属于electronics.stackexchange.com
-
CLOCK_DIVIDER_SETTING 在每种情况下都使用什么?
-
@SimonJenkins,我更新了帖子。
-
我还是希望能得到一些答案,我需要朝着正确的方向前进。我迷路了!
标签: c embedded microcontroller pic microchip