схема - по картинке (резисторы при кнопках - по килоому). прерываться должно по любой кнопке.
код - ниже. прерывание INT1 вновь включается по переполнению таймера T1.
проблема: если дрыгать кнопкой HOLD - то всё верно делается.
если дрыгать часто другое кнопкой - сначала тоже всё нормально, но после пыры-тройки замыканий кнопкой программа переходит на метку ROTATE_MODE:. т.е. нуль на PD0 как будто перестаёт отслеживаться.
где грабли ?
;####################
(внешнее прерывание INT1)
ROTATE_MODE_INT:
push temp0
in temp0,SREG
push temp0
sbic PIND,0 ; skip if PIND0 is clr
rjmp ROTATE_MODE
SET_FREEZE:
rcall PRINT_CLOCK_SYMBOL ; длится около сотни мкс
;#############
;start BEEP
ldi temp0,0x4F ; <- BEEP-frequensy
out OCR0B,temp0
ldi temp0,0b00010000
;5:4 - toggle OCR0B on compare
out TCCR0A,temp0
ldi temp0,0x0F
out TCNT1H,temp0
out TCNT1L,temp0
ldi temp0,0b00000011 ; start Timer1 ck/
out TCCR1B,temp0 ;
;#############
rjmp ROTATE_MODE_INT_OUT
ROTATE_MODE:
rcall PRINT_CLOCK_SYMBOL ; длится около сотни мкс
;do change the mode...
mov temp0,modes ;
ror temp0 ;
ror modes ;
sbrc modes,2 ; skip if bit #2 is clr
ldi modes,0b10000000 ; set mode is "sdgsdg"
sbrc modes,7;
rcall PRINT_FSDFSDG ; длится пару сотен мкс
sbrc modes,6;
rcall PRINT_DSGSGSD ; длится пару сотен мкс
;#############
;start BEEP
ldi temp0,0x2F ; <- BEEP-frequensy
out OCR0B,temp0
ldi temp0,0b00010000
;5:4 - toggle OCR0B on compare
out TCCR0A,temp0
ldi temp0,0x0F
out TCNT1H,temp0
out TCNT1L,temp0
ldi temp0,0b00000011 ; start Timer1 ck/
out TCCR1B,temp0 ;
;#############
ROTATE_MODE_INT_OUT:
;#### disable Extern INT1 ####
in temp0,GIMSK
cbr temp0,0b10000000
out GIMSK,temp0
;#### disable Extern INT1 ####
pop temp0
out SREG,temp0
pop temp0
reti
; ROTATE_MODE_INT (end)
;#################################################