我目前正在学习PIC组装,我已经谈到了定时器的主题。我知道计时器会根据预分频器增加寄存器中的值,直到溢出,在这种情况下,它会发送一个中断。
我不明白的是,我应该如何配置预分频器,以便计时器按照我选择的时间间隔(例如,1s)发送一个中断。示例代码将不胜感激。
(我在PIC16F877A中使用PIC16F877A)
发布于 2014-04-22 16:23:35
我知道计时器会根据预分频器增加寄存器中的值,直到溢出,在这种情况下,它会发送一个中断。。
这部分是正确的。值是根据选定的时钟输入和预标量递增的。,预标量简单地将时钟输入划分为不同的时间单位。我将使用一个例子,从微芯片的应用笔记AN580。
假设您选择了外部时钟源(TMR1CS集),并且该时钟源为32.768kHz,则输入到预标量功能块的频率为32.768kHz。通过将T1CKPS1和T1CKPS0设置为所需的值,您的预标量可以在以下比率之间进行选择: 1:1、1:2、1:4和1:8。将增加TIMER1寄存器的时钟的频率可以是以下任意一种:
Prescale....T1CKPS1....T1CKPS0....FREQUENCY(kHz)
1..................0..................0.................32.768
2..................0..................1.................16.384
4..................1..................0.................8.192
8..................1..................1.................4.096
溢出时间是TIMER1计数到其最大值所需的时间。对于16位计数器,最大计数为2^16 = 65536计数。溢出时间只是计数的数量,除以频率。这给出了基于预销售值的以下溢出时间:
Prescale....FREQUENCY(kHz)....TIME(s)
1..................32.768........................2
2..................16.384........................4
4..................8.192..........................8
8..................4.0961........................16
最后,TIMER1具有匹配寄存器TMR1H和TMR1L。这允许我们将一个值设置在最大计数以下,这将产生相同的溢出时间效果。同样,您只需将计数数除以频率即可。例如,假设我们选择了Prescale 1,我们现在可以生成以下时间:
TMR1H....TMR1L....TIME(s)
0x80.0x00.1
0xC0.0x00.0.5
0xE0.0x00.0.25
0xF0.0x00.0.125
下面的代码片段来自微芯片的Application AN580,并给出了在TIMER1上设置1秒中断的示例。我建议您完整地阅读应用程序说明,并意识到这是使用外部振荡器的一个例子。你也可以选择使用你的内部时钟频率-这可能会给你更细粒度的时间。
START
CLRF STATUS ;Do initialization (Bank0)
BCF T1CON, TMR1ON ;Timer1 is NOT incrementing
:
: ;Do initialization stuff here
:
MOVLW 0x80 ;TIM1H:TMR1L = 0x8000 gives 1 second
MOVWF TMR1H ; overflow, at 32kHz.
CLRF TMR1L
;
CLRF INTCON
CLRF PIR1
BSF STATUS, RP0 ;Bank1
CLRF PIE1 ;Disable all peripheral interrupts
;
BSF PIE1, TMR1IE ;Enable TMR1 Interrups
;
; Initialize the Special Function Registers (SFR) interrupts
;
BCF STATUS, RP0 ;Bank0
CLRF PIR1
BSF INTCON, PEIE ;Enable Peripheral Interrupts
BSF INTCON, GIE ;Enable all Interrupts
;
MOVLW 0x0E
MOVWF T1CON ;Enable T1 Oscillator, Ext Clock, Async, prescaler = 1
BSF T1CON, TRM1ON ;Turn Timer1 ON
;
zzz SLEEP
GOTO zzz ;Sleep, wait for TMR1 interrupt我不明白的是,我应该如何配置预分频器,以便计时器按照我选择的时间间隔(例如,1s)发送一个中断。
您可以使用这个公式来确定您的时间:Time = Count / (Freq / Prescale)
发布于 2020-06-04 13:01:46
您必须设置timer0的预分频器值,如T0PS<2:0> = 001,您也可以使用TOCON最后3位来分配,例如TOCON = 00000111,如果您的计时器在10 ms内进行中断,而如果您将预分频器分配给2,则您的中断发生在20 ms内,则预分频器负责增加循环计数。但是,您必须考虑到TOPS<2:0>=0意味着您的预分频器是2。另外,您还必须为timer0使用PSA=0。
https://stackoverflow.com/questions/23223201
复制相似问题