Захотелось добавить в свой проект пищалку, благо ножки лишние есть. Пищит... Но где взять осмысленную инфу - формулы пересчёта и другое, чтобы выводить заданную частоту и длительность. А то мерять не больно хочется, ведь с разной частотой кварца будет и разная частота на выходе буззера...
Звук с помощью sound
Сообщений 1 страница 13 из 13
Поделиться22007-09-24 21:27:23
Там-же в хелпе вроде всё описано.
Sound PortX.X, Pulses, Period
Sound Speaker , 50 , 800
Pulses= количество импульсов (длительность)
Period= период в количестве тактов основного генератора
Поделиться32007-09-25 09:26:40
Хелп прочитал, но вот такой конкретный вопрос - какие Pulses и Period нужно поставить, чтобы получить звук 440 Герц в течении 1 секунды при частоте кварца 8 МГц?
Поделиться42007-09-25 10:44:52
Думаю так 8000000/440=период, соответственно 440 импульсов=1сек.
Sound Speaker , 440 , 18182
Провериш- отпишись.
Поделиться52007-09-25 14:26:47
Sound PortX.X, Pulses, Period
Получается такая картина:
Чем больше Period, тем меньше частота. При малых значениях уходит в ультразвук, при больших - в басы а затем щелчки.
Наверное, частоту следует считать как F=(1/8000000)* Period. А длительность звуковой посылки - F*Pulses. Осциллографа под рукой нет, но по слуху примерно так.
Поделиться62007-09-25 15:11:27
Мои значения пробовал подставлять?
Мне кажется так 8000000-количество тактов генератора в секунду. Значит, чтобы сгенерить частоту 440 Гц, нужно поделить частоту генератора на 440. Получаем период. А длительность равная секунде- это 440 импульсов.
Итог Период=F/440=18182. Это при условии, что процедура Sound не использует делителей.
С уважением Сергей Черников.
Поделиться72007-09-26 09:21:24
При таких значениях Sound Speaker , 440 , 18182 слышится рокот в несколько герц в течении примерно 12 сек. Если значения поменять местами, те же 12 сек звука, но намного выше - примерно сотни герц. Скорее всего процедура Sound выполняется за несколько тактов процессора. Чем меньше значение периода, тем выше частота с переходом в ультразвук, и чем больше значение - тем ниже частота с переходом в щелчки. Скорее всего значение период - это не делитель, а множитель. Т.е. при частоте 8000000 один такт происходит за 125 наносекунд, чтобы получить частоту например в 440 герц, нужно умножить 125 нс на значение Period и на количество тактов, необходимых для этой процедуры. Необходимо знать или опытным путём вычислить эту константу.
Поделиться82007-09-26 11:54:21
Почту проверь.
Поделиться92007-09-26 22:59:54
Почту проверил, спасибо. Если не против, выложу здесь.
Поделиться102007-09-27 11:28:54
Не против, может кому сгодится. Но я не помню насколько она точна. Это всего лишь тест процедуры Sound.
Поделиться112007-09-27 11:52:16
'-------------------------------------------------------------- ' (c) 2003-2004 RCI Corporation '-------------------------------------------------------------- ' file: Звонок.BAS Сергей Черников ' demo: Реализация функций Электронного звонка на ATmega8 '-------------------------------------------------------------- 'Enable Interrupts $crystal = 4000000 'зададим частоту кварца Config Portd = Input 'Не забудьте установить параметры генератора в меню "Lock and Fuse Bits" программатора '696750/Re1=частота ноты Рэ Dim V As Word Dim V8 As String * 80 'Название мелодии $regfile = "m8def.dat" 'используем ATmega8 V8 = "(Copyright Sergey Chernikov ??????)" Dim Do1 As Word , Dodiez1 As Word , Re1 As Word , Rediez1 As Word , Mi1 As Word , Fa1 As Word , Fadiez1 As Word , Sol1 As Word , Soldiez1 As Word , La1 As Word , Ladiez1 As Word , Ci1 As Word Dim Do2 As Word , Dodiez2 As Word , Re2 As Word , Rediez2 As Word , Mi2 As Word , Fa2 As Word , Fadiez2 As Word , Sol2 As Word , Soldiez2 As Word , La2 As Word , Ladiez2 As Word , Ci2 As Word Dim Do3 As Word , Dodiez3 As Word , Re3 As Word , Rediez3 As Word , Mi3 As Word , Fa3 As Word , Fadiez3 As Word , Sol3 As Word , Soldiez3 As Word , La3 As Word , Ladiez3 As Word , Ci3 As Word Dim Do4 As Word , Dodiez4 As Word , Re4 As Word , Rediez4 As Word , Mi4 As Word , Fa4 As Word , Fadiez4 As Word , Sol4 As Word , Soldiez4 As Word , La4 As Word , Ladiez4 As Word , Ci4 As Word Dim Do5 As Word , Dodiez5 As Word , Re5 As Word , Rediez5 As Word , Mi5 As Word , Fa5 As Word , Fadiez5 As Word , Sol5 As Word , Soldiez5 As Word , La5 As Word , Ladiez5 As Word , Ci5 As Word Dim Do6 As Word , Dodiez6 As Word , Re6 As Word , Rediez6 As Word , Mi6 As Word , Fa6 As Word , Fadiez6 As Word , Sol6 As Word , Soldiez6 As Word , La6 As Word , Ladiez6 As Word , Ci6 As Word Dim Do7 As Word , Dodiez7 As Word , Re7 As Word , Rediez7 As Word , Mi7 As Word , Fa7 As Word , Fadiez7 As Word , Sol7 As Word , Soldiez7 As Word , La7 As Word , Ladiez7 As Word , Ci7 As Word Do1 = 2663 : Dodiez1 = 2514 : Re1 = 2372 : Rediez1 = 2239 : Mi1 = 2114 : Fa1 = 1995 : Fadiez1 = 1883 : Sol1 = 1777 : Soldiez1 = 1678 : La1 = 1584 : Ladiez1 = 1495 : Ci1 = 1411 Do2 = Do1 / 2 : Dodiez2 = Dodiez1 / 2 : Re2 = Re1 / 2 : Rediez2 = Rediez1 / 2 : Mi2 = Mi1 / 2 : Fa2 = Fa1 / 2 : Fadiez2 = Fadiez1 / 2 : Sol2 = Sol1 / 2 : Soldiez2 = Soldiez1 / 2 : La2 = La1 / 2 : Ladiez2 = Ladiez1 / 2 : Ci2 = Ci1 / 2 Do3 = Do1 / 4 : Dodiez3 = Dodiez1 / 4 : Re3 = Re1 / 4 : Rediez3 = Rediez1 / 4 : Mi3 = Mi1 / 4 : Fa3 = Fa1 / 4 : Fadiez3 = Fadiez1 / 4 : Sol3 = Sol1 / 4 : Soldiez3 = Soldiez1 / 4 : La3 = La1 / 4 : Ladiez3 = Ladiez1 / 4 : Ci3 = Ci1 / 4 Do4 = Do1 / 8 : Dodiez4 = Dodiez1 / 8 : Re4 = Re1 / 8 : Rediez4 = Rediez1 / 8 : Mi4 = Mi1 / 8 : Fa4 = Fa1 / 8 : Fadiez4 = Fadiez1 / 8 : Sol4 = Sol1 / 8 : Soldiez4 = Soldiez1 / 8 : La4 = La1 / 8 : Ladiez4 = Ladiez1 / 8 : Ci4 = Ci1 / 8 Do5 = Do1 / 16 : Dodiez5 = Dodiez1 / 16 : Re5 = Re1 / 16 : Rediez5 = Rediez1 / 16 : Mi5 = Mi1 / 16 : Fa5 = Fa1 / 16 : Fadiez5 = Fadiez1 / 16 : Sol5 = Sol1 / 16 : Soldiez5 = Soldiez1 / 16 : La5 = La1 / 16 : Ladiez5 = Ladiez1 / 16 : Ci5 = Ci1 / 16 'Do6 = Do1 / 32 : Re6 = Re1 / 32 : Mi6 = Mi1 / 32 : Fa6 = Fa1 / 32 : Sol6 = Sol1 / 32 : La6 = La1 / 32 :Ladiez6=Ladiez1/32: Ci6 = Ci1 / 32 'Do7 = Do1 / 64 : Re7 = Re1 / 64 : Mi7 = Mi1 / 64 : Fa7 = Fa1 / 64 : Sol7 = Sol1 / 64 : La7 = La1 / 64 :Ladiez7=Ladiez1/64: Ci7 = Ci1 / 64 'Config Pinb.3 = Output 'Mute белый Speaker Alias Pinb.1 'выход динамика Mute Alias Portd.7 'Назначим порт для MUTE Waitms 500 Klava: Do If Pind.0 = 0 Then Sound Speaker , 25 , Do1 End If If Pind.1 = 0 Then Sound Speaker , 25 , Re1 End If If Pind.2 = 0 Then Sound Speaker , 25 , Mi1 End If If Pind.3 = 0 Then Sound Speaker , 25 , Fa1 End If If Pind.4 = 0 Then Sound Speaker , 25 , Sol1 End If If Pind.5 = 0 Then Sound Speaker , 25 , La1 End If If Pind.6 = 0 Then Sound Speaker , 25 , Ci1 End If If Pind.7 = 0 Then Goto Dalee End If Loop Dalee: Sound Speaker , 125 , Do1 'сгенерить сигнал Sound Speaker , 125 , Re1 'сгенерить сигнал Sound Speaker , 125 , Mi1 'сгенерить сигнал Sound Speaker , 125 , Fa1 'сгенерить сигнал Sound Speaker , 125 , Sol1 'сгенерить сигнал Sound Speaker , 125 , La1 'сгенерить сигнал Sound Speaker , 125 , Ci1 'сгенерить сигнал Sound Speaker , 125 , Do2 'сгенерить сигнал Sound Speaker , 125 , Re2 'сгенерить сигнал Sound Speaker , 125 , Mi2 'сгенерить сигнал Sound Speaker , 125 , Fa2 'сгенерить сигнал Sound Speaker , 125 , Sol2 'сгенерить сигнал Sound Speaker , 125 , La2 'сгенерить сигнал Sound Speaker , 125 , Ci2 'сгенерить сигнал Sound Speaker , 250 , Do3 'сгенерить сигнал Sound Speaker , 250 , Re3 'сгенерить сигнал Sound Speaker , 250 , Mi3 'сгенерить сигнал Sound Speaker , 250 , Fa3 'сгенерить сигнал Sound Speaker , 250 , Sol3 'сгенерить сигнал Sound Speaker , 250 , La3 'сгенерить сигнал Sound Speaker , 250 , Ci3 'сгенерить сигнал Sound Speaker , 500 , Do4 'сгенерить сигнал Sound Speaker , 500 , Re4 'сгенерить сигнал Sound Speaker , 500 , Mi4 'сгенерить сигнал Sound Speaker , 500 , Fa4 'сгенерить сигнал Sound Speaker , 500 , Sol4 'сгенерить сигнал Sound Speaker , 500 , La4 'сгенерить сигнал Sound Speaker , 500 , Ci4 'сгенерить сигнал Sound Speaker , 1000 , Do5 'сгенерить сигнал Sound Speaker , 1000 , Re5 'сгенерить сигнал Sound Speaker , 1000 , Mi5 'сгенерить сигнал Sound Speaker , 1000 , Fa5 'сгенерить сигнал Sound Speaker , 1000 , Sol5 'сгенерить сигнал Sound Speaker , 1000 , La5 'сгенерить сигнал Sound Speaker , 10000 , Ci5 'сгенерить сигнал V = 0 Do ' Sound Speaker , 1 , Do1 'сгенерить сигнал Sound Speaker , 25 , Ci5 'сгенерить сигнал Sound Speaker , 6 , Mi3 'сгенерить сигнал Waitms 3 Incr V Loop Until V = 500 'V = 0 ' For V = 0 To 15 ' Dtmfout V , 50 ' dtmf out on PORTB.3 for the 2313 for 500 mS 'output is on the OC1A output pin ' Waitms 50 ' wait 500 msec ' If V >= 14 Then Goto Klava ' End If 'Next 'End
Поделиться122007-10-02 16:53:00
Отчёт о проделанной работе берём здесь - http://ledeffects.net/data/bascom/SOUND_BASCOM.zip
Поделиться132018-11-27 08:29:08
Появилась у меня острая необходимость в беспроводном звонке, купил дешёвский какой-то, он жрал батарейки как лошадь и срабатывал сам по себе. Решил выкинуть потроха и воткнуть свои на основе атмеги и NRF24L01.
Но суть не в этом. Когда наткнулся на эту статью (спасибо Василию за отличное описание!), понял, что sound от Bascom меня не устраивает тем, что выход однотактный, динамик не раскачивается на полную, транзисторы лепить места мало. Решил сваять свою функцию, более прозрачную для понимания.
Dim Play As Byte
Dim Ton As Word
Dim Dlit As Word
Dim C_dlit As WordConfig Timer1 = Timer , Prescale = 1
On Compare1a Sound_out
'Enable Compare1a
Enable Timer1
Start Timer1Declare Sub Sound2(byval Pulses As Word , Byval Periods As Word)
'Periods = (F_crystal / 2)/ F_nota
'Pulses = (F_nota * 4) * длительность ноты
'Пример: C2(1/16): Periods = 4.000.000 / 523,25hz = 7645 Pulses = 2093 * 1/16 =131Do
'----Sound2 Pulses(takt) , Periods (f*2)----------
'Ace of Base :: Happy Nation
Sound2 294 , 6811 'D3(1/16)
Sound2 165 , 12135 'E2(1/16)
Sound2 165 , 12135 'E2(1/16)
Sound2 147 , 13621 'D2(1/16)
Sound2 294 , 13621 'D2(1/8)
Sound2 165 , 12135 'E2(1/16)
Sound2 165 , 12135 'E2(1/16)
Sound2 165 , 12135 'E2(1/16)
Sound2 165 , 12135 'E2(1/16)
Sound2 330 , 12135 'E2(1/8)
Sound2 392 , 10204 'G2(1/8)
Sound2 349 , 11454 'F2(1/8)
Sound2 330 , 12135 'E2(1/8)
Sound2 330 , 12135 'E2(1/8)
Sound2 165 , 12135 'E2(1/16)
Sound2 175 , 11454 'F2(1/16)
Sound2 5000 , 400 'P(1/16)
Sound2 5000 , 400 'P(1/16)
Sound2 349 , 11454 'F2(1/8)
Sound2 440 , 9091 'A2(1/8)
Sound2 392 , 10204 'G2(1/8)
Sound2 349 , 11454 'F2(1/8)
Sound2 330 , 12135 'E2(1/8)
Sound2 294 , 13621 'D2(1/8)
Sound2 330 , 12135 'E2(1/8)
Sound2 5000 , 400 'P(1/16)
Sound2 392 , 10204 'G2(1/8)
Sound2 5000 , 400 'P(1/16)
Sound2 175 , 11454 'F2(1/16)
Sound2 165 , 12135 'E2(1/16)
Sound2 165 , 12135 'E2(1/16)
Sound2 294 , 13621 'D2(1/8)
Sound2 277 , 14431 'Cis2(1/8)
Sound2 294 , 13621 'D2(1/8)
Sound2 294 , 13621 'D2(1/8)
Sound2 294 , 13621 'D2(1/8)
Sound2 330 , 12135 'E2(1/8)
Sound2 330 , 12135 'E2(1/8)
Sound2 294 , 13621 'D2(1/8)
Sound2 294 , 13621 'D2(1/8)Loop
'------------------------------------------------------------
Sub Sound2(byval Pulses As Word , Byval Periods As Word)
'äëèòåëüíîñòü, ïåðèîä
Compare1a = Periods
Dlit = Pulses
C_dlit = 0
Play = 1
Timer1 = 0
Enable Compare1a 'Enable Sound_out
While Play = 1Wend
End Sub
'-------------------------------------------------------------------------------
Sound_out:
Incr C_dlit
If C_dlit <= Dlit Then
If Compare1a > 400 Then
If Sp_p = 1 Then
Sp_p = 0
Sp_m = 1
Else
Sp_p = 1
Sp_m = 0
End If
End If
Timer1 = 0
Else
Disable Compare1a
Sp_p = 0
Sp_m = 0
Play = 0
End IfReturn
Функцию паузы сделал по значению Periods = 400.
А чтобы мелодию Siemens, скопированную с интернета вручную не пересчитывать сделал на скорую руку софтину. В одно окошко вставляете текст Сименса, в другом получаете код для Sound2. Специально прикладываю исходник в VB.NET, желающие могут дописать туда вывод для Баскомовской функции Sound, проверку синтаксиса на входном текстбоксе или ещё что нибудь. Мне этот инструмент нужен один раз всего был, хорошо если ещё кому пригодиться. Ссылка