Страница 1 из 1
Деление регистра на const | определение процента
Добавлено: Вт мар 30, 2010 12:12:22
AladoR
Приветствую.
Прошу помочь в создании простенькой программы (даже части программы).
Имеется регистр, в котором записано число (1 Байт).
[Задача 1] Требуется определить процент этого числа от максимального. То есть допустим в регистре содержится число 130. Максимальное значение регистра - 255. нужно определить, сколько процентов число 130 составляет от 255.
[Задача 2] Ну или хотя бы помогите с написанием деления этого регистра на 100 и 10. Мне требуется вывести значение этого регистра на индикаторы. Для этого мне нужно вывести его в процентном соотношении [задача 1] или в абсолютном [задача 2]. Для этого, как я понимаю, нужно разделить число на 100 и вывести на один индикатор сотни, потом разделить это число на 10 и вывести на индикатор десятки... Так, я немного запутался..

В общем, помогите, плз, с делением регистра на константу и выводом числа на индикаторы.
P.S. Assembler я знаю довольно плохо...
P.P.S. Да, забыл уточнить, разрабатывается устройство на основе МК51, программирую на Асемблере. Такое задание дано на курсовик, поэтому программировать на C, использовать другой МК уже не буду, так как курсовик почти доделан...
Re: Деление регистра на const | определение процента
Добавлено: Вт мар 30, 2010 12:16:10
SII
Хоть бы написали, для какого процессора -- ассемблеры-то разные у разных архитектур. Если для 8-разрядных AVR, то можно попробовать сие:
Код: Выделить всё
; =======================
;
; Беззнаковое деление двухбайтовой величины на байт
;
; =======================
;
; Параметры:
;
; R17:R16 - делимое
; R18 - делитель
;
; Возвращаемый результат:
;
; C=1 - ошибка
; C=0 - деление выполнено
; R16 - частное
; R17 - остаток
;
; Изменяемые регистры: R16, R17, R19
DivByte:
ldi R19, 8
cp R18, R17
brlo _DB40
breq _DB40
_DB10: rol R16
rol R17
brcs _DB20
cp R18, R17
brlo _DB20
brne _DB30
_DB20: sub R17, R18
sec
_DB30: dec R19
brne _DB10
rol R16
ret
_DB40: sec
ret
Пы.Сы. Если работаете с микроконтроллерами, ассемблер знать обязательно, и знать достаточно хорошо

Re: Деление регистра на const | определение процента
Добавлено: Вт мар 30, 2010 12:25:03
AladoR
)) Не успел внести изменение в первый пост с уточнением, как уже ответ появился. Спасибо, вечерком буду разбираться...
А вышенаписанный код подойдет для Асемблера МК51? Или только AVR? Просто некоторые команды мне пока незнакомы.
P.S. Ассемблер не знаю. потому что в принципе я не работаю с МК, курсовик надо сделать... После этого не думаю, что буду с ними работать. Но в процессе разработки устройства заинтересовался программированием на Ассемблере, так что может быть буду разбираться более углубленно...
Re: Деление регистра на const | определение процента
Добавлено: Вт мар 30, 2010 13:17:07
SII
У каждой архитектуры -- своя система команд, а значит, свой ассемблер. Посему этот код на 8051 не пойдёт. Кстати говоря, если склероз не изменяет (работал с ними чуть ли не 20 лет назад), у 8051 была команда деления...
Ну а будете работать в дальнейшем или нет -- это заранее сказать сложно. Да и знания совсем уж лишними не бывают -- хотя б для общего развития и всё такое

