Interfaz para generar llamada telefonica por tonos DTMF

Hola con todos primero me disculpo porque me he dado cuenta de que no he realizado aportes al foro y esto es porque recien estoy en proceso de aprendizaje. En esta ocasión tengo una duda sobre el título de este tema estoy realizando una alarma casera, hasta ahí todo bien estoy utilizando el pic 16f628A quería que otra de las características de la alarma sea que genere una llamada telefónica. El circuito para generar la llamada la saque de un libro y el diagrama lo adjunto. Ahora, me he dado cuenta qUE los tonos si se generan correctamente porque la primera vez esperé a qUE se realize la llamada y no paso nada, después en otro intento, levanté otro teléfono y luego de generados los tonos la línea seguía dando tono de marcado mas no de timbrado (al otro teléfono). Ustedes dirán ya hay muchos temas en este foro al respecto pero la verdad es que no son muy claros para mi, ahora en base a lo que he leído en el foro tengo la sospecha que lo que está fallando es lo que llaman la interfaz o simulación de "teléfono levantado". Esa es mi sospecha pero no se si sea cierta. Les agradezco mucho que me orienten en qué cambios se le pueden hacer a este circuito para que funcione, muchas gracias.
 

Adjuntos

  • circuito_dtmf.JPG
    circuito_dtmf.JPG
    16.6 KB · Visitas: 647
Última edición por un moderador:
Pedro, es que tengo la impresion de que el circuito que adjuntas es para lineas telefonicas tipo discado (dial) no para lineas del tipo tonos (DTMF).

Ahora bien, si efectivamente es para lineas DTMF, donde está el circuito generador de tonos ?, dentro del PIC ?, ahi podria estar la razon de la falla, ya que la generacion PIC de los tonos no es la mejor y entonces el circuito falla.

Saludos
 
Gracias por tu respuesta tecnogirl, los tonos si se realizan por medio del PIC he buscado hasta el cansancio sobre el tema y resulta que encontré que si utilizara CI's como el MT8880, para la interfaz necesitaría un transformador de acoplamiento de 600Ohms 1:1 que no consigo por ningún lado, alguna otra manera, o la manera más efectiva para realizar esta interfaz? cualquier guía o ayuda yo los agradezco mucho mucho mucho.
 
Gracias por sus respuestas tecnogirl y santiago, a la final probé lo que me propusiste en la página de pablin y no funcionó. He intentado tanto y nada ha dado resultado, es la primera vez que no consigo finalizar un proyecto pero supongo que para todo hay una primera vez... Conseguí hacer la llamada telefónica desde mi alarma pero lo hice por pulsos mediante un relé y el mismo pic que menciono, pero acoplado mi circuito a un teléfono de esos baratos. Creo que la razón de mi fracaso radica en lo propuesto por tecnogirl, es decir la generación de estos tonos mediante un pic, puede ser deficiente, hubiera intentado algun otro circuito con los generadores propios de tonos DTMF, pero me quedé sin presupuesto, además, los circuitos que encontré también llevaban el dichoso transformador de acoplamiento 1:1 de 600Ohms, x acá en una electrónica me dijeron que me lo fabricarían por casi 20 dólares, pero eso es mucho para mi como estudiante, entonces no pude hacer ningún aporte sobre este tema, creo que lo único que puedo decir a quienes intenten hacer algo parecido es:

NO UTILICEN PICs PARA LA GENERACIÓN DE ESTOS TONOS, y si alguien necesita ayuda para generar una llamada mediante pulsos... ahí si que puedo ayudar. saludos y exitos a todos.
 
:) Ja Ja hola a todos... soy nuevo y no he ido a presentarme aun... pero ya voy.

Me gustaría haber podido ayudar antes.... pero no estaba :LOL:

Si se puede, yo ya lo hice y me resultó de pelos... es mas, le aplique un chip de voz grabada tipo ISD1750... asi QUe, no se desesperen... cometí muchos errores y aprendí, pero, antes QUe nada, repite conmigo: NO PUEDO ACEPTAR DEJAR DE INTENTARLO... (Michael Jordan)

Para empezar, si se puede, pero yo use el HT9200 que es muchísimo mas barato y fácil de usar. Lo puedes conectar en modo serial (I2C) o en modo paralelo.

Lo siguiente es saber que para generar DTMF hay que conocer las reglas del juego:
1º.- la duración mínima del tono DTMF es de 70 mili segundos (yo uso 100 ms)
2º.- debes usar una pausa, o interdígito, de igual período de duración entre dígito y dígito.

(apuesto QUe no lo sabias... :confused:)

Ahora, dibujé a la rápida este esquema unifilar para explicarlo:

INTERFAZPIC_DTMF.jpg


Cuando quieras tomar línea, le pides al PIC que active el RELE mediante la R2 (QUe se yo... tal vez de 1k) y cuando el RELE se cerró, queda la R2 como impedancia de entrada para la línea telefónica (que la acoplas al circuito mediante un puente de diodos con el positivo hacia el RELE y el negativo hacia la R3 de 100k) y es de 820 ohms. Con esa impedancia baja, tendrás TONO y el voltaje de la línea telefónica desciende de unos 50v a unos 8v mas o menos.

Para acoplar el DTMF prueba 2 cosas:
1º Acoplo directo mediante un condensador desde la pata de salida del DTMF al contacto del RELE con la R1, ó
2º Acoplo indirecto usando un simple "4N26" que es un opto transistor. Se pone el transistor en paralelo a R1 y la salida del DTMF controla al LED interno del 4N26.
:unsure: me gusta ayudar, pero que aprendan experimentando... :D

Ahora, puedes generar con tu PIC órdenes para que el HT9200 arroje DTMF, lo controlas con la patita CE\. En el dibujo, la línea gruesa entre el PIC y el HT es el bus de datos de 4 bits y la línea delgada son las líneas de control que necesites.

OPCIONAL: Se le puede agregar al circuito propuesto un detector de "respuesta" :eek:

Es que puedes detectar si la llamada tuvo o no respuesta.... :D

Pero eso es mas complejo y lo dejamos para mas adelante, ok?

Un saludo a todos y ahora voy a presentarme... :D
 
Última edición:
Lo siguiente es saber que para generar DTMF hay que conocer las reglas del juego:
1º.- la duración mínima del tono DTMF es de 70 mili segundos (yo uso 100 ms)
2º.- debes usar una pausa, o interdígito, de igual período de duración entre dígito y dígito.

(apuesto que no lo sabias... :confused:)

;) La explicación que levanté mas arriba, corresponde al resultado de un trabajo que efectué para generar llamadas telefónicas dada cierta situación.

