延迟循环 PIC 汇编代码在面包板上不起作用
Delay loop PIC assembly code not working on breadboard
我尝试对 PIC 12F675 进行编程,使其使连接到其 GPIO 0 引脚(引脚编号 7)的 LED 二极管闪烁。
我已将引脚设置为数字模式:
clrf ANSEL
我已将它们全部设置为输出:
clrf TRISIO
最后这是我使用的循环:
;this delay loop should consume 1 000 000 ticks
;which is 1 second approximately
movlw 0xff ;assigned the highest 8bit value to accumulator
movwf 0x20 ;moved the value to general purpose register 20
movwf 0x21 ;moved the value to GPR 21
clrw ;cleared the working register (accumulator)
movlw 0x15 ;assigned the value 15 to accumulator
movwf 0x22 ;moved the value to GPR 22
bsf GPIO,0 ;set the first pin high
loop1
decfsz 0x20, 1
goto loop1
decfsz 0x21, 1
goto loop1
decfsz 0x22, 1
goto loop1 ;nested loops to delay further action
bcf GPIO,0 ;set the first pin low
最后这是我用来配置芯片的代码:
__CONFIG _FOSC_INTRCIO & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF & _CP_OFF & _CPD_ON
我的问题是:在MPLAB X中编译程序并逐步调试时,程序执行没有问题,GPIO 0位确实是根据循环改变状态。但是当我将芯片连接到面包板时,LED 不会闪烁,只是一直亮着。
我的问题是:问题可能是由振荡器配置错误引起的吗? (我也用了100nF去耦陶瓷电容)
我已经尝试了很多代码变体。欢迎任何建议。
我使用的整个 .asm 代码:
list p=12F675
#include <p12F675.inc>
__CONFIG _FOSC_INTRCIO & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF & _CP_OFF & _CPD_ON
OSCCAL equ 0x90
TRISIO equ 0x85
ANSEL equ 0x9f
GPIO equ 0x05
org 0x00
bsf 0x03,5 ;bank1
movlw b'00111100' ;osccal value
clrf OSCCAL
movwf OSCCAL ;osccal set
movlw b'11111110' ;ansel value
movwf ANSEL ;set pin AN0 as digital I/O
movlw b'11111110' ;trisio value
movfw TRISIO ;set pin GPIO0 as output
clrf TRISIO
bcf 0x83,5 ;bank0
clrf GPIO ;clear GPIO port
start
movlw 0xff
movwf 0x20
movwf 0x21
clrw
movlw 0x15
movwf 0x22
bsf GPIO,0
loop1
decfsz 0x20, 1
goto loop1
decfsz 0x21, 1
goto loop1
decfsz 0x22, 1
goto loop1
bcf GPIO,0
movlw 0xff
movwf 0x20
movwf 0x21
clrw
movlw 0x15
movwf 0x22
loop2
decfsz 0x20, 1
goto loop2
decfsz 0x21, 1
goto loop2
decfsz 0x22, 1
goto loop2
goto start
end
一切正常,除了比较器配置!
插入以下代码以禁用比较器(默认打开)以将 GP0、GP1 和 GP2 用作数字 I/O 引脚。
bcf STATUS,RP0 ;Bank 0
movlw 07h ;Set GP<2:0> to digital IO
movwf CMCON ;digital IO
我尝试对 PIC 12F675 进行编程,使其使连接到其 GPIO 0 引脚(引脚编号 7)的 LED 二极管闪烁。
我已将引脚设置为数字模式:
clrf ANSEL
我已将它们全部设置为输出:
clrf TRISIO
最后这是我使用的循环:
;this delay loop should consume 1 000 000 ticks
;which is 1 second approximately
movlw 0xff ;assigned the highest 8bit value to accumulator
movwf 0x20 ;moved the value to general purpose register 20
movwf 0x21 ;moved the value to GPR 21
clrw ;cleared the working register (accumulator)
movlw 0x15 ;assigned the value 15 to accumulator
movwf 0x22 ;moved the value to GPR 22
bsf GPIO,0 ;set the first pin high
loop1
decfsz 0x20, 1
goto loop1
decfsz 0x21, 1
goto loop1
decfsz 0x22, 1
goto loop1 ;nested loops to delay further action
bcf GPIO,0 ;set the first pin low
最后这是我用来配置芯片的代码:
__CONFIG _FOSC_INTRCIO & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF & _CP_OFF & _CPD_ON
我的问题是:在MPLAB X中编译程序并逐步调试时,程序执行没有问题,GPIO 0位确实是根据循环改变状态。但是当我将芯片连接到面包板时,LED 不会闪烁,只是一直亮着。
我的问题是:问题可能是由振荡器配置错误引起的吗? (我也用了100nF去耦陶瓷电容)
我已经尝试了很多代码变体。欢迎任何建议。
我使用的整个 .asm 代码:
list p=12F675
#include <p12F675.inc>
__CONFIG _FOSC_INTRCIO & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF & _CP_OFF & _CPD_ON
OSCCAL equ 0x90
TRISIO equ 0x85
ANSEL equ 0x9f
GPIO equ 0x05
org 0x00
bsf 0x03,5 ;bank1
movlw b'00111100' ;osccal value
clrf OSCCAL
movwf OSCCAL ;osccal set
movlw b'11111110' ;ansel value
movwf ANSEL ;set pin AN0 as digital I/O
movlw b'11111110' ;trisio value
movfw TRISIO ;set pin GPIO0 as output
clrf TRISIO
bcf 0x83,5 ;bank0
clrf GPIO ;clear GPIO port
start
movlw 0xff
movwf 0x20
movwf 0x21
clrw
movlw 0x15
movwf 0x22
bsf GPIO,0
loop1
decfsz 0x20, 1
goto loop1
decfsz 0x21, 1
goto loop1
decfsz 0x22, 1
goto loop1
bcf GPIO,0
movlw 0xff
movwf 0x20
movwf 0x21
clrw
movlw 0x15
movwf 0x22
loop2
decfsz 0x20, 1
goto loop2
decfsz 0x21, 1
goto loop2
decfsz 0x22, 1
goto loop2
goto start
end
一切正常,除了比较器配置! 插入以下代码以禁用比较器(默认打开)以将 GP0、GP1 和 GP2 用作数字 I/O 引脚。
bcf STATUS,RP0 ;Bank 0
movlw 07h ;Set GP<2:0> to digital IO
movwf CMCON ;digital IO