Здравствуйте!
Подскажите пожалуйста как решить задачу. Написал программу по устранению дребезга кнопки, в отладчике работает и если ее вставить в основной цикл программы тоже работает, а вот в обработке прерываний не работает. Как сделать так, чтобы программа работала в обработке прерываний от T1 не только в отладчике, но и в реальности? переполнениеи T1 происходит каждые 100 Гц.
rx0 значение которое было в предыдущий раз
rx1 значение сейчас
rx2 значение, которое говорит в основном цикле программы о нажатии кнопки
ldi Temp4,1
out TIMSK,Temp4 ; разрешение прерывания от таймера ТС0
ldi Temp4 , 0x05
out TCCR0,Temp4 ; установка предделителя
; с этого момента таймер запущен
;================ Инициализация таймера ТС1
out TIMSK,Temp4 ; разрешение прерывания от таймера ТС1
ldi temp4, 0x01
out TCCR1A,Temp4 ; установка предделителя
; с этого момента таймер запущен
;========== Программа
MAIN_PROGRAM:
;******************************************** Выполнение двоично-десятичного преобразования
mov bufer,counter_sec ;запись содержания регистра counter_sec в bufer
;========== Счетчик сотен
sotnya:
mov temp, bufer ;запись содержания регистра bufer в temp
cpi temp,sotni ;вычитание сотни из temp
brcs M1 ;if флаг n=1(число отрицательное) then переход на метку М
subi bufer, sotni ;вычитание сотни из bufer
inc counter_sotn ;counter_sotn+1
rjmp sotnya
M1:
ldi Temp,0x3E
out PortA,Temp ;разрешение вывода(0) сотен
out portC,counter_sotn ;вывод сотен в portC
ldi Temp,0
mov counter_sotn,Temp ; отчистка счетчика сотен
;========== Счетчик десятков
desyatok:
mov temp, bufer ;запись содержания регистра bufer в temp
subi temp,desyatki ;вычитание десятка из temp
brmi M2 ;if флаг n=1(число отрицательное) then переход на метку М2
ldi Temp,0x3B
out PortA,Temp ;разрешение вывода(0) единиц
out portC,counter_sotn ;вывод единиц в portC
ldi Temp,0
mov counter_sotn,Temp ;отчистка счетчика единиц
;====== Обработка кнопок
in rx1,PIND
mov rx,rx1
com rx1
andi rx1,0x40
;здесь этот кусок работает (когда кнопка не нажата PIND,bit6=1
; когда кнопка нажата PIND,bit6=0
; если случается такое что rx1=1-[состояние PIND,bit6 сейчас]
; а rx0=0-[состояние PIND,bit6 в предыдущий раз], то в rx2,bit6
; записывается 1 )
and rx1,rx0
mov rx2,rx1
mov rx0,rx
sbrs rx2,6 ; если rx2,bit6=1 то счетчик сбрасывается
rjmp exit1
ldi counter_sec, 0x00
ldi temp, 0x00
ldi bufer, 0x00
kostyali писал(а):
Для начала, при входе в прерывание сохраните флаги и все, что может быть подпорчено, при выходе - восстановите.
а что может быть подпорчено еще кроме флагов? вот так восстанавливать?[красным цветом] а сохранять в смысле посмотреть и запомнить по отладчику? в обработке прерываний от T0 так же флаги лучше восстанавливать?
;------------------------------------- Обработка прерываний от Т1 ------------------------------------------------------
TM1_OVF:
ldi Temp3 , 0xec
out TCNT1H,Temp3
out TCNT1L,Temp3
in rx1,PIND
mov rx,rx1
com rx1
andi rx1,0x40 ; здесь этот кусок не работает, не могу понять почему
and rx1,rx0
mov rx2,rx1
mov rx0,rx