TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: bikertron en 10 de Enero de 2008, 20:01:28

Título: Interfaz con Tip-Ring telefonico usando HT9200A
Publicado por: bikertron en 10 de Enero de 2008, 20:01:28
En primer lugar una afectuoso saludo...
Soy nuevo en el foro y el motivo de mi posteo va relacionado a que estoy trabajando en una aplicación que reconoce los tonos DTMF para luego "rediscar" la llamada por un canal más economico, ya sea a traves de un conversor celular a través de una tarjeta SIM o un adaptador VOIP.

Inicialmente estaba trabajando con el MT8888CE que es receptor-generador DTMF, pero ahora por simplicidad me cambie al trabajo en conjunto del CM8870 como detector DTMF y como generador ocupo el HT9200A...como ocupo multiples lineas ocupo el pic18f452 del cual utilizo las 3 interrupciones externas......pero eso no es la dificultad...en realidad estoy listo...el reconocimiento es correcto y el generador tambien lo hago funcionar correctamente(verificado tanto a traves de un parlante como por el osciloscopio).....en realidad necesito una ayudita en la interfaz de salida al momento de contarme a la linea a traves del Tip y Ring.....lo he conectado a traves de un transistor y un puente rectificador directo a la linea ..pero no me pesca......

Cualquier recomendación se agradece..........
Título: Re: Interfaz con Tip-Ring telefonico usando HT9200A
Publicado por: bikertron en 11 de Enero de 2008, 18:11:40
otra pregunta!!!

Resulta que tengo desarrollado el codigo para mandar los tonos pero no logro crear la pausa entre los tonos... :? :? :?......

Código: [Seleccionar]
void cargar_dato()
     {
     if(bit_test(numero,0)==1)
     D0=1;
     if(bit_test(numero,0)==0)
     D0=0;
     if(bit_test(numero,1)==1)
     D1=1;
     if(bit_test(numero,1)==0)
     D1=0;
     if(bit_test(numero,2)==1)
     D2=1;
     if(bit_test(numero,2)==0)
     D2=0;
     if(bit_test(numero,3)==1)
     D3=1;
     if(bit_test(numero,3)==0)
     D3=0;
     if(bit_test(numero,4)==1)
     D4=1;
     if(bit_test(numero,4)==0)
     D4=0;
     }

void enviar_digito()
     {
     
     output_low(DTMF_CE);
     delay_ms(10);
     
     numero=numerodis[j];
     cargar_dato();

for(j=0;j<=i;++j)
     { 

//envío del D0
   
     output_high(DTMF_CLK);
     DTMF_DATA=D0;
     delay_us(5);
     output_low(DTMF_CLK);
     delay_us(5);
     
//envío del D1     
     
     output_high(DTMF_CLK);
     DTMF_DATA=D1;
     delay_us(5);
     output_low(DTMF_CLK);
     delay_us(5);
     
//envío del D2
     
     output_high(DTMF_CLK);
     DTMF_DATA=D2;
     delay_us(5);
     output_low(DTMF_CLK);
     delay_us(5);
     
//envío del D3
     
     output_high(DTMF_CLK);
     DTMF_DATA=D3;
     delay_us(5);
     output_low(DTMF_CLK);
     delay_us(5);
     
//envío del D4
   
     output_high(DTMF_CLK);
     DTMF_DATA=D4;
     delay_us(5);
     output_low(DTMF_CLK);
 
     numero=numerodis[j];
     cargar_dato();
     printf(" %u ",numero);

//tiempo de vida del tono

     delay_ms(500);
     
     }
   
//rutina  de stop data

     for(x=0;x<=4;++x)
     {
     output_high(DTMF_CLK);
     DTMF_DATA=1;
     delay_us(5);
     output_low(DTMF_CLK);
     delay_us(5);
     }


output_high(DTMF_CE);

     }

void rediscar()
    {
     putc('r');
     output_high(rele_output1);
     delay_ms(1000);
       
     enviar_digito();
 
     putc('F');
     delay_ms(10);
     output_low(rele_input);
     for(j=0;j==i;++j)
     numerodis[j]=0;
     interrupcion_ext=0;
   }
Título: Re: Interfaz con Tip-Ring telefonico usando HT9200A
Publicado por: todopic en 12 de Enero de 2008, 01:21:32
Hola, bienvenido al foro!
La linea telefonica, tiene una tension de unos 48v cuando esta libre, y al levantar el tubo, se "carga" y cae a una tension menor de 10 v
Por eso, se emplea un capacitor, por el cual pasara la tension pulsante del timbre de llamada....y al levantar el tubo, se "puentea" el capacitor....
No se como conectaste tu circuito, pero para control, podrias colocar ademas un led, y una resistencia de unos 4,7k...  prueba si asi se "mantiene retenida la linea"
En una oportunidad construí una espera musical, y colocaba un pequeño trafo, por el cual le inyectaba el audio, y lo retenia con un tiristor de muy baja potencia (o un rele)


Norberto
Título: Re: Interfaz con Tip-Ring telefonico usando HT9200A
Publicado por: bikertron en 16 de Enero de 2008, 16:36:52
Gracias por tus concejos  :) :) :) :)......

Ahora mas bien estoy pegado con el codigo para generar los tonos con el ht9200A.....lamentablemente no he podido lograr los silencios entre tonos....el codigo de arriba ilustra la generación.....

Para entender el circuito, te explico que tengo implementada una linea artificial para cuando el individuo marca el primer digito conmuta (mt8870 entrega una interrupcion), la linea publica me entrega el tono de invitación a marcar para luego darle los niveles de tensión en la linea alternativa conmutada mediante un rele (rele de 8 pines, 2 para la bobina). Cuando reconozco a quien quiere llamar por un proceso de conmutació de reles encamino la llamada y vuelvo a DISCAR MEDIANTE EL GENERADOR POR LA LINEA SELECCIONADA para luego vovler a conmutar la linea de "voz" con la salida seleccionada.

 :) :) :) :) :) :) :)
Título: Re: Interfaz con Tip-Ring telefonico usando HT9200A
Publicado por: todopic en 16 de Enero de 2008, 20:06:26
Hola Bikertron, o sea que estas haciendo un "repetidora" del numero discado...
pero por lo poco que se de C, estas colocando delay_us(5)
5 microsegundos....  creo que tendrias que colocar al menos 200 milisegundos...

Norberto
Título: Re: Interfaz con Tip-Ring telefonico usando HT9200A
Publicado por: bikertron en 16 de Enero de 2008, 23:31:45
Hola Bikertron, o sea que estas haciendo un "repetidora" del numero discado...
pero por lo poco que se de C, estas colocando delay_us(5)
5 microsegundos....  creo que tendrias que colocar al menos 200 milisegundos...

Norberto

Estimado norberto con eso estoy implementando  un reloj de 100khz en la comunicación serial con el HT9200a para sicronizar los datos
Título: Re: Interfaz con Tip-Ring telefonico usando HT9200A
Publicado por: micro_cadaver en 28 de Enero de 2008, 21:09:12
veo que despues de enviar una trama de digito dtmf estas enviando el codigo "dtmf off" y luego deshabilitas el CE del ht9200a, no te recomiendo eso, guiandome de este ejemplo del ensalce de abajo he observado que el "dtmf off" dura 40milisegundos y luego vuelve a enviar el siguiente digito dtmf sin tocar el CE.

http://www.todopic.com.ar/foros/index.php?topic=15304.msg96142#msg96142

