如何将 ISR 上的预分频器设置为以微秒为单位的特定间隔?

发布于 2024-12-16 22:32:31 字数 612 浏览 2 评论 0原文

我有一个 PIC18F87J11 设备,我应该创建:
1) 高优先级 ISR,应该每 100 毫秒触发一次
2) 一个低优先级 ISR,应该每 10ms 触发一次

我有关于配置预分频器的基本知识,例如对于 Timer0,它是

movlw b'00000010'
movwf T0CON

手册页读取的内容,这应该将 Timer0 配置为 16 位计数器,预分频器 1:8(设备手册第 179 页)。问题是,当我想要 100ms 间隔时,我不知道如何确定正确的预分频器设置。 任何帮助表示赞赏。

编辑:
好吧,现在我意识到我对自己在做什么的了解可能比我想象的要少得多。我在 手册 中找不到相关信息(并且我'我确定它在那里)。我需要将 Timer0 设置为 100ms,将 Timer1 设置为 10ms。

I have a PIC18F87J11 device and I'm supposed to create:
1) a high-priority ISR that's supposed to be triggered every 100ms
2) a low-priority ISR that's supposed to be triggered every 10ms

I have a basic knowledge about configuring a pre-scaler, in example for Timer0, it's

movlw b'00000010'
movwf T0CON

as manual page reads, this should configure Timer0 to 16bit counter, pre-scaler 1:8 (device's manual page 179). The problem is, I don't know how to determine the correct pre-scaler settings when I want 100ms intervals.
Any help appreciated.

EDIT:
Okay, now I realize that I probably have way less idea about what I'm doing then I thought. I can't find relevant information in manual (and I'm sure it is there). I need to set up Timer0 to 100ms and Timer1 to 10ms.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

爱已欠费 2024-12-23 22:32:31

这是 TMR0 的 ISR 高优先级启动程序。

在 MCPU 启动代码的一开始,您必须定义...

;Init TMR0 as 8 bit timer, overflow every 1024 CPU cycles if TMRxPrescaler4 is set
;{
TMRxPrescaler2      equ 0
TMRxPrescaler4      equ 1
TMRxPrescaler8      equ 2
TMRxPrescaler16     equ 3
TMRxPrescaler32     equ 4
TMRxPrescaler64     equ 5
TMRxPrescaler128    equ 6
TMRxPrescaler256    equ 7

    movlw   (1<<TMR0ON) + (1<<T08BIT) + TMRxPrescaler4
    movwf   T0CON
    bsf INTCON, TMR0IE       ;enable TMR0 overflow interrupt 
;};

MCPU 启动后,不要忘记打开中断...

    bsf     INTCON, GIE

ISR rutine:

ISR
    bcf INTCON, TMR0IF              ;demask TMR0 overflow interrupt
;your ISR code
    retfie  1

在 ISR rutune 中计数 TMR0 溢出的数量,对于 10MHz CPU 时钟:10000000 / 4 / 1024 = 2441.4 溢出一秒。

我建议您仅使用一个 ISR 例程来处理这两个事件。

Here are you have ISR high-priority initiation rutine for TMR0.

At very begining of your MCPU initiation code you must define...

;Init TMR0 as 8 bit timer, overflow every 1024 CPU cycles if TMRxPrescaler4 is set
;{
TMRxPrescaler2      equ 0
TMRxPrescaler4      equ 1
TMRxPrescaler8      equ 2
TMRxPrescaler16     equ 3
TMRxPrescaler32     equ 4
TMRxPrescaler64     equ 5
TMRxPrescaler128    equ 6
TMRxPrescaler256    equ 7

    movlw   (1<<TMR0ON) + (1<<T08BIT) + TMRxPrescaler4
    movwf   T0CON
    bsf INTCON, TMR0IE       ;enable TMR0 overflow interrupt 
;};

After MCPU initiation don't forget to switch on interrupts...

    bsf     INTCON, GIE

ISR rutine:

ISR
    bcf INTCON, TMR0IF              ;demask TMR0 overflow interrupt
;your ISR code
    retfie  1

In ISR rutune count numbers of TMR0 overflows, for 10MHz CPU clock: 10000000 / 4 / 1024 = 2441.4 overflows for one second.

I recommend that you are using only one ISR rutine where you handle both events.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文