Посмотри, может на мысль натолкнет. Программка была написана примерно за 10 мин (не все, придеться додумать)
//---------------------------------------------------------------
Int1: sbr r25,10000000b // Установить бит признак управления
reti // Флаги в основной программе не используются (поэтому и не портятся)
//---------------------------------------------------------------
Int0: sbrc r25,7
rjmp Set_dir // Если бит управления установлен
in r16,DirTimer
andi r16,11111000b
breq Ext // Если таймер не запущен
in r16,TCNTL
in r17,TCNTH // Считываются показания таймера
// Обработка времени (по сути дела деление на 4)
out TCNTH,r16_Date_high
out TCNTH,r16_Date_Low // Установка времени срабат. таймера
ldi r16,00000011b
out DirTimer,r16 // Включение таймера
ldi r18,4 // Счетчик =4
sbr r25,00000001b // Установить принуд вывод 0
reti
Set_dir:
cbr r25,10000000b // Обнуление признака управления
ldi r16,0
out TCNTH,r16
out TCNTL,r16 // Обнуление таймера
ldi r16,00000011b
out DirTimer,r16 // Включение таймера
Ext: reti
//---------------------------------------------------------------
T_Ovf: out TCNTH,r16_Date_high
out TCNTH,r16_Date_Low // Установка времени срабат. таймера
ldi r16,00000011b
eor r25,r16 // Инверсия бит принудит устан 0 и 1
dec r18 // Уменьшение счетчика
brne Ext // Если не дошли до конца
ldi r16,0
out DirTimer,r16 // Выключение таймера
cbr r25,00000011b // Обнуление бит принудит установки
reti
//---------------------------------------------------------------
Int_Reset:
// Инициализация стека
// Инициализация портов
// Инициализация прерываний
// Инициализация таймера
Begin: sbrc r25,0
rjmp Set0 // Признак принуд устан 0
sbrc r25,1
rjmp Set1 // Признак принуд устан 1
sbic PORTin,PINin
rjmp Set1 // Повторять входной сигнал
Set0: cbi PORTout,PINout
rjmp Begin
Set1: sbi PORTout,PINout
rjmp Begin
//---------------------------------------------------------------
|