EJEMPLO PARA EL MT8889
; ###########################################################################
; NOMBRE : DEMO_DTMF.ASM
; FECHA : 04/01/06
; XTAL : 4MHZ
; DESCRIPCION : REALIZA UNA LLAMADA TELEFONICA Y ESPERA QUE SE PRESIONE
; LA TECLA * (ASTERISCO) PARA FINALIZAR LA LLAMADA
; DISEÑADO POR : MARIO PASTOR PARA LOS AMIGOTES DEL FORO TODOPIC
; ###########################################################################
LIST P=16F877A
RADIX DEC
ERRORLEVEL -302
INCLUDE "P16F877A.INC"
__CONFIG 0X3F71
; ###########################################################################
; DEFINICION DE LA MEMORIA RAM
; ###########################################################################
CBLOCK 0X20
DEMO_1,DEMO_2,DEMO_CONT
DTMF_TX,DTMF_RX
ENDC
; ####################################################################
; DEFINICION DE IGUALDADES
; ####################################################################
; SE DEFINEN PINES DE PORTA
#DEFINE TELF PORTA,3
#DEFINE DTMF_D3 PORTA,5
#DEFINE DTMF_TRIS3 TRISA,5
; SE DEFINEN PINES DE PORTC
#DEFINE DTMF_IRQ PORTC,1
#DEFINE DTMF_DS PORTC,2
#DEFINE DTMF_RS0 PORTC,3
; SE DEFINEN PINES DE PORTD
#DEFINE DTMF_RW PORTD,0
#DEFINE DTMF_CS PORTD,1
; SE DEFINEN PINES DE PORTE
#DEFINE DTMF_D2 PORTE,0
#DEFINE DTMF_TRIS2 TRISE,0
#DEFINE DTMF_D1 PORTE,1
#DEFINE DTMF_TRIS1 TRISE,1
#DEFINE DTMF_D0 PORTE,2
#DEFINE DTMF_TRIS0 TRISE,2
; ####################################################################
; DEFINICION DE MACROS
; ####################################################################
BANK_0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK_1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK_2 MACRO
BCF STATUS,RP0
BSF STATUS,RP1
ENDM
BANK_3 MACRO
BSF STATUS,RP0
BSF STATUS,RP1
ENDM
PAGE_0 MACRO
BCF PCLATH,3
BCF PCLATH,4
ENDM
PAGE_1 MACRO
BSF PCLATH,3
BCF PCLATH,4
ENDM
; ###########################################################################
ORG 0X00
NOP
GOTO INICIO
ORG 0X05
; ###########################################################################
; RUTINA DE CONFIGURACION
; ###########################################################################
; CONFIGURACIONES INICIALES DEL PIC
CONFIGURACION
BANK_0
MOVLW B'00000000' ;TELF=0 (COLGADO),X,X,X
MOVWF PORTA
MOVLW B'00000000' ;DTMF_RS0=0,DTMF_DS=0,X,X
MOVWF PORTC
MOVLW B'00000011' ;DTMF_CS=1,DTMF_RW=1
MOVWF PORTD
BSF OPTION_REG,NOT_RBPU ;NO PULL UP
BANK_1
MOVLW B'00000111' ;PORTA COMO E/S DIGITALES
MOVWF ADCON1
MOVLW B'00000000' ;TODOS COMO SALIDA
MOVWF TRISA
MOVLW B'00000010' ;RC1=ENTRADA PARA EL DTMF_IRQ
MOVWF TRISC
MOVLW B'00000000' ;TODOS COMO SALIDA
MOVWF TRISD
MOVLW B'00000111' ;TODOS COMO ENTRADA
MOVWF TRISE
BANK_0
RETURN
; ###########################################################################
; RUTINAS DE RETARDO
; ###########################################################################
; EL RETARDO GENERADO ES DE APROXIMADAMENTE 5 MS PARA UN XTAL DE 4MHZ
; REGISTROS USADOS: DEMO_1,DEMO_2
DEMO_5MS
MOVLW .10
MOVWF DEMO_1
MOVLW .165
MOVWF DEMO_2
DECFSZ DEMO_2,F
GOTO $-1
DECFSZ DEMO_1,F
GOTO $-5
RETURN
; ###########################################################################
; RUTINA QUE GENERA RETARDOS MULTIPLOS A 5MS DEPENDIENDO DEL VALOR QUE SE
; PONGA EN EL REGISTRO W.
; REGISTROS USADOS: DEMO_CONT
DEMO_VMS
MOVWF DEMO_CONT
CALL DEMO_5MS
DECFSZ DEMO_CONT,F
GOTO $-2
RETURN
; ###########################################################################
; RUTINAS PARA EL MT8889
; ###########################################################################
;
; | | | | | | | | | |
; ----------------------------------------------------------
; | VDD ST/ EST D3 D2 D1 D0 /IRQ DS RS0 |
; | GT CP |
; | |
; | MT8889 |
; | |
; | |
; | IN+ IN- GS VREF VSS OSC1 OSC2 TONE R/W /CS |
; ----------------------------------------------------------
; | | | | | | | | | |
;
; ###########################################################################
; SE DEFINEN LOS TONOS DTMF
TONO_1 EQU B'00000001'
TONO_2 EQU B'00000010'
TONO_3 EQU B'00000011'
TONO_4 EQU B'00000100'
TONO_5 EQU B'00000101'
TONO_6 EQU B'00000110'
TONO_7 EQU B'00000111'
TONO_8 EQU B'00001000'
TONO_9 EQU B'00001001'
TONO_0 EQU B'00001010'
TONO_AST EQU B'00001011'
TONO_# EQU B'00001100'
TONO_A EQU B'00001101'
TONO_B EQU B'00001110'
TONO_C EQU B'00001111'
TONO_D EQU B'00000000'
#DEFINE DTMF_COMD_MODE BSF DTMF_RS0
#DEFINE DTMF_DATO_MODE BCF DTMF_RS0
; ###########################################################################
; INICIALIZACION DEL MT8889 SEGUN DATASHEET
UP_MT8889
; ESTA SECUENCIA ES LA QUE SE ENCUENTRAN EN EL DATASHEET
MOVLW 20 ;SECUENCIA ESTABLECIDA POR FABRICANTE
CALL DEMO_VMS ;RETARDO PARA ESTABILIZACION (100MS)
DTMF_COMD_MODE
CALL READ_MT8889 ;1° LECTURA DE STATUS REGISTER
MOVLW B'00000000' ;2° ESCRITURA DE CONTROL REGISTER
CALL WRITE_MT8889
MOVLW B'00000000' ;3° ESCRITURA DE CONTROL REGISTER
CALL WRITE_MT8889
MOVLW B'00001000' ;4° ESCRITURA DE CONTROL REGISTER
CALL WRITE_MT8889
MOVLW B'00000000' ;5° ESCRITURA DE CONTROL REGISTER
CALL WRITE_MT8889
CALL READ_MT8889 ;6° LECTURA DE STATUS REGISTER
; AQUI REALIZAMOS LA CONFIGURACION QUE DESEAMOS
MOVLW B'00001000' ;ESCRITURA EN CRA
CALL WRITE_MT8889 ;SELEC CRB, NO_IRQ, DTMF_MODE, NO_TONO
MOVLW B'00000000' ;ESCRITURA EN CRB
CALL WRITE_MT8889 ;DUAL_TONE, NO_TEST, BURST MODE
CALL READ_MT8889 ;LECTURA DE STATUS REGISTER
RETURN
; ###########################################################################
; PERMITE LA LECTURA DEL MT8889
; REGISTROS USADOS: DTMF_RX
READ_MT8889
BANK_1
BSF DTMF_TRIS3 ;CONFIGURA PUERTO COMO ENTRADA
BSF DTMF_TRIS2
BSF DTMF_TRIS1
BSF DTMF_TRIS0
BANK_0
BSF DTMF_RW ;MODO LECTURA
BCF DTMF_CS ;ACTIVA IC
BSF DTMF_DS ;CLOCK
CLRF DTMF_RX ;BORRAMOS REGISTRO PARA RECEPCION
BTFSC DTMF_D0
BSF DTMF_RX,0
BTFSC DTMF_D1
BSF DTMF_RX,1
BTFSC DTMF_D2
BSF DTMF_RX,2
BTFSC DTMF_D3
BSF DTMF_RX,3
NOP
BCF DTMF_DS ;CLOCK
BSF DTMF_CS ;DESACTIVAMOS IC
RETURN
; ###########################################################################
; PERMITE LA ESCRITURA DEL MT8889
; REGISTROS USADOS: DTMF_TX
WRITE_MT8889
MOVWF DTMF_TX
BANK_1
BCF DTMF_TRIS3 ;CONFIGURA PUERTO COMO SALIDA
BCF DTMF_TRIS2
BCF DTMF_TRIS1
BCF DTMF_TRIS0
BANK_0
BCF DTMF_D0 ;POR DEFECTO TODOS A CERO
BCF DTMF_D1
BCF DTMF_D2
BCF DTMF_D3
BTFSC DTMF_TX,0
BSF DTMF_D0
BTFSC DTMF_TX,1
BSF DTMF_D1
BTFSC DTMF_TX,2
BSF DTMF_D2
BTFSC DTMF_TX,3
BSF DTMF_D3
NOP
BCF DTMF_RW ;MODO ESCRITURA
BCF DTMF_CS ;ACTIVA IC
BSF DTMF_DS ;CLOCK
NOP
BCF DTMF_DS ;CLOCK
BSF DTMF_CS ;DESACTIVAMOS IC
BSF DTMF_RW ;MODO LECTURA
BANK_1
BSF DTMF_TRIS3 ;CONFIGURA PUERTO COMO ENTRADA
BSF DTMF_TRIS2
BSF DTMF_TRIS1
BSF DTMF_TRIS0
BANK_0
RETURN
; ###########################################################################
; TRASMITE EL EQUIVALENTE DTMF DE UN NUMERO CON DURACION ESTANDAR
MARCA_DTMF
DTMF_DATO_MODE
CALL WRITE_MT8889 ;TX SU EQUIVALENTE EN DTMF
DTMF_COMD_MODE
BSF DTMF_RW ;MODO LECTURA
MARCA_DTMF_A
BCF DTMF_CS ;ACTIVA IC
BSF DTMF_DS ;CLOCK
BTFSC DTMF_D1 ;BUFFER LIBRE PARA SIGUIENTE TX?
GOTO MARCA_DTMF_B ;SI
BCF DTMF_DS ;NO
BSF DTMF_CS ;DESACTIVAMOS IC
GOTO MARCA_DTMF_A ;SEGUIMOS CON LA ESPERA
MARCA_DTMF_B
BCF DTMF_DS ;CLOCK
BSF DTMF_CS ;DESACTIVAMOS IC
BSF DTMF_RW ;MODO LECTURA
RETURN
; ###########################################################################
; INICIO DEL PROGRAMA
; ###########################################################################
INICIO
CALL CONFIGURACION ;CONFIGURAMOS EL PIC
CALL UP_MT8889 ;INICIALIZAMOS EL MT8889
MOVLW 200 ;ESPERAMOS 2 SEGUNDOS O LO QUE SE DESEE
CALL DEMO_VMS
MOVLW 200
CALL DEMO_VMS
LLAMADA
BSF TELF ;DESCOLGAMOS TELEFONO
MOVLW 200 ;ESPERAMOS 2 SEGUNDOS PARA CONEXION
CALL DEMO_VMS ;ESTO PUEDE VARIAR SEGUN EL PROOVEDOR
MOVLW 200
CALL DEMO_VMS
; AQUI HABILITAMOS LA GENERACION DE TONO DTMF (CRA,B0)
DTMF_COMD_MODE
MOVLW B'00000001' ;NO_SELEC CRB, NO_IRQ, DTMF_MODE, TONO
CALL WRITE_MT8889
CALL READ_MT8889 ;LECTURA DEL STATUS PARA BORRAR FLAGS
; REALIZAMOS LA LLAMADA AL NUMERO DESEADO, EN MI CASO LLAMO A MI CELULAR.
; PUEDES AGREGAR O QUITAR NUMEROS, TAMBIEN SE PUEDE HACER UNA RUTINA PARA
; REDUCIR CODIGO... ESO TE LO DEJO COMO TAREA ;)
MOVLW TONO_9
CALL MARCA_DTMF ;TX SU EQUIVALENTE EN DTMF
MOVLW TONO_7
CALL MARCA_DTMF ;TX SU EQUIVALENTE EN DTMF
MOVLW TONO_8
CALL MARCA_DTMF ;TX SU EQUIVALENTE EN DTMF
MOVLW TONO_4
CALL MARCA_DTMF ;TX SU EQUIVALENTE EN DTMF
MOVLW TONO_8
CALL MARCA_DTMF ;TX SU EQUIVALENTE EN DTMF
MOVLW TONO_3
CALL MARCA_DTMF ;TX SU EQUIVALENTE EN DTMF
MOVLW TONO_2
CALL MARCA_DTMF ;TX SU EQUIVALENTE EN DTMF
MOVLW TONO_8
CALL MARCA_DTMF ;TX SU EQUIVALENTE EN DTMF
; AQUI HABILITAMOS LA INTERRUPCION DEL MT8889 (NIVEL LOGICO 0) CUANDO SE
; DETECTE UN TONO DTMF.
DTMF_COMD_MODE
MOVLW B'00000100' ;NO_SELEC CRB, IRQ, DTMF_MODE, NO_TONO
CALL WRITE_MT8889
CALL READ_MT8889 ;LECTURA DEL STATUS PARA BORRAR FLAGS
ESPERA
BTFSC DTMF_IRQ ;INTERRUPCION POR RX DE TONO DTMF?
GOTO ESPERA ;NO
DTMF_DATO_MODE ;SI
CALL READ_MT8889 ;LECTURA DE TONO RECIBIDO
MOVLW TONO_AST
XORWF DTMF_RX,W
BTFSS STATUS,Z ;EL DATO RECIBIDO ES *?
GOTO ESPERA ;NO
FIN_LLAMADA
MOVLW 200 ;ESPERAMOS 1 SEGUNDO
CALL DEMO_VMS
BCF TELF ;COLGAMOS TELEFONO
GOTO $ ;LAZO INFINITO
END