Assembly 如何在PIC组件中的PIC16F1938上实现1秒时钟,使灯亮1秒?
我对这件事有一些想法,主要是我将使用的PIC本身没有足够的计时器位来计算一秒钟,但是使用预分频器和后分频器,我可以有效地将自己的计时器位增加到18位。但是,我需要23位,剩下5位。我有两个想法,比如在计时器中存储每次使用18位的计数(词汇可能不正确,但我认为可以看出我想说什么)。此外,有人建议使用旗帜(这些是不是像相反的想法?)。我正在使用MPLAB X IDE为芯片编写程序。我还需要做两个闪烁灯光的程序,一个有中断,一个没有,虽然现在我只是在做一个没有中断,这就是我的问题。为便于快速参考,PIC上时钟的滴答声频率为每秒8000000次。至于端口、寄存器,我不确定需要使用什么。如果有人能为一些简单的事情提供一段示例代码,比如在预分频器和后分频器上使用1:1让时钟在较短的时间间隔内开始闪烁,那将非常有帮助。我对这种编程非常生疏,我使用PIC至少已经有一年了,更不用说在PIC汇编中实际编写了(我的结果好坏参半) 在定时器溢出中断时使用强> 在MCPU启动时,初始化其中一个计时器,例如Timer0(8位计时器)和内部TMR0 interupt增加另一个计数器变量Assembly 如何在PIC组件中的PIC16F1938上实现1秒时钟,使灯亮1秒?,assembly,timer,clock,pic,Assembly,Timer,Clock,Pic,我对这件事有一些想法,主要是我将使用的PIC本身没有足够的计时器位来计算一秒钟,但是使用预分频器和后分频器,我可以有效地将自己的计时器位增加到18位。但是,我需要23位,剩下5位。我有两个想法,比如在计时器中存储每次使用18位的计数(词汇可能不正确,但我认为可以看出我想说什么)。此外,有人建议使用旗帜(这些是不是像相反的想法?)。我正在使用MPLAB X IDE为芯片编写程序。我还需要做两个闪烁灯光的程序,一个有中断,一个没有,虽然现在我只是在做一个没有中断,这就是我的问题。为便于快速参考,PI
tickleror
,它计数ms,而不是计数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处写入中断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
}
仅此而已…使用定时器溢出中断强> 在MCPU启动时,初始化其中一个计时器,例如Timer0(8位计时器)和内部TMR0 interupt增加另一个计数器变量
tickleror
,它计数ms,而不是计数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处写入中断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
}
仅此而已……谢谢,但我要的是一些没有中断的东西。我正在做一个有中断的,一个没有。这有助于我更好地理解一些事情,但这并不是我想要的,谢谢。你能指出每一部分的位置吗?我假设这是一个单独的文件,因为这就是我被教导如何做的。这是1秒时钟还是100ms时钟?我看到了毫秒和秒的用法,在这方面我的数学有问题。使用中断是解决问题的唯一合理方法!其他的都是糟糕的程序设计。是的,你必须在一秒钟内数到1000,这是我的输入错误。如果你不想使用中断,那么就用延迟rutine代替计数器/计时器。事实上,我认为这是糟糕的编程,这就是需要的。我正在制作一个使用中断和一个没有。我很可能会使用不同的内存空间,因为很明显,引导加载程序在默认情况下会跳转到不同的内存位置,而且我还有一个我认为有延迟的旧程序,从我尝试使用LED板制作pong克隆开始(有些,但不完全成功,成功地使lights根据输入创建了一个模式). 再次感谢所有的帮助。谢谢,但我要求的是一些没有中断的东西。我正在做一个有中断的,一个没有。这有助于我更好地理解一些事情,但这并不是我想要的,谢谢。你能指出每一部分的位置吗?我假设这是一个单独的文件,因为这就是我被教导如何做的。这是1秒时钟还是100ms时钟?我看到了毫秒和秒的用法,在这方面我的数学有问题。使用中断是解决问题的唯一合理方法!其他的都是糟糕的程序设计。是的,你必须在一秒钟内数到1000,这是我的输入错误。如果你不想使用中断,那么就用延迟rutine代替计数器/计时器。事实上,我认为这是糟糕的编程,这就是需要的。我正在制作一个使用中断和一个没有。我很可能会使用不同的内存空间,因为很明显,引导加载程序在默认情况下会跳转到不同的内存位置,而且我还有一个我认为有延迟的旧程序,从我尝试使用LED板制作pong克隆开始(有些,但不完全成功,成功地使lights根据输入创建了一个模式). 再次感谢所有的帮助。