Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何在PIC组件中的PIC16F1938上实现1秒时钟,使灯亮1秒?_Assembly_Timer_Clock_Pic - Fatal编程技术网

Assembly 如何在PIC组件中的PIC16F1938上实现1秒时钟,使灯亮1秒?

Assembly 如何在PIC组件中的PIC16F1938上实现1秒时钟,使灯亮1秒?,assembly,timer,clock,pic,Assembly,Timer,Clock,Pic,我对这件事有一些想法,主要是我将使用的PIC本身没有足够的计时器位来计算一秒钟,但是使用预分频器和后分频器,我可以有效地将自己的计时器位增加到18位。但是,我需要23位,剩下5位。我有两个想法,比如在计时器中存储每次使用18位的计数(词汇可能不正确,但我认为可以看出我想说什么)。此外,有人建议使用旗帜(这些是不是像相反的想法?)。我正在使用MPLAB X IDE为芯片编写程序。我还需要做两个闪烁灯光的程序,一个有中断,一个没有,虽然现在我只是在做一个没有中断,这就是我的问题。为便于快速参考,PI

我对这件事有一些想法,主要是我将使用的PIC本身没有足够的计时器位来计算一秒钟,但是使用预分频器和后分频器,我可以有效地将自己的计时器位增加到18位。但是,我需要23位,剩下5位。我有两个想法,比如在计时器中存储每次使用18位的计数(词汇可能不正确,但我认为可以看出我想说什么)。此外,有人建议使用旗帜(这些是不是像相反的想法?)。我正在使用MPLAB X IDE为芯片编写程序。我还需要做两个闪烁灯光的程序,一个有中断,一个没有,虽然现在我只是在做一个没有中断,这就是我的问题。为便于快速参考,PIC上时钟的滴答声频率为每秒8000000次。至于端口、寄存器,我不确定需要使用什么。如果有人能为一些简单的事情提供一段示例代码,比如在预分频器和后分频器上使用1:1让时钟在较短的时间间隔内开始闪烁,那将非常有帮助。我对这种编程非常生疏,我使用PIC至少已经有一年了,更不用说在PIC汇编中实际编写了(我的结果好坏参半)

在定时器溢出中断时使用

在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
}

仅此而已…

使用定时器溢出中断

在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根据输入创建了一个模式). 再次感谢所有的帮助。