2015-08-11 9 views
0

Я использую 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

Для того, чтобы указать на фактический слот в таблице вы должны добавить один к индексу:

RPT: 

MOVF 0X27,W 
MOVWF 0X28 
INCF 0x28,F   ; add here 
MOVLW LOW IF_TABLE 

Кроме того, после BANKSEL DACCON1 вам нужно переключиться обратно в банк ноль

BANKSEL DACCON1 
MOVWF DACCON1 
BANKSEL 0X27  ; switch back here 
INCF 0X27,F 
+0

Проблема заключалась в том, что смещение должно быть между 1 и 255. На самом деле я добавил несколько кодов, которые предотвращают 0x27 от нуля. (INCF 0x28, F не решит проблему полностью, поскольку, как только 0x27 достигнет значения 0xff, 0x28 будет быть нулевым и оставаться в программе s на линии movwf pcl) – Hesam