Полная версия этой страницы:
Z регистр в ATtiny15
Pyku_He_oTTyda
Mar 14 2006, 07:36
Как правильно работать с шестнадцатиразрядным Z регистром в ATtiny15 на асм? В принципе интересует несколько команд:
приращение на 1, вычитание 1, сравнить с заданным значением.
Не приходилось работать с 16, кроме как вычитание в S2313, но здесь команда sbiw не поддерживается камнем, а dec работает с регистром, как с 8 разрядным (по крайней мере у меня).
SpyBot
Mar 14 2006, 07:53
Здесь видимо все придется делать вручную - например для уменьшения на единицу несколько байтного числа надо уменьшить на единицу младший байт, затем проверить флаг N, и если он установлен (младший байт в результате вычитания "перешел" через ноль и стал отрицательным), то уменьшить на единицу следующий байт и т.д.
Сравнение тоже просто - сначала сравниваем, например, старшие байты и если они равны, то младшие.
А если так:
;приращение на единицу
inc zl
brne a
inc zh
a:
;вычитание единицы
dec zl
brne b
dec zh
b:
;сравнение c 0x4536
inc zl
brne в
inc zh
в: cpi zh,0x45
brne no_equ
cpi zl,0x36
brne no_equ
equ:
.....
no_equ:
......
;считать?!
; если из памяти то lpm ?!
; если из регистров то непонятен вопрос..
;Удачи
SpyBot
Mar 14 2006, 08:15
не, имхо brne не катит - при увеличении надо проверять флаг V, а при уменьшении N.
"не, имхо brne не катит - при увеличении надо проверять флаг V, а при уменьшении N"
..?! :-)
Команды dec, inc, влияют на флаг нуля! если результат операции равен нулю(а в этом примере это так!), то brne "отреогирует" правильно!!! ( для понятности вставте между inc и brne команду cpi zl,0 и все встанет на свои места, в смысле станет понятно!).
зы: это рабочий код... можете проверить...
SpyBot
Mar 14 2006, 08:51
так нам же нужен не 0, а именно переход через ноль
т.е. если zl = 1, вычитаем 1 и при zl = 0 происходит уменьшение старшего байта. Но это же неправильно, т.к. это уменьшение должно происходить когда zl = 0xff.
viakon
Mar 14 2006, 09:15
декремент
subi zl,1
sbci zh,0
инкремент
subi zl,255
sbci zh,255
сравнение c const
ldi r16, high(const)
cpi zl, low(const)
cpc zh,r16
далее условие какое нужно
"
так нам же нужен не 0, а именно переход через ноль
т.е. если zl = 1, вычитаем 1 и при zl = 0 происходит уменьшение старшего байта. Но это же неправильно, т.к. это уменьшение должно происходить когда zl = 0xff
"
ПАСИБА за замечание недоглядел!

(просто при копировании из своей проги редактировал..невнимательно) Абсолютно справедливо..исправляю

:
;вычитание единицы
dec zl
cpi zl,0xff
brne b
dec zh
b:
SpyBot
Mar 14 2006, 09:30
Если не принимать во внимание наиболее правильный вариант viakon'a и то, что правильнее будет не 0xff, a 0xfe, то лучше использовать команду brvc.
viakon -

согласен.
" то лучше использовать команду brvc". Поясните пож-та чем "лучше" и чем "правильнее"?
Э, позвольте, а нафига на T15 работать с Z, как с 16-бит? Разве что для LPM, потому как озу там одни регистры

, но для LPM как-то круто: +, - и т.д.???
Кстати, не забывайте, что комманда LD Rx,Z и подобные запарывают ZH - так написано в пдф.
Pyku_He_oTTyda
Mar 14 2006, 10:16
Спасибо за ответы!
Вечером буду смотреть, что более удобным покажется.
Цитата
считать полученное значение.
по инерции чушь написал, счас сотру
Регистр нужен мне для длинной задержки по времени
SpyBot
Mar 14 2006, 10:34
Цитата(add @ Mar 14 2006, 12:37)

viakon -

согласен.
" то лучше использовать команду brvc". Поясните пож-та чем "лучше" и чем "правильнее"?
Прошу прощения за ошибку.
viakon
Mar 14 2006, 11:09
Цитата(Pyku_He_oTTyda @ Mar 14 2006, 15:16)

Регистр нужен мне для длинной задержки по времени
используй таймер
У атмела чтото в апнотах было типа long time delay.
Pyku_He_oTTyda
Mar 14 2006, 11:16
вот и хочу: время от таймера максимум 0,4 сек*65535 около 7 часов, так много мне не надо, но и 8 разрядов не хватает...
апноты обязательно посмотрю, спасибо за наводку
Цитата(Pyku_He_oTTyda @ Mar 14 2006, 12:16)

Регистр нужен мне для длинной задержки по времени
А почему обязательно Z? Можно 2 ЛЮБЫХ регистра... Или по инерции?
Pyku_He_oTTyda
Mar 14 2006, 12:13
второе
Pyku_He_oTTyda
Mar 15 2006, 08:37
Спасибо всем! Все получилось
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.