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