[an error occurred while processing this directive]
Умножать можно по-разному
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Oldring 28 августа 2002 г. 11:35
В ответ на: Ответ: Демонстрируйте, а мы с благоговейным трепетом будем лицезреть сие чудо. отправлено trainer 27 августа 2002 г. 22:07

Аргумент - в r16
Результат - в r18 - число от 1 до 100, равное round(r16 * 100 / 256)

ldi 17, 28
ldi r18, 0
loop: subi r17, LOW(-100)
sbci r18, HIGH(-100)
subi r16, 1
brnc loop

Не компилировал и на симуляторе не прогонял - но не думаю, что есть серьезные ошибки, кроме текстуальных. Все-таки несколько месяцев на ассемблере AVR уже не писал :)

Чтобы получить две десятичные цифры в двух регистрах в двоичном представлении или в виде ASCII кодов

Аргумент - в r16
Результат - в r18 - младшая цифра, в r19 - старшая

ldi r17, 28
ldi r18, LOW(-10)
ldi r19, 0 ; '0' для ASCII
loop: subi r17, LOW(-100)
sbci r18, HIGH(-100)
brne skipHDigit
ldi r18, LOW(-10)
inc r19
skipHDigit:
subi r16, 1
brnc loop
subi r18, LOW(-10) ; LOW(-'0' - 10) для ASCII

Ах, да... В последнем алгоритме страшая цифра будет равна 10 (или '9'+1, уж не помню, какой там символ), если на индикатор нужно вывести 100%. Что поделаешь, неувязочка, но не слишком принципиальная - проанализировать цифру на равенство 10 после алгоритма проще, чем тащить третий регистр внутрь цикла, дополнительный код тривиален. Да и ведущие нули все равно гасить нужно.

У последнего алгоритма максимальное время выполнения - 1805 циклов. Это, конечно, сильно больше, чем при побитовом умножении, но все равно сильно меньше, чем время реакции глаза при всех разумных тактовых частотах. :)

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru