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

问题描述 投票:1回答:2

我目前正在学习PIC汇编,并且我已经涉及到计时器这一主题。我知道计时器会根据预分频器递增其寄存器中的值,直到发生溢出,在这种情况下它将发送中断。

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

((我正在使用PIC16F877A中的Timer1)

assembly pic
2个回答
4
投票

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

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

假设您选择了一个外部时钟源(设置为TMR1CS),并且该时钟源为32.768kHz,则输入到预分频器功能块的频率为32.768kHz。通过将T1CKPS1T1CKPS0设置为所需的值,可以在以下比例之间选择预分频器:1:1、1:2、1:4和1:8。将增加TIMER1寄存器的时钟频率可以是以下任意一种:

Prescale .... T1CKPS1 .... T1CKPS0 .... FREQUENCY(kHz)1 .................. 0 .................. 0 ........... ...... 32.7682 ......... 0 .................. 1 ........... ...... 16.3844 .................. 1 .................. 0 .......... ...... 8.1928 ......... 1 .................. 1 ........... ...... 4.096

溢出时间是TIMER1计数到最大值所花费的时间。使用16位计数器,最大计数为2 ^ 16 = 65536个计数。溢出时间就是计数的数量除以频率。这为我们提供了以下基于预分频值的溢出时间:

Prescale .... FREQUENCY(kHz) .... TIME]1 .................. 32.768 ........................ 22 .................. 16.384 ........................ 44 .................. 8.192 .......................... 88 ............ 4.0961 ........................ 16

最后,TIMER1具有匹配寄存器TMR1HTMR1L。这使我们可以设置一个低于最大计数的值,这将产生相同的溢出时间效果。同样,您只需将计数数除以频率即可。例如,假设我们选择了Prescale 1:

,现在可以产生以下时间

TMR1H

.... TMR1L .... 时间0x80 .......... 0x00 ......... 10xC0 .......... 0x00 ......... 0.50xE0 .......... 0x00 ......... 0.250xF0 .......... 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)发送中断。

您可以使用此公式来确定您的时间:时间=计数/(频率/预分频)


0
投票

您必须设置timer0的预分频值,例如T0PS <2:0> = 001,您也可以使用TOCON的后3位进行分配,例如TOCON = 00000111如果您的计时器在10毫秒内产生中断,并且如果您将预分频器分配给2,则您的中断在20毫秒内发生,则预分频器负责增加周期数。但是,您必须考虑TOPS <2:0> = 0意味着您的预分频器为2。必须将PSA = 0才能使用Timer0的预分频器。

© www.soinside.com 2019 - 2024. All rights reserved.