延迟循环PIC汇编代码在面包板上无法正常工作

3

我尝试编程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编译并逐步调试程序时,程序执行没有问题,GPIO0按照循环确实改变了其状态。但是,当我将芯片连接到面包板时,LED无法闪烁,只是保持亮着的状态。
我的问题是:这个问题可能是由于振荡器配置不正确引起的吗?(我也使用了100 nF降噪陶瓷电容)
我已经尝试了许多代码变化。欢迎任何建议。
我使用的整个.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

看门狗定时器是开启还是关闭? - GJ.
我生成了这段代码:_WDTE_OFF,我认为它已经关闭。所有生成的配置位代码:__CONFIG _FOSC_INTRCIO&_WDTE_OFF&_PWRTE_ON&_MCLRE_OFF&_BOREN_OFF&_CP_OFF&_CPD_ON。 - Avo
@Avo请通过编辑问题添加更多细节。 - Weather Vane
好的,我更新了问题。现在整个代码都在那里了。 - Avo
我的错误,当然我是指nano。对不起。 - Avo
显示剩余2条评论
1个回答

1
除了比较器配置之外,一切看起来都很好!插入以下代码以禁用比较器(默认为开启),以将GP0,GP1和GP2用作数字I/O引脚。
bcf      STATUS,RP0 ;Bank 0    
movlw    07h        ;Set GP<2:0> to digital IO
movwf    CMCON      ;digital IO

您先生/女士,我将永远感激您。这确实解决了我的问题!感谢您的时间和努力 :) - Avo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接