You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 07:40:30