Страница 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 и продолжает считать вперёд

Код: Выделить всё

hh2:	cpi		t_hrl, 4
		breq	hh3
Процитированная проверка делается после того, как 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
:music:

Re: Помощь по коду ASM...

Добавлено: Вс сен 12, 2010 11:34:47
Sadness
Meteor писал(а):Зачем в каждой последующей проверке, обнулять регистры секунд, десятков секунд.... до самого финала? Ведь на предыдущем шаге они были обнулены?
Логично! Исправлю :)
avreal писал(а):Процитированная проверка делается после того, как t_hrl был обнулён. И никогда не выполняется. Это надо после инкремента единиц часов если не 10, то проверять оба условия - не два ли в десятках и не четыре ли в единицах.
Спасибо огромное, ибо по написанию прошивок это аж вторая моя программа, а как долбался с breq чуть моск не сломал себе пока не узнал что у него адресный диапазон, куда он может передать управление, маленький... а как при прерывании слетал SREG я ж не знал этого :) в общем нюансы нюансы...
avreal писал(а):Но зато ж это написано на асме, а не на «этих ваших сях, код из-под котрых большой и тормозной» :-D
По хорошему так оба языка надо знать, каждый в своём случае применяеццо, на часы хватит асма, а вот еси там какоето распознание оптических образов прошить в контроллер то я думаю на асме можно будет повеситься пока такое сделаешь тут бы уже С помог.... но я начал учить асм как разберусь нормально что к чему тада можно и за С сесть :)

Переписал, проверил, тикает как часы и не глючит, ещё раз спасибо =)