:unsure: Los puntos que repito y destaco, son la principal causa de error. Generar DTMF es simple con los chips disponibles, como el que yo usé. El PIC solo le provee de una serie de códigos binarios que el chip traduce en tonos. Pero el discado en centrales públicas y privadas, requiere que se respeten ciertas normas: la duración mínima del tono emitido (70ms) y la duración mínima de un interdígito, o pausa entre un dígito y otro (70ms).

Todo esto quiere decir que no se trata de emitir tonos de cada dígito y punto, y creer que saldremos al mundo, no. Hay reglas que respetar.

:cool: Lo otro, tiene que ver con tomar línea, es decir, lograr que la línea telefónica alcance el voltaje apropiado para poder transmitir tonos e incluso voz posterior a los tonos. Para ello es necesario usar una R=680 Ω 1w como resistencia de carga. La central telefónica, cuando percibe esta impedancia baja, disminuye la tensión de la línea y con ello permite la comunicación.

(y) Puedes usar el bosquejo mio como modelo. Si tienes otra duda o algo no te queda claro, puedes seguir planteándolas en este hilo.

:eek: lo olvidaba... más ayuda de como funciona el discado DTMF o PULSO lo puedes encontrar en mi tutorial de telefonía pública desde el post #4 al #8 (y aprovecha de opinar :D)

Saludos y éxito en tu proyecto :apreton:
 
Hola a todos ....DTMF se puede generar mediante software en un PIC. Adjunto como ejemplo una extracción de la ayuda del compilador de Basic Proton Ide para PIC que nativa mente tiene la instrucción DTMFOUT para sacar DTMF por un pin asignado del pic a tal fin y de forma extremadamente sencilla.
Saludos.

Ric.
 

Adjuntos

  • DTMFenProtonIDE.pdf
    34.8 KB · Visitas: 692
