; ; "sektim.txt" ; файл обработки прерывания ; генератора секунды ; обработчиков секундомера/таймера обратного отсчета tms_gen: sei ; разрешено прерывание по главным часам push xl push xh in xh,SREG push xh ; храним SREG в стеке ldwi xh,xl,lot1_2 ; указатель на начало массива данных ; счетчиков секундомера/таймера ld maxmask,x+ ; читаем маску из lot1_2 ld cnt_ggs,x ; ситаем параметры счетчика второго круга dec cnt_ggs breq ringts1 ; если первый счетчик опустошен идем на ringts1 lou_tsret: st x,cnt_ggs ; завершение до достижения максимального значения ; вернем измененный счетчик назад lou_tset1: pop xh out SREG,xh ; восстановить SREG pop xh pop xl ; восстановить содержимое указателя Х reti ; выход с разрешением прерываний ;----------------------------------------------------------------- ringts1: st x+,maxmask ; перезагрузка cnt1_2 push flags ; хранить текущий flags в стеке push accl ; хранить текущий accl в стеке push acch ; хранить текущий acch в стеке ld flags,x+ ; читать из ts_flags флаги ; оперативного статуса таймера/секундомера sbrc flags,tiksef ; тест tiksef и пропуск, если tiksef=0 rjmp sekonder ; при tiksef=1 идем на обработчик секундомера sbrc flags,tionn ; тест tionn и пропуск, если tionn=0 rjmp aptaim ; при tionn =1 идем на обработчик таймера обратного отсчета end_tmsw: pop acch ; если ничего не активно pop accl pop flags rjmp lou_tset1 ; просто завершаем данный модуль ;----------------------------------------------------------- ; обработка счетчиков секундомера sekonder: ld maxmask,x+ ; читаем из max_sts ld cnt_ggs,x ; читаем из ts_cnts inc cnt_ggs ; счетчик=счетчик+1 eor maxmask,cnt_ggs ; xor с результатом в maxmask brbs SREG_Z,sekomin ; если не совпало st x,cnt_ggs ; вернуть значение в секундомер rjmp off_cts ; и выход на off_cts sekomin: st x+,maxmask ; иначе в счетчик грузим 0 и повторяем для минут ld maxmask,x+ ; читаем из max_mts ld cnt_ggs,x ; читаем из ts_cntm inc cnt_ggs ; счетчик=счетчик+1 eor maxmask,cnt_ggs ; xor с результатом в maxmask brbs SREG_Z,sekoh ; если не совпало st x,cnt_ggs ; вернуть значение в секундомер rjmp off_cts ; и выход на off_cts sekoh: st x+,maxmask ; иначе в счетчик грузим 0 st x+,maxmask ; иначе в счетчик грузим 0 и повторяем для минут ld maxmask,x+ ; читаем из max_hts ld cnt_ggs,x ; читаем из ts_cnth inc cnt_ggs ; счетчик=счетчик+1 eor maxmask,cnt_ggs ; xor с результатом в maxmask brbs SREG_Z,sekoh1 ; если не совпало st x,cnt_ggs ; вернуть значение в секундомер rjmp off_cts ; и выход на off_cts sekoh1: st x+,maxmask ; иначе в счетчик грузим 0 и заершаем прерывание ; свыше 99:59:59 снова пойдет от 00:00:00 ;-------------------------------------------------------------------- off_cts: ldwi acch,accl,print_tms movw cnt_ggs:maxmask,acch:accl pop acch pop accl pop flags pop xh out SREG,xh ; восстановить SREG pop xh pop xl ; восстановить содержимое указателя Х push maxmask push cnt_ggs reti ; выход с разрешением прерываний на print_tms, ; а по исполнении print_tms возврат в точку вызова ; прерывания ;-------------------------------------------------------------------- ; обработка счетчиков таймера обратного отсчета aptaim: rcall zertest ; проверка на "00:00:00" brbc SREG_Z,aptim ; если не "00:00:00" идем на aptim rjmp end_tmsw ; анализ не производится, исходное значение равно 00:00:00!!! ;-------------------------------------------------------------------- aptim: ld acch,x+ ; читаем из max_sts ld cnt_ggs,x ; читаем из ts_cnts ser acch ; -1 add cnt_ggs,acch ; счетчик=счетчик + (-1) brbs SREG_C,zaversh ; идем на zaversh, если SREG_C=1 ldi acch,59 st x+,acch ; иначе грузим в ts_cnts 59 ld acch,x+ ; и продолжаем со счетчиком минут ld cnt_ggs,x ; читаем из ts_cntm ser acch ; -1 add cnt_ggs,acch ; счетчик=счетчик + (-1) brbs SREG_C,zaversh ; идем на zaversh, если SREG_C=1 ldi acch,59 st x+,acch ; иначе грузим в ts_cntm 59 ld acch,x+ ; и продолжаем со счетчиком часов ld cnt_ggs,x ; читаем из ts_cnth ser acch ; -1 add cnt_ggs,acch ; счетчик=счетчик + (-1) zaversh: st x,cnt_ggs ; возвращаем результат в счетчик rcall zertest ; проверка на "00:00:00" brbs SREG_Z,zerotm ; если интервал завершен идем в zerotm rjmp off_cts ; выход с изменением показаний дисплея ;--------------------------------------------------------------- ; по достижении 00:00:00 - zerotm: in acch,TCCR1B cbr acch,(1<