программирование микроконтроллеров AVR для АОНа
- Сообщения: 3
- Зарегистрирован: Вс май 17, 2009 12:51:42
имеется dtmf-сигнал состоящий из 2 частот, как на микроконтроллере обрабатывать его, чтобы получить передаваемую цифру
- Реклама
Лучше аппаратно (MT8870, КР1008ВЖ18, HT9170 или аналоги)
Например так: http://www.infidigm.net/projects/dtmf2/
Если есть желание повозится с програмным - пожалуйста файлик.
Проект правда на PIC, но это не главное, главное теория.
Например так: http://www.infidigm.net/projects/dtmf2/
Если есть желание повозится с програмным - пожалуйста файлик.
Проект правда на PIC, но это не главное, главное теория.
- Вложения
-
- DTMF.zip
- програмное декодирование DTMF
- (99.49 КБ) 907 скачиваний
Моя реализация аппаратного декодирования DTMF с телефонной линии.
- Вложения
-
- DTMF-decoder_(MT8870_tiny2313_9LED)_v.2.0.zip
- декодер на MT8870 (CVAVR)
- (212.13 КБ) 882 скачивания
-
- DTMF.GIF
- схема
- (86.74 КБ) 1857 скачиваний
Если речь всё же об АОНе, а не о DTMF, то 8870 не канает – тут только "ручками, ручками". ДПФ надо писать, желательно на асме. Плюс парсинг и пересборка пакета, ну это самое простое.
Я в своё время частично воспользовался для этого исходниками АОНа на Z80, свободно валяющимися в сети.
Я в своё время частично воспользовался для этого исходниками АОНа на Z80, свободно валяющимися в сети.
Даже остановленные часы два раза в сутки показывают правильное время.
Здравствуйте. У меня вопрос именно по DTMF и MT8870. Нужно написать программку которая будет декодировать DTMF сигнал и потом управлять внешней нагрузкой. На вход будет приходить 2 команды:
Для работы за основу взял исходник Danko. Меня интересует что будет хранится в переменной cod_DTMF при подача каждой с команд?
Код: Выделить всё
0b43 - Включить нагрузку;
34b0 - Выключить нагрузку.Я не Сашок!!!
- Реклама
То что возвращает MT8870.sachok писал(а):Danko. Меня интересует что будет хранится в переменной cod_DTMF при подача каждой с команд?
p.s.
у MT8870 ноль это не 0x00, а 0x0A более детально в таблице
- Вложения
-
- MT8870.jpg
- Страничка из Даташит
- (135.6 КБ) 1047 скачиваний
Тогда следующий вопрос такой: МТ8870 декодирует по 1 цифре за цикл?
Если это так то я могу сравнивать только последнюю цифру, например:
0b43 Включить нагрузку:
34b0 Выключить нагрузку:
Можно так сделать?
Если это так то я могу сравнивать только последнюю цифру, например:
0b43 Включить нагрузку:
Код: Выделить всё
if (cod_DTMF==3)
{
PORTB.5=1;
}Код: Выделить всё
if (cod_DTMF==10)
{
PORTB.5=0;
}Я не Сашок!!!
Цифры декодируются в порядке получения.
Как только будет получена цифра появляется сигнал на 15 ножке, МК обрабатывает внешнее прерывание, получает код от MT8870.
Лично я бы в виде команды использовал не одну цифру на определенную последовательность дабы исключить ошибку или многократный повтор одной команды.
Как только будет получена цифра появляется сигнал на 15 ножке, МК обрабатывает внешнее прерывание, получает код от MT8870.
Лично я бы в виде команды использовал не одну цифру на определенную последовательность дабы исключить ошибку или многократный повтор одной команды.
DTMF (Dual Tone Multi Frequency, тоновый набор):balagurov07 писал(а):имеется dtmf-сигнал состоящий из 2 частот, как на микроконтроллере обрабатывать его, чтобы получить передаваемую цифру
Способ кодирования набранного номера, при котором цифры передаются сочетанием двух звуковых тонов. Всего в системе используется восемь различных тонов, подобранных таким образом, чтобы они передавались по телефонной сети с минимальным затуханием без наложения друг на друга. Поскольку данные тоны приходятся как раз на частотный диапазон человеческой речи, были приняты специальные меры, чтобы предотвратить распознавание определенных звуков голоса как сигналов набора (данное ложное распознавание обозначается термином talk-off).
А не две частоты.
Вот такая идея пришла: определять команду в зависимости от суммы пришедших чисел.
0b43=10+14+4+3=31; Включить нагрузку:
Код:
Кажись должно сработать.
Код: Выделить всё
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")
}Код:
Код: Выделить всё
if (full_DTMF==31 && cod_DTMF=3)
{
PORTB.5=1;
}Я не Сашок!!!