Re: Деление регистра на const | определение процента
Добавлено: Ср мар 31, 2010 01:27:00
AladoR
_noise писал(а):По таблице.
а подробнее можно? ))
_noise писал(а):Алгоритм - другое. Он тоже не знается, но придумывается.
вот мне как раз и нужен алгоритм деления регистра на число...
Буду благодарен, если кто подскажет. Именно на Асемблере МК51
Re: Деление регистра на const | определение процента
Добавлено: Ср мар 31, 2010 12:05:52
MisterDi
Самый простой в данном случае алгоритм это подсчитать в цикле количество вычитаний делителя из делимого.
Re: Деление регистра на const | определение процента
Добавлено: Ср мар 31, 2010 14:29:04
NiTr0
MisterDi писал(а):Самый простой в данном случае алгоритм это подсчитать в цикле количество вычитаний делителя из делимого.
На 8051 как раз самый простой способ - поделить соответствующей инструкцией... Хотя, если макс. значение = 255, и нужно узнать текущее в % - нужно всего лишь умножить текущее на 100, и взять старший байт (т.е. результат фактически делится на 256).
Re: Деление регистра на const | определение процента
Добавлено: Чт апр 01, 2010 00:35:10
stas00n
AladoR писал(а):
[Задача 1] Требуется определить процент этого числа от максимального. То есть допустим в регистре содержится число 130. Максимальное значение регистра - 255. нужно определить, сколько процентов число 130 составляет от 255.
А не пойдет, в данном случае, 130/256? Тогда делить ничего не нужно, да и вообще ничего не нужно делать - входные данные и есть результат (дробь х/256), просто запятая ставится перед старшим разрядом, а чтобы получить проценты - множим на 100; команда умножения в 8051 наверняка есть.
AladoR писал(а):
[Задача 2] Ну или хотя бы помогите с написанием деления этого регистра на 100 и 10. Мне требуется вывести значение этого регистра на индикаторы. Для этого мне нужно вывести его в процентном соотношении [задача 1] или в абсолютном [задача 2]. Для этого, как я понимаю, нужно разделить число на 100 и вывести на один индикатор сотни, потом разделить это число на 10 и вывести на индикатор десятки... Так, я немного запутался..

В общем, помогите, плз, с делением регистра на константу и выводом числа на индикаторы.
Чтобы вывести число на индикатор, нужно преобразовать его из двоичного кода в двоично-десятичный. Делается это на асме также безо всякого деления, только сложением-вычитанием-сравнением. Такие подпрограммы называются навроде "bin2bcd", наверняка есть типовые и для 8051.
Re: Деление регистра на const | определение процента
Добавлено: Чт апр 01, 2010 01:01:17
stas00n
А вообще, деление на константу лучше заменять умножением на обратную величину, т.к. умножение выполняется быстрее.
Например,
183/17 = 183*(1/17);
1/17≈15/256;
183/17≈183*15/256;
в двоичном представлении будет так:
10110111/00010001≈10110111*.00001111=00001010.10111001;
С восьмибитными числами грубовато получается, лучше взять двухбайтовую константу - для практических задач достаточно будет, если, конечно, не калькулятор пишем.
Re: Деление регистра на const | определение процента
Добавлено: Чт апр 01, 2010 16:54:16
GP1
Если кому интересно, у Светы на сайте лежит книжка Ревича (точное название не помню, что типа такого) "Практическое программирование на языке ассемблера для AVR", там очень подробно разжевано про деление/умножение многоразрядных чисел и масштабирование данных.
Re: Деление регистра на const | определение процента
Добавлено: Чт апр 01, 2010 17:56:07
stas00n
Если книжка - не корявый перевод аппноутов, то интересно, можно ссылочку?
Re: Деление регистра на const | определение процента
Добавлено: Чт апр 01, 2010 18:59:33
GP1
я же написал:
у Светы на сайте...
Света - для тех кто не в курсе, один из наших модераторов

Re: Деление регистра на const | определение процента
Добавлено: Чт апр 01, 2010 19:07:44
stas00n
[flood]
Я же вроде ссылку спрашивал, а не "кто такая Света?"

[/flood]
Re: Деление регистра на const | определение процента
Добавлено: Чт апр 01, 2010 19:24:48
GP1
Re: Деление регистра на const | определение процента
Добавлено: Пт апр 02, 2010 13:46:50
AladoR
Всем спасибо за советы! буду изменять программу.. Вчера преподу отнес курсовик, но он на прогу даже не посмотрел почти... Сейчас вот сижу, переделываю схему электрическую принципиальную. Всегда ненавидел черчение! ))) Так что если время останется, то внесу в программу нормальный алгоритм деления.
P.S. Почитаю заодно Светины книжки )))