107-Генератор DTMF сигналу на ATtiny2313
Рішення зібрати такий пристрій продиктоване бажанням спробувати реалізувати складні аналогові сигнали за допомогою мікроконтролера. Ніякого практичного застосування для цього пристрою не планувалося, але може кому нагоді такий пристрій? Користуйтесь!

Робота пристрою.
Пристрій формує складний двокомпонентний сигнал за фактом натискання кнопки на матричній клавіатурі 4х4, що стандартно використовується для таких цілей. Я налагоджував пристрій за допомогою ось такої мембранної клавіатури.

Крім формування тону кнопки, пристрій дублює натискання клавіш видачею відповідних символів за UART (цифри та великі літери латиниці). Ще пристрій формує тональну послідовність згідно надісланої в UART рядку символів. Наприклад, повідомлення "4563245". Якщо потрібно зробити паузу в тоновому озвучуванні, використовується символ «P». Наприклад "8P097P111P22P33". Параметри UART - Baud Rate: 9600, 8 Data, 2 Stopbit, без контролю парності
Трохи теорії.
Тон, що формується за натисканням клавіші, є сумою двох синусоїдальних сигналів із частотами, відповідно, рядки та стовпця натиснутої клавіші (на схемі вище вказані ці частоти). Алгоритм формування змішаного сигналу досить цікавий, але не оригінальний і велосипед я по новій не винаходив. Кому цікаво, як це робиться, можна почитати відповідний документ Atmel
doc1982.pdf - Апнот AVR314: DTMF Generator
Прошивка мікроконтролера.
Мікроконтролер може працювати: як від внутрішнього задає генератора 8МГц (відпадає необхідність в кварцовому резонаторі - ніжки потрібно залишити «висіти в повітрі», але менше точність вихідних частот ібільша залежність від зовнішніх факторів), - так і від зовнішнього генератора, що задає кварцового генератора (кварц на 8МГц) для більш точної роботи. При виборі варіанта генератора, що задає, прошивка залишається одна і та ж, різні будуть тільки фьюзи (фьюзи аналогічні попередній статті, звідки вони і взяті). keypad_dtmf_out.hex - Прошивка DTMF генератора на ATtiny2313
106-fuse_8in.png - ф'юбіти для варіанта внутрішнього генератора, що задає 8МГц (без зовнішнього кварцу) Фьюз-байти: Low=$E4, High=$DF, Ext=$FF 106-fuse_ext.png - ф'юбіти для варіанти із зовнішнім кварцовим генератором, що задає, з довільною частотою Фьюз-байти: Low=$FF, High=$DF, Ext=$FF Нагадую:Для Algorithm Builder і UniProf галочки ставляться як на картинці. Для PonyProg, AVR Studio, SinaProg галочки ставляться інверсно. Як програмувати мікроконтролери читаємо у FAQ.
keypad_dtmf_out_source.zip - Вихідник DTMF генератора
Тепер подивимося, що в нас вийшло.
Сигнал формується за допомогою ШІМ і для того, щоб надати йому потрібну форму застосовується RC-ланцюжок. У результаті, після RC-ланцюжка, отримуємо такий сигнал (натиснута кнопка 6):

По всій кривій корисного сигналу ми спостерігаємо гребінку високої частоти (частота вище чутної, так що шуму вона не створюватиме) – це робота RC-ланцюжка. Можна зробити лінію більш плавною, збільшивши ємність конденсатора або опір резистора, але в цьому випадку значно зменшитися розмах корисного сигналу.
Дивимося спектр сигналу і переконуємось у наявності двох окремих частот (частота ШІМ пішла за межі області відображення), отже все нормально – пристрій працює як слід.

