Сброс PCH при добавлении значения в PCL с использованием addwf pic18f2x - PullRequest
0 голосов
/ 11 декабря 2019

Я пытаюсь использовать простые таблицы поиска в сборке, добавляя определенный индекс к счетчику программы. Кажется, он работает в диапазоне от PCL (так до 0xff), но после этого, когда PCH начинает играть, PCH просто сбрасывается после инструкции addwf.

Как я могу предотвратить сброс PCH после добавления? Нужно ли каким-либо образом манипулировать PCLATH и PCLATU, чтобы PCH сохранил его значение.

Я использую pic18f25k50 с ассемблером mpasm.

Таким образом, эта справочная таблица работает нормально:

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

1 Ответ

0 голосов
/ 20 декабря 2019

Это один из примеров полного способа кодирования таблицы для поиска контроллера 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

Существуют лучшие способы сделать это с помощью кодов операций на языке ассемблера, специально предназначенных для операций чтения из памяти программ. .

...