PIC18F452间接寻址写入RAM异常求助(MPLAB X v4.01)
PIC18F452 间接寻址写入RAM 50H-55H的问题解决
问题分析
1. FSR/INDF未定义
PIC18系列单片机的间接寻址寄存器并非8位PIC的FSR/INDF,而是采用16位的FSR0/FSR1/FSR2寄存器组(每个寄存器组拆分为FSR0L/FSR0H、FSR1L/FSR1H、FSR2L/FSR2H),对应间接存储寄存器INDF0/INDF1/INDF2。直接使用FSR/INDF会因为寄存器不存在而触发编译错误。
2. 自行equ定义后结果错误
手动用equ定义FSR/INDF必然会因为寄存器地址匹配错误,导致操作指向了非目标寄存器,最终写入到错误的RAM地址(比如你遇到的00H、04H)。PIC18的寄存器地址有严格的映射,不能随意自定义。
3. 使用FSR0系列无数据写入
大概率是初始化或循环逻辑错误:
- 未正确设置
FSR0H:50H属于RAM Bank0,FSR0H需设为00H,否则会指向其他Bank的地址 - 循环次数设置错误:50H-55H共6个地址,计数器需设为6
- 未正确使用间接寻址操作:比如没有执行写入指令,或地址递增逻辑错误
正确实现代码(汇编)
org 0x0000 ; 复位入口地址 goto main ; 跳转到主程序 main: ; 初始化FSR0指向RAM 50H(Bank0,FSR0H=00H,FSR0L=50H) movlw 0x00 movwf FSR0H movlw 0x50 movwf FSR0L movlw 0x77 ; 准备要写入的数据77H movlw 0x06 ; 设置循环次数:6个地址单元 movwf COUNT ; 计数器存入临时寄存器COUNT write_loop: movwf POSTINC0 ; 将WREG的77H写入当前FSR0指向的地址,同时自动递增FSR0 decfsz COUNT, F ; 计数器减1,若不为0则继续循环 goto write_loop ; 程序停驻 loop: goto loop ; 定义临时寄存器(可选择RAM空闲地址) COUNT equ 0x20
关键注意事项
- Bank选择:PIC18的RAM分多个Bank,目标地址50H属于Bank0,因此
FSR0H必须设为00H;若目标地址在其他Bank,需对应设置FSR0H的值(比如Bank1设为01H) - 间接寻址后缀:使用
POSTINC0可以在写入数据的同时自动递增FSR0地址,简化代码;也可以手动用incf FSR0L, F实现地址递增,但需注意跨Bank时要同步更新FSR0H - 循环次数:计算目标地址数量时,需用
结束地址 - 起始地址 + 1,这里55H-50H+1=6,所以计数器设为6
验证方法
在MPLAB X模拟器中运行程序后,打开View > Simulator > RAM窗口,定位到50H-55H地址单元,确认每个单元的值均为77H。
内容的提问来源于stack exchange,提问作者Matt Bennett
相关产品推荐
相关产品推荐

