Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Это лучше всего, так как слух очень чувствителен к спектральной чистоте звука, а при наличии других прерываний в системе обеспечить её можно только при аппаратной генерации звука.

Отправлено Леонид Иванович 01 ноября 2008 г. 12:00
В ответ на: лучше настроить шим на эту суперзадачу и разрешать его на заданный интервал отправлено <font color=gray>kan</font> 01 ноября 2008 г. 09:29

Но есть минус - теряется таймер. А длительность бипа можно отсчитывать тем же таймером в периодах. Вот пример генерации звука таймером 2:


//------------------------------- Константы: ---------------------------------

#define BeepD 100.0 //длительность стандартного звука, мс
#define BeepF 1.000 //частота стандартного звука, КГц

#define TickD 25.0 //длительность короткого звука, мс
#define TickF 1.500 //частота короткого звука, КГц

//------------------------- Макроопределения: --------------------------------

//Преобразование частоты [KHz] в длительность периода [тики таймера]:
#define KHZ2T(x) (int)((FCLK * 1000.0 / 512.0) / (x))
//Преобразование длительности [mS] в число периодов:
#define MS2P(x, y) (int)((x) * (y) * 2)

//------------------------------- Переменные: --------------------------------

static int SndD; //длительность звукового сигнала в периодах

//--------------- Генерация звука: длительность d, период t: -----------------

void Sound(int d, char t)
{
OCR2 = t;
SndD = d;
TCCR2 = (1<<WGM21) | (1<<COM20) | (1<<CS22); //CTC, toggle OC2, CK/256
TIFR = (1<<OCIE2); //очистка отложенных прерываний
TIMSK |= (1<<OCIE2); //разрешение прерывания таймера 2
}

//----------------- Прерывание таймера для генерации звука: ------------------

#pragma vector = TIMER2_COMP_vect
__interrupt void GenSnd(void)
{
if(!--SndD)
{
TCCR2 = (1<<WGM21) | (1<<COM21) | (1<<CS22); //CTC, clear OC2, CK/256
TIMSK &= ~(1<<OCIE2); //запрещение прерывания таймера 2
}
}

//------------ Генерация стандартного звукового сигнала (beep): --------------

__monitor void Sound_Beep(void)
{
Sound(MS2P(BeepD, BeepF), KHZ2T(BeepF));
}

//------------- Генерация короткого звукового сигнала (teek): ----------------

__monitor void Sound_Tick(void)
{
Sound(MS2P(TickD, TickF), KHZ2T(TickF));
}
//----------------------------------------------------------------------------



Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
увеличьте 2 вдвое:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru