我目前正在学习PIC组装,我已经谈到了计时器的主题。我知道定时器根据预分频器递增其寄存器中的值,直到发生溢出,在这种情况下它会发送一个中断。
我不明白我应该如何配置预分频器,以便定时器发送一个具有我选择的时间间隔的中断(比如1s)。示例代码将不胜感激。
(我在PIC16F877A中使用Timer1)
答案 0 :(得分:4)
我知道定时器根据预分频器递增其寄存器中的值,直到溢出发生,在这种情况下它会发送一个中断。
这是部分正确的。 该值根据所选时钟输入和预分频器递增。预分频器简单地将时钟输入分为不同的时间单位。我将使用Microchip的应用笔记AN580中的一个例子。
假设您已选择外部时钟源(TMR1CS
设置)并且该时钟源为32.768kHz,则输入到预分频功能块的频率为32.768kHz。通过将T1CKPS1
和T1CKPS0
设置为所需的值,可以在以下比率之间选择预分解:1:1,1:2,1:4和1:8。将TIMER1寄存器递增的时钟频率可以是以下任何一种:
<强>预分频强> ....的 T1CKPS1 强> ....的 T1CKPS0 强> ....的频率(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计数。溢出时间只是计数的数量除以频率。这为我们提供了基于预分频值的以下溢出时间:
<强>预分频强> ....的频率(kHz)强> ....的时间(s)强>
1 .................. 32.768 ........................ 2
2 .................. 16.384 ........................ 4
4 .................. 8.192 .......................... 8
8 .................. 4.0961 ........................ 16
最后,TIMER1具有匹配寄存器TMR1H
和TMR1L
。这允许我们设置一个低于最大计数的值,这将产生相同的溢出时间效果。同样,您只需按频率划分计数。例如,假设我们选择了Prescale 1:
<强> TMR1H 强> ....的 TMR1L 强> ....的时间(s)强>
0x80的.......... 0×00 ......... 1个
将0xC0 .......... 0×00 ......... 0.5
取0xE0 .......... 0×00 ......... 0.25
0xF0 .......... 0x00 ......... 0.125
以下代码段来自Microchip的应用笔记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)发送中断。
您可以使用此公式来确定您的时间:时间=计数/(频率/预分频)
答案 1 :(得分:0)
您必须像这样设置timer0的预分频值 T0PS <2:0> = 001,您也可以使用TOCON的后3位进行分配,例如TOCON = 00000111 如果您的计时器在10毫秒内产生中断,并且如果您将预分频器分配给2,则您的中断将在20毫秒内发生,则预分频器负责增加周期数,但是您必须考虑TOPS <2:0> = 0意味着您的预分频器为2。必须将PSA = 0才能使用Timer0的预分频器。