Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
ZPS
0 / 0 / 0
Регистрация: 16.02.2010
Сообщений: 511
1

Генератор тона (handshake tone)

20.07.2011, 20:38. Просмотров 4540. Ответов 8
Метки нет (Все метки)

Что-то у меня затупчик вышел.

Читаю доку на протокол, который нужно эмулировать в моей железке.
· A burst of 1400 Hz. ±3% tone wyth a
duration of 100 msec. ±5%
· A pouse of 100 msec. ±5%
· A burst of 2300 Hz. ±3% tone wyth a
duration of 100 msec. ±5%
И спотыкаюсь о мою "любимую" тему - рассчеты.
Как мне сгенерировать такой сигнал на ноге контроллера (tiny13 или tiny2313)?
Научите как это правильно делается? А то у меня даже проверить нечем что я там накодил.

UPD
На CVAVR или в общих чертах алгоритм.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.07.2011, 20:38
Ответы с готовыми решениями:

Генерация тона (AVR Studio)
Народ, нужно издавать звуки частотами (A3 - 220, G4 - 392, ...)... Вот только все никак не могу...

Видеорегистратор An-Tone
Здравствуйте! Имеется dvr An-Tone, к которому подключены 4 камеры коаксиальным кабелем....

Мелодия Tone без Delay
Здравствуйте. Так и не нашёл в интернете решение проблемы, везде в примерах есть функция игры...

Handshake failed
Доброго времени суток. Подскажите, пожайлуста. Изучаю программирование под Android и попутно пишу...

Как отклонить подключение TCP до handshake
Есть ли способы до accept() сбросить подключение, чтобы на другой стороне выдало что подключение...

8
hittroysir
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 185
20.07.2011, 20:55 2
Сначала меняешь "1" и "0" с частотой 1400 Гц (период 0.714 мс) т.е. выставляешь "1" ждешь пол периода, выставляешь "0" и так 140 периодов. Ждешь 100 мс. Повторяешь примерно то же только на частоте 2300 Гц и делаешь 230 периодов.
0
ZPS
0 / 0 / 0
Регистрация: 16.02.2010
Сообщений: 511
21.07.2011, 00:09 3
Не понятно.
почему 140 периодов?
И как правильно посчитать задержку в 0,714 сек... какой делитель таймеру ставить... я что-то совсем туплю, вроде принцип понятен, но от чего отталкиваться в рассчете.
0
hittroysir
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 185
21.07.2011, 01:14 4
Задержку надо в 2 раза меньше, весь период это состояние "1" а потом "0" нужное кол-во времени. Считается он как 1/1400 = 0.000714 секунды или 0.714 миллисекунды. 140 периодов потому что надо пищать 100 мс (duration of 100 msec). Если микроконтроллер больше ничем не занят в это время, задержку лучше сделать в цикле. Можно про задачу подробнее?
0
ZPS
0 / 0 / 0
Регистрация: 16.02.2010
Сообщений: 511
21.07.2011, 03:59 5
Цитата Сообщение от hittroysir
Можно про задачу подробнее?
Пытаюсь получить информацию по протоколу ContactID от охранного прибора. DTMF посылку прочитал (через MT8870), почти разобрал.
Осталось в начале соединения выдать этот самый homdshake tone, чтобы прибор понял, что ему отвечает станция и после каждой посылки kissoff тон. Ну и завести это всё в телефонную линию.
В первый раз сталкиваюсь с точными задачами.
0
motfriiusir
0 / 0 / 0
Регистрация: 17.03.2010
Сообщений: 188
21.07.2011, 12:23 6
Допустим, вам необходимо выдать тоновый сигнал 1400 Гц длительностю 100 мс.
Допустим, тактовая частота Fclk = 1 МГц.
Допустим, в наличии tiny2313 и 8-розрядный таймер 0.
Частоте сигнала 1400 Гц соответствует период 1/1400 Гц = 714 мкс, т.е. вывод МК должен дергаться вдвое быстрее - каждые 357 мкс.
При тактовой частоте 1 МГц для таймера 0 нужно использовать предделитель. Например, пусть будет 8. Тогда счетный регистр будет инкрементироваться каждые 8 мкс.
Используем режим СТС и прерывание по совпадению значений в TCNT0 и OCR0A.
Перед запуском таймера запишем в OCR0A значение 357/8 = 44.
Таким образом когда таймер досчитает до 44, пройдет 357 мкс и возникнет прерывание по совпадению в канале А,по которому можно дрыгать выводом МК для генерации сигнала.
Для того, чтобы отсчитать 100 мс, нужно отсчитать необходимое колличество прерываний таймера. Поскольку прерывание возникает каждые 357 мкс, нужно отсчитать 100000 / 357 = 280 прерываний, после чего остановить таймер или запретить прерывания.
Для того, чтобы вручную не дергать выводом, можно использовать автоматическое переключение вывода OC0A по совпадению значений в TCNT0 и OCR0A, для чего установить бит COM0A0 в регистре TCCR0A.

