15. Генерируем звук!



Автор: WildCat

Генерирование звука в Bascom

Самый простой способ извлечь звук из нашего подопытного - подключить к нему одной лапкой динамик (через резистор!), а второй - подключить динамик к земле. После этого воспользуемся командой "Голос!" (Sound):

Sound Portpin, Soundtime, High/Low-time
где Soundtime - число импульсов, а High/Low-time - длительность этих импульсов. На самом деле, в справке Bascom об этом сказано не очень понятно и подробно.
Пример:
Sound, Portb.0, 100, 500
издаст звук частотой примерно 600 Гц и длительностью примерно 120 мс:



Как видите, вам придется поэкспериментировать с параметрами этой команды. Но если вам нужны точные частоты, используйте функции таймера.

Очевидным применением такой программы является генератор кодов Морзе:



Вот её код: sendmorse.bas
(программа достаточно длинная, чтобы приводить здесь её листинг)

Скорость передачи, высота тона и длительность символов зависит от константы Speed. В данном случае не было необходимости точно рассчитывать все значения. Вроде звучит нормально, и ладно.
Таблица "знакогенератора" находится в блоке данных Morse_alfaber. Собственно, программа при работе делает Lookupstr, чтобы получить код Морзе для очередного символа из передаваемой строки. Она перебирает все символы по очереди и при этом издает "точки" и "тире". Символ "<" означает, что между окружающими его символами не нужно делать паузу при передаче. Это применяется в передаче спецсимволов "KA" и "SK", означающими "Начало передачи" и "Конец передачи" соответственно. Эти спецсимволы передаются слитно, без паузы между буквами.

Синтез тонов DTMF

Двухтональный многочастотный сигнал - Dual Tone Multi-Frequency (DTMF) - используется в телефонии для передачи набираемых на клавиатуре телефона символов, а в радиолюбительских приложениях - для управления, например, репитерами. Это такая система передачи данных, когда складываются два синусоидальных сигнала с разной частотой и результат пересылается приемнику. Такая система кодирования применяется в аналоговых линиях связи, т.к. обладает высокой помехоустойчивостью.
Bascom умеет самостоятельно генерировать DTMF тона:
Dtmfout, Dtmfcode, Dtmftime
Здесь Dtmfcode - десятичное число от 0 до 15, а Dtmftime - длительность передаваемого сигнала в миллисекундах. Как вариант, можно использовать такой код:
Dtmfout, String, Dtmftime
Он перебирает все символы из переменной String и генерирует последовательность тонов.
Приведем пример, отсылающий все 16 DTMF-кодов:
dtmf.bas
$regfile = "2313def.dat"
$crystal = 4000000

Dim Counter As Byte

Enable Interrupts

Do
  For Counter = 0 To 15
    Dtmfout Counter , 500
    Waitms 250
  Next Counter
  Wait 1
Loop

End
Команда Dtmfout использует Timer1 и генерирует прерывания, поэтому вы не можете использовать Timer1 в других прерываниях.
Соответственно, сигнал снимается с вывода OC1, для AT90S2313 это PortB.3 (15 нога).

Как видите, двухтоновой синтез очень прост, и вы можете легко разработать систему радиоуправления на 16 каналов. Также несложно сделать DTMF-декодер на Bascom, для этого нужен микроконтроллер с АЦП и немножко мозгов. А подключив стандартную клавиатуру 4x4 (как об этом рассказывалось раньше) и динамик, вы получите отличный Bluebox.



DECADALAB ALFA