微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 PIC16F1829 间接寻址时如何正确清除 RAM

如何解决使用 PIC16F1829 间接寻址时如何正确清除 RAM

使用 PIC16F1829 间接寻址时,如何正确清除 RAM 并初始化 FSR0 寄存器?

代码有效。我的问题是,在调试时,尽管 FSR0 寄存器持有 0x70 地址,但其值应存储在地址 0x70 和 0x71 的变量(即本例中的 Delay1 和 Delay2)分别存储在 0x120 和 0x121。

enter image description here

我不知道我错过了什么,因为使用 16 位 FSR 寄存器的例子并不多。因此,任何人都可以提供任何帮助,我们将不胜感激。

LIST        p=16f1829   ;list directive to define processor
#INCLUDE    <p16f1829.inc>  ;processor specific variable deFinitions

 __CONfig _CONfig1,(_FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_ON & _CLKOUTEN_OFF & _IESO_OFF & _FcmeN_OFF);
 __CONfig _CONfig2,(_WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _LVP_OFF);

;---------------------------------------------- ---------------------------

; UDATA declares a section of uninitialised data
VARIABLES   UDATA       ; VARIABLES is the name of the section of memory
Delay1      RES 1       ; uninitialised data,placed by linker in GPR's.
Delay2      RES 1       ; uninitialised data,placed by linker in GPR's.


;-------------------------------------------------------------------------
; RESET VECTOR
;-------------------------------------------------------------------------

RESET_VECTOR    CODE    0x0000
    GOTO    START   

;-------------------------------------------------------------------------
; INTERRUPT SERVICE ROUTINE
;-------------------------------------------------------------------------

INT_VECTOR  CODE    0x0004  ; Interrupt vector location
    GOTO    START

;-------------------------------------------------------------------------
; MAIN PROGRAM
;-------------------------------------------------------------------------

MAIN_PROG   CODE

START

;-------------------------------------------------------------------------
; SET OSCILLATOR TO FACTORY FREQUENCY AND CLEAR GPR's
;-------------------------------------------------------------------------

    ERRORLEVEL -302     ; disable warning accessing register not in bank 0
    BANKSEL OSCTUNE     ; Configure OPTION_REG and TMR0
    MOVLW   0x00        ; Set oscillator to factory calibrated frequency
    MOVWF   OSCTUNE     ;
    BANKSEL STATUS
    ERRORLEVEL +302     ; Enable warning accessing register not in bank 0

CLEAR_RAM               ; code sequence initialises all GPR's to 0x00                           
    MOVLW   0x70        ; initialise pointer to RAM
    MOVWF   FSR0L
    CLRF    FSR0H

NEXT
    CLRF    INDF0       ; clear INDF0 register
    INCF    FSR0L,F    ; inc pointer
    BTFSS   FSR0L,7    ; all done?
    GOTO    NEXT        ; no clear NEXT

CONTINUE            ; yes CONTINUE
    nop

;-------------------------------------------------------------------------
; REMAINDER OF PROGRAM 
;-------------------------------------------------------------------------
; Setup main init
    BANKSEL OSCCON          ; Selects memory bank containing OSCCON register 
    MOVLW   b'00111000'     ; Set cpu clock speed of 500KHz -> correlates to (1/(500K/4)) for each instruction
    MOVWF   OSCCON          ; OSCCON <- 0x38

; Configure the LEDs        
    BCF     TRISC,0             ; Make I/O Pin C0 an output for DS1
    
    BANKSEL LATC            ; Selects memory bank containing LATC
    CLRF    LATC            ; Start by turning off all of the LEDs

MAINLOOP:
    BSF LATC,0         ; Turn LED on
 
ONDELAYLOOP:
    DECFSZ  Delay1,f        ; Waste time.
    BRA     ONDELAYLOOP     ; The Inner loop takes 3 instructions per loop * 256 loops = 768 instructions
    DECFSZ  Delay2,f        ; The outer loop takes an additional 3 instructions per lap * 256 loops
    BRA     ONDELAYLOOP     ; (768+3) * 256 = 197376 instructions / 125K instructions per second = 1.579 sec.
    BCF     LATC,0          ; Turn off LED C0 - NOTE: do not need to switch banks with 'banksel' since bank2 is still selected

OFFDELAYLOOP:
    DECFSZ  Delay1,f        ; same delay as above
    BRA     OFFDELAYLOOP
    DECFSZ  Delay2,f
    BRA     OFFDELAYLOOP
    BRA     MAINLOOP        ; Do it again...

;-------------------------------------------------------------------------
; END OF PROGRAM
;-------------------------------------------------------------------------

    END         ; End of program

解决方法

答案是你的代码:

; UDATA declares a section of uninitialised data
VARIABLES   UDATA       ; VARIABLES is the name of the section of memory
Delay1      RES 1       ; uninitialised data,placed by linker in GPR's.
Delay2      RES 1       ; uninitialised data,placed by linker in GPR's.

告诉汇编器将它们放在存储区中。

要将数据放置在公共(非存储区)内存中,请将此语法与 MPASM 结合使用:

; UDATA_SHR declares a section of uninitialised data common to all banks
VARIABLES   UDATA_SHR   ; VARIABLES is the name of the section of memory
Delay1      RES 1       ; uninitialised data,placed by linker in GPR's.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。