assembly - 延迟循环 PIC 汇编代码在面包板上不起作用

标签 assembly microcontroller pic

我尝试对 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

关于assembly - 延迟循环 PIC 汇编代码在面包板上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38292400/

相关文章:

c - 如何避免 xc8 编译器中的警告 1352?

optimization - 帧指针优化的使用

security - 更改BIOS代码/刷新BIOS

使用来自 adc 外设的回调更改结构内的变量值

c - TickGetDiv256() 是如何工作的?

c - PIC18f2520 + HCSR04

c - 使用 XC8 C 编译器除法后打印负数

assembly - 识别程序集中的有符号和无符号值

assembly - x86 程序集 - 比较 SF 和 OF 标志

python - 实时艺术项目---输入: sound --- output: image (better title?)