PIC组件:在特定时间间隔内配置Timer1

时间:2014-04-22 15:00:37

标签: assembly pic

我目前正在学习PIC组装,我已经谈到了计时器的主题。我知道定时器根据预分频器递增其寄存器中的值,直到发生溢出,在这种情况下它会发送一个中断。

我不明白我应该如何配置预分频器,以便定时器发送一个具有我选择的时间间隔的中断(比如1s)。示例代码将不胜感激。

(我在PIC16F877A中使用Timer1)

2 个答案:

答案 0 :(得分:4)

  

我知道定时器根据预分频器递增其寄存器中的值,直到溢出发生,在这种情况下它会发送一个中断。

这是部分正确的。 该值根据所选时钟输入和预分频器递增。预分频器简单地将时钟输入分为不同的时间单位。我将使用Microchip的应用笔记AN580中的一个例子。

假设您已选择外部时钟源(TMR1CS设置)并且该时钟源为32.768kHz,则输入到预分频功能块的频率为32.768kHz。通过将T1CKPS1T1CKPS0设置为所需的值,可以在以下比率之间选择预分解: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具有匹配寄存器TMR1HTMR1L。这允许我们设置一个低于最大计数的值,这将产生相同的溢出时间效果。同样,您只需按频率划分计数。例如,假设我们选择了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的预分频器。