• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Написание программ для MCS-51

  • Автор темы Автор темы wintechn
  • Дата начала Дата начала

wintechn

Новые
Регистрация
25 Янв 2017
Сообщения
15
Реакции
0
Баллы
0
Написание программ для MCS-51

Уважаемые форумчане.
Интересует вопрос касательно написания программы для микроконтроллера серии MCS-51 (конкретный тип микроконтроллера на данном этапе не интересует, он будет определяться в последующем).
В частности интересует написание следующих программ:
- программы арифметических операций (суммирование, вычитание, умножение и деление) чисел с плавающей и фиксированной запятой;
- программы двоично-десятичного преобразования чисел с плавающей и фиксированной запятой.
 
А чё тут думать?
Берём карандашик и пишем.
Или берём Протеус и запускаем в нём эту однокристалку.
Вопрос то в чём?
 
Вопрос то в чём?

Два варианта - либо человеку надо срочно сдать курсовую а он ни слухом ни духом в теме... либо человек хочет освоить работу с МК, а с какой стороны начать - пока не знает. Во втором случае надо помочь.

wintechn, каков ваш вариант?
 
Вопрос в том, что ранее с микроконтроллерами особо не стыкался, в основном на уровне изготовления устройств которые печатались в журналах. А то что я делал сам, то я обошелся масштабным усилителем в результате чего и избавился от проблемы с дробными числами. А теперь никак не получается, а вбивать таблицу результатов вычислений функции, возможным не вижу так как их больше максимально адресуемого объема ПЗУ.
 
усилителем в результате чего и избавился от проблемы с дробными числами. А теперь никак не получается

Здесь бы неплохо знать суть проблемы. Что за устройство делаете, хотя бы примерно. Почему именно х51 семейство. Что используется в качестве среды разработки (сильно подозреваю что ассемблер? - и опять же - почему именно?)

Вообще-то алгоритмы деления-умножения найти можно легко, как и примеры для конкретных процессоров. Но надо ли? Не проще использовать для разработки Си и не тратить время на "кирпичики", а заниматься собственно алгоритмом?

ЗЫ Сам начинал с ассемблера, просто в те времена компиляторов хороших не было еще. И с х51 работал и даже с х48. И уверенно скажу - не напишете вы на асме лучше, чем на Си. Ну, если эта программа чуть сложнее мигания светодиодом. Компиляторы нынче умные. Надежность программы и скорость разработки - на порядок выше.

А по "железу" - скажу, что нынче готовая плата с STM32 процессором стоит примерно доллара три, и за пятерку - USB-свисток - программатор и пошаговый отладчик на кристалле. И это 32-х разрядный проц с тактовой выше 50 МГц и просто необъятной периферией.
 
Вкратце в чем суть:

Есть физический процесс которым необходимо управлять, а для его контроля используется три измерительных датчика.

На основании показаний датчиков формируется два управляющих сигнала (которые определяются при помощи вычисления математических формул), а также необходимо производить индикацию определенных параметров.

Проблем с индикацией и формированием одного из двух управляющих сигналов нет.

А вот со вторым управляющим сигналом есть проблемы потому как диапазон управления лежит в диапазоне (0 . . . 10) В с дискретностью 10 мВ, да и зависимость нелинейная.
 
А вот со вторым управляющим сигналом есть проблемы потому как диапазон управления лежит в диапазоне (0 . . . 10) В с дискретностью 10 мВ, да и зависимость нелинейная.

Ну, получается, 1000 дискрет? Если зависимость известна, таблица для ШИМа, 1000 значений 2000 байт. Совсем несмертельно, по моему.

10 разрядов ШИМ - для х51 сходу не скажу, подзабыл я их уже, а на любой AVRке получить запросто. И float тут не нужен - таблицу можно рассчитать на компе.
 
Вкратце в чем суть:

Есть физический процесс которым необходимо управлять, а для его контроля используется три измерительных датчика.

На основании показаний датчиков формируется два управляющих сигнала (которые определяются при помощи вычисления математических формул), а также необходимо производить индикацию определенных параметров.

Проблем с индикацией и формированием одного из двух управляющих сигналов нет.

А вот со вторым управляющим сигналом есть проблемы потому как диапазон управления лежит в диапазоне (0 . . . 10) В с дискретностью 10 мВ, да и зависимость нелинейная.

Так и проблем то особых я не вижу.

Изначально задаемся, что имеем дело с числами с фиксированной частотой (я думаю так будет проще).

Если максимальный результат вычислений в отношении к целы лежит в пределах от 0 до 10, то, понятно, что достаточно одного байта для целых. Например, его можно определить ячейкой памяти данных 30h
А судя из дискретности то, для отображения дробной части, также с головой хватит одного байта. К продолжения примера, его можно определить ячейкой памяти данных 31h

Выполнение операций суммирования и вычитания тогда следует производить как для двухбайтных чисел.

В случае умножения также проблем никаких не вижу, достаточно использовать процедуру MUL AB: к примеру есть два числа X,x и Y,y (в приведенном обозначении большие буквы соответствуют целым а маленькие дробным) то всего навсего достаточно определить сумму по частным производным: X*Y + X*y + Y*x + x*y. Тогда, частные производные: X*Y - дают целые части ; X*y и Y*x - дают старший байт целую часть, а младший байт дробную часть; x*y - дает два байта дробной части, если достаточно точности до сотых, то младшую часть произведения можно просто откинуть.

В случае деления, его следует производить по всем правилам деления как и для целых чисел.

Касательно преобразования двоичного кода числа с фиксированной запятой в двоично-десятичное, то целые определяются путем двукратного деления байта целых на 10 (первое деление дает единицы, а второе сотни) (а в случае что итоговый результат как я понял не превышает 10 то второе деление и не нужно вообще). А дробная часть получается путем умножения байта дроби на 10, каждое такое умножение дает последующие значения десятые, сотые, тысячные и т. д..



А вообще можете изучить следующие книги по 51-м микроконтроллерам: Боборыкин А. В. Однокристальные микроЭВМ; Каспер Э. Программирование на языке Ассемблера для микроконтроллеров семейства i8051, в них найдете все необходимые примеры.
 
Назад
Сверху