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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Родился
Сообщения: 10
Зарегистрирован: Сб сен 11, 2010 22:44:00

Сообщение 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
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

Оставлю при себе свое мнение о краткости обработки прерываний. Все тоже самое можно было выполнить в основном цикле, выставляя некоторый флаг.
Теперь вопрос. Зачем в каждой последующей проверке, обнулять регистры секунд, десятков секунд.... до самого финала? Ведь на предыдущем шаге они были обнулены?
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна

Сообщение 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
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Контактная информация:
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

:music:
Последний раз редактировалось Vov123 Вс сен 12, 2010 11:47:43, всего редактировалось 2 раза.
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 10
Зарегистрирован: Сб сен 11, 2010 22:44:00

Сообщение Sadness »

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

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

Вернуться в «Микроконтроллеры и ПЛИС»