从子程序返回不在PIC18上工作

时间:2012-04-18 14:59:33

标签: assembly microcontroller pic mplab

我正在编写一个子程序来计算wreg中的set位数,但是在到达子程序末尾的return语句时,它只是无休止地重复return语句。我是PIC和汇编的新手,所以我确定我刚刚做了些傻事,但我还没有能够解决它。任何帮助将不胜感激。

这是我的代码:

COUNT       equ 0x00

NUMBER      equ 0x01

BITS        equ 0x02

;bitcounter subprogram counts the number of set bits in a byte

BITCOUNTER:

Loop1   rlcf NUMBER,f   ;rotates one bit of number into carry flag, store rotated number

    btfsc STATUS, C     ;skips next line if carry is clear

    incf COUNT, f   ;add one to count, store in count

    bcf STATUS, C   ;clear carry flag

    decfsz BITS

    goto Loop1

    movf COUNT, 0   ; put bit count into W register
return 

START

        movlw   0x0008

        movwf   BITS

        movlw   0xF2

        movwf NUMBER    ;stores input as "number"

        call BITCOUNTER

    end

2 个答案:

答案 0 :(得分:2)

我是PIC编程新手并且尚未向PIC上传任何代码(仍在等待程序员交付)但我认为最后的“goto start”解决了问题,因为PIC需要做一些东西。 “goto start”指令将PIC置于循环中,因此不必尝试“停止”。在它缺席的情况下,我认为PIC正试图通过简单地无限期地重复最后一条指令来处理“无法停止”。

如果是这样,你可以选择添加类似的东西(假设我已将其设置为正确):

loop2 nop
      goto loop2

代码末尾。在重置PIC之前,PIC将继续运行无操作(或者您可以根据需要设置中断,WDT或其他一些功能)。

答案 1 :(得分:1)

试试这个......

include "p18f452.inc"  ;from dir X:\Program Files (x86)\Microchip\MPASM Suite

COUNT       equ 0x00
NUMBER      equ 0x01
BITS        equ 0x02

;bitcounter subprogram counts the number of set bits in a byte
            org 0

START
            movlw   0x0008
            movwf   BITS
            movlw   0xF2
            movwf   NUMBER    ;stores input as "number"
            call    BITCOUNTER
            goto    START

BITCOUNTER:
Loop1       rlcf   NUMBER,f   ;rotates one bit of number into carry flag, store rotated number
            btfsc  STATUS, C     ;skips next line if carry is clear
            incf   COUNT, f   ;add one to count, store in count
            bcf    STATUS, C   ;clear carry flag
            decfsz BITS
            goto   Loop1
            movf   COUNT, 0   ; put bit count into W register
            return

            end

请记住,没有MCPU配置设置,如振荡器,看门狗...... 只是测试代码!