我对此事有一些想法,主要是我将要使用的PIC本身没有足够的定时器位来计数到秒,但使用预分频器和后分频器,我可以有效地将自己调到18位。但是,我需要23位,让我短5位。我有几个想法,例如存储每次在计时器中使用18位的计数,(词汇表可能不正确,但我认为可以看出我想说的是什么)。另外,有人建议使用标志(这些是反制想法吗?)。我正在使用MPLAB X IDE为芯片编写程序。我还需要做两个这样的程序来闪烁一个灯,一个有中断,一个没有,虽然现在我只是在没有中断的那个上工作,这就是我的问题。为了快速参考,PIC上的时钟滴答速率为每秒8,000,000个抽头。至于端口,寄存器,我不确定我需要使用什么。如果有人能够提供一些简单的示例代码,比如让时钟在预分频器和后分频器上使用1:1以较短的间隔开始闪烁,这将有很大帮助。我对这种编程非常生疏,因为我使用了PIC,大概至少一年了,更不用说实际上在PIC汇编中写的了(我的结果好坏参半)。
答案 0 :(得分:1)
用于定时器溢出中断!
在启动MCPU时,启动一个定时器,假设Timer0(8位定时器)和TMR0中断内部增加另一个计数ms的计数器变量TickRoller
,而不是计数ms并打开/关闭LED:< / p>
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写入中断rutine,如:
__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
;}
不要忘记主程序rutine!
;Main Program loop
{
MainLoop
clrwdt ;Clear wdt timer
;
; ...
;
goto MainLoop
}
这就是......