Hola
Para generar tonos DTMF hay bastantes rutinas en ensamblador, en C y en Basic por lo que te remito al foro o a Internet para encontrarlas.
Lo único que te comento es que para que la señal sea limpia tienes que poner un filtro a la salida, con el filtro adecuado la señal será limpia, por cierto la frecuencia del oscilador ha de ser de 20MHZ como mínimo.
DECODIFICACIONLa decodificación de tonos DTMF sin utilizar un integrado especifico, como a ti te piden se puede realizar de dos manera:
1º Usando una red de filtros para cada una de las frecuencias del par, la salida de estos filtros te dará una salida a 1 cuando este presente la frecuencia para la que esta diseñado, con lo cual necesitaras ocho filtros y formar un array para cada par de frecuencias.
Hay esquemas en Internet pero no creo que este método sea él mas adecuado par lo que te piden.
2º Otra manera más elegante de hacerlo es utilizar el algoritmo modificado de Goertzel.
Una buena fuente de explicación para el este algoritmo y cómo programarlo se puede encontrar en el "algoritmo modificado de Goertzel en la detección de DTMF usando" nota de aplicación del TMS320C80 de Texas Instruments
El algoritmo de Goertzel es más eficiente que el análisis por transformada rápida de Fourier.
Te pongo una pagina donde puedes encontrar todo un proyecto completo y que funciona de decodificador DTMF con este algoritmo.
http://www.geocities.com/constantinescuradu/content/dtmf.htmOtra pagina muy interesante con mucha información aunque el proyecto esta diseñado para un micro de Motorola.
http://iie.fing.edu.uy/ense/asign/sisdsp/proyectos/2000/registro_llamadas/Explicación detallada del algoritmo:
http://www.embedded.com/story/OEG20020819S0057Saludos
Juan