Готові рішення
Для завдань генерування та декодування DTMF-сигналу існують готовірішення. Ось кілька даташитів на ці мікросхеми.
TP5089N.pdf - DTMF генератор MT8870D.pdf - DTMF декодер
P.S. Шкода немає в ATtiny2313 АЦП - можна було ще й декодер DTMF забабахать! Але нічого, повторюватиму на мезі обов'язково прироблю.
Дуже корисна штука. Не завжди виходить знайти спеціалізовану мікросхему генератора або декодера. А якщо ВИ напишіть прошивку для генератора і декодера наприклад для ATmega8 (Поширений і компактний мікроконтролер) то дуже багато любителів паяти будуть Вам вкрай вдячні і вдячні. НЕ доведеться більше топтати базари та магазини у пошуках. Поставив контролер, залив прошивку та отримав що тобі треба.
Якщо хтось задумав реалізувати декодер DTMF akv — це вже зробив (на мезі8) http://www.forum.getchip.net/viewtopic.php?f=9&t=394&start=10
Добрий вечір Євген.прошу вас до вашого генератора ДТМФ розробити-декодер DTMF.тільки повноцінний.як на мт8870.якщо можна то реалізувати на ньому клавіатуру.тобто можна управляти як вхідним сигналом-так і з клавіатури.наявність підтвердження пізнання сигналу. юарт.дуже прошу.в залозі відразу випробую.
Є ідея зробити «все в одному», але поки не знаю коли дійде справа до реалізації.
Доброго вечора GetChiper. Протестував генератор DTMF в Proteuse. Видає таку форму, що й малюнку (графіці) вище. Але цей отриманий сигнал не хоче визначатися декодером DTMF. Сам декодер я тестував на записаному реальному сигналі (від мікрофона) і завжди завжди видавав правильний результат. Я не хочу сказати, що DTMF згенерований неправильно, просто допоможіть розібратися в чому справа. Може частота генерації зміщена або впливає гребінка на сигналі. Найцікавіше, що якщо ШІМ без RC подати надекодер, той визначає DTMF, але неправильно…
Контролер із кварцом? Можливий догляд частоти якщо МК працює від внутрішнього генератора, що задає. Чи можна подивитися спектр сигналу, що видається? Чи відповідають 2 частоти, що видаються, натиснутою кнопкою?
Щоб усунути гребінець можна збільшити резистор в RC ланцюжку (тобто 2к7). Але тоді рівень сигналу значно знизиться.
До речі, а декодера вистачає рівня сигналу? Наводить на думку помилкова але все ж таки спрацювання без RC ланцюжка, коли рівень сигналу максимальний
GetChiper, дякую за поради. Проблема вирішена, DTMF визначається 100%. Все просто – неправильні фюзи :). До речі, сама ідея формування сигналу дуже сподобалася. Так можна будь-яку форму зробити. Якщо буде час об'єдную генератор і декодер, для цього все є.
Спасибі за схему та програму, запрацювало все відразу. Декодер DTMF у мене був зібраний раніше, теж не ATtiny2313 з індикаторами 2х16. Все ОК. Правда на виході я ставив диференціальний трансформатор (бо сигнал передається через мультиплексор по НЧ каналах) і на зворотному кінці все декодується нормально.
GetChiper, а можеш викласти бібліотеку елементів для splan, дуже красиво схеми виходять)
Бібліотеки як такої немає (все збираюся зібрати, і не виберуся цим зайнятися). Але всі елементи можна взяти у бібліотеку із файлів проектів.
GetChoper'y: Як говорив товариш Саахов: «Все правильно, папір написаний правильно ....» Тільки закралася помилка прикра. Так званий RC-ланцюжок перед вихідним транзистором, який у колах фахівців називають Фільтром Нижніх Частот Першого Порядку, розрахований з-рук-вон-погано. Частота зрізу такого фільтра дорівнює: Fср=1/2πRC, (Hz) Підставляємо у формулу 2700(Ом) і 0,0000001(Фарад) іотримуємо 589 Гц. Тим часом як частоти DTMF сигналу лежать у сфері 697…1633 Гц, тобто. наш (точніше, ваш) фільтр пригнічує навіть частоти корисного сигналу. Тому окремі громадяни скаржаться на нестабільність спрацьовування DTMF-декодера. Як бути? Просто поставити фільтр з кошерною частотою зрізу і непогано б 2-го чи 3-го порядку. Коротше кажучи, даєте мені ваш e-mail і отримаєте файл з картинками.
Проблема з фільтром першого порядку в тому, що спад у нього плавний, а частота ШІМ не так далеко віддалена від частот DTMF сигналу, відповідно доводиться йти на компроміс - сильніше притиснути частоти ШІМ і не дуже зменшити корисний сигнал.
Щодо фільтрів N-го порядку — я з Вами згоден, було б краще, але думаю це кожен зможе реалізувати «під себе».
Залишив варіант S >
До речі, для бажаючих мати DTMF-декодер раджу: http://www.qrz.ru/schemes/contribute/constr/dtmf.shtml І зв'язок з комп'ютером є, можна за Термінальною програмою запам'ятовувати DTMF-посилки доки вінчестер не заб'ється.