Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2010, 19:02   #11
my_sappho_story
Пользователь
 
Аватар для my_sappho_story
 
Регистрация: 20.10.2010
Сообщений: 29
По умолчанию

Динамик есть. Но звуков не издает. Что делать? Кучу вариантов генерации звука уже перепробывала, но не получается.
Вот это нашла:
Код:
TITLE   SOUND   (COM) Процедура для генерации звука
SOUNSG  SEGMENT PARA 'Code'
        ASSUME  CS:SOUNG,DS:SOUNG,SS:SOUNG
        ORG     100H
BEGIN:  JMP     SHORT MAIN
; -------------------------------------------------------
DURTION DW      1000            ;Время звучания
TONE    DW      256H            ;Высота (частота) звука
; -------------------------------------------------------
MAIN    PROC    NEAR
        IN      AL,61H          ;Получить и сохранить
        PUSH    AX              ; данные порта
        CLI                     ;Запретить прерывания
        CALL    B10SPKR         ;Произвести звук
        POP     AX              ;Восстановить значение
        OUT     61H,AL          ; порта
        STI                     ;Разрешить прерывания
        RET
MAIN    ENDP

B10SPKR PROC    NEAR
B20:    MOV     DX,DURTION      ;Установить время звучания
B30:
        AND     AL,11111100B    ;Очистить биты 0 и 1
        OUT     61H,AL          ;Передать на динамик
        MOV     CX,TONE         ;Установить частоту
B40:
        LOOP    B40             ;Задержка времени
        OR      AL,00000010B    ;Установить бит 1
        OUT     61H,AL          ;Передать на динамик
        MOV     CX,TONE         ;становить частоту
B50:
        LOOP    B50             ;Задержка времени
        DEC     DX              ;Уменьшить время звучания
        JNZ     B30             ;Продолжать?
        SHL     DURTION,1       ; нет - увеличить время,
        SHR     TONE,1          ; сократить частоту
        JNZ     B20             ;Нулевая частота?
        RET                     ; да - выйти
B10SPKR ENDP

SOUNSG  ENDS
        END     BEGIN
и вот это
Код:
;---установка адресов портов
COMMAND_REG  EQU   43H     ;адрес командного регистра
CHANNEL_2    EQU   42H     ;адрес канала 2
             CALL  SET_COUNT  ;установка диапазона
              .
;---здесь программа работает, а затем требует случайное число
              .
             CALL  GET_NUMBER ;получение случайного числа
              .
              .

;---начинаем отсчет канала 2
SET_COUNT    PROC
             MOV   AL,10110110B   ;канал 2, режим 2, оба байта
             OUT   COMMAND_REG,AL ;посылаем в командный регистр
             MOV   AX,10000       ;значение счетчика
             OUT   CHANNEL_2,AL   ;посылаем младший байт
             MOV   AL,AH          ;передвигаем старший байт в AL
             OUT   CHANNEL_2,AL   ;посылаем старший байт
             RET
SET_COUNT    ENDP
;---получение случайного числа
READ_NUMBER  PROC
;---пересылаем значение счетчика в регистр задвижки
             MOV   AL,10000110B   ;требуемая команда
             OUT   COMMAND_REG,AL ;посылаем в командный регистр
;---читаем значение счетчика
             MOV   AL,10110110B   ;запрос на чтение/запись
             OUT   COMMAND_REG,AL ;посылаем запрос
             IN    AL,CHANNEL_2   ;получаем младший байт
             MOV   AH,AL          ;временно храним его в AH
             IN    AL,CHANNEL_2   ;получаем старший байт
             CALL  SET_COUNT      ;восстанавливаем задвижку
             SWAP  AH,AL          ;ставим байты на место
             RET                  ;теперь случайное число в AX
READ_NUMBER  ENDP
Но видимо мозгов почему-то не хватает((

Объясните, пожалуйта, популярно как двумя способами ( с помощью подпрограмм и с программируемого интервального таймера) можно сгенерировать звук данной частоты данной длительности.
my_sappho_story вне форума Ответить с цитированием
Старый 21.11.2010, 15:04   #12
my_sappho_story
Пользователь
 
Аватар для my_sappho_story
 
Регистрация: 20.10.2010
Сообщений: 29
По умолчанию

Почему в коде
Код:
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA 
.CODE
						;Установим режим таймера 
	mov AL,036h 		;A)Какал 2, режим 3, вид операции 3 
	out 4 3h,AL 		;BK регистр команд 
						;Установим частоту канала 2 таймера 
	mov АХ, 995 		;CI 193000 Гц/995=1200 Гц 
	out 42h,AL 			;D)Младший байт константы в порт 
	mov AL,AH 			;E)АЬ=старший байт константы 
	out 42h,AL 			;F)Старший байт константы в порт 
						;Зключим динамик и разрешим таймер 
	in AL,61h 			;GKведем содержимое порта 61h 
	or AL,3 			;(8)Установим биты 0 и 1 
	out 61h,AL 			;(9)Выведем в порт 
						;После задержки выключим динамик и запретим таймер 
	mov ECX,200000000	;A0)Задержка ~ 4 с 
	delay: db 67h 		;A1)Префикс изменения размера адреса 
	loop delay 			;A2)Цикл 
	and AL,11111100b	;A3)Сбросим в AL биты 0 и 1 
	out 61h,AL 			;A4)Выведем в порт 
	
