如何在PIC​​组件中的PIC16F1938上实现一秒钟时钟以打开灯亮一秒钟?

时间:2013-10-21 01:59:15

标签: assembly timer clock pic

我对此事有一些想法,主要是我将要使用的PIC本身没有足够的定时器位来计数到秒,但使用预分频器和后分频器,我可以有效地将自己调到18位。但是,我需要23位,让我短5位。我有几个想法,例如存储每次在计时器中使用18位的计数,(词汇表可能不正确,但我认为可以看出我想说的是什么)。另外,有人建议使用标志(这些是反制想法吗?)。我正在使用MPLAB X IDE为芯片编写程序。我还需要做两个这样的程序来闪烁一个灯,一个有中断,一个没有,虽然现在我只是在没有中断的那个上工作,这就是我的问题。为了快速参考,PIC上的时钟滴答速率为每秒8,000,000个抽头。至于端口,寄存器,我不确定我需要使用什么。如果有人能够提供一些简单的示例代码,比如让时钟在预分频器和后分频器上使用1:1以较短的间隔开始闪烁,这将有很大帮助。我对这种编程非常生疏,因为我使用了PIC,大概至少一年了,更不用说实际上在PIC汇编中写的了(我的结果好坏参半)。

1 个答案:

答案 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
}

这就是......