Страница 1 из 1
Помощь по коду ASM...
Добавлено: Сб сен 11, 2010 22:52:13
Sadness
Помогите разобраться в коде:
это кусок кода прерывания по переполнению таймера Т2 [ATmega8L]
устройство - таймер который просто отсчитывает вперёд секунды минуты и часы
при переходе с 23:59:59 на 24:00:00 должен происходить сброс переменных в ноли
чтобы было 00:00:00 но этого не происходит, таймер показывает 24:00:00 и
продолжает считать вперёд
;------Прерывание T2 [1с]------
tim2: sei
inc t_secl
cpi t_secl, 10
breq sh
reti
sh: ldi t_secl, 0
inc t_sech
cpi t_sech, 6
breq ml
reti
ml: ldi t_secl, 0
ldi t_sech, 0
inc t_minl
cpi t_minl, 10
breq mh
reti
mh: ldi t_secl, 0
ldi t_sech, 0
ldi t_minl, 0
inc t_minh
cpi t_minh, 6
breq hl
reti
hl: ldi t_secl, 0
ldi t_sech, 0
ldi t_minl, 0
ldi t_minh, 0
inc t_hrl
cpi t_hrl, 10
breq hh
reti
hh: ldi t_secl, 0
ldi t_sech, 0
ldi t_minl, 0
ldi t_minh, 0
ldi t_hrl, 0
inc t_hrh
cpi t_hrh, 2
breq hh2
reti
hh2: cpi t_hrl, 4
breq hh3
reti
hh3: ldi t_secl, 0
ldi t_sech, 0
ldi t_minl, 0
ldi t_minh, 0
ldi t_hrl, 0
ldi t_hrh, 0
reti
Re: Помощь по коду ASM...
Добавлено: Сб сен 11, 2010 23:20:56
Meteor
Оставлю при себе свое мнение о краткости обработки прерываний. Все тоже самое можно было выполнить в основном цикле, выставляя некоторый флаг.
Теперь вопрос. Зачем в каждой последующей проверке, обнулять регистры секунд, десятков секунд.... до самого финала? Ведь на предыдущем шаге они были обнулены?
Re: Помощь по коду ASM...
Добавлено: Вс сен 12, 2010 03:11:34
avreal
Meteor писал(а):Оставлю при себе свое мнение о краткости обработки прерываний. Все тоже самое можно было выполнить в основном цикле, выставляя некоторый флаг.
Это оно только выглядит страшно, а время там не такое и большое выйдет.
Meteor писал(а):Теперь вопрос. Зачем в каждой последующей проверке, обнулять регистры секунд, десятков секунд.... до самого финала? Ведь на предыдущем шаге они были обнулены?
Но зато ж это написано на асме, а не на «этих ваших сях, код из-под котрых большой и тормозной» :-D
Sadness писал(а):таймер показывает 24:00:00 и продолжает считать вперёд
Процитированная проверка делается после того, как t_hrl был обнулён. И никогда не выполняется. Это надо после инкремента единиц часов если не 10, то проверять оба условия - не два ли в десятках и не четыре ли в единицах. И выглядеть это всё должно как-то так
Код: Выделить всё
; тут бы всё-таки SREG сохранить
inc t_secl
cpi t_secl, 10
brne L_reti
clr t_secl
inc t_sech
cpi t_sech, 6
brne L_reti
clr t_sech
inc t_minl
cpi t_minl, 10
brne L_reti
clr t_minl
inc t_minh
cpi t_minh, 6
brne L_reti
clr t_minh
inc t_hrl
cpi t_hrl, 10
brne L_check_24
inc t_hrh
rjmp L_clrhrl
L_check_24:
cpi t_hrl, 4
brne L_reti
cpi t_hrh, 2
brne L_reti
clr t_hrh
L_clrhrl:
clr t_hrl
L_reti:
; а тут восстановить
reti
Re: Помощь по коду ASM...
Добавлено: Вс сен 12, 2010 06:12:53
Vov123
Re: Помощь по коду ASM...
Добавлено: Вс сен 12, 2010 11:34:47
Sadness
Meteor писал(а):Зачем в каждой последующей проверке, обнулять регистры секунд, десятков секунд.... до самого финала? Ведь на предыдущем шаге они были обнулены?
Логично! Исправлю
avreal писал(а):Процитированная проверка делается после того, как t_hrl был обнулён. И никогда не выполняется. Это надо после инкремента единиц часов если не 10, то проверять оба условия - не два ли в десятках и не четыре ли в единицах.
Спасибо огромное, ибо по написанию прошивок это аж вторая моя программа, а как долбался с breq чуть моск не сломал себе пока не узнал что у него адресный диапазон, куда он может передать управление, маленький... а как при прерывании слетал SREG я ж не знал этого

в общем нюансы нюансы...
avreal писал(а):Но зато ж это написано на асме, а не на «этих ваших сях, код из-под котрых большой и тормозной» :-D
По хорошему так оба языка надо знать, каждый в своём случае применяеццо, на часы хватит асма, а вот еси там какоето распознание оптических образов прошить в контроллер то я думаю на асме можно будет повеситься пока такое сделаешь тут бы уже С помог.... но я начал учить асм как разберусь нормально что к чему тада можно и за С сесть
Переписал, проверил, тикает как часы и не глючит, ещё раз спасибо =)