Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
206 Часть 11. Программирование микроконтроллеров АVR на ассемблере ; деление на 64 clr count data ; счетчик до 6 div64 L : l sr dataH ; сдвинули старший вправо ror dataL ; сдвинули младший с переносом inc count data cpi count_data , 6 ; всего 6 раз ( сдвиг на 6 разрядов ) brne div64L Не правда ли, гораздо изящнее и понятнее, чем деление «в лоб»? О перации с вещественными числами Усвоив такой прием, попробуем на радостях решить задачку, которая на первый взгляд требует, по крайней мере, знания высшей алгебры - умножить некое число на вещественный коэффициент (число с «плавающей запятой»). Теоретически для этого требуется представить исходные числа в виде «мантисса-порядок», сложить порядки и перемножить мантиссы (см. разд. «Отрицательные и вещественные числа вМК» в конце этой главы). Нам же неохота возиться с этим представлением, т. к. мы не проектируем универсальный компьютер, и в подавляющем большинстве реальных задач все конечные результаты у нас являются целыми числами (запятая в электронных схемах с индикацией результатов устанавливается на нужном месте принудительно). На самом деле эта задача решается очень просто, если ее свести к последователь ному умножению и делению целых чисел, представив реальное число в виде целой дроби с оговоренной точностью. Например, число 0,48576 можно представить как 48 576/ 1 00 ООО. И если нам требуется на такой коэффициент умножить, к примеру, результат какого-то измерения, равный 976, то можно действовать, не выходя за рамки диапазона целых чисел: сначала умножить 976 на 48 576 (получится заведо мо целое число 47 4 1 0 1 76), а потом поделить результат на 1 0 5 , чисто механически перенеся запятую на пять разрядов. Получится 474, 1 0 1 76 или, если отбросить дробную часть, 474. Большая точность нам и не требуется, т. к. исходное число 976 имело три десятичных разряда. С числами в десятичном виде хорошо работать «руками», просто отсчитывая раз ряды. Нам же делить на сто тысяч в 8-разрядном МК крайне неудобно - представ ляете, насколько громоздкая процедура получится? Наше ноу-хау состоит в том, что мы, чтобы «вогнать» вещественное число в целый диапазон, воспользуемся не десятичной дробью, а двоичной, - деление тогда сведется к только что описанной механической процедуре сдвига, аналогичной переносу запятой в десятичном виде. Итак, чтобы умножить 976 на коэффициент 0,48576, следует сначала последний «вручную» умножить, например, на 2 1 6 = 65 536, и таким образом получить числи-
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==