На железе еще не проверял. Сейчас занялся макеткой для таких случаев, заколебался с кучей плат париться. После на ней уже в реале погоняю. Код вроде должен работать. Посмотри пожалуйста.
Proc_Weld_Comp: ; Обработчик одного из состояний.
Check_Timer Param_Timer_Weld_0_1_s
sbrs r16,n_ST_TIME_OUT
ret
ldd r16,Y+DISP_COMP_TIMER
ldd r17,Y+DISP_COMP_VALUE_BUF
inc r16
std Y+DISP_COMP_TIMER,r16
cp r16,r17
brlo Proc_Weld_Comp_End
cbr FLAGS,f_WELD_COMP
ldd r16,Y+DISP_WELD_VALUE_BUF
cpi r16,0
breq Proc_Weld_Set_Wait_Run
; Run Timer0
ldi r16,1<<CS00 | 1<<CS01
out TCCR0,r16 ; Запуск счетчика TIMER0.
; EXT_INT0_INIT
ldi r16,1<<INTF0
out GIFR,r16 ; Сброс флага внешнего прерывания.
ldi r16,1<<ISC00 | 1<<ISC01
out MCUCR,r16 ; Прерывание по фронту.
ldi r16,1<<INT0
out GICR,r16 ; Разрешение внешнего прерывания.
sbr FLAGS,f_WELD_YES ; Разрешение управления тиристором.
st Y,FLAGS
Proc_Weld_Comp_B:
Set_State DISP_PROC_FSM_WELD,_PROC_WELDING
Proc_Weld_Comp_End:
ret
EXT_INT0:
in RSREG,SREG
push r16
push r17
push YL
push YH
ldiy PROC_WELD_FLAGS
ld r16,Y
sbrc r16,n_WELD_YES
rjmp EXT_INT0_A
; EXT_INT0
out GICR,RCLR ; Запрет прерывания EXT_INT0.
; TIMER0
in r16,TIMSK
cbr r16,1<<OCIE0
out TIMSK,r16 ; Запрет прерывания по совпадению.
in r16,TCCR0
cbr r16,1<<CS00 | 1<<CS01
out TCCR0,r16 ; Остановка счетчика TIMER0.
rjmp EXT_INT0_C
EXT_INT0_A:
EXT_INT0_B:
; EXT_INT0
out GICR,RCLR ; Запрет прерывания EXT_INT0.
; TIMER0
in r16,TIFR
andi r16,1<<OCF0
out TIFR,r16 ; Очистка флага прерывания по совпадению.
in r16,OCR0
subi r16,-(XTAL/64/1000)
out OCR0,r16 ; Загрузка в регистр сравнения нужного значения.
in r16,TIMSK
sbr r16,1<<OCIE0
out TIMSK,r16 ; Разрешение прерывания по совпадению.
; WELD_IMP_PIN_OUT=1
WELD_IMP_OUT_1
EXT_INT0_C:
pop YH
pop YL
pop r17
pop r16
out SREG,RSREG
reti
TIMER0_COMP:
in RSREG,SREG
push r16
; WELD_IMP_PIN_OUT=0
WELD_IMP_OUT_0
; TIMER0
in r16,TIMSK
cbr r16,1<<OCIE0
out TIMSK,r16 ; Запрет прерывания по совпадению.
in r16,TCCR0
cbr r16,1<<CS00 | 1<<CS01
out TCCR0,r16 ; Остановка счетчика TIMER0.
; EXT_INT0
ldi r16,1<<INTF0
out GIFR,r16 ; Сброс флага внешнего прерывания.
ldi r16,1<<INT0
out GICR,r16 ; Разрешение внешнего прерывания.
pop r16
out SREG,RSREG
reti