Muy buen apunte Datagenius.
Ley tu proyecto con cuidado, voy a hacerlo para ver como me funciona,
Me pondre en la tareas de conseguir el HT 9200.
Estuve haciendo algo similar y enn el protoboard con un pic 16f628, me funciono. ( claro que lo trabaje fue con una planta telefonica, y me hacia las marcaciones perfectas. No lo probe directamente a la linea.
Pero cuando hice el circuito impreso y monte los elemento, me dejo viendo estrellas, !! no funciono"" y eso que monte los mismos elementos que tenia en el protoboard.
Bueno seguire luchandole hasta que lo logre.
Gracias por tus aportes.
 
:LOL: Gracias Cesar, tal vez te agrade saber que una vez domines lo del discado DTMF se le pueden incorporar otros servicios a tu esquema, por ejemplo, una vez que termine de discar, que sepa el circuito "cuando" respondió al que llamas y a continuación active una voz grabada en algún chip y que finalmente corte la llamada... :unsure: también un identificador del RING, que es timbre o corriente de llamada que te avisa de que te están llamando, luego tu sistema contesta automáticamente y reproduce otro mensaje pre grabado... y cosas como esas.

:aplauso: espero que te resulte tu circuito y repares tu problema del circuito impreso.


:apreton:
 
HOLA DATAGENIUS.
bueno hasta ahora pude conseguir el integrado ht9200a, ( vivo en BELIZE C.A) pero solo pude conseguir el de 8 pines. el cual es de configuracion serial.
pienzo que he hecho el programa para el pic de acuerdo al data sheet, pero no me genera el tono, Si genera un ruido , pero nada que ver un tono DTMF.
Si pudieras revisar mi codigo por favor y decirme donde esta el error. para que no genere tono.
yo lo entiendo de esta manera.

coloco el clock en alto.
ingreso el codiogo del digito telefonico que quiero marcar.
coloco ahora el clock en bajo (EL DATA SHEET dice que el data ingresa en la transicion alto a bajo 0
doy un retardo
coloco clock en alto
ingreso codigo del 2do digito telefonico.
clock en bajo
retardo.
al finalizar el numero de digitos del telefono que quiero marcar, debo ingresar el codigo de stop
el cual es 11111.
adjunto mi programa . gracias por tu ayuda.



LIST P=16F876A
INCLUDE <P16F876A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _XT_OSC




CBLOCK 0X20
CONTADOR_BITS ; Cuenta los bits a transmitir o a recibir.
NUMERO_TELEFONO ; Dato a transmitir o recibido.
I2C_Flags ; Guarda la información del estado del bus I2C.
ENDC



#DEFINE CLK PORTC,7
#DEFINE DATA PORTC,6

ORG 0X00
GOTO Inicio

Inicio
MOVLW 0X06
MOVWF ADCON1
BSF STATUS,RP0
BCF PORTC,5 ;ENABLE
BCF PORTC,6 ;DATA
BCF PORTC,7 ;CLOCK
movlw 0x06
movwf ADCON1
BCF STATUS,RP0
BCF PORTC,5
BCF PORTC,6
BCF PORTC,7
GOTO Principal
;*****************

TABLA
addwf PCL,F
RETLW B'01010' ;No 0
RETLW B'00001' ;No 1
RETLW B'00010'
RETLW B'00011'
RETLW B'00100'
RETLW B'00101'
RETLW B'00110'
RETLW B'00111'
RETLW B'01000'
RETLW B'01001' ;No 9
RETLW B'11111' ;STOP
;********************************
Principal
BSF PORTC,5 ;ENABLE BAJO = 0
CALL Retardo_1s
movlw .0 ;NUMERO_TEL
CALL ENVIA
MOVLW .1 ;NUMERO_TEL
CALL ENVIA
movlw .2 ;NUMERO_TEL
CALL ENVIA
MOVLW .3 ;NUMERO_TEL
CALL ENVIA
movlw .4 ;NUMERO_TEL
CALL ENVIA
MOVLW .5 ;NUMERO_TEL
CALL ENVIA
movlw .6 ;NUMERO_TEL
CALL ENVIA
MOVLW .7 ;NUMERO_TEL
CALL ENVIA
movlw .8 ;NUMERO_TEL
CALL ENVIA
MOVLW .9 ;NUMERO_TEL
CALL ENVIA
CALL Retardo_200ms

movlw .10 ;STOP
CALL ENVIA
CALL Retardo_5s

GOTO Principal

ENVIA
BCF PORTC,5 ;ENABLE
CALL TABLA
MOVWF NUMERO_TELEFONO
CALL ENV_DIGITO_TEL_BYTE

RETURN
;**************************************************
ENV_DIGITO_TEL_BYTE
BCF PORTC,5
movwf NUMERO_TELEFONO ; Almacena el byte a transmitir.
movlw 0x05 ; A transmitir 5 bits.
movwf CONTADOR_BITS
ENVIA_BITE
BSF CLK ;CLOCK = 1
rrf NUMERO_TELEFONO,F ; Chequea el bit, llevándolo previamente al Carry.
btfsc STATUS,C
goto ENVIA_UNO
ENVIA_CERO
BCF DATA ;TRANSMITE 0 AL DATA
CALL Retardo_200micros
BCF CLK ;CLOCK BAJO = 0 INGRESA EL DATA
CALL Retardo_200micros
goto NEXT_BITE ;DESCUENTA UN BITE Y SIGUE
ENVIA_UNO
BSF DATA ;TRANSMITE 1 AL DATA
CALL Retardo_200micros
BCF CLK ;CLOCK BAJO INGRESA EL DATA
CALL Retardo_200micros
NEXT_BITE
;CALL Retardo_200micros
decfsz CONTADOR_BITS,F ; DESCUENTA UN BITE
goto ENVIA_BITE ; NO ES CERO VUELE AL SIGUIENTE BITE
; SI YA ES ULTIMO TERMINA
CALL Retardo_200micros
return



;*******************************************
;**************************** Librería "RETARDOS.INC" *********************************
;
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López. www.pic16f84a.com
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
;
; Librería con múltiples subrutinas de retardos, desde 4 microsegundos hasta 20 segundos.
; Además se pueden implementar otras subrutinas muy fácilmente.
;
; Se han calculado para un sistema microcontrolador con un PIC trabajando con un cristal
; de cuarzo a 4 MHz. Como cada ciclo máquina son 4 ciclos de reloj, resulta que cada
; ciclo máquina tarda 4 x 1/4MHz = 1 µs.
;
; En los comentarios, "cm" significa "ciclos máquina".
;
; ZONA DE DATOS *********************************************************************

CBLOCK
R_ContA ; Contadores para los retardos.
R_ContB
R_ContC
ENDC
;
; RETARDOS de 4 hasta 10 microsegundos ---------------------------------------------------
;
; A continuación retardos pequeños teniendo en cuenta que para una frecuencia de 4 MHZ,
; la llamada a subrutina "call" tarda 2 ciclos máquina, el retorno de subrutina
; "return" toma otros 2 ciclos máquina y cada instrucción "nop" tarda 1 ciclo máquina.
;
Retardo_10micros ; La llamada "call" aporta 2 ciclos máquina.
nop ; Aporta 1 ciclo máquina.
nop ; Aporta 1 ciclo máquina.
nop ; Aporta 1 ciclo máquina.
nop ; Aporta 1 ciclo máquina.
nop ; Aporta 1 ciclo máquina.
Retardo_5micros ; La llamada "call" aporta 2 ciclos máquina.
nop ; Aporta 1 ciclo máquina.
Retardo_4micros ; La llamada "call" aporta 2 ciclos máquina.
return ; El salto del retorno aporta 2 ciclos máquina.
;
; RETARDOS de 20 hasta 500 microsegundos ------------------------------------------------
;
Retardo_500micros ; La llamada "call" aporta 2 ciclos máquina.
nop ; Aporta 1 ciclo máquina.
movlw d'164' ; Aporta 1 ciclo máquina. Este es el valor de "K".
goto RetardoMicros ; Aporta 2 ciclos máquina.
Retardo_200micros ; La llamada "call" aporta 2 ciclos máquina.
nop ; Aporta 1 ciclo máquina.
movlw d'64' ; Aporta 1 ciclo máquina. Este es el valor de "K".
goto RetardoMicros ; Aporta 2 ciclos máquina.
Retardo_100micros ; La llamada "call" aporta 2 ciclos máquina.
movlw d'31' ; Aporta 1 ciclo máquina. Este es el valor de "K".
goto RetardoMicros ; Aporta 2 ciclos máquina.
Retardo_50micros ; La llamada "call" aporta 2 ciclos máquina.
nop ; Aporta 1 ciclo máquina.
movlw d'14' ; Aporta 1 ciclo máquina. Este es el valor de "K".
goto RetardoMicros ; Aporta 2 ciclos máquina.
Retardo_20micros ; La llamada "call" aporta 2 ciclos máquina.
movlw d'5' ; Aporta 1 ciclo máquina. Este es el valor de "K".
;
; El próximo bloque "RetardoMicros" tarda:
; 1 + (K-1) + 2 + (K-1)x2 + 2 = (2 + 3K) ciclos máquina.
;
RetardoMicros
movwf R_ContA ; Aporta 1 ciclo máquina.
Rmicros_Bucle
decfsz R_ContA,F ; (K-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto Rmicros_Bucle ; Aporta (K-1)x2 ciclos máquina.
return ; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_500micros: 2 + 1 + 1 + 2 + (2 + 3K) = 500 cm = 500 µs. (para K=164 y 4 MHz).
; - Retardo_200micros: 2 + 1 + 1 + 2 + (2 + 3K) = 200 cm = 200 µs. (para K= 64 y 4 MHz).
; - Retardo_100micros: 2 + 1 + 2 + (2 + 3K) = 100 cm = 100 µs. (para K= 31 y 4 MHz).
; - Retardo_50micros : 2 + 1 + 1 + 2 + (2 + 3K) = 50 cm = 50 µs. (para K= 14 y 4 MHz).
; - Retardo_20micros : 2 + 1 + (2 + 3K) = 20 cm = 20 µs. (para K= 5 y 4 MHz).
;
; RETARDOS de 1 ms hasta 200 ms. --------------------------------------------------------
;
Retardo_200ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'200' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_100ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'100' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_50ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'50' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_20ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'20' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_10ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'10' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_5ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'5' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_2ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'2' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_1ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'1' ; Aporta 1 ciclo máquina. Este es el valor de "M".
;
; El próximo bloque "Retardos_ms" tarda:
; 1 + M + M + KxM + (K-1)xM + Mx2 + (K-1)Mx2 + (M-1) + 2 + (M-1)x2 + 2 =
; = (2 + 4M + 4KM) ciclos máquina. Para K=249 y M=1 supone 1002 ciclos máquina
; que a 4 MHz son 1002 µs = 1 ms.
;
Retardos_ms
movwf R_ContB ; Aporta 1 ciclo máquina.
R1ms_BucleExterno
movlw d'249' ; Aporta Mx1 ciclos máquina. Este es el valor de "K".
movwf R_ContA ; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
nop ; Aporta KxMx1 ciclos máquina.
decfsz R_ContA,F ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
goto R1ms_BucleInterno ; Aporta (K-1)xMx2 ciclos máquina.
decfsz R_ContB,F ; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto R1ms_BucleExterno ; Aporta (M-1)x2 ciclos máquina.
return ; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_200ms: 2 + 1 + 2 + (2 + 4M + 4KM) = 200007 cm = 200 ms. (M=200 y K=249).
; - Retardo_100ms: 2 + 1 + 2 + (2 + 4M + 4KM) = 100007 cm = 100 ms. (M=100 y K=249).
; - Retardo_50ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 50007 cm = 50 ms. (M= 50 y K=249).
; - Retardo_20ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 20007 cm = 20 ms. (M= 20 y K=249).
; - Retardo_10ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 10007 cm = 10 ms. (M= 10 y K=249).
; - Retardo_5ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 5007 cm = 5 ms. (M= 5 y K=249).
; - Retardo_2ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 2007 cm = 2 ms. (M= 2 y K=249).
; - Retardo_1ms : 2 + 1 + (2 + 4M + 4KM) = 1005 cm = 1 ms. (M= 1 y K=249).
;
; RETARDOS de 0.5 hasta 20 segundos ---------------------------------------------------
;
Retardo_20s ; La llamada "call" aporta 2 ciclos máquina.
movlw d'200' ; Aporta 1 ciclo máquina. Este es el valor de "N".
goto Retardo_1Decima ; Aporta 2 ciclos máquina.
Retardo_10s ; La llamada "call" aporta 2 ciclos máquina.
movlw d'100' ; Aporta 1 ciclo máquina. Este es el valor de "N".
goto Retardo_1Decima ; Aporta 2 ciclos máquina.
Retardo_5s ; La llamada "call" aporta 2 ciclos máquina.
movlw d'50' ; Aporta 1 ciclo máquina. Este es el valor de "N".
goto Retardo_1Decima ; Aporta 2 ciclos máquina.
Retardo_2s ; La llamada "call" aporta 2 ciclos máquina.
movlw d'20' ; Aporta 1 ciclo máquina. Este es el valor de "N".
goto Retardo_1Decima ; Aporta 2 ciclos máquina.
Retardo_1s ; La llamada "call" aporta 2 ciclos máquina.
movlw d'10' ; Aporta 1 ciclo máquina. Este es el valor de "N".
goto Retardo_1Decima ; Aporta 2 ciclos máquina.
Retardo_500ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'5' ; Aporta 1 ciclo máquina. Este es el valor de "N".
;
; El próximo bloque "Retardo_1Decima" tarda:
; 1 + N + N + MxN + MxN + KxMxN + (K-1)xMxN + MxNx2 + (K-1)xMxNx2 +
; + (M-1)xN + Nx2 + (M-1)xNx2 + (N-1) + 2 + (N-1)x2 + 2 =
; = (2 + 4M + 4MN + 4KM) ciclos máquina. Para K=249, M=100 y N=1 supone 100011
; ciclos máquina que a 4 MHz son 100011 µs = 100 ms = 0,1 s = 1 décima de segundo.
;
Retardo_1Decima
movwf R_ContC ; Aporta 1 ciclo máquina.
R1Decima_BucleExterno2
movlw d'100' ; Aporta Nx1 ciclos máquina. Este es el valor de "M".
movwf R_ContB ; Aporta Nx1 ciclos máquina.
R1Decima_BucleExterno
movlw d'249' ; Aporta MxNx1 ciclos máquina. Este es el valor de "K".
movwf R_ContA ; Aporta MxNx1 ciclos máquina.
R1Decima_BucleInterno
nop ; Aporta KxMxNx1 ciclos máquina.
decfsz R_ContA,F ; (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar).
goto R1Decima_BucleInterno ; Aporta (K-1)xMxNx2 ciclos máquina.
decfsz R_ContB,F ; (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar).
goto R1Decima_BucleExterno ; Aporta (M-1)xNx2 ciclos máquina.
decfsz R_ContC,F ; (N-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto R1Decima_BucleExterno2 ; Aporta (N-1)x2 ciclos máquina.
return ; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_20s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 20000807 cm = 20 s.
; (N=200, M=100 y K=249).
; - Retardo_10s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 10000407 cm = 10 s.
; (N=100, M=100 y K=249).
; - Retardo_5s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 5000207 cm = 5 s.
; (N= 50, M=100 y K=249).
; - Retardo_2s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 2000087 cm = 2 s.
; (N= 20, M=100 y K=249).
; - Retardo_1s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 1000047 cm = 1 s.
; (N= 10, M=100 y K=249).
; - Retardo_500ms: 2 + 1 + (2 + 4N + 4MN + 4KMN) = 500025 cm = 0,5 s.
; (N= 5, M=100 y K=249).

; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López. www.pic16f84a.com
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================





END
 
HOLA DATAGENIUS.
bueno hasta ahora pude conseguir el integrado ht9200a, ( vivo en BELIZE C.A) pero solo pude conseguir el de 8 pines. el cual es de configuracion serial.
pienzo que he hecho el programa para el pic de acuerdo al data sheet, pero no me genera el tono, Si genera un ruido , pero nada que ver un tono DTMF.
Si pudieras revisar mi codigo por favor y decirme donde esta el error. para que no genere tono.
yo lo entiendo de esta manera.

coloco el clock en alto.
ingreso el codiogo del digito telefonico que quiero marcar.
coloco ahora el clock en bajo (EL DATA SHEET dice que el data ingresa en la transicion alto a bajo 0
doy un retardo
coloco clock en alto
ingreso codigo del 2do digito telefonico.
clock en bajo
retardo.
al finalizar el numero de digitos del telefono que quiero marcar, debo ingresar el codigo de stop
el cual es 11111.
adjunto mi programa . gracias por tu ayuda.

:LOL: Cesar, parece que te equivocaste...

Mira, hice esmero en dejar claro el procedimiento de la llamada telefónica usando DTMF.

1º La información serial usa el protocolo I2C muy bien explicado en el libro de donde sacaste los retardos.
2º La emisión de "cada dígito" debe durar 70ms como mínimo, luego debes acompañar ese dígito con una pausa de igual duración y luego enviar otro dígito.
3º La conversación entre PIC y HT es serial, por tanto manda ese protocolo. Tienes que decirme si lo estás empleando bien antes de juzgar el porqué no te resulta.

La rutina que mandas es principalmente la configuración base del 16F876A, el envío de datos y las rutinas de retardo... no veo las rutinas de envío I2C, solo tu protocolo de envío

:eek: OJO, tu dices en tu rutina:
Principal
BSF PORTC,5 ;ENABLE BAJO = 0 => ERROR, estas ordenando un 1 (bcf=0)

ENV_DIGITO_TEL_BYTE
BCF PORTC,5
movwf NUMERO_TELEFONO ; Almacena el byte a transmitir.
movlw 0x05 ; A transmitir 5 bits.
movwf CONTADOR_BITS

===> No sé porqué solo envías 5 bits... :unsure: yo envío los 8, si es que estamos hablando de los 8 bits que compondrán el dígito en el HT

:D Bueno, seguimos en conversación.... :no: te des por vencido !

:apreton:
 
Hola Datahenius.
Si tienes razon, cometi un error en la expresion BSF PORTC,5 ;ENABLE BAJO = 0 =>
BSF es alto. "de todas manera mi idea es .... desde el comienzo deshabilito el pin 1 CE Negado del HT 9200 Aara que el IC no funcione.
ya mas adelante lo coloco en bajo para habilitarlo.

ENV_DIGITO_TEL_BYTE
BCF PORTC,5 creo que con esta expresion habilito el funciomiento del HT 9200.
En cuanto al porque envio solamente 5 digitos

movlw 0x05 ; A transmitir 5 bits.
movwf CONTADOR_BITS

MI RAZON ( no se si estoy equivocado ) es que cada digito de numero telefonico esta compuesto por 5 digitos para generar cada tono ( esto de acuerdo al data sheet )
donde dice
'''' para generar el tono correspondiente a un numero se deben ingresar los 5 digitos correspondientes comenzando desde D0.
DIGITO D4 D3 D2 D1 D0 FRECUENCIA
1 0 0 0 0 1 697 + 1209 hz
2 0 0 0 1 0 697 +1336 hz

etc
etc
Dtmf 0ff 1 1 1 1 1 ---

Esto es lo que dice el data sheet.
de dat forma que yo envio solamente estos 5 digitos. los almaceno en el buffer y los voy transmitiendo uno por uno ( con rotacion a la derecha ) cada digito ingresa al ht 9200 cuando el pic envia un DATA 0 o 1 en el momento de la transision de alto a bajo del clock.
lo del protocolo I2C pues lo trate de implementar de acuerdo al libro ( PROYECTOS CON PIC 16F84 EDOITORIAL RAMA).
AHORA BIEN :despues de que coloque el post ,ingrese los tiempos de retardo de 70 ms como tu dices.
bueno pues el HT9200 si genera unos tonos , pero no se porque NO HACEN LA MARCACION, de acuerdo al numero discado.
PIENZO que si el ht 9200 esta sacando informacion por el pin DTMF es porque el protocolo I2C esta tranajando ( Si estoy equivocado por favor hasme la acotacion en que lugar tengo mi problema para corregirlo.)

por favor si puedes revisar nuevamente mi codigo y decirme donde estoy equivocado ::: te lo agradecere

CORDIALMENTE
cesar
;*************************** SERIE_7.ASM ***********************

;

LIST P=16F876A
INCLUDE <P16F876A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _XT_OSC




CBLOCK 0X20
CONTADOR_BITS ; Cuenta los bits a transmitir o a recibir.
NUMERO_TELEFONO ; Dato a transmitir o recibido.
I2C_Flags ; Guarda la información del estado del bus I2C.
ENDC



#DEFINE CLK PORTC,7
#DEFINE DATA PORTC,6

ORG 0X00
GOTO Inicio

Inicio
MOVLW 0X06
MOVWF ADCON1
BSF STATUS,RP0
BCF PORTC,5 ;ENABLE
BCF PORTC,6 ;DATA
BCF PORTC,7 ;CLOCK
movlw 0x06
movwf ADCON1
BCF STATUS,RP0
BCF PORTC,5
BCF PORTC,6
BCF PORTC,7
GOTO Principal
;*****************

TABLA
addwf PCL,F
RETLW B'01010' ;No 0
RETLW B'00001' ;No 1
RETLW B'00010'
RETLW B'00011'
RETLW B'00100'
RETLW B'00101'
RETLW B'00110'
RETLW B'00111'
RETLW B'01000'
RETLW B'01001' ;No 9
RETLW B'11111' ;STOP
;********************************
Principal
BSF PORTC,5 ;DISABLE
CALL Retardo_1s
movlw .6 ;NUMERO_TEL
CALL ENVIA
MOVLW .6 ;NUMERO_TEL
CALL ENVIA
movlw .1 ;NUMERO_TEL
CALL ENVIA
MOVLW .0 ;NUMERO_TEL
CALL ENVIA
movlw .6 ;NUMERO_TEL
CALL ENVIA
MOVLW .8 ;NUMERO_TEL
CALL ENVIA
movlw .6 ;NUMERO_TEL
CALL ENVIA

GOTO Principal ; AQUI LO DEVUELVO A Principal
; es provisional , esta rutina sera
; enviada a un """ espere mientras se da orden de
; discado""""

ENVIA

BCF PORTC,5 ;ENABLE aqui se habilta para que el ht 9200 funcione
CALL TABLA ; los 5 digitos correspondientes a la frecuencia cada tono
MOVWF NUMERO_TELEFONO
CALL ENV_DIGITO_TEL_BYTE
CALL Retardo_1s
; AQUI ENVIO LA SENAL DE FINAL despues de cada digito
; marcado, '''' NO SE SI ES CORRECTO O NO """"
movlw .10 ;STOP senal de stop de DTMF
CALL TABLA
MOVWF NUMERO_TELEFONO
CALL ENV_DIGITO_TEL_BYTE
RETURN
;**************************************************

; No utilizo la rutina I2C completa puesto que estoy
; utilizando el HT 9200 solo como esclavo
; por lo tanto no requiero enviar respuesta desde el HT 9200 AL PIC
; ESO ES LO QUE CREO !!puedo estar equivocado!!
;*********************************************
ENV_DIGITO_TEL_BYTE
BCF PORTC,5 ; Habilito ht 9200
movwf NUMERO_TELEFONO ; Almacena el byte a transmitir.
movlw 0x05 ; A transmitir 5 bits.(D0 HASTA D4)
movwf CONTADOR_BITS
ENVIA_BITE
BSF CLK ;CLOCK = 1
rrf NUMERO_TELEFONO,F ; Chequea el bit, llevándolo previamente al Carry.
btfsc STATUS,C
goto ENVIA_UNO
ENVIA_CERO
BCF DATA ;TRANSMITE 0 AL DATA
CALL Retardo_50ms
CALL Retardo_20ms
BCF CLK ;CLOCK BAJO = 0 INGRESA EL DATA
CALL Retardo_50ms
CALL Retardo_20ms
goto NEXT_BITE ;DESCUENTA UN BITE Y SIGUE
ENVIA_UNO
BSF DATA ;TRANSMITE 1 AL DATA
CALL Retardo_50ms
CALL Retardo_20ms
BCF CLK ;CLOCK BAJO INGRESA EL DATA
CALL Retardo_50ms
CALL Retardo_20ms
NEXT_BITE

decfsz CONTADOR_BITS,F ; DESCUENTA UN BITE
goto ENVIA_BITE ; NO ES CERO VUELE AL SIGUIENTE BITE


return



;*******************************************
;**************************** Librería "RETARDOS.INC" *********************************
;
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López. www.pic16f84a.com
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
;
; Librería con múltiples subrutinas de retardos, desde 4 microsegundos hasta 20 segundos.
; Además se pueden implementar otras subrutinas muy fácilmente.
;
; Se han calculado para un sistema microcontrolador con un PIC trabajando con un cristal
; de cuarzo a 4 MHz. Como cada ciclo máquina son 4 ciclos de reloj, resulta que cada
; ciclo máquina tarda 4 x 1/4MHz = 1 µs.
;
; En los comentarios, "cm" significa "ciclos máquina".
;
; ZONA DE DATOS *********************************************************************

CBLOCK
R_ContA ; Contadores para los retardos.
R_ContB
R_ContC
ENDC
;
; RETARDOS de 4 hasta 10 microsegundos ---------------------------------------------------
;
; A continuación retardos pequeños teniendo en cuenta que para una frecuencia de 4 MHZ,
; la llamada a subrutina "call" tarda 2 ciclos máquina, el retorno de subrutina
; "return" toma otros 2 ciclos máquina y cada instrucción "nop" tarda 1 ciclo máquina.
;
Retardo_10micros ; La llamada "call" aporta 2 ciclos máquina.
nop ; Aporta 1 ciclo máquina.
nop ; Aporta 1 ciclo máquina.
nop ; Aporta 1 ciclo máquina.
nop ; Aporta 1 ciclo máquina.
nop ; Aporta 1 ciclo máquina.
Retardo_5micros ; La llamada "call" aporta 2 ciclos máquina.
nop ; Aporta 1 ciclo máquina.
Retardo_4micros ; La llamada "call" aporta 2 ciclos máquina.
return ; El salto del retorno aporta 2 ciclos máquina.
;
; RETARDOS de 20 hasta 500 microsegundos ------------------------------------------------
;
Retardo_500micros ; La llamada "call" aporta 2 ciclos máquina.
nop ; Aporta 1 ciclo máquina.
movlw d'164' ; Aporta 1 ciclo máquina. Este es el valor de "K".
goto RetardoMicros ; Aporta 2 ciclos máquina.
Retardo_200micros ; La llamada "call" aporta 2 ciclos máquina.
nop ; Aporta 1 ciclo máquina.
movlw d'64' ; Aporta 1 ciclo máquina. Este es el valor de "K".
goto RetardoMicros ; Aporta 2 ciclos máquina.
Retardo_100micros ; La llamada "call" aporta 2 ciclos máquina.
movlw d'31' ; Aporta 1 ciclo máquina. Este es el valor de "K".
goto RetardoMicros ; Aporta 2 ciclos máquina.
Retardo_50micros ; La llamada "call" aporta 2 ciclos máquina.
nop ; Aporta 1 ciclo máquina.
movlw d'14' ; Aporta 1 ciclo máquina. Este es el valor de "K".
goto RetardoMicros ; Aporta 2 ciclos máquina.
Retardo_20micros ; La llamada "call" aporta 2 ciclos máquina.
movlw d'5' ; Aporta 1 ciclo máquina. Este es el valor de "K".
;
; El próximo bloque "RetardoMicros" tarda:
; 1 + (K-1) + 2 + (K-1)x2 + 2 = (2 + 3K) ciclos máquina.
;
RetardoMicros
movwf R_ContA ; Aporta 1 ciclo máquina.
Rmicros_Bucle
decfsz R_ContA,F ; (K-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto Rmicros_Bucle ; Aporta (K-1)x2 ciclos máquina.
return ; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_500micros: 2 + 1 + 1 + 2 + (2 + 3K) = 500 cm = 500 µs. (para K=164 y 4 MHz).
; - Retardo_200micros: 2 + 1 + 1 + 2 + (2 + 3K) = 200 cm = 200 µs. (para K= 64 y 4 MHz).
; - Retardo_100micros: 2 + 1 + 2 + (2 + 3K) = 100 cm = 100 µs. (para K= 31 y 4 MHz).
; - Retardo_50micros : 2 + 1 + 1 + 2 + (2 + 3K) = 50 cm = 50 µs. (para K= 14 y 4 MHz).
; - Retardo_20micros : 2 + 1 + (2 + 3K) = 20 cm = 20 µs. (para K= 5 y 4 MHz).
;
; RETARDOS de 1 ms hasta 200 ms. --------------------------------------------------------
;
Retardo_200ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'200' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_100ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'100' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_50ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'50' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_20ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'20' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_10ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'10' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_5ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'5' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_2ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'2' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_1ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'1' ; Aporta 1 ciclo máquina. Este es el valor de "M".
;
; El próximo bloque "Retardos_ms" tarda:
; 1 + M + M + KxM + (K-1)xM + Mx2 + (K-1)Mx2 + (M-1) + 2 + (M-1)x2 + 2 =
; = (2 + 4M + 4KM) ciclos máquina. Para K=249 y M=1 supone 1002 ciclos máquina
; que a 4 MHz son 1002 µs = 1 ms.
;
Retardos_ms
movwf R_ContB ; Aporta 1 ciclo máquina.
R1ms_BucleExterno
movlw d'249' ; Aporta Mx1 ciclos máquina. Este es el valor de "K".
movwf R_ContA ; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
nop ; Aporta KxMx1 ciclos máquina.
decfsz R_ContA,F ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
goto R1ms_BucleInterno ; Aporta (K-1)xMx2 ciclos máquina.
decfsz R_ContB,F ; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto R1ms_BucleExterno ; Aporta (M-1)x2 ciclos máquina.
return ; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_200ms: 2 + 1 + 2 + (2 + 4M + 4KM) = 200007 cm = 200 ms. (M=200 y K=249).
; - Retardo_100ms: 2 + 1 + 2 + (2 + 4M + 4KM) = 100007 cm = 100 ms. (M=100 y K=249).
; - Retardo_50ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 50007 cm = 50 ms. (M= 50 y K=249).
; - Retardo_20ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 20007 cm = 20 ms. (M= 20 y K=249).
; - Retardo_10ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 10007 cm = 10 ms. (M= 10 y K=249).
; - Retardo_5ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 5007 cm = 5 ms. (M= 5 y K=249).
; - Retardo_2ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 2007 cm = 2 ms. (M= 2 y K=249).
; - Retardo_1ms : 2 + 1 + (2 + 4M + 4KM) = 1005 cm = 1 ms. (M= 1 y K=249).
;
; RETARDOS de 0.5 hasta 20 segundos ---------------------------------------------------
;
Retardo_20s ; La llamada "call" aporta 2 ciclos máquina.
movlw d'200' ; Aporta 1 ciclo máquina. Este es el valor de "N".
goto Retardo_1Decima ; Aporta 2 ciclos máquina.
Retardo_10s ; La llamada "call" aporta 2 ciclos máquina.
movlw d'100' ; Aporta 1 ciclo máquina. Este es el valor de "N".
goto Retardo_1Decima ; Aporta 2 ciclos máquina.
Retardo_5s ; La llamada "call" aporta 2 ciclos máquina.
movlw d'50' ; Aporta 1 ciclo máquina. Este es el valor de "N".
goto Retardo_1Decima ; Aporta 2 ciclos máquina.
Retardo_2s ; La llamada "call" aporta 2 ciclos máquina.
movlw d'20' ; Aporta 1 ciclo máquina. Este es el valor de "N".
goto Retardo_1Decima ; Aporta 2 ciclos máquina.
Retardo_1s ; La llamada "call" aporta 2 ciclos máquina.
movlw d'10' ; Aporta 1 ciclo máquina. Este es el valor de "N".
goto Retardo_1Decima ; Aporta 2 ciclos máquina.
Retardo_500ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'5' ; Aporta 1 ciclo máquina. Este es el valor de "N".
;
; El próximo bloque "Retardo_1Decima" tarda:
; 1 + N + N + MxN + MxN + KxMxN + (K-1)xMxN + MxNx2 + (K-1)xMxNx2 +
; + (M-1)xN + Nx2 + (M-1)xNx2 + (N-1) + 2 + (N-1)x2 + 2 =
; = (2 + 4M + 4MN + 4KM) ciclos máquina. Para K=249, M=100 y N=1 supone 100011
; ciclos máquina que a 4 MHz son 100011 µs = 100 ms = 0,1 s = 1 décima de segundo.
;
Retardo_1Decima
movwf R_ContC ; Aporta 1 ciclo máquina.
R1Decima_BucleExterno2
movlw d'100' ; Aporta Nx1 ciclos máquina. Este es el valor de "M".
movwf R_ContB ; Aporta Nx1 ciclos máquina.
R1Decima_BucleExterno
movlw d'249' ; Aporta MxNx1 ciclos máquina. Este es el valor de "K".
movwf R_ContA ; Aporta MxNx1 ciclos máquina.
R1Decima_BucleInterno
nop ; Aporta KxMxNx1 ciclos máquina.
decfsz R_ContA,F ; (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar).
goto R1Decima_BucleInterno ; Aporta (K-1)xMxNx2 ciclos máquina.
decfsz R_ContB,F ; (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar).
goto R1Decima_BucleExterno ; Aporta (M-1)xNx2 ciclos máquina.
decfsz R_ContC,F ; (N-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto R1Decima_BucleExterno2 ; Aporta (N-1)x2 ciclos máquina.
return ; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_20s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 20000807 cm = 20 s.
; (N=200, M=100 y K=249).
; - Retardo_10s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 10000407 cm = 10 s.
; (N=100, M=100 y K=249).
; - Retardo_5s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 5000207 cm = 5 s.
; (N= 50, M=100 y K=249).
; - Retardo_2s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 2000087 cm = 2 s.
; (N= 20, M=100 y K=249).
; - Retardo_1s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 1000047 cm = 1 s.
; (N= 10, M=100 y K=249).
; - Retardo_500ms: 2 + 1 + (2 + 4N + 4MN + 4KMN) = 500025 cm = 0,5 s.
; (N= 5, M=100 y K=249).

; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López. www.pic16f84a.com
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================





END
 
:LOL: Ufff, mucho código...

:rolleyes: mira, reconozco que tienes razón con lo de enviar 5 bits por dígito DTMF (y)

:rolleyes: Ahora, como estoy cansadito del trabajo, solo me alcancé a dar cuenta del siguiente error:

; AQUI ENVIO LA SENAL DE FINAL despues de cada digito
; marcado, '''' NO SE SI ES CORRECTO O NO """"
movlw .10 ;STOP senal de stop de DTMF (n)

La data exige que emitas 5 "unos" (11111)

:LOL: para que te aparezcan puros "unos" mejor pon:

movlw .255 ;STOP senal de stop de DTMF (y)

Así te aparece el código b'11111111' del cual solo envías los 5 primeros bits :D

:unsure: El .10 equivale en binario a b'00001010'

Que tal si lo pruebas así y vemos qué pasa? :D

La próxima vez, no es necesario que listes todo el programa. Evita las rutinas de Retardos, ya están archi probadas.

Nos leemos :LOL:

:apreton:
 
Última edición:
hola Datagenius.
lamento la demora en la respuesta sucede que hace unos dias tuve una cirugia de vesicula, y no me habia sentido bien , para sentarme al computador, PERO bueno aqui estoy hoy.

gracias por tu interes, de acuerdo a lo que me dices de el STOP.
Si observas la expresion,
movlw .10 ;STOP senal de stop de DTMF
CALL TABLA

aqui la rutina se dirige a la tabla donde busca la posicion 10.

RETLW B'11111' desde aqui me envia Los cinco digitos de senal STOP.
por lo tanto creo que estoy enviando el codigo correcto,

De todas maneras gracias por tu ayuda y tu interes en este proyecto.
seguire trabajandolo hasta que lo logre
cordialmente

cesar







































































































































































































































































































































++
 
A todos los integrantes y al administrador de este foro.

Quiero Disculparme, ya que al colocar el anterior post, algo sucedio con el teclado de mi pc, y envie un monton de espacio en blanco.lo cual se ve terrible.
Disculpenme por favor . Fue un accidente.

Cordialmente

Cesar
 
Hola Datagenius:
Buenas Noticias
!!!!!!!!!!!!! EUREKA !!!!!!!!!!!!!!!!! funciono,
ya pude generar los tonos con el HT9200A (serial)
quiero darte las gracias por tu aporte y gran colaboracion, fuiste mi faro de luz.
quiero hacerte una pregunta ??? has trabajado con el MT 8888C.
ESTE ES UN TRANSEIVER que puede generar, transmitir y recibir tonos DTMF.
si pudieras ayudarme .. mira no he logrado configurar el programa para conectarlo con el pic.... de acuerdo al data sheet no he podido entender como ingresar a registro STATUS de este (m8888c), para darle la orden de generar un determinado Tono.
otra cosa ??? como puedo detectar que al otro lado de la linea me han contestado???.
generalmente esto es por inversion de polaridad en la linea , pero aqui en Belize no usan ese sistema.

de que otra manera podria detectar que la llamada fue contestada, o esta ocupada la linea????
te agradesco mucho.

aqui publico mi programita ,. tal vez a alguien le interese,
;************************* SERIE_12.ASM ***************************
;********************** SERIE_11.ASM ****************
;********************************** serie_10.asm ********************
;************************************ SERIE_9.ASM *********************
;*************************** SERIE_7.ASM ***********************

;

LIST P=16F876A
INCLUDE <P16F876A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _XT_OSC

;;;; ME FUNCIONO PERFECTO HIZO LA MARCACION A MI CELULAR
; CIRCUITO EN PULSONIX EJEMPLOS ALARMA TELEFONO OK


;;;; De acuerdo al uso que se le vaya a dar, habra que hacer una rutina para que vaya a principal
;; y marque el numero telefonico que uno quiere.

; cuando el numero marcado conteste se le asignara alguna tarea, ya sea un mensaje de VOZ
;; u otra cosa, de igual manera tan pronto termine, enviar el micro y el HT9200 a reposo
; hasta un nuevo evento que lo dispare nuevamente.

; este programa es solamente para ver como se hace la marcacion por TONOS, con
; un HT 9200A (SERIAL)
; Utilizando protocolo I2C.
; ESPERO USTEDES LO MEJOREN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

CBLOCK 0X20
CONTADOR_BITS ; Cuenta los bits a transmitir o a recibir.
NUMERO_TELEFONO ; Dato a transmitir o recibido.
I2C_Flags ; Guarda la información del estado del bus I2C.
ENDC



#DEFINE CLK PORTC,7 ;CLOCK para el HT 9200
#DEFINE DATA PORTC,6 ; DATA PARA EL HT 9200

ORG 0X00
GOTO Inicio

Inicio
MOVLW 0X06
MOVWF ADCON1
BSF STATUS,RP0
BCF PORTC,5 ;ENABLE
BCF PORTC,6 ;DATA
BCF PORTC,7 ;CLOCK
movlw 0x06
movwf ADCON1
BCF STATUS,RP0
BCF PORTC,5
BCF PORTC,6
BCF PORTC,7
BSF CLK
GOTO Principal
;***************************************
; TABLA PARA SELECCIONAR EL DIGITO TELEFONICO A MARCAR;

TABLA
addwf PCL,F
RETLW B'01010' ;No 0
RETLW B'00001' ;No 1
RETLW B'00010' ;No 2
RETLW B'00011' ;No 3
RETLW B'00100'
RETLW B'00101'
RETLW B'00110'
RETLW B'00111' ;No 7
RETLW B'01000' ;No 8
RETLW B'01001' ;No 9
RETLW B'11111' ;STOP
;********************************
Principal
BSF PORTC,5 ;DISABLE HT 9200
CALL Retardo_1s
movlw .6 ;NUMERO_TEL
CALL ENVIA
MOVLW .6 ;NUMERO_TEL
CALL ENVIA
movlw .1 ;NUMERO_TEL
CALL ENVIA
MOVLW .0 ;NUMERO_TEL
CALL ENVIA
movlw .6 ;NUMERO_TEL
CALL ENVIA
MOVLW .8 ;NUMERO_TEL
CALL ENVIA
movlw .6 ;NUMERO_TEL
CALL ENVIA



call Retardo_5s ; despues de estos retardo vuelve a principal
call Retardo_10s ; y marca de nuevo el numero de tel
; aqui hay que colocar al micro en reposo
; hasta que un nuevo evento lo active
; y haga la marcacion telefonica de nuevo

GOTO Principal ; AQUI LO DEVUELVO A Principal
; es provisional , esta rutina sera
; enviada a un """ espere mientras se da orden de
; discado""""

ENVIA

BCF PORTC,5 ;ENABLE aqui se habilta para que el ht 9200 funcione

CALL TABLA ; los 5 digitos correspondientes a la frecuencia cada tono
MOVWF NUMERO_TELEFONO
CALL ENV_DIGITO_TEL_BYTE
CALL Retardo_1s
; AQUI ENVIO LA SENAL DE FINAL despues de cada digito
; marcado, '''' """"
movlw .10 ;STOP senal de stop de DTMF
CALL TABLA
MOVWF NUMERO_TELEFONO
CALL ENV_DIGITO_TEL_BYTE
RETURN
;**************************************************

; No utilizo la rutina I2C completa puesto que estoy
; utilizando el HT 9200 solo como esclavo
; por lo tanto no requiero enviar respuesta desde el HT 9200 AL PIC
; ;*********************************************
ENV_DIGITO_TEL_BYTE
BCF PORTC,5 ; Habilito ht 9200

movwf NUMERO_TELEFONO ; Almacena el byte a transmitir.
movlw 0x05 ; A transmitir 5 bits.(D0 HASTA D4)
movwf CONTADOR_BITS
ENVIA_BITE
BSF CLK ;CLOCK = 1
rrf NUMERO_TELEFONO,F ; Chequea el bit, llevándolo previamente al Carry.
btfsc STATUS,C
goto ENVIA_UNO
ENVIA_CERO
BCF DATA ;TRANSMITE 0 AL DATA
CALL Retardo_50ms
CALL Retardo_20ms

BCF CLK ;CLOCK BAJO = 0 INGRESA EL DATA

CALL Retardo_20ms

goto NEXT_BITE ;DESCUENTA UN BITE Y SIGUE
ENVIA_UNO
BSF DATA ;TRANSMITE 1 AL DATA
CALL Retardo_50ms
CALL Retardo_20ms

BCF CLK ;CLOCK BAJO INGRESA EL DATA

CALL Retardo_20ms
NEXT_BITE

decfsz CONTADOR_BITS,F ; DESCUENTA UN BITE
goto ENVIA_BITE ; NO ES CERO VUELE AL SIGUIENTE BITE
;
RETURN

;;;;;;; OJO FALTAN LOS RETARDOS ;;;;;;;;;;;

;*******************************************
;;;;; LOS RETARDOS LOS PODRAN SACAR DEL ANTERIOR POST DONDE SE ENCUENTRA
;;;;; LA LIBRERIA DE RETARDOS;;;



END
 
Atrás
Arriba