TODOPIC

FORO TÉCNICO => Telefonía, GPS y Microcontroladores => Mensaje iniciado por: japifer_22 en 21 de Octubre de 2009, 02:59:54

Título: marcador por tono DTMF (novato)
Publicado por: japifer_22 en 21 de Octubre de 2009, 02:59:54
hola compañeros foreros, quiero hacer un llamador por telefono por tono, esto puede ser utilisando algun CI de la spesialidad como el HT9200B, pero el problema es que en mi país segun yo no esta, y queria ver si alguien save de algun otro integrado que m permita generar los tonos DTMF. o acerlo mediante un pic, e visto que hay una libreria  EX_DTMF.C  que genera estos tonos, pero tengo 2 inconvenientes con esto:
1- se nesesita un trnasformador para suavisar la señal
2- esta pensada para trabajarla con un teclado 3x4.
bueno no puedo trabajar con teclado ya que quiero conectarlo al PC.
bueno mi pregunta es:
alguien tiene o save de algun CI que aga estó osea generar tonos DTMF ???
alguien save o me puede ayudar a modificar la libreria para poder trabajarla con el pc y no con un teclado?????

bueno la libreria es esta;
Código: [Seleccionar]
/////////////////////////////////////////////////////////////////////////
////                           EX_DTMF.C                             ////
////                                                                 ////
////  This program simulates a touch-tone telephone.  The user can   ////
////  push keys on the keypad and the dtmf tones will be heard over  ////
////  the speaker.  If the user places the receiver of a telephone   ////
////  over the speaker, and then dials a number on the keypad, the   ////
////  telephone will recognize the dtmf tones and place the call.    ////
////                                                                 ////
////  Configure the CCS prototype card as follows:                   ////
////     Plug in the KEYPAD.                                         ////
////     Connect a R-2R ladder to Port D as shown below.             ////
////     Connect the negative wire of the speaker to ground.         ////
////     Connect the positive wire of the speaker to the output of   ////
////        the R-2R ladder.                                         ////
////                                                                 ////
////  PIN 32  PIN 33  PIN 34  PIN 35  PIN 36  PIN 37  PIN 38  PIN 39 ////
////    |       |       |       |       |       |       |       |    ////
////   2R      2R      2R      2R      2R      2R      2R      2R    ////
////    |       |       |       |       |       |       |       |    ////
////    *---R---*---R---*---R---*---R---*---R---*---R---*---R---*    ////
////    |                                                       |    ////
////   2R                                                       |    ////
////    |                R = 100 ohms                         OUTPUT ////
////   GND PIN 27       2R = 200 ohms                                ////
////                                                                 ////
////  This example will work with the PCB, PCM and PCH compilers.    ////
////  The following conditional compilation lines are used to        ////
////  include a valid device for each compiler.  Change the device,  ////
////  clock and RS232 pins for your hardware if needed.              ////
/////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2003 Custom Computer Services         ////
//// This source code may only be used by licensed users of the CCS  ////
//// C compiler.  This source code may only be distributed to other  ////
//// licensed users of the CCS C compiler.  No other use,            ////
//// reproduction or distribution is permitted without written       ////
//// permission.  Derivative programs created using this software    ////
//// in object code form are not restricted in any way.              ////
/////////////////////////////////////////////////////////////////////////


#if defined(__PCB__)
#include <16c56.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20000000)    // must be 20 MHz

#elif defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)    // must be 20 MHz

#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)    // must be 20 MHz
#endif

#include <kbd.c>

