Страница 1 из 1
программирование микроконтроллеров AVR для АОНа
Добавлено: Пн май 18, 2009 15:11:11
balagurov07
имеется dtmf-сигнал состоящий из 2 частот, как на микроконтроллере обрабатывать его, чтобы получить передаваемую цифру
Добавлено: Пн май 18, 2009 17:27:43
Danko
Лучше аппаратно (MT8870, КР1008ВЖ18, HT9170 или аналоги)
Например так:
http://www.infidigm.net/projects/dtmf2/
Если есть желание повозится с програмным - пожалуйста файлик.
Проект правда на PIC, но это не главное, главное теория.
Добавлено: Вт май 19, 2009 11:46:50
Danko
Моя реализация аппаратного декодирования DTMF с телефонной линии.
Добавлено: Вт май 19, 2009 21:44:55
Секретный кот
Если речь всё же об АОНе, а не о DTMF, то 8870 не канает – тут только "ручками, ручками". ДПФ надо писать, желательно на асме. Плюс парсинг и пересборка пакета, ну это самое простое.
Я в своё время частично воспользовался для этого исходниками АОНа на Z80, свободно валяющимися в сети.
Добавлено: Вс май 24, 2009 19:46:10
sachok
Здравствуйте. У меня вопрос именно по DTMF и MT8870. Нужно написать программку которая будет декодировать DTMF сигнал и потом управлять внешней нагрузкой. На вход будет приходить 2 команды:
Код: Выделить всё
0b43 - Включить нагрузку;
34b0 - Выключить нагрузку.
Для работы за основу взял исходник
Danko. Меня интересует что будет хранится в переменной
cod_DTMF при подача каждой с команд?
Добавлено: Пн май 25, 2009 09:54:48
Danko
sachok писал(а):Danko. Меня интересует что будет хранится в переменной cod_DTMF при подача каждой с команд?
То что возвращает MT8870.
p.s.
у MT8870 ноль это не 0x00, а 0x0A более детально в таблице
Добавлено: Пн май 25, 2009 15:10:05
sachok
Тогда следующий вопрос такой: МТ8870 декодирует по 1 цифре за цикл?
Если это так то я могу сравнивать только последнюю цифру, например:
0b4
3 Включить нагрузку:
34b
0 Выключить нагрузку:
Можно так сделать?
Добавлено: Пн май 25, 2009 16:45:59
Danko
Цифры декодируются в порядке получения.
Как только будет получена цифра появляется сигнал на 15 ножке, МК обрабатывает внешнее прерывание, получает код от MT8870.
Лично я бы в виде команды использовал не одну цифру на определенную последовательность дабы исключить ошибку или многократный повтор одной команды.
Re: программирование микроконтроллеров AVR для АОНа
Добавлено: Пн май 25, 2009 16:52:07
Danko
balagurov07 писал(а):имеется dtmf-сигнал состоящий из 2 частот, как на микроконтроллере обрабатывать его, чтобы получить передаваемую цифру
DTMF (Dual Tone Multi Frequency, тоновый набор):
Способ кодирования набранного номера, при котором цифры передаются сочетанием двух звуковых тонов. Всего в системе используется восемь различных тонов, подобранных таким образом, чтобы они передавались по телефонной сети с минимальным затуханием без наложения друг на друга. Поскольку данные тоны приходятся как раз на частотный диапазон человеческой речи, были приняты специальные меры, чтобы предотвратить распознавание определенных звуков голоса как сигналов набора (данное ложное распознавание обозначается термином talk-off).
А не две частоты. 
Добавлено: Пн май 25, 2009 17:31:12
sachok
Вот такая идея пришла: определять команду в зависимости от суммы пришедших чисел.
Код: Выделить всё
unsigned char i;
// External Interrupt 0 service routine
//
// Внешнее прерывание от MT8870 (INT0 по возрастающему фронту)
//
interrupt [EXT_INT0] void ext_int0_isr(void)
{
unsigned char cod_DTMF;
unsigned char full_DTMF;
#asm("cli")
for (i=0;i<4;i++)
{
if (i==0)
{
full_DTMF=0;
}
MT8870_TOE_ON(); // активизировать выводы (Q1-Q4) MT8870
#asm("nop")
cod_DTMF = PINB & 0x0F; // получить код DTMF из MT8870
#asm("nop")
MT8870_TOE_OFF(); // выводы (Q1-Q4) MT8870 перевести в Z состояние
full_DTMF=full_DTMF+cod_DTMF;
}
#asm("sei")
}
0b43=10+14+4+3=31; Включить нагрузку:
Код:
Код: Выделить всё
if (full_DTMF==31 && cod_DTMF=3)
{
PORTB.5=1;
}
Кажись должно сработать.