Xitami napisał: Potrzebny przetwornik C/A np. DAC08, drabinka R-2R
Wystarczy przetwornik 2 bitowy (an nawet 1.5 bitowy

, czyli trzy możliwe napięcia).
Albo nawet dwa przetworniki jednobitowe + sumator

, czyli 2 rezystory i tym właśnie się zajmiemy)
na każdy z pinów podajemy dwie częstotliwośći odpowiadające częstotliwościom sygnałów DTMF. Np. dla "1" będą to 697 i 1209 Hz
Po "zmixowaniu na rezystorach dostajemy coś takiego jak na rysunku dtmf_sq.gif. tam jest jeszcze interpolacja sin(x)/x na potrzeby wyświetlania, co może trochę "namieszać", ale generalnie dostajemy na wyjściu sygnał o 3 poziomach.
Teraz taki sygnał przepuszczamy przez filtr dolnoprzepustowy (ja zastosowałem Butterwortha 4 rzędu) fc=1600Hz, ale jak to będzie zwykły RC 1 rzędu, też się raczej nic nie stanie, mam nadzieję...
I w ten oto "magiczny" sposób dostajemy to, co widać na rysunku dtmf_sqfil.gif. Poniżej dla porównania DTMF wygenerowany programowo...
Wszystkie trzy sygnały w pliku dtmf.rar, wav 8bit 44.1kHz po 1 sekundzie
--------
W ramach dalszych badań - filtr 1 rzędu to trochę mało, minimum drugiego, chociaż harmoniczne najniższej częstotliwośći w DTMF (697Hz) leżą i tak powyżej częstotliwości najwyższej (1633), więc jeżeli odbiornik do detekcji częstotliwości stosuje pętle PLL, to nie powinno być problemów.
Tony można generować np tak:
Dla naszej "1" okresy wynoszą odpowiednio 1434 i 827 cykli dla rezonatora 12MHz, czyli ich połówki to 717 i 414 cykli
mamy 2 liczniki a i b i dwa piny x i y
a=717
b=414
petla:
a=a-1
jezeli a=0 to x = not(x) a=717
b=b-1
jeżeli b=0 to y = not(y) b=414
skocz do petla
Założenie jest takie, że cała pętla wykonuje się w jednym cyklu, co jest oczywiście nonsensem
I teraz albo bawimy się w cyklowanie (tak jak sie robilo dema na C64

), odpowiednio dobieramy wartości ładowane do liczników i piszemy procedurę w asm, albo robimy wszystko na przerwaniach i timerach, a to się da nawet na jednym timerze zrobić

i przy okazji generator DTMF nie będzie blokował procka