首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PIC程序集:为特定时间间隔配置Timer1

PIC程序集:为特定时间间隔配置Timer1
EN

Stack Overflow用户
提问于 2014-04-22 15:00:37
回答 2查看 6.6K关注 0票数 1

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

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

(我在PIC16F877A中使用PIC16F877A)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-22 16:23:35

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

这部分是正确的。值是根据选定的时钟输入和预标量递增的。,预标量简单地将时钟输入划分为不同的时间单位。我将使用一个例子,从微芯片的应用笔记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.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具有匹配寄存器TMR1HTMR1L。这允许我们将一个值设置在最大计数以下,这将产生相同的溢出时间效果。同样,您只需将计数数除以频率即可。例如,假设我们选择了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秒中断的示例。我建议您完整地阅读应用程序说明,并意识到这是使用外部振荡器的一个例子。你也可以选择使用你的内部时钟频率-这可能会给你更细粒度的时间。

代码语言:javascript
复制
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)

票数 4
EN

Stack Overflow用户

发布于 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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23223201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档