Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Звук с помощью sound

Сообщений 1 страница 13 из 13

1

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

0

2

Там-же в хелпе вроде всё описано.
                                   Sound PortX.X, Pulses, Period
                                   Sound Speaker , 50 , 800
Pulses= количество импульсов (длительность)
Period= период в количестве тактов основного генератора

0

3

Хелп прочитал, но вот такой конкретный вопрос  - какие  Pulses и Period нужно поставить, чтобы получить звук 440 Герц в течении 1 секунды при частоте кварца 8 МГц?

0

4

Думаю так 8000000/440=период, соответственно 440 импульсов=1сек.
Sound Speaker , 440 , 18182
Провериш- отпишись.

0

5

Sound PortX.X, Pulses, Period
Получается такая картина:
Чем больше  Period, тем меньше частота. При малых значениях уходит в ультразвук, при больших - в басы а затем щелчки.
Наверное, частоту следует считать как F=(1/8000000)* Period. А длительность звуковой посылки - F*Pulses. Осциллографа под рукой нет, но по слуху примерно так.

0

6

Мои значения пробовал подставлять?
Мне кажется так 8000000-количество тактов генератора в секунду. Значит, чтобы сгенерить частоту 440 Гц, нужно поделить частоту генератора на 440. Получаем период. А длительность равная секунде- это 440 импульсов.
Итог Период=F/440=18182. Это при условии, что процедура Sound не использует делителей.
С уважением Сергей Черников.

0

7

При таких значениях  Sound Speaker , 440 , 18182 слышится рокот в несколько герц в течении примерно 12 сек. Если значения поменять местами, те же 12 сек звука, но намного выше - примерно сотни герц. Скорее всего процедура  Sound  выполняется за несколько тактов процессора. Чем меньше значение периода, тем выше частота с переходом в ультразвук, и чем больше значение - тем ниже частота с переходом в щелчки. Скорее всего значение период - это не делитель, а множитель. Т.е. при частоте 8000000 один такт происходит за 125 наносекунд, чтобы получить частоту например в 440 герц, нужно умножить 125 нс на значение Period и на количество тактов, необходимых для этой процедуры. Необходимо знать или опытным путём вычислить эту константу.

0

8

Почту проверь.

0

9

Почту проверил, спасибо. Если не против, выложу здесь.

0

10

Не против, может кому сгодится. Но я не помню насколько она точна. Это всего лишь тест процедуры Sound.

0

11

Код:
'--------------------------------------------------------------
'                     (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

0

12

Отчёт о проделанной работе берём здесь - http://ledeffects.net/data/bascom/SOUND_BASCOM.zip

0

13

Появилась у меня острая необходимость в беспроводном звонке, купил дешёвский какой-то, он жрал батарейки как лошадь и срабатывал сам по себе. Решил выкинуть потроха и воткнуть свои на основе атмеги и NRF24L01.
Но суть не в этом. Когда наткнулся на эту статью (спасибо Василию за отличное описание!), понял, что sound от Bascom меня не устраивает тем, что выход однотактный, динамик не раскачивается на полную, транзисторы лепить места мало. Решил сваять свою функцию, более прозрачную для понимания.

Альтернатива Sound

Dim Play As Byte
Dim Ton As Word
Dim Dlit As Word
Dim C_dlit As Word

Config Timer1 = Timer , Prescale = 1
On Compare1a Sound_out
'Enable Compare1a
Enable Timer1
Start Timer1

Declare 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 =131

Do

'----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 = 1

Wend
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 If

Return

Функцию паузы сделал по значению Periods = 400.

А чтобы мелодию Siemens, скопированную с интернета вручную не пересчитывать сделал на скорую руку софтину. В одно окошко вставляете текст Сименса, в другом получаете код для Sound2. Специально прикладываю исходник в VB.NET, желающие могут дописать туда вывод для Баскомовской функции Sound, проверку синтаксиса на входном текстбоксе или ещё что нибудь. Мне этот инструмент нужен один раз всего был, хорошо если ещё кому пригодиться. Ссылка

0