Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> задача по MK51, вычислить среднее арифметическое 
:(
    Опции темы
:)PROD[;
  Дата 3.12.2006, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 4.4.2005
Где: Томск Россия

Репутация: нет
Всего: нет



Здравствуйте.
Дали задание – написать на ассемблере программу для МК51 (эмулятор AVSim51).
Задача: поместить в регистр B среднее арифметическое массива 8-ми разрядных двоичных чисел в адресах 20H-2FH.

Все бы хорошо, но при сложении 16ти однобайтных чисел (если брать максимально-допустимое для них значение) может получиться 12ти разрядное число, и напрямую командой DIV AB его не разделить.
Есть идея перевести сумму из двоичной в двоично-десятичную систему, записать в DPTR (тысячи и сотни в DPH,а десятки и единицы в DPL), потом их обратно в двоичную систему и уже потом делить по частям. Вот только программка получается уж больно здоровой.
Нет ли более простого способа решить?
Заранее спасибо
PM   Вверх
LessNik
Дата 4.12.2006, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 20.2.2006

Репутация: 1
Всего: 1



Самый простой способ - написать на Cи, а потом в листинге посмотреть ассемблерный код и сказать, что мол типа сам написал smile Ну а если очень хочется написать самому на ассемблере, то можешь сначала делить каждое число на знаменатель, а уж потом складывать. (x1+x2+x3+...+xn)/n=x1/n +x2/n +x3/n + ... + x4/n. Справишься байтовыми регистрами.


Цитата(:)PROD[; @  3.12.2006,  22:00 Найти цитируемый пост)
Есть идея перевести сумму из двоичной в двоично-десятичную систему, записать в DPTR (тысячи и сотни в DPH,а десятки и единицы в DPL), потом их обратно в двоичную систему и уже потом делить по частям


Чё-то ты намудрил.
PM MAIL   Вверх
maxim1000
Дата 4.12.2006, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



Цитата(LessNik @  4.12.2006,  09:00 Найти цитируемый пост)
(x1+x2+x3+...+xn)/n=x1/n +x2/n +x3/n + ... + x4/n

если деление нацело (а оно нацело), то массив из (к примеру) 2-ек даст среднее 0, что не очень хорошо

в данном случае количество элементов 16, так что деление можно заменить сдвигом
если есть возможность работать с 16-разрядным аккумулятором, и вытащить из него биты 4..11, то, пожалуй, это - оптимальный вариант

если можно работать только с байтами, то подойдёт такое (модификация предложенного "поразрядного способа", только используется 16-ричная система - оптимальнее получается):

отдельно усредняем старшие: сначала сдвигаем их на 4 вниз (это можно сделать без потерь, т.к. у старших четвёрок младшие 4 бита нулевые), а потом складываем

отдельно усредняем младшие - просто складываем (переполнения не будет) и сдвигаем вниз на 4 (потери будут, но как раз от этих потерь никак не избавиться)

ну и складываем результаты


--------------------
qqq
PM WWW   Вверх
:)PROD[;
Дата 5.12.2006, 06:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 4.4.2005
Где: Томск Россия

Репутация: нет
Всего: нет



задача решена.
загоняем сумму 16ти элементов в DPTR и сдвигаем на 4 бита влево. либо обмениваем тетрады по принципу  
SWAP DPL
ANL DPL,#00FF
SWAP DPH
ANL DPH,#FF00
ORL DPH,DPL

идея LessNik возможно неплоха для Си, на асме либо будет давать большие погрешности, либо не будет работать вообще.

Всем спасибо smile 

Это сообщение отредактировал(а) :)PROD[; - 5.12.2006, 06:29
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0618 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.