Деление регистра на const | определение процента

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Родился
Сообщения: 10
Зарегистрирован: Вт окт 13, 2009 16:17:04
Откуда: Санкт-Петербург

Сообщение AladoR »

Приветствую.

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

P.S. Assembler я знаю довольно плохо...
P.P.S. Да, забыл уточнить, разрабатывается устройство на основе МК51, программирую на Асемблере. Такое задание дано на курсовик, поэтому программировать на C, использовать другой МК уже не буду, так как курсовик почти доделан...
Последний раз редактировалось AladoR Вт мар 30, 2010 12:20:16, всего редактировалось 1 раз.
Люди уходят из моей жизни. Люди вторгаются в мою жизнь. А я просто допиваю кофе, одеваю кеды, вставляю наушники и иду по жизни дальше.
Реклама
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Сообщение 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
Пы.Сы. Если работаете с микроконтроллерами, ассемблер знать обязательно, и знать достаточно хорошо ;)
Реклама
Родился
Сообщения: 10
Зарегистрирован: Вт окт 13, 2009 16:17:04
Откуда: Санкт-Петербург

Сообщение AladoR »

)) Не успел внести изменение в первый пост с уточнением, как уже ответ появился. Спасибо, вечерком буду разбираться...

А вышенаписанный код подойдет для Асемблера МК51? Или только AVR? Просто некоторые команды мне пока незнакомы.

P.S. Ассемблер не знаю. потому что в принципе я не работаю с МК, курсовик надо сделать... После этого не думаю, что буду с ними работать. Но в процессе разработки устройства заинтересовался программированием на Ассемблере, так что может быть буду разбираться более углубленно...
Люди уходят из моей жизни. Люди вторгаются в мою жизнь. А я просто допиваю кофе, одеваю кеды, вставляю наушники и иду по жизни дальше.
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Сообщение SII »

У каждой архитектуры -- своя система команд, а значит, свой ассемблер. Посему этот код на 8051 не пойдёт. Кстати говоря, если склероз не изменяет (работал с ними чуть ли не 20 лет назад), у 8051 была команда деления...

Ну а будете работать в дальнейшем или нет -- это заранее сказать сложно. Да и знания совсем уж лишними не бывают -- хотя б для общего развития и всё такое :)
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 10
Зарегистрирован: Вт окт 13, 2009 16:17:04
Откуда: Санкт-Петербург

Сообщение AladoR »

_noise писал(а):По таблице.
а подробнее можно? ))
_noise писал(а):Алгоритм - другое. Он тоже не знается, но придумывается.
вот мне как раз и нужен алгоритм деления регистра на число...
Буду благодарен, если кто подскажет. Именно на Асемблере МК51
Люди уходят из моей жизни. Люди вторгаются в мою жизнь. А я просто допиваю кофе, одеваю кеды, вставляю наушники и иду по жизни дальше.
Реклама
Встал на лапы
Сообщения: 85
Зарегистрирован: Сб мар 13, 2010 13:52:10

Сообщение MisterDi »

Самый простой в данном случае алгоритм это подсчитать в цикле количество вычитаний делителя из делимого.
misterdi<@>i.ua
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3051
Зарегистрирован: Пт авг 10, 2007 12:49:55
Откуда: kr.ua

Сообщение NiTr0 »

MisterDi писал(а):Самый простой в данном случае алгоритм это подсчитать в цикле количество вычитаний делителя из делимого.
На 8051 как раз самый простой способ - поделить соответствующей инструкцией... Хотя, если макс. значение = 255, и нужно узнать текущее в % - нужно всего лишь умножить текущее на 100, и взять старший байт (т.е. результат фактически делится на 256).
Контактная информация:
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Сообщение stas00n »

AladoR писал(а): [Задача 1] Требуется определить процент этого числа от максимального. То есть допустим в регистре содержится число 130. Максимальное значение регистра - 255. нужно определить, сколько процентов число 130 составляет от 255.
А не пойдет, в данном случае, 130/256? Тогда делить ничего не нужно, да и вообще ничего не нужно делать - входные данные и есть результат (дробь х/256), просто запятая ставится перед старшим разрядом, а чтобы получить проценты - множим на 100; команда умножения в 8051 наверняка есть.
AladoR писал(а): [Задача 2] Ну или хотя бы помогите с написанием деления этого регистра на 100 и 10. Мне требуется вывести значение этого регистра на индикаторы. Для этого мне нужно вывести его в процентном соотношении [задача 1] или в абсолютном [задача 2]. Для этого, как я понимаю, нужно разделить число на 100 и вывести на один индикатор сотни, потом разделить это число на 10 и вывести на индикатор десятки... Так, я немного запутался.. :) В общем, помогите, плз, с делением регистра на константу и выводом числа на индикаторы.
Чтобы вывести число на индикатор, нужно преобразовать его из двоичного кода в двоично-десятичный. Делается это на асме также безо всякого деления, только сложением-вычитанием-сравнением. Такие подпрограммы называются навроде "bin2bcd", наверняка есть типовые и для 8051.
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Сообщение stas00n »

А вообще, деление на константу лучше заменять умножением на обратную величину, т.к. умножение выполняется быстрее.
Например,
183/17 = 183*(1/17);
1/17≈15/256;
183/17≈183*15/256;
в двоичном представлении будет так:
10110111/00010001≈10110111*.00001111=00001010.10111001;
С восьмибитными числами грубовато получается, лучше взять двухбайтовую константу - для практических задач достаточно будет, если, конечно, не калькулятор пишем.
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

Если кому интересно, у Светы на сайте лежит книжка Ревича (точное название не помню, что типа такого) "Практическое программирование на языке ассемблера для AVR", там очень подробно разжевано про деление/умножение многоразрядных чисел и масштабирование данных.
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Сообщение stas00n »

Если книжка - не корявый перевод аппноутов, то интересно, можно ссылочку?
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

я же написал:
у Светы на сайте...
Света - для тех кто не в курсе, один из наших модераторов :)))
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Сообщение stas00n »

[flood]
Я же вроде ссылку спрашивал, а не "кто такая Света?" :)
[/flood]
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

Понимаю, кот должен быть ленивым по определению :)))
http://svetlana-06-89.mylivepage.ru/wik ... ллеры_и_ПК
http://narod.ru/disk/5333767000/Ревич-П ... .djvu.html
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Родился
Сообщения: 10
Зарегистрирован: Вт окт 13, 2009 16:17:04
Откуда: Санкт-Петербург

Сообщение AladoR »

Всем спасибо за советы! буду изменять программу.. Вчера преподу отнес курсовик, но он на прогу даже не посмотрел почти... Сейчас вот сижу, переделываю схему электрическую принципиальную. Всегда ненавидел черчение! ))) Так что если время останется, то внесу в программу нормальный алгоритм деления.

P.S. Почитаю заодно Светины книжки )))
Люди уходят из моей жизни. Люди вторгаются в мою жизнь. А я просто допиваю кофе, одеваю кеды, вставляю наушники и иду по жизни дальше.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»