Предустановки таймера 0:
TCNT0 <- 0
TCCR0A <- 1<<COM0A0 | 1<<WGM01
TCCR0B <- 1<<CS01
OCR0A <- 357/8
TIMSK <- 1<<OCIE0A
0
ShypKyttir
0 / 0 / 0
Регистрация: 11.06.2011
Сообщений: 322
21.07.2011, 12:25 7
Цитата Сообщение от ZPS
Как мне сгенерировать такой сигнал на ноге контроллера (tiny13 или tiny2313)?
Научите как это правильно делается? А то у меня даже проверить нечем что я там накодил.
... при указанной точности вполне можно применить прерывание по переполнению таймера, а полученный результат проверить в AVRStudyo или Proteus.
0
hittroysir
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 185
21.07.2011, 12:27 8
На сколько я понял МК при выдаче этого homdshake tone больше ничего делать не будет, значить можно написать по быдлокодерски (да простят меня обитатели форума).
Код
for (i = 140; i>0; i--)    //140 потому что надо пищать 100мс при частоте 1400 Гц это 140 периодов
{
выставляешь "1" в порте;
_delay_ms(0.357);        // задержка в пол периода
выставляешь "0" в порте;
_delay_ms(0.357);
}
_delay_ms(100);
for (i = 230; i>0; i--)    //230 потому что надо пищать 100мс при частоте 2300 Гц это 230 периодов
{
выставляешь "1" в порте;
_delay_ms(0.217);        // задержка в пол периода
выставляешь "0" в порте;
_delay_ms(0.217);
}
Для выдачи kissoff
Код
for (i = 750; i>0; i--)    //здесь от 750 до 1000
{
выставляешь "1" в порте;
_delay_ms(0.357);        // задержка в пол периода
выставляешь "0" в порте;
_delay_ms(0.357);
}
P.S. пока писал ответили, но не пропадать же решению...
0
ZPS
0 / 0 / 0
Регистрация: 16.02.2010
Сообщений: 511
21.07.2011, 23:11 9
Огромное спасибо всем :)
Теперь, кажется, всё встало на свои места. И алгоритм расчета и варианты решения теперь сложились в общую картинку. Думаю, теперь разберусь.

Можно и по "быдлокодерски", учитывая, что тонов всего 2 и параллельно никаких задач - запихнул в функцию и дергай, а таймеры для других задач пусть тикают. Но и таймерный вариант соберу, чтобы знать как это делается у нормальных людей :)
0
21.07.2011, 23:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2011, 23:11

CUrl ошибка error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
file_put_contents('cookie.txt',''); $url = &quot;http://linkshrink.net/&quot;; $cookiefile = 'cookie.txt';...

Изменение тона изображения
Доброго времени суток. Есть такая проблема: дано: компонент TImage; нужно изменить тон...

Правильно хорошего тона
Предлагаю обсудить насущные вопросы связанные с использование HTML5!!! Как вы считаете хорошо ли...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru