Вопрос № 28141: Уважаемые Эксперты,раскажите,пожалуйста подробно, как вывести одновременно в контр.AT89C2051 ,на одну ногу 700 гц,на другую 900 гц, на третью 1100,...1300,...1500,...1700 гц . форма синус ,а если нет то цифра. Спасибо....Вопрос № 28150: Разбирался в программе, которая выводит список блоков памяти MS-DOS, по книжке Фролова. Но там код на С. Хотелось бы получить код на ассемблере. И желательно для вывода информации о блоке
использовать средства BIOS.
Разъяните подробно как написат...
Вопрос № 28.141
Уважаемые Эксперты,раскажите,пожалуйста подробно, как вывести одновременно в контр.AT89C2051 ,на одну ногу 700 гц,на другую 900 гц, на третью 1100,...1300,...1500,...1700 гц . форма синус ,а если нет то цифра. Спасибо.
Отправлен: 22.10.2005, 23:37
Вопрос задал: Pettimm (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: Bob Johnson
Здравствуйте, Pettimm!
Насколько я понимаю, такого количество таймеров в контроллере нет? Тогда частоты необходимо синтезировать. Формула синусоиды:
y = a*sin (2*pi*f*t), где
y - выходной сигнал,
a - амплитуда,
f - частота,
t - время.
Дальше создается цикл, который выводит на каждую ногу контроллера (а там цапы стоят?) выходной сигнал ("у" в формуле) и увеличивает значение времени t. Чем больше раз в секунду данный цикл сможет выполняться, чем больше будет частота дискретизации, а значит синусоиды получатся более качественными. Для синтеза частоты 1700 гц более менее синусоидальной формы необходимо, чтобы цикл мог выполняться хотя бы по 8 раз на один период сигнала (т.е. 1700*8 раз в секунду).
Естественно, что считать синус "на лету" слишком долго, поэтому на практике создают в памяти таблицу синуса. Удобно, чтобы ее размер был равен 2^n, где n - какое либо число, например 8. Формулу в приведенном мной виде опять же использовать нецелесообразно, т.к. всех этих умножений можно избежать. Вот пример на асме х86, под контроллер переведешь сам (см. приложение).
В программе используется 256-ти байтная таблица синуса, каждый байт которой представляет отдельное значение. переменная sin1pos содержит "позицию" первого генератора. Старшие 8 бит позиции отражают реальную позицию в таблице синуса, а младшие 24 используются для повышения точности синтезируемой частоты. Скорость sin1spd определяет выходную частоту и рассчитывается исходя из того, сколько раз в секунду будет выполняться данный цикл (на контроллере можно либо повесить его на прерывание, которое вызывать
с заданной частотой по таймеру, либо просто рассчитать скорость выполнения исходя из количества тактов требуемых для каждой команды и тактовой частоты (на спектруме можно было применять только второй вариант)). Если, например, ты хотел бы синтезировать частоту 1 Гц, а цикл выполнялся бы у тебя 256 раз в секунду, то скорость должна была бы быть равна 0х01000000. Если бы 512 раз в секунду - то 0х00800000 и т.п.
Приложение:
Ответ отправил: Bob Johnson (статус: Академик)
Отправлен: 23.10.2005, 18:34 Оценка за ответ: 5 Комментарий оценки: Приятно получать достаточно подробные ответы,но надо попробовать практически и думаю,что по этому поводу будут еще вопросы,ведь опыт пока не большой...Благодорю! Творческих вам успехов.
Вопрос № 28.150
Разбирался в программе, которая выводит список блоков памяти MS-DOS, по книжке Фролова. Но там код на С. Хотелось бы получить код на ассемблере. И желательно для вывода информации о блоке использовать средства BIOS.
Разъяните подробно как написать на ассемблере.
Отправлен: 23.10.2005, 00:27
Вопрос задал: Jnshish (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Юра Устинов
Здравствуйте, Jnshish!
Как я правильно понимаю, то для вывода информации о блоках памяти (А теперь внимательно) в ДОС, в BIOS не должно быть никаких функций. BIOS оправдывает своё название (Базавая система ввода вывода) и содержит только функции для работы с устройствами.
Насчёт инфы по блокам памяти:
До сих пор, если требовалось создать массив данных в памяти, мы просто обращались к памяти за концом программы, считая, что там есть еще хотя бы 64 килобайта свободной памяти. Разумеется, как и во всех операционных системах, в DOS есть средства управления распределением памяти — выделение блока (аналог стандартной функции языка С malloc), изменение его размеров (аналог realloc) и освобождение (free).
Функция DOS 48h — Выделить память
Ввод: АН = 48h
ВХ = размер блока в 16-байтных параграфах
Вывод: CF = 0, если блок выделен
АХ = сегментный адрес выделенного блока
CF = 1, если произошла ошибка:
АХ = 7 — блоки управления памятью разрушены
АХ = 8 — недостаточно памяти:
ВХ = размер максимального доступного блока
Эта функция с большим значением в ВХ (обычно FFFFh) используется для определения размера самого большого доступного блока памяти.
Функция DOS 49h — Освободить память
Ввод: АН = 49h
ES = сегментный адрес освобождаемого блока
Вывод: CF = 0, если блок освобожден
CF = 1:
АХ = 7, если блоки управления памятью разрушены,
АХ = 9, если в ES содержится неверный адрес
Эта функция не позволит освободить блок памяти, которым текущая программа не владеет, но с помощью функции DOS 50h (AX = 50h, ВХ = сегментный адрес PSP процесса) программа может «притвориться» любым другим процессом.
Функция DOS 4Ah — Изменить размер блока памяти
Ввод: АН = 4Ah
ВХ = новый размер в 16-байтных параграфах
ES = сегментный адрес модифицируемого блока
Вывод: CF = 0, если размер блока изменен
CF = 1:
АХ = 7, если блоки управления памятью разрушены,
АХ = 8, если не хватает памяти (при увеличении),
АХ = 9, если ES содержит неверный адрес
ВХ = максимальный размер, доступный для этого блока
Если для увеличения блока не хватило памяти, DOS увеличивает его до возможного предела.
При запуске СОМ-программы загрузчик DOS выделяет самый большой доступный блок памяти для этой программы, так что при работе с основной памятью эти функции требуются редко (в основном для того, чтобы сократить выделенный программе блок памяти до минимума перед загрузкой другой программы), но уже в MS-DOS 5.0 и далее с помощью этих же функций можно выделять память в областях UMB — неиспользуемых участках памяти выше 640 Кб и ниже 1 Мб, для этого требуется сначала подключить UMB к менеджеру памяти и изменить стратегию
выделения памяти с помощью функции DOS 58h.
Про UMB
Функция DOS 58h — Считать/изменить стратегию выделения памяти
Ввод: АН = 58h
AL = 00h — считать стратегию
AL = 01h — изменить стратегию
ВХ = новая стратегия
биты 2 – 0:
00 — первый подходящий блок
01 — наиболее подходящий блок
11 — последний подходящий блок
биты 4 – 3:
00 — обычная память
01 — UMB (DOS 5.0+)
10 — UMB, затем обычная память (DOS 5.0+)
AL = 02h — считать состояние UMB
AL = 03h — установить состояние UMB
ВХ = новое состояние: 00 — не используются, 01 — используются
Вывод: CF = 0, АХ = текущая стратегия для AL = 0, состояние UMB для AL = 2
CF = 1, AX = 01h, если функция не поддерживается (если не запущен менеджер памяти (например, EMM386) или нет строки DOS = UMB в CONFIG.SYS
Если программа изменяла стратегию выделения памяти или состояние UMB, она обязательно должна их восстановить перед окончанием работы
--------- Спасём Россию!!!
Ответ отправил: Юра Устинов (статус: 2-ой класс)
Отправлен: 23.10.2005, 15:55
Отвечает: Лысков Игорь Витальевич
Юра Устинов:
Что-то ты не то ответил...Человеку надо получить список MCB, А ты ему даешь команды для работы с блоками памяти. Близко, но не то :(
Здравствуйте, Jnshish!
Бери программку, когда-то баловался подобным. Кое-что сохранилось...
Она формирует файлик. Добавить вывод на экран средствами int 10h (читай средствами BIOS) - ну это уже сам потрудись...:)