; Include for: ; Filename: Interrupt_Hi.Asm * ; Используется вычисляемый переход для нужной ветки ;btfss PIR3,TMR5IF,ACCESS ; флаг TMR5 есть ? ; bra Int_Timer2 ; ; RetFie_Latch MACRO ; быстрый возврат из прерывания с восстановлением сохранённых защёлок ; movff PCLATU_Temp,PCLATU ; Спасаем защёлки ; movff PCLATH_Temp,PCLATH ; от порчи retfie FAST; return ; ENDM ; Банковых переменных не нашёл ; переключать страницу нет смысла ; W1_Page ; BSR на Bank-1 for 1-W Task ; Новая последовательность определения ветки ; без порчи защёлок вычисляемым переходом ; и без необходимости контролировать номер команды: movf Int_T5_Route,W,ACCESS ; bz T_R0 ; Запасная dcfsnz WREG,W,ACCESS bra T_R1 ; Линия=вход, задержка №2, следующая ветка обработчика dcfsnz WREG,W,ACCESS bra T_R2 ; Читаем линию, задержка №3, следующая ветка обработчика dcfsnz WREG,W,ACCESS bra T_R3 ; Отключаем линию, Завершаем цепку прерываний ; Если номер > 3 то выполняется 4 ветка, завершающая цепку прерываний. ; dcfsnz WREG,W,ACCESS ; bra T_R4 ; Линия=1,Задержка №2, ветка №3, Линия=вход ; dcfsnz WREG,W,ACCESS ; bra T_R5 ; Запасная ; bsf W_1_Flg,0,ACCESS ; Модуль 1-Wire требует проца, цепка прерываний завершена, очередь фона 1-W, ; RetFie_Latch ; bra ExitTmr5Int; retfie FAST ; return T_R4: ; I-4 - поднять линию, отключить линию, заслать задержку №2 (10), ;выставить ветку 3 прерывания, запустить таймер W1_Set ;поднять линию ;W1_Input ;отключить линию ; movff16 Delay_T5_N2,PR5L ; заслать задержку №2 movff Delay_T5_N2+1,TMR0H ; При записи старший байт обязательно первым, в буфер movff Delay_T5_N2,TMR0L ; При записи младшего синхронно пишется старший decf Int_T5_Route,F,ACCESS ; выставить пред идущую ветку прерывания ;movlf 0x3,Int_T5_Route,ACCESS ;выставить номер 3 ветки прерывания таймера5 ; bsf T5CON,TMR5ON,ACCESS ; Запуск отсчёта задержки ; bsf T0CON,TMR0ON,ACCESS ; Запуск отсчёта задержки ; movff PCLATU_Temp,PCLATU ; Спасаем защёлки ; movff PCLATH_Temp,PCLATH ; от порчи W1_Input ;отключить линию после некоторой (максимально возможной) задержки RetFie_Latch ;bra ExitTmr5Int; retfie FAST ; return ;retfie FAST ;;ExitTmr5Int ;; movff PCLATU_Temp,PCLATU ; Спасаем защёлки ;; movff PCLATH_Temp,PCLATH ; от порчи ;; retfie FAST ; movff PCLATU,PCLATU_Temp ; Спасаем защёлки ; movff PCLATH,PCLATH_Temp ; от порчи ; movf PCL,W,ACCESS ; Заполняем защёлки U и H ; rlncf Int_T5_Route,W,ACCESS; Удваиваем указатель ветки, ибо ;; массив команд по 2 байта типа BRA или RETLW ;; Для массива GOTO или CALL надо 2 сдвига. ; addwf PCL,F,ACCESS ; Чтение-Модификация-запись PCL. Защёлки U и H НЕ присваиваются сами при чтении/мод/записи ; bra T_R0 ; Запасная ; bra T_R1 ; Линия=вход, задержка №2, следующая ветка обработчика ; bra T_R2 ; Читаем линию, задержка №3, следующая ветка обработчика ; bra T_R3 ; Отключаем линию, Завершаем цепку прерываний ; bra T_R4 ; Линия=1,Задержка №2, ветка №3, Линия=вход ; bra T_R5 ; Запасная ; T_R0: ; Резерв ; LED1_Toggle ;btg FotoFire ; Красный СД жгём btg Debug_LED bsf W_1_Flg,0,ACCESS ; Модуль 1-Wire требует проца, цепка прерываний завершена, очередь фона 1-W, RetFie_Latch ; bra ExitTmr5Int; retfie FAST T_R1: ; I-1 - отключить линию, заслать задержку №2, ;выставить следующую ветку прерывания, запустить таймер incf Int_T5_Route,F,ACCESS ; выставить следующую ветку прерывания ;movff16 Delay_T5_N2,PR5L ; заслать задержку №2 movff Delay_T5_N2+1,TMR0H ; При записи старший байт обязательно первым, в буфер W1_Input ;отключить линию - пытаюсь перемещать для улучшения изохронности movff Delay_T5_N2,TMR0L ; При записи младшего синхронно пишется старший ;bsf T5CON,TMR5ON,ACCESS ; Запуск отсчёта задержки ; bsf T0CON,TMR0ON,ACCESS ; Запуск отсчёта задержки - Таймер0 всегда шпарит RetFie_Latch ;bra ExitTmr5Int; retfie FAST T_R2: ; - прочитать линию, заслать задержку №3 (410), ;выставить ветку 3 прерывания, запустить таймер bcf W_1_ReadBuf,7,ACCESS ; Чистим место для чтения бита из 1-В btfsc W1_Port,W1_Pin,ACCESS ; Единственный раз читаем порт bsf W_1_ReadBuf,7,ACCESS ; Если на входе 1 - то и на выходе 1 из 1-В incf Int_T5_Route,F,ACCESS ; выставить следующую ветку прерывания ;movff16 Delay_T5_N3,PR5L ; заслать задержку №3 movff Delay_T5_N3+1,TMR0H ; При записи старший байт обязательно первым, в буфер movff Delay_T5_N3,TMR0L ; При записи младшего синхронно пишется старший ;bsf T5CON,TMR5ON,ACCESS ; Запуск отсчёта задержки ; bsf T0CON,TMR0ON,ACCESS ; Запуск отсчёта задержки RetFie_Latch ;bra ExitTmr5Int; retfie FAST T_R3: ;I-3 - Выставить флаг завершения операции 1-Wire ; возможно выставить флаг выделения проца фоновому обработчику, отключить линию W1_Input ;отключить линию bsf W_1_Flg,0,ACCESS ; Модуль 1-Wire требует проца, цепка прерываний завершена, очередь фона 1-W, bcf T0CON,TMR0ON,ACCESS ; Гасим таймер clrf Int_T5_Route,ACCESS ; выставить заглушку на случайное ветку прерывания RetFie_Latch ;bra ExitTmr5Int; retfie FAST ; bra ExitTmr5Int; retfie FAST T_R5: ; RetFie_Latch ;bra ExitTmr5Int; retfie FASTbra ExitTmr5Int; retfie FAST return