Debugging 在PIC16F1829中使用间接寻址时,如何正确清除RAM
当使用PIC16F1829间接寻址时,如何清除RAM并正确初始化FSR0寄存器 代码是有效的。我的问题是,在调试时,应将其值存储在地址0x70和0x71的变量(本例中为Delay1和Delay2)分别存储在0x120和0x121,尽管FSR0寄存器持有0x70地址 我不知道我遗漏了什么,因为使用16位FSR寄存器的例子并不多。因此,我们非常感谢任何人能够提供的任何帮助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
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位置来保存断点的上下文。