Я использую PIC16F1782 и пытаюсь реализовать таблицу поиска retlw. Я написал этот код, относящийся к microchip AN556 (Реализация таблицы) Но это не работает. Я смоделировал этот код, используя MPLAB X IDE v3.05 и нашел, что MOVLW HIGH IF_TABLE помещает 0x80 в WREG, что кажется неправильным. Тогда ПК получит неправильное значение, и когда я вызову IF_TABLE, программа перейдет в неправильное место. Я был бы признателен, если бы вы могли мне помочь.Реализация таблицы поиска в PIC16F1782
ORG 0H
GOTO MAIN
;simple ISR for TIMER0 OverFlow
ORG 0004H
BTFSS INTCON,2
RETFIE
MOVLW 0X01
XORWF PORTA,F
BCF INTCON,2
RETFIE
MAIN
;OSCON,DACCON and portA configurations
BANKSEL OSCCON
MOVLW B'11110000'
MOVWF OSCCON
BANKSEL DACCON0
MOVLW B'10110000'
MOVWF DACCON0
BANKSEL OPTION_REG
MOVLW B'10000001'
MOVWF OPTION_REG
BANKSEL INTCON
MOVLW B'10100000'
MOVWF INTCON
BANKSEL TRISA
BANKSEL PORTA ;
CLRF PORTA ;Init PORTA
BANKSEL LATA ;Data Latch
CLRF LATA ;
BANKSEL ANSELA ;
CLRF ANSELA ;digital I/O
BANKSEL TRISA ;
MOVLW B'00000000'
MOVWF TRISA
BANKSEL PORTA
BSF PORTA,0
CLRF 0X27
CLRF 0X28
;the problem is in RPT loop
RPT:
MOVF 0X27,W
MOVWF 0X28
MOVLW LOW IF_TABLE
ADDWF 0X28,F
MOVLW HIGH IF_TABLE
BTFSC STATUS,C
ADDLW 1
MOVWF PCLATH
MOVF 0X28,W
CALL IF_TABLE
BANKSEL DACCON1
MOVWF DACCON1
INCF 0X27,F
GOTO RPT
IF_TABLE:
MOVWF PCL
RETLW D'126'
RETLW D'128'
RETLW D'131'
RETLW D'136'
.
.
.
END
Проблема заключалась в том, что смещение должно быть между 1 и 255. На самом деле я добавил несколько кодов, которые предотвращают 0x27 от нуля. (INCF 0x28, F не решит проблему полностью, поскольку, как только 0x27 достигнет значения 0xff, 0x28 будет быть нулевым и оставаться в программе s на линии movwf pcl) – Hesam