pd: te mande un privado.
Título: Re: Interfaz con Tip-Ring telefonico usando HT9200A
Publicado por: bikertron en 29 de Enero de 2008, 12:49:16
Muchas Gracias Micro_cadaver  :-/ :-/ :-/ :-/ :-/ voy a echarle un vistazo a lo que publicaste.....que por lo demás está muy bien explicado
Título: Re: Interfaz con Tip-Ring telefonico usando HT9200A
Publicado por: micro_cadaver en 29 de Enero de 2008, 17:28:10
hola aca te mando el programa para el ht9200 en C del compilador CSS

#include <16f628a.h>
#fuses HS,NOWDT,PUT,NOPROTECT,BROWNOUT,MCLR,NOLVP,NOCPD
#use delay(clock=20000000)
#use fast_io(b)

#byte porta = 0x05
#byte portb = 0x06

#bit  dtmf_ce     = portb.0
#bit  dtmf_datos  = portb.1
#bit  dtmf_reloj  = portb.2

int contador,numero;

void envia_dtmf(numero);
//---------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------------
//
//
//    Funcion Principal
//
//
//---------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------------

void main()
{
   set_tris_b(0);
   output_b(0);
   dtmf_ce = 0;

   delay_ms(100);

   envia_dtmf(2);//digito 2
   envia_dtmf(31);//off dtmf

   envia_dtmf(7);//digito 7
   envia_dtmf(31);//off dtmf

   envia_dtmf(6);//digito 6
   envia_dtmf(31);//off dtmf

   envia_dtmf(9);//digito 9
   envia_dtmf(31);//off dtmf

   envia_dtmf(10);//digito 0
   envia_dtmf(31);//off dtmf

   envia_dtmf(3);//digito 3
   envia_dtmf(31);//off dtmf

   envia_dtmf(3);//digito 3
   envia_dtmf(31);//off dtmf

   while(1);

}
//---------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------------
//
//    Funcion que envia codigo dtmf por el ht9200
//
//---------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------------
void envia_dtmf(numero)
{
   int a;
   dtmf_reloj=1;

   for(a=0;a<5;a++)
   {
      dtmf_datos=0;
      if( bit_test(numero,0) )
         dtmf_datos=1;

      dtmf_reloj=0;
      delay_us(5);
      dtmf_reloj=1;
      numero >>= 1;
   }

   delay_ms(60);
}

saludos!  :-/


pd: habia cometido un error que si quieres el codigo de la tecla 0 en dtmf tienes que ver la tabla que esta en el datahseet del ht9200 donde verás que dice que tienes que mandar el numero 10.
Título: Re: Interfaz con Tip-Ring telefonico usando HT9200A
Publicado por: bikertron en 29 de Enero de 2008, 18:33:39
Interesante trabajo estimado micro_cadaver..... Muy agradecido...... 8) 8) 8)
....................................toda la mañana la gaste creando un driver para el ht9200 en assembler..jajaj con la intervencion que hiciste inicialmente...

Título: Re: Interfaz con Tip-Ring telefonico usando HT9200A
Publicado por: bikertron en 30 de Enero de 2008, 13:58:16
hola aca te mando el programa para el ht9200 en C del compilador CSS


Encontre un conflicto al analizarlo......los tono correspondientes a 8-9-0-*-#-A-B-C generan un tono puro  :shock: , eso mismo me pasaba antes pero con otros números y con un codigo propio.................

ESTOY TRABAJANDO EN ESO  :lol: :lol:

la trama de los datos enviados serialmente estan correctas...curiosamente los digitos conflictivos comparten el mismo bit D3 en "uno"
Título: Re: Interfaz con Tip-Ring telefonico usando HT9200A
Publicado por: micro_cadaver en 30 de Enero de 2008, 16:02:42
revisa esta tabla amigo

