我对这个问题有一些想法,主要是我将使用的 PIC 本身没有足够的计时器位来计数到一秒,但是使用预分频器和后分频器,我可以有效地让自己达到 18 位。但是,我需要 23 位,剩下 5 位。我有几个想法,例如在计时器中存储每次用完 18 位的计数,(词汇可能不正确,但我认为可以看出我想说什么)。此外,有人建议使用标志(这些是否像计数器的想法?)。我正在使用 MPLAB X IDE 为芯片编写程序。我还需要执行其中两个程序来闪烁灯,一个有中断,一个没有,尽管现在我只是在处理一个没有中断的程序,这就是我的问题所在。为了快速参考,PIC 上时钟的滴答率为每秒 8,000,000 次。至于端口,寄存器,我不确定我需要使用什么。如果有人可以为简单的事情提供一段示例代码,例如在预分频器和后分频器上使用 1:1 让时钟以较短的间隔开始闪烁灯,那将有很大帮助。我对这种编程很生疏,自从我使用 PIC 以来已经大约至少一年了,更不用说实际用 PIC 程序集编写了(我的结果好坏参半)。
问问题
2971 次
1 回答
1
用于定时器溢出中断!
在启动 MCPU 时,初始化一个定时器,假设 Timer0(8 位定时器)和内部 TMR0 中断增加另一个计数 ms 的计数器变量TickRoller
,而不是计数 ms 并打开/关闭 LED:
TickRoller res 1 ;Define Interrupt tick 1ms timer
;Set OPTION reg
;{
movlw B'00000000' ;Prescaler is assigned to the Timer0 module
;Prescaler TMR0 Rate 2
BANKSEL OPTION_REG
movwf OPTION_REG
;}
;Set INTCON reg and enable interrupts
;{
bcf CPSCON0, T0XCS ;Timer0 clock source is controlled by FOSC/4
movlw B'10100000' ;Enables the Timer0 interrupt
;Clear TMR0IF
;Enable global interrupts
movwf INTCON ;Set INTCON register
;}
之后在地址 0x0004 处写入中断规则,如:
__Interrupt code 0x0004
;INTERRUPT
;{
;Timer0 interrupt in use, overflow every 512 cycles @ CPU clock 32MHz = 64uS
bcf INTCON, TMR0IF ;Reenable timer interrupt
;Tick Roller
;{
incf TickRoller, f
btfss TickRoller, 4 ;TickRoll event every 0.001024s
retfie ;Bit 4 of TickRoller not set so exit from interrupt
clrf TickRoller ;Reset event counter
;
; your rutine
; count up to 1000 and change the LED state every second
;
retfie ;exit from interrupt
;}
不要忘记主程序例程!
;Main Program loop
{
MainLoop
clrwdt ;Clear wdt timer
;
; ...
;
goto MainLoop
}
就这样...
于 2013-10-21T09:13:10.697 回答