assembly 在组件中写入16F18877上的数据EEPROM

iovurdzv  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(105)

我试图弄清楚如何写入PIC 16 F18877在汇编数据EEPROM.这是我第一次尝试使用它,我已经通读了好几次的EEPROM(虽然我有时发现Microchip的文档是缺乏/不清楚),并试图谷歌的解决方案没有运气.
我的目标是从0xF001读取,然后将0x25写入该位置,最后读回。初始读取返回0x0,即使EE数据存储器窗口将所有位置显示为0xFF,然后回读仅返回0x0,因为我在回读之前清除了位置,以确保我阅读回EEPROM中的数据,而不是以前的值。
我肯定我错过了一些简单/明显的东西,但我似乎无法弄清楚它是什么。这是我想出的(非工作)代码:

MOVLW  01h
  MOVWF  eeprom_addr_low
  MOVLW  0F0h
  MOVWF  eeprom_addr_high
   
  ;READ EEPROM
  BANKSEL NVMADRL
  MOVLW   eeprom_addr_low
  MOVWF   NVMADRL
  MOVLW   eeprom_addr_high
  MOVWF   NVMADRH
   
  BSF     NVMCON1,6  ;NVMREGS
  BSF     NVMCON1,0  ;RD
   
  MOVF    NVMDATL,W
  MOVWF   eeprom_data_low
  MOVF    NVMDATH,W
  MOVWF   eeprom_data_high
   
  ;WRITE EEPROM
  BANKSEL NVMADRH
  MOVF    eeprom_addr_high,W
  MOVWF   NVMADRH
  MOVF    eeprom_addr_low,W
  MOVWF   NVMADRL
  BSF     NVMCON1,2     ;WREN
  BSF     NVMCON1,6     ;LWL0
   
writeLoop:
  MOVLW   025h
  MOVWF   NVMDATL
  MOVLW   00h           ;0x00
  MOVWF   NVMDATH
  MOVLW   eeprom_addr_low   ;01h
  MOVWF   NVMADRL
  MOVLW   eeprom_addr_high  ;0F0h
  MOVWF   NVMADRH
  BSF     NVMCON1,2     ;WREN
unlockSeq:
  BCF     INTCON,7      ;GIE
  MOVLW   055h
  MOVWF   NVMCON2
  MOVLW   0AAh
  MOVWF   NVMCON2
  BSF     NVMCON1,1     ;WR
  BSF     INTCON,7      ;GIE
  BCF     NVMCON1,2     ;WREN
readBack:
  MOVLW   00h
  MOVWF   NVMDATL       ;Just clearing it to confirm if the readback is working for debugging purposes
  MOVWF   NVMDATH
   
  MOVLW   eeprom_addr_low
  MOVWF   NVMADRL
  MOVLW   eeprom_addr_high
  MOVWF   NVMADRH
   
  BSF     NVMCON1,6
  BSF     NVMCON1,0
   
  MOVF    NVMDATL,W
  MOVWF   eeprom_data_low
  MOVF    NVMDATH,W
  MOVWF   eeprom_data_high

字符串
我还尝试添加一个循环来等待读取完成,因为我的理解是,一旦读取完成,NVMCON1的位0将被清除。然而,如果我添加以下内容:

waitForRead:
    BTFSC   NVMCON1,0
    GOTO    waitForRead


就会进入一个无限循环
任何帮助/指导将不胜感激,因为我坚持到底是什么,我错过了。

bprjcwpo

bprjcwpo1#

因此,在玩了几次之后,我能够让读/写/读工作于以下代码:

MOVLW   01h
    MOVWF   eeprom_addr_low
    MOVLW   0F0h
    MOVWF   eeprom_addr_high
    
    ;READ EEPROM
    BANKSEL NVMADRL
    MOVLW   eeprom_addr_low
    MOVWF   NVMADRL
    MOVLW   eeprom_addr_high
    MOVWF   NVMADRH
    
    BSF BANKMASK(NVMCON1),6   ;NVMREGS
    BSF BANKMASK(NVMCON1),0   ;RD
    
   
waitForRead:
    BTFSC   BANKMASK(NVMCON1),0
    GOTO    waitForRead
       
    BANKSEL NVMDATL
    MOVF    NVMDATL,W
    MOVWF   eeprom_data_low
    
    ;WRITE EEPROM
    BANKSEL NVMADRL
    
    MOVF    eeprom_addr_low,W
    MOVWF   NVMADRL
    MOVLW   0F0h
    MOVWF   NVMADRH

    
writeLoop:
    BANKSEL NVMDATL
    MOVLW   025h
    MOVWF   NVMDATL
    
    BANKSEL NVMADRL
    MOVLW   eeprom_addr_low ;01h
    MOVWF   NVMADRL
    MOVLW   0F0h        
    MOVWF   NVMADRH
    
    BSF     BANKMASK(NVMCON1),2     ;WREN

unlockSeq:
    MOVLW   055h
    BCF     BANKMASK(INTCON),7      ;GIE
    MOVWF   NVMCON2
    MOVLW   0AAh
    MOVWF   NVMCON2
    BSF     BANKMASK(NVMCON1),1     ;WR
    BSF     BANKMASK(INTCON),7      ;GIE
    BCF     BANKMASK(NVMCON1),2     ;WREN
waitForWrite:
    BTFSC   NVMCON1,1           ;WR
    GOTO    waitForWrite

readBack:
    MOVLW   01h
    MOVWF   eeprom_addr_low
    MOVLW   0F0h
    MOVWF   eeprom_addr_high
    
    ;READ EEPROM
    BANKSEL NVMADRL
    MOVLW   eeprom_addr_low
    MOVWF   NVMADRL
    MOVLW   0F0h
    MOVWF   NVMADRH
    
    BSF BANKMASK(NVMCON1),6   ;NVMREGS
    BSF BANKMASK(NVMCON1),0   ;RD
    
    BANKSEL NVMDATL
    MOVF    NVMDATL,W
    MOVWF   eeprom_data_low

字符串
似乎有两个问题:
1.我没有等待写完成,并试图快速读回它。

  1. MPLAB模拟器似乎有点坏。也就是说,有时我会第二次运行代码(在它工作后)不做任何更改,从EEPROM的初始读取将返回0x 0,而不是预期的0xFF(这是启动时所有位置的默认值)。清理/重建偶尔会修复此问题,但有时我必须完全重新启动MPLAB,然后立即调试代码,它就像预期的那样工作了。好奇是否有其他人遇到过这种情况。

相关问题