(http://img295.imageshack.us/img295/6758/61268187xf8.jpg)
Título: Re: Interfaz con Tip-Ring telefonico usando HT9200A
Publicado por: bikertron en 30 de Enero de 2008, 18:38:00
revisa esta tabla amigo



los datos envíados concuerdan con los de la tabla......hiciste la prueba tu??....con el osciloscopio me doy cuenta de que me entrega los tono puros para los digitos antes mencionados

Saludos
Título: Re: Interfaz con Tip-Ring telefonico usando HT9200A
Publicado por: micro_cadaver en 31 de Enero de 2008, 02:54:53
sip y va bien  :-/
Título: Re: Interfaz con Tip-Ring telefonico usando HT9200A
Publicado por: bikertron en 31 de Enero de 2008, 14:01:02
sip y va bien  :-/

lo revisaste en el osciloscopio o por un parlante??? :?
Título: Re: Interfaz con Tip-Ring telefonico usando HT9200A
Publicado por: micro_cadaver en 31 de Enero de 2008, 20:10:58
defrente a la linea telefonica, pones un puente diodo conectando la linea entre sus  terminales analogos del puente diodo, preferible si lo haces con 4 1n4007, luego el ( - ) del puente lo mandas a tierra DC, y el positivo al colector de un 2n3904, cuyo emisor lo conectas a una resistencia de 180 ohmios conectada a tierra. y la base del transistor lo conectas a una ressitencia de 5k1 y esta a la salida DTMF del ht9200.
Título: Re: Interfaz con Tip-Ring telefonico usando HT9200A
Publicado por: bikertron en 01 de Febrero de 2008, 17:08:40
EQUIPO FUNCIONANDO PERFECTAMENTE..................PROYECTO FINALIZADO :-/ :-/ :-/ :-/

.............AHORA VAMOS POR EL DESAFÍO DE INTEGRAR UN GATEWAY VOIP
Título: Re: Interfaz con Tip-Ring telefonico usando HT9200A
Publicado por: marcopolo_Arg en 16 de Mayo de 2017, 19:02:40
hola aca te mando el programa para el ht9200 en C del compilador CSS

#include <16f628a.h>
#fuses HS,NOWDT,PUT,NOPROTECT,BROWNOUT,MCLR,NOLVP,NOCPD
#use delay(clock=20000000)
#use fast_io(b)

#byte porta = 0x05
#byte portb = 0x06

#bit  dtmf_ce     = portb.0
#bit  dtmf_datos  = portb.1
#bit  dtmf_reloj  = portb.2

int contador,numero;

void envia_dtmf(numero);
//---------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------------
//
//
//    Funcion Principal
//
//
//---------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------------

void main()
{
   set_tris_b(0);
   output_b(0);
   dtmf_ce = 0;

   delay_ms(100);

   envia_dtmf(2);//digito 2
   envia_dtmf(31);//off dtmf

   envia_dtmf(7);//digito 7
   envia_dtmf(31);//off dtmf

   envia_dtmf(6);//digito 6
   envia_dtmf(31);//off dtmf

   envia_dtmf(9);//digito 9
   envia_dtmf(31);//off dtmf

   envia_dtmf(10);//digito 0
   envia_dtmf(31);//off dtmf

   envia_dtmf(3);//digito 3
   envia_dtmf(31);//off dtmf

   envia_dtmf(3);//digito 3
   envia_dtmf(31);//off dtmf

   while(1);

}
//---------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------------
//
//    Funcion que envia codigo dtmf por el ht9200
//
//---------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------------
void envia_dtmf(numero)
{
   int a;
   dtmf_reloj=1;

   for(a=0;a<5;a++)
   {
      dtmf_datos=0;
      if( bit_test(numero,0) )
         dtmf_datos=1;

      dtmf_reloj=0;
      delay_us(5);
      dtmf_reloj=1;
      numero >>= 1;
   }

   delay_ms(60);
}

saludos!  :-/


pd: habia cometido un error que si quieres el codigo de la tecla 0 en dtmf tienes que ver la tabla que esta en el datahseet del ht9200 donde verás que dice que tienes que mandar el numero 10.

Es necesario utilizar el CE? o lo puedo dejar a tierra y dejar el chip siempre habilitado?