Code:
;============================================================================================
INTERRUPT
;-------------------------------------------
;Doan ma bat buoc de vao ngat
;-------------------------------------------
MOVWF W_SAVE ;W_SAVE(bank unknown!) = W
SWAPF STATUS, W
CLRF STATUS ; force bank 0 for remainder of handler
MOVWF STAT_SV ; STAT_SV = swap_nibbles( STATUS )
; STATUS = 0
MOVF PCLATH, W
MOVWF PCH_SV ; PCH_SV = PCLATH
CLRF PCLATH ; PCLATH = 0
MOVF FSR, W
MOVWF FSR_SV ; FSR_SV = FSR
; 10 cycles from interrupt to here!
;-----------------------------------
;Doan chuong trinh ngat
;-----------------------------------
; cac ban se viet chuong trinh ngat o day
;--------------------------------------------------
;Doan ma bat buoc de ket thuc ngat
;--------------------------------------------------
MOVF FSR_SV, W
MOVWF FSR ; FSR = FSR_SV
MOVF PCH_SV, W
MOVWF PCLATH ; PCLATH = PCH_SV
SWAPF STAT_SV, W
MOVWF STATUS ; STATUS = swap_nibbles( STAT_SV )
SWAPF W_SAVE, F
SWAPF W_SAVE, W ; W = swap(swap( W_SAVE )) (no change Z bit)
BSF INTCON, GIE
RETFIE
;====================================================================================================
em có thắc mắc ở chương trình trên, em không hiểu dòng này:
MOVWF W_SAVE ;W_SAVE(bank unknown!) = W
giả sử các biến W_SAVE,STAT_SV,PCH_SV được khai báo ở bank0 (địa chỉ từ 0X20 đến 0x7F), khi chương trình chính đang làm việc ở bank 2 thì xảy ra ngắt vậy thì câu lệnh trên không thực hiện đúng do biến W_SAVE được lưu ở bank0, các anh giải thik giúp em chỗ này với ạ