CONST unsigned int SINE_WAVE[200] = {
128,132,136,139,143,147,150,154,158,161,165,169,172,176,179,
182,186,189,192,195,199,202,204,207,210,213,215,218,220,223,
225,227,229,231,233,235,237,238,240,241,242,243,244,245,246,
247,247,247,248,248,248,248,248,247,247,247,246,245,244,243,
242,241,240,238,237,235,233,231,229,227,225,223,220,218,215,
213,210,207,204,202,199,195,192,189,186,182,179,176,172,169,
165,161,158,154,150,147,143,139,136,132,128,124,120,117,113,
109,106,102, 98, 95, 91, 87, 84, 80, 77, 74, 70, 67, 64, 61,
 57, 54, 52, 49, 46, 43, 41, 38, 36, 33, 31, 29, 27, 25, 23,
 21, 19, 18, 16, 15, 14, 13, 12, 11, 10,  9,  9,  9,  8,  8,
  8,  8,  8,  9,  9,  9, 10, 11, 12, 13, 14, 15, 16, 18, 19,
 21, 23, 25, 27, 29, 31, 33, 36, 38, 41, 43, 46, 49, 52, 54,
 57, 61, 64, 67, 70, 74, 77, 80, 84, 87, 91, 95, 98,102,106,
109,113,117,120,124};

int index1,index2,inc1,inc2;


#INT_RTCC
void wave_generator() {
   int wave = 0;

   set_rtcc(25);           // when clock is 20MHz, interrupts every 100us

   wave = ((long)SINE_WAVE[index1]+(long)SINE_WAVE[index2])/2;
   output_d(wave);

   index1 += inc1;
   index2 += inc2;

   if(index1 >= 200)
      index1 -= 200;

   if(index2 >= 200)
      index2 -= 200;
}

#define DTMF_ROW1   14  // for 700 Hz, increment this many times every 100us
#define DTMF_ROW2   15  // for 750 Hz, increment this many times every 100us
#define DTMF_ROW3   17  // for 850 Hz, increment this many times every 100us
#define DTMF_ROW4   19  // for 950 Hz, increment this many times every 100us
#define DTMF_COLA   24  // for 1200 Hz, increment this many times every 100us
#define DTMF_COLB   27  // for 1350 Hz, increment this many times every 100us
#define DTMF_COLC   30  // for 1500 Hz, increment this many times every 100us

void generate_dtmf_tone(char keypad, long duration)  {

   index1=0;
   index2=0;
   inc1=0;
   inc2=0;
   if((keypad=="1")||(keypad=="2")||(keypad=="3"))
      inc1=DTMF_ROW1;
   else if((keypad=="4")||(keypad=="5")||(keypad=="6"))
      inc1=DTMF_ROW2;
   else if((keypad=="7")||(keypad=="8")||(keypad=="9"))
      inc1=DTMF_ROW3;
   else if((keypad=="*")||(keypad=="0")||(keypad=="#"))
      inc1=DTMF_ROW4;

   if((keypad=="1")||(keypad=="4")||(keypad=="7")||(keypad=="*"))
      inc2=DTMF_COLA;
   else if((keypad=="2")||(keypad=="5")||(keypad=="8")||(keypad=="0"))
      inc2=DTMF_COLB;
   else if((keypad=="3")||(keypad=="6")||(keypad=="9")||(keypad=="#"))
      inc2=DTMF_COLC;

   setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);

   while(duration-- > 0)
   {
      delay_ms(1);
   }
   disable_interrupts(INT_RTCC);
   output_d(0);
}


