программирование микроконтроллеров AVR для АОНа

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Родился
Сообщения: 3
Зарегистрирован: Вс май 17, 2009 12:51:42

Сообщение balagurov07 »

имеется dtmf-сигнал состоящий из 2 частот, как на микроконтроллере обрабатывать его, чтобы получить передаваемую цифру
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

Лучше аппаратно (MT8870, КР1008ВЖ18, HT9170 или аналоги)
Например так: http://www.infidigm.net/projects/dtmf2/

Если есть желание повозится с програмным - пожалуйста файлик.
Проект правда на PIC, но это не главное, главное теория.
Вложения
DTMF.zip
програмное декодирование DTMF
(99.49 КБ) 907 скачиваний
Контактная информация:
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

Моя реализация аппаратного декодирования DTMF с телефонной линии.
Вложения
DTMF-decoder_(MT8870_tiny2313_9LED)_v.2.0.zip
декодер на MT8870 (CVAVR)
(212.13 КБ) 882 скачивания
DTMF.GIF
схема
(86.74 КБ) 1857 скачиваний
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2106
Зарегистрирован: Ср сен 17, 2008 14:32:15
Откуда: Старые Васюки

Сообщение Секретный кот »

Если речь всё же об АОНе, а не о DTMF, то 8870 не канает – тут только "ручками, ручками". ДПФ надо писать, желательно на асме. Плюс парсинг и пересборка пакета, ну это самое простое.
Я в своё время частично воспользовался для этого исходниками АОНа на Z80, свободно валяющимися в сети.
Даже остановленные часы два раза в сутки показывают правильное время.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк

Сообщение sachok »

Здравствуйте. У меня вопрос именно по DTMF и MT8870. Нужно написать программку которая будет декодировать DTMF сигнал и потом управлять внешней нагрузкой. На вход будет приходить 2 команды:

Код: Выделить всё

0b43 - Включить нагрузку;
34b0 - Выключить нагрузку.
Для работы за основу взял исходник Danko. Меня интересует что будет хранится в переменной cod_DTMF при подача каждой с команд?
Я не Сашок!!!
Контактная информация:
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

sachok писал(а):Danko. Меня интересует что будет хранится в переменной cod_DTMF при подача каждой с команд?
То что возвращает MT8870.

p.s.
у MT8870 ноль это не 0x00, а 0x0A более детально в таблице
Вложения
MT8870.jpg
Страничка из Даташит
(135.6 КБ) 1047 скачиваний
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк

Сообщение sachok »

Тогда следующий вопрос такой: МТ8870 декодирует по 1 цифре за цикл?
Если это так то я могу сравнивать только последнюю цифру, например:
0b43 Включить нагрузку:

Код: Выделить всё

if (cod_DTMF==3)
{
PORTB.5=1;
}
34b0 Выключить нагрузку:

Код: Выделить всё

if (cod_DTMF==10)
{
PORTB.5=0;
}
Можно так сделать?
Я не Сашок!!!
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

Цифры декодируются в порядке получения.
Как только будет получена цифра появляется сигнал на 15 ножке, МК обрабатывает внешнее прерывание, получает код от MT8870.
Лично я бы в виде команды использовал не одну цифру на определенную последовательность дабы исключить ошибку или многократный повтор одной команды.
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

balagurov07 писал(а):имеется dtmf-сигнал состоящий из 2 частот, как на микроконтроллере обрабатывать его, чтобы получить передаваемую цифру
DTMF (Dual Tone Multi Frequency, тоновый набор):
Способ кодирования набранного номера, при котором цифры передаются сочетанием двух звуковых тонов. Всего в системе используется восемь различных тонов, подобранных таким образом, чтобы они передавались по телефонной сети с минимальным затуханием без наложения друг на друга. Поскольку данные тоны приходятся как раз на частотный диапазон человеческой речи, были приняты специальные меры, чтобы предотвратить распознавание определенных звуков голоса как сигналов набора (данное ложное распознавание обозначается термином talk-off).

А не две частоты. 8)
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк

Сообщение 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;
}
Кажись должно сработать.
Я не Сашок!!!
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»