Debugging 在PIC16F1829中使用间接寻址时,如何正确清除RAM

Debugging 在PIC16F1829中使用间接寻址时,如何正确清除RAM,debugging,assembly,microcontroller,pic,microchip,Debugging,Assembly,Microcontroller,Pic,Microchip,当使用PIC16F1829间接寻址时,如何清除RAM并正确初始化FSR0寄存器 代码是有效的。我的问题是,在调试时,应将其值存储在地址0x70和0x71的变量(本例中为Delay1和Delay2)分别存储在0x120和0x121,尽管FSR0寄存器持有0x70地址 我不知道我遗漏了什么,因为使用16位FSR寄存器的例子并不多。因此,我们非常感谢任何人能够提供的任何帮助 LIST p=16f1829 ;list directive to define processor #IN

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

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

我不知道我遗漏了什么,因为使用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);
LIST p=16f1829;用于定义处理器的list指令
#包括,;处理器特定变量定义
__配置配置1,(\u FOSC\u INTOSC&\u WDTE\u OFF&\u PWRTE\u OFF&\u MCLRE\u OFF&\u CP\u OFF&\u CPD\u OFF&\u BOREN\u ON&\u clkoten\u OFF&\u IESO\u OFF&\u FCMEN);
__配置配置2,(\u WRT\u OFF和\u PLLEN\u OFF和\u STVREN\u OFF和\u LVP\u 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声明未初始化数据的一部分
变量UDATA;变量是内存段的名称
第1条第1款;未初始化的数据,由链接器放置在GPR中。
第2条第1款;未初始化的数据,由链接器放置在GPR中。
;-------------------------------------------------------------------------
; 重置向量
;-------------------------------------------------------------------------
重置向量代码0x0000
开始
;-------------------------------------------------------------------------
; 中断服务程序
;-------------------------------------------------------------------------
INT_矢量代码0x0004;中断向量定位
开始
;-------------------------------------------------------------------------
; 主程序
;-------------------------------------------------------------------------
主程序代码
开始
;-------------------------------------------------------------------------
; 将振荡器设置为出厂频率并清除探地雷达
;-------------------------------------------------------------------------
错误级别-302;禁用警告访问不在组0中的寄存器
班克塞尔振荡器;配置选项_REG和TMR0
MOVLW 0x00;将振荡器设置为出厂校准频率
MOVWF-OSCTUNE;
班克塞尔状态
错误级别+302;启用警告访问不在气缸组0中的寄存器
清除内存;代码序列将所有GPR初始化为0x00
MOVLW 0x70;初始化指向RAM的指针
MOVWF FSR0L
CLRF FSR0H
下一个
CLRF INDF0;清除INDF0寄存器
INCF FSR0L,F;公司指针
BTFSS FSR0L,7;都做完了吗?
转到下一个;下一个不清楚
继续;是的,继续
不
;-------------------------------------------------------------------------
; 程序的剩余部分
;-------------------------------------------------------------------------
; 设置主初始化
班克塞尔振荡器;选择包含OSCCON寄存器的内存库
MOVLW b'00111000';将CPU时钟速度设置为500KHz->与每条指令的(1/(500K/4))相关

MOVWF-OSCCON;OSCCON答案是您的代码:

; 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.
Delay2      RES 1       ; uninitialised data, placed by linker in GPR's.

答案是您的代码:

; 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.
Delay2      RES 1       ; uninitialised data, placed by linker in GPR's.

非常感谢。我一整天都在绞尽脑汁想弄清楚我做错了什么,尽管我知道共享变量,但我从来没有想过要把它们声明成那样。为了澄清,在UDATA和UDATA_SHR下声明变量除了刚才学到的教训之外,还有其他区别吗?@aLoHa,最重要的是公共(共享)RAM很小。对于PIC16F1829,它是16字节,当使用In-Circuit Debug作为ICD工具时,需要一个公共RAM位置来保存断点的上下文。非常感谢。我一整天都在绞尽脑汁想弄清楚我做错了什么,尽管我知道共享变量,但我从来没有想过要把它们声明成那样。为了澄清,在UDATA和UDATA_SHR下声明变量除了刚才学到的教训之外,还有其他区别吗?@aLoHa,最重要的是公共(共享)RAM很小。对于PIC16F1829,它是16个字节,当使用In-Circuit Debug作为ICD工具时,15个字节需要一个公共RAM位置来保存断点的上下文。