Перейти к содержанию
    

Как правильно работать с шестнадцатиразрядным Z регистром в ATtiny15 на асм? В принципе интересует несколько команд:

приращение на 1, вычитание 1, сравнить с заданным значением.

 

Не приходилось работать с 16, кроме как вычитание в S2313, но здесь команда sbiw не поддерживается камнем, а dec работает с регистром, как с 8 разрядным (по крайней мере у меня). :help:

Изменено пользователем Pyku_He_oTTyda

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здесь видимо все придется делать вручную - например для уменьшения на единицу несколько байтного числа надо уменьшить на единицу младший байт, затем проверить флаг 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 ?!

; если из регистров то непонятен вопрос..

 

;Удачи

Изменено пользователем add

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"не, имхо brne не катит - при увеличении надо проверять флаг V, а при уменьшении N"

..?! :-)

Команды dec, inc, влияют на флаг нуля! если результат операции равен нулю(а в этом примере это так!), то brne "отреогирует" правильно!!! ( для понятности вставте между inc и brne команду cpi zl,0 и все встанет на свои места, в смысле станет понятно!).

зы: это рабочий код... можете проверить...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так нам же нужен не 0, а именно переход через ноль

т.е. если zl = 1, вычитаем 1 и при zl = 0 происходит уменьшение старшего байта. Но это же неправильно, т.к. это уменьшение должно происходить когда zl = 0xff.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

декремент

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

"

ПАСИБА за замечание недоглядел! :ohmy: (просто при копировании из своей проги редактировал..невнимательно) Абсолютно справедливо..исправляю :rolleyes: :

 

;вычитание единицы

dec zl

cpi zl,0xff

brne b

dec zh

b:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если не принимать во внимание наиболее правильный вариант viakon'a и то, что правильнее будет не 0xff, a 0xfe, то лучше использовать команду brvc.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

viakon - :biggrin: :a14: согласен.

 

" то лучше использовать команду brvc". Поясните пож-та чем "лучше" и чем "правильнее"?

Изменено пользователем add

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Э, позвольте, а нафига на T15 работать с Z, как с 16-бит? Разве что для LPM, потому как озу там одни регистры ;), но для LPM как-то круто: +, - и т.д.???

 

Кстати, не забывайте, что комманда LD Rx,Z и подобные запарывают ZH - так написано в пдф.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответы!

Вечером буду смотреть, что более удобным покажется.

считать полученное значение.

по инерции чушь написал, счас сотру

 

Регистр нужен мне для длинной задержки по времени

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

viakon - :biggrin: :a14: согласен.

 

" то лучше использовать команду brvc". Поясните пож-та чем "лучше" и чем "правильнее"?

Прошу прощения за ошибку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Регистр нужен мне для длинной задержки по времени

 

используй таймер

 

У атмела чтото в апнотах было типа long time delay.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот и хочу: время от таймера максимум 0,4 сек*65535 около 7 часов, так много мне не надо, но и 8 разрядов не хватает...

апноты обязательно посмотрю, спасибо за наводку

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...