void main()  {
   char k;

   kbd_init();

   while(TRUE)
   {
      k=kbd_getc();
      if(k!=0)
         generate_dtmf_tone(k, 100);
   }
}
espero que me puedan ayudar o orientar en lo que ando buscando.
saludos
Título: Re: marcador por tono DTMF (novato)
Publicado por: jhozate en 21 de Octubre de 2009, 13:42:28
el MT8888 (http://www.datasheetcatalog.org/datasheets2/30/309538_1.pdf) es codificador-decodificador DTMF
saludos
Título: Re: marcador por tono DTMF (novato)
Publicado por: japifer_22 en 21 de Octubre de 2009, 21:54:36
hola gracias vamos a ver si lo encuentro
Título: Re: marcador por tono DTMF (novato)
Publicado por: krostby en 25 de Octubre de 2009, 00:09:53
puedes usar el mt8880 con entrada hex, salida tono dtmf bastante estable. lo consigues en casa Keim, Santiago.Suerte
Título: Re: marcador por tono DTMF (novato)
Publicado por: japifer_22 en 02 de Noviembre de 2009, 21:04:41
hola bueno les coment oque e conseguido el CM8870 y el HT9200A los cuales son decodificador de DTMF y codificador de DTMF, pero en los dos estoy teniendo problemas, les comento que en el CM8870 cuando lo conecto a la linea telefonica me empiesa a generar ruido y esta vastantes molestos, le adjunto el diagrama que estoy usando. en cuanto al generador de DTMF no se como ingresarle los numeros ya qu e este solo se hace mediante su entrada DATA de forma serie, lo unico que entiendo es que la forma de ingresar es de D0 a D4, pero nada mas. en esto alguien me puede ayudar por favor.
Título: Re: marcador por tono DTMF (novato)
Publicado por: jhozate en 02 de Noviembre de 2009, 21:15:00
hace un tiempo utilicé este diagrama para el 8870 y funciona
(http://4.bp.blogspot.com/_QOf4C-Xo_BU/SYv0w6BbQYI/AAAAAAAAANk/HB8QdhApQq8/s400/DTMF+Receiver+IC+MT8870+Tester.gif)
para el otro habria q mirar bien el datasheet para inicializarlo y poder generar el DTMF
Título: Re: marcador por tono DTMF (novato)
Publicado por: japifer_22 en 02 de Noviembre de 2009, 21:33:00
hola jhozate  pero no que son distintos el MT8870 y el CM8870 ???? en cuanto a los voltajes ?????
Título: Re: marcador por tono DTMF (novato)
Publicado por: krostby en 02 de Noviembre de 2009, 21:43:24
Hola Japifer 22.  No entiendo porque estas utilizando un amp de bajo ruido,  no es necesario que pases los tonos dtmf de la línea por un 386 hacia el 8870.  lo puedes utilizar directamente si usas un buen acoplador de linea con un trafo 600:600.
Título: Re: marcador por tono DTMF (novato)
Publicado por: jhozate en 02 de Noviembre de 2009, 21:48:20
no entiendo a q te refieres con los voltajes ..pero es un decodificador DTMF y hace lo mismo que el CM
Título: Re: marcador por tono DTMF (novato)
Publicado por: japifer_22 en 02 de Noviembre de 2009, 22:03:04
olvidenlo esque en este tema soy demasiado novato no entiendo nada de esto  :? , pero en fin mmm estava pensandon en lo que me dijiste en el primer post de utilisar el MT8880, ya que krostby me dijo donde encontrarlos, por que de todas formas nesesito codificar y decodificar estas señales, pero alguien de ustedes tiene el circuito para montar el MT8880 ?? tanto para generas las señales como para decifrar estas mismas ????? que me puedan facilitar por favor.
Título: Re: marcador por tono DTMF (novato)
Publicado por: Cryn en 03 de Noviembre de 2009, 12:01:31
Hola jhozate, tienes algún esquema para enviar DTMF's a la red telefónica? de preferencia sin trafo? se puede mediante rectifiador?

saludos.
Título: Re: marcador por tono DTMF (novato)
Publicado por: jhozate en 03 de Noviembre de 2009, 13:51:02
no cryn no tengo ese esquema (en el momento, pero creo poder conseguirlo con alguien) pero supongo que el esquema tipico que viene en el datasheet del MT8880 serviria para empezar...y si japifer con el 8880 pueder codificar y decodificar...ahi la espinita seria mirar bien la hoja de datos por que hay que hacer una rutina de inicializacion que tambien esta en la hoja de datos.
Título: Re: marcador por tono DTMF (novato)
Publicado por: jhozate en 03 de Noviembre de 2009, 14:31:21
viendo la hoja de datos del 8880...tal parece que es mas sencillo utilizar el HT9200 que segun parece solo es seleccionar el modo en que se ingresaran los bits correspondientes(5 bits) al tono a generar y esto se hace poniedo a 0 al pin S/P (modo serial) o poniendo a 1 (modo paralelo) y luego enviar los 5 bits
Título: Re: marcador por tono DTMF (novato)
Publicado por: Cryn en 03 de Noviembre de 2009, 14:41:01
no cryn no tengo ese esquema (en el momento, pero creo poder conseguirlo con alguien) pero supongo que el esquema tipico que viene en el datasheet del MT8880 serviria para empezar...
En la hoja de datos solo están el circuito recomendado para su funcionamiento, pero no dice como conectarlo a una linea telefónica por ejemplo ya sea para recibir o enviar DTMF's.

Saludos, gracias por responder
Título: Re: marcador por tono DTMF (novato)
Publicado por: japifer_22 en 03 de Noviembre de 2009, 16:18:06
hola buen oacavo de comprar los zrner que me falaba para armar el cto que me propusiste, ahora a provar a ver como anda, en aunto al HT9200 yo tengo el A osea los datos se le ingresa meniante su entrada serie la pregunta del millon es como le envio los datos a este ?? es que no entiendo como enviar los datos por un solo pin del pic. bueno ahora a empesar a esperimentar con todo y ir dejando los resultados en este post. (por el momento con el CM8870 ya que no se como mandat los datos al HT9200A  :mrgreen:)
Título: Re: marcador por tono DTMF (novato)
Publicado por: Suky en 03 de Noviembre de 2009, 16:29:00
japifer_22 coloca puntos, comas, etc para que se pueda entender tu redacción, si??? Luego el tema de el envío de datos ya intentamos explicarte el tema en otro foro! Que duda tenes??? Creo que fuimos claros de como se puede mandar  :?
Título: Re: marcador por tono DTMF (novato)
Publicado por: japifer_22 en 03 de Noviembre de 2009, 23:15:43
hola suky, bueno primero que todo, disculpen mi mal escrivir es que de flojo no arreglo las cosas con respecto artografia y puntuaciones, pero ahora si que empieso a darle bien OK :mrgreen:.
bueno con respecto a como mandar los datos entendi parte de ello, como bien tu mensionas devido a mi publicacion del tema en otro foro, pero el punto es el siguiente, y el cual sigo sin entender;
se que se tiene que enviar por un solo pin los datos, pero lo que no entiendo es como hacerlo, osea cuant otiempo tengo que esperar para enviar el segundo dato y demaces, por que se save que tengo que envierle desde el D0 al D4 y de esa misma manera, pero lo que no se es como representar el 1 y el 0 para envierle esto al HT9200A.
Título: Re: marcador por tono DTMF (novato)
Publicado por: Suky en 03 de Noviembre de 2009, 23:34:47
La forma de enviar puede ser la siguiente:

Código: C
  1. #define DATA PIN_B4
  2. #define SCLK PIN_B2
  3. #define CE PIN_B1
  4.  
  5.    output_low(SCLK);
  6.    output_low(CE);
  7.  
  8.    for(i=1;i<=5;++i) {
  9.       output_high(SCLK);
  10.       output_bit(DATA, shift_left(Control,1,0));
  11.       delay_us(xx);
  12.       output_low(SCLK);
  13.       delay_us(xx);
  14.    }
  15.    output_high(CE);

En el datasheet dice a que frecuencia máxima trabaja así que ya esta!
Título: Re: marcador por tono DTMF (novato)
Publicado por: japifer_22 en 04 de Noviembre de 2009, 00:14:55
jajaja hola suky, saves que me da risa esta situaciòn, por que ahora lo que no entiendo es tu codigo, osea entiendo partes pero no todo. ahora bien, lo que no entiendo es la linea

Citar
output_bit(DATA, shift_left(Control,1,0));

bueno esto en parte por que nunca e usado esta función, pero se que hace esta función desplaza a la izquierda un bit de un array o de una estructura, pero no se como se maneja ni nada por el estilo.
me puedes explicar plissss. :mrgreen:
Título: Re: marcador por tono DTMF (novato)
Publicado por: Suky en 04 de Noviembre de 2009, 00:29:13
Vamos por partes:  :undecided:

output_bit (pin, value)
Setea el pin con el valor de value, que en este caso vendrá dado del shift_left.

Syntax:
 shift_left (address, bytes, value) o shift_right (address, bytes, value)
 
Parametros:
 address es una variable, bytes es el numero de bytes a trabajar, value es 0 o 1, valor del carry.
 
Returns:
 0 o 1 del bit que salga al rotar.

Más detalles en la ayuda del CCS  :mrgreen:

Ahora tu determinarás que usar, left o right.

Saludos!
 

Título: Re: marcador por tono DTMF (novato)
Publicado por: japifer_22 en 04 de Noviembre de 2009, 01:23:30
ya aver........ si esta es mi ultima duda (ojalas  :mrgreen:) la variable control es la qu uso para indicar el numero ???, por ejemplo yo digo control = 10100 esto quiere decir, que si uso shift_left desplazo hacia la izquierda de a un bit osea pongo el cero, reseteo, pongo el cero nuevamente y reseteo luego pongo el uno y vuelvo a resetear algo asi es o no ????? asta completa el valor de control o no ????? dando por terminado el primer numero que en este caso se compone de "5" bit ??
Título: Re: marcador por tono DTMF (novato)
Publicado por: Cryn en 22 de Noviembre de 2009, 19:35:19
Tengo un problema con el MT8880, con este ya he generado y recibido tonos DTMF, tengo un rectificador y un NPN conectado a este, el rectificador está conectado a la línea telefónica mi circuito es idéntico al de acá (http://www.todopic.com.ar/foros/index.php?topic=15127.msg233528#msg233528) salvo que he quitado la parte del PNP porque no hará falta el control de colgado y descolgado de la línea ya que el tubo del teléfono será el que determine el colgado y descolagado. Puedo introducir los DTMF mediante ese circuito a la línea.

Mi problema es que cuando no se marca ningún tono con el MT8880 el transistor NPN  hace que la tensión de línea colgado baje de 51V a 47V y hasta a 35V (47V con resistencia de 30k, 35V con resistencia de 1.5k), y curiosamente ese transistor comienza a calentar paulatinamente.

He medido la tensión en el pin 8 (TONE OUT) del MT8880 y esta cuando no se envía ningún tono tiene una tensión entre 2 a 3V, lo que me parece extraño y me hace pensar que está haciendo conducir de cierta manera al PNP, ya que cuando con un cable llevo la base a GND el problema de la baja de tensión se resuelve y no hay calentamiento.

No se si el problema irá con el hardware, porque he probado con rangos desde 1.5k a 30k para la base del PNP y el calentamiento sigue existiendo, para valores más altos de resistencia quizá el transistor no llegue a conducir y no envíe los tonos. O no se si el problema irá por alguna configuración del MT8880 que haga que la salida en el pin 8 TONE OUT se ponga a cero.

A ver que me dicen, espero su ayuda, muchas gracias

saludos.
Título: Re: marcador por tono DTMF (novato)
Publicado por: krostby en 27 de Noviembre de 2009, 23:53:22
japifer_22, que es lo que realmente quieres hacer ???  yo tengo un circuito conectado a la linea TF y funciona perfectamente bien (8870).

Krostby
Título: Re: marcador por tono DTMF (novato)
Publicado por: japifer_22 en 28 de Noviembre de 2009, 16:17:12
hola yo no e trabajado con el mt8880, y oestoy trabajando con el CM8870 y HT9200, el 8870 me pudo funcionar, pero ahora estoy intentando de generar el codigo para el HT9200. en este ultimo no e podido avansar mucho por que e etado haciendo otras cosas, pero en cuanto lo tenga lo publcare aki para que le echen un vistaso.

krostby hola bueno te comento que seria vastante amabre de tu parte para ver que diseño tienes, y si me lo puedes mandar, ya que el qu tengo yo funciona pero el problema que no siempre detecta los tonos.
bueno nos estamos contactando que esten bien.......
salu2s!