0

我试图通过向程序计数器添加某个索引来在程序集中使用简单的查找表。它似乎在PCL(so until 0xff) 的范围内工作,但之后,当PCH进入播放时,指令PCH后刚刚重置。addwf

添加后如何防止PCH重置?我是否需要以某种方式操纵PCLATHand以保持其价值。PCLATUPCH

我正在使用带有 mpasm 汇编器的 pic18f25k50。

所以这个查找表工作正常:

TABLE_GET_VALUE
    movf    index, 0 ; memory location = 0x9E 
    mullw   4
    movf    PRODL, 0
    addwf   PC
    movf    0x20, 0
    return
    movf    0x21, 0
    return
    movf    0x22, 0
    return
    movf    0x23, 0
    return
    movf    0x24, 0
    return
    movf    0x25, 0
    return
    movf    0x26, 0
    return
    movf    0x27, 0
    return
    movf    0x28, 0
    return      ; memory location = 0xC8

而这个将程序重置回第一条指令:

TABLE_GET_COEFFICIENT
    movf    index, 0    ; memory location 0x108
    mullw   4
    movf    PRODL, 0
    addwf   PC
    movf    0x30, 0
    return
    movf    0x31, 0
    return
    movf    0x32, 0
    return
    movf    0x33, 0
    return
    movf    0x34, 0
    return
    movf    0x35, 0
    return
    movf    0x36, 0
    return
    movf    0x37, 0
    return
    movf    0x38, 0
    return      ; memory location 0x132
4

2 回答 2

1

这是对 PIC18F 控制器的表查找进行编码的完整方法的一个示例。

;------------------------------------------------------------------------------ 
; MAIN PROGRAM 
;------------------------------------------------------------------------------ 
MAIN_CODE CODE              ; let linker place main program 

Main: 
    movlw   8
    call    TableOneLookup
    bra     Main

;------------------------------------------------------------------------------ 
;
; TableOneLookup
;
; Description: Look up data in table placed in code space
;
; Input:  WREG = byte offset in table
;
; Output: WREG = byte from table
;
;------------------------------------------------------------------------------ 
TABLE_ONE_CODE  code
TableOneLookup:
    push
    clrf    TOSU
    clrf    TOSH
    movwf   TOSL                ; Save offset in to TableOne
    addwf   TOSL,F              ; Double offset in to TableOne
    rlcf    TOSH,F              ; Propagate carry
    movlw   LOW(TabelOne)       ; Add TableOne address low byte
    addwf   TOSL,F
    movlw   HIGH(TabelOne)      ; Add TableOne address high byte
    addwfc  TOSH,F
    movlw   UPPER(TabelOne)     ; Add TableOne address upper byte
    addwfc  TOSU,F
    return                      ; Branch in to TableOne
TabelOne:
    DT      0x30
    DT      0x31
    DT      0x32
    DT      0x33
    DT      0x34
    DT      0x35
    DT      0x36
    DT      0x37
    DT      0x38
    end

使用专门为程序存储器读取操作设计的汇编语言操作码有更好的方法来做到这一点。

于 2019-12-20T20:52:55.663 回答
0

所以我找到了答案。

显然当你写到andPCL的内容是直接写到and的。这意味着锁存器在此过程中永远不会使用当前值更新。更新and的一种方法是阅读. 这会触发锁存器更新为当前值,这意味着稍后写入时会复制 wright 值。PCLATHPCLATUPCHPCUPCLATHPCLATUPCLPCL

像这样:

TABLE_GET_COEFFICIENT
    movf    index, 0    ; memory location 0x108
    mullw   4
    movf    PC, 0       ; writing te PC value just for updating latches
    movf    PRODL, 0
    addwf   PC
    movf    0x30, 0
    return
    movf    0x31, 0
    return
    movf    0x32, 0
    return
    movf    0x33, 0
    return
    movf    0x34, 0
    return
    movf    0x35, 0
    return
    movf    0x36, 0
    return
    movf    0x37, 0
    return
    movf    0x38, 0
    return      ; memory location 0x132

数据表中的更多信息:3.1.1 和 5.1.1

于 2019-12-11T20:14:28.887 回答