MOV AH,4Ch
INT 21h
END
ошибки
Цитата:
Assembling file: stgz.asm
out 4 3h,AL ;BK ЁхушёЄЁ ъюьрэф
**Error** stgz.asm(8) Too few operands to instruction
out 4 3h,AL ;BK ЁхушёЄЁ ъюьрэф
*Warning* stgz.asm(8) Argument needs type override
mov └╒, 995 ;CI 193000 ├Ў/995=1200 ├Ў
**Error** stgz.asm(10) Too few operands to instruction
mov └╒, 995 ;CI 193000 ├Ў/995=1200 ├Ў
*Warning* stgz.asm(10) Argument needs type override
mov ECX,200000000 ;A0)╟рфхЁцър ~ 4 ё
**Error** stgz.asm(19) Undefined symbol: ECX
Error messages: 3
Warning messages: 2
Passes: 1
Remaining memory: 419k
Что изправить?
Очень прошу подсказать
my_sappho_story вне форума Ответить с цитированием
Старый 01.12.2010, 21:48   #13
my_sappho_story
Пользователь
 
Аватар для my_sappho_story
 
Регистрация: 20.10.2010
Сообщений: 29
По умолчанию

ошибок не находит, но и не кричит
Код:
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA 
.CODE
.386 
 
;Установим режим таймера 
mov AL,0B6h                        ;(1) Какал 2, режим 3, вид операции 3 
out 43h,AL                      ;(2) B регистр команд 
;Установим частоту канала 2 таймера 
mov AX, 995                        ;(3) 193000 Гц/995=1200 Гц 
out 42h,AL                      ;(4) Младший байт константы в порт 
mov AL,AH                       ;(5) АL=старший байт константы 
out 42h,AL                      ;(6) Старший байт константы в порт 
;Bключим динамик и разрешим таймер 
in AL,61h                       ;(7) Bведем содержимое порта 61h 
or AL,3                                    ;(8) Установим биты 0 и 1 
out 61h,AL                      ;(9) Выведем в порт 
;После задержки выключим динамик и запретим таймер 
mov ECX,200000000                  ;(10) Задержка ~ 4 с 
delay: db 67h                      ;(11) Префикс изменения размера адреса 
loop delay                      ;(12) Цикл 
and AL,11111100b                   ;(13) Сбросим в AL биты 0 и 1 
out 61h,AL                      ;(14) Выведем в порт 
 
MOV AH,4Ch
INT 21h
END
Почему?
my_sappho_story вне форума Ответить с цитированием
Старый 05.12.2010, 02:35   #14
my_sappho_story
Пользователь
 
Аватар для my_sappho_story
 
Регистрация: 20.10.2010
Сообщений: 29
По умолчанию

Код:
TIME:  MOV ECX, 13Eh
MET:   DEC ECX
          JNZ MET
          RET
13Eh получили из уравнения
Td=Tcall+Tmov+X*(Tdec+Tjnz)+Tret,
где Tcall и Tret – время выполнения команд вызова подпрограммы и возврата в нее, а Tmov, Tdec и Tjnz – время на выполнение команд, входящих в подпрограмму TIME
Td=τ(17+7+X(5+10)+10+5)
Td=τ(39+15X)
X=(Td/τ-39)/15
τ=1/f=1/1200=0,000833c
X=(4/0,000833-39)/15=318=13Eh

Чтобы подпрограмма работа 4 секунды и издавала звуки с частотой 1200Гц как нужно еще дооформлять код программы?
my_sappho_story вне форума Ответить с цитированием
Старый 05.12.2010, 15:54   #15
pas13
Новичок
Джуниор
 
Регистрация: 05.12.2010
Сообщений: 1
По умолчанию генерация звука

Товарсчи, нужна помощь. Задание такое:
Написать программу, которая читает символь¬ную строку специального вида и проигрывает ее как мелодию. Строка состоит из следующих элементов:
буквы, обозначающие ноты, ">" (повышение) или "<" (понижение) октавы, "1" и следующей за ним цифрой (от 0 до 9)-задает длитель-ность ноты, "p"-пауза, аналогично длительности.
Времени совсем нет, а у меня пока так:


Код:

; подпрограмма генерации звука
; Вход: (АХ)= частота звука в Гц
Sound proc near
mov bx,ax ;частота
mov ax, free
mov dx,frec+2 ;(dx:ax)=l 193180
div bx ;ax=(dx:ax)/bx
mov bx,a ;сохранить счетчик таймера
in al,61h ;разрешить счет канала 2
or al,3 ;и разрешить работу динамика
out 61h,a1
mov al,10110110b ;управляющее слово таймера: канал 2,
; режим 3, двоичное слово
out 43h,al ;вывод в регистр режима
mov а1,bl
out 42h,al ;младший байт счетчика
mov al,bh
out 42h,al ;старший байт счетчика
ret
freq dd 1193180
Sound endp
;Подпрограмма выключения звука
;
No_Sound proc near
push ax
in al,61h ;порт PB
and al,0fdh ;сброс битов 0,1
out 61h,al
pop ax ret
No_Sound endp


Пож-та, допишите так, чтоб соответствовало заданию, я просто не успеваю, сдача совсем близко...
pas13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программная работа со звуком _-Re@l-_ Общие вопросы Delphi 7 28.01.2011 11:49
Программная эмуляция джойстика overloaded0 Win Api 0 25.10.2008 00:02
программная работа с параметром Sack Microsoft Office Access 4 29.09.2008 11:22
Генерация звука N!ckeL Общие вопросы Delphi 1 19.06.2008 09:19
Генерация звука (assembler) SerGeO3x Помощь студентам 1 17.06.2008 19:01