;;GENERADOR DE DTMF (Doble Tono Multifrecuencia)
;;DIRECTAMENTE DESDE EL PIC
;;
;;Emplea las siguientes instrucciones de
;;los Mid-Range 8 bits PICs (49 instrucciones o más):
;; LSRF
;;En aquellos PICs que no la soporten se puede sustituir
;;por RRF File y luego BCF File,7
;; BRW
;;Si vuestro PIC no tiene esta instrucción deberéis
;;alinear las rutinas Onda_Colu y Onda_Fila (con ORG)
;;y sustituir BRW por ADDWF PCL,F
;;
;;Os incluyo la rutina de interrupción (ISR),
;;los parámetros de configuración,
;;las macros y las tablas de valores
;;Emplea 1 PWM (ó CCP) y 3 TMR:
;;TMR0: Controla el cambio de altura de la onda
;;TMR1: Controla la duración del pulso o el silencio
;;TMR2: Usada por el módulo PWM
;;Configurad el PIC para 16MHz
;; PICdevJerez - Jerez de la Frontera - España
#ifndef Carry
#define Carry STATUS,C
#endif
;La duración de cada tono ha de ser superior a 40ms
;La duración la pausa ha de ser superior a 40ms
;Se asigna un valor de 246 a TMR1H para que la pausa
;o el tono duren unos 70ms aprox.
Marcar MACRO Fila,Columna
movlw Fila
movwf IncFila
movlw Columna
movwf IncColu
clrf TMR0
bsf INTCON,TMR0IE
clrf TMR1L
movlw .246
movwf TMR1H
bsf T1CON,TMR1ON
btfsc T1CON,TMR1ON
goto $-1
clrf TMR1L
movlw .246
movwf TMR1H
bsf T1CON,TMR1ON
btfsc T1CON,TMR1ON
goto $-1
endM
IncColu equ .120
IncFila equ .121
DutyColu equ .122
DutyFila equ .123
PosColu equ .124
PosFila equ .125
;La frecuencia base es simple de comprender:
;(FOSC/4) / TMR0 / PRES(TMR0) / SAMPLES
; 4MIPS / 256 / 2 / 256
#define FREC_BASE .30;
;Dejamos que el MPASM nos calcule el salto que hemos de
;dar en cada interrupción del TMR0, como empleamos números
;naturales de 8 bits, hay una desviación por redondeo.
;El estándar requiere que la desviación de frecuencia no exceda
;del 1.8%, aunque se tolera hasta un 2% de desviación
; FRECUENCIA REQUERIDA FRECUENCIA REAL OBTENIDA
#define FILA1 (.697/FREC_BASE); 694Hz
#define FILA4 (.770/FREC_BASE)+1; 783Hz
#define FILA7 (.852/FREC_BASE); 844Hz
#define FILA0 (.941/FREC_BASE); 936Hz
#define COLU1 (.1209/FREC_BASE); 1205Hz
#define COLU2 (.1336/FREC_BASE); 1327Hz
#define COLU3 (.1477/FREC_BASE); 1477Hz
;Número 1 : FILA1 + COLU1
;Número 2 : FILA1 + COLU2
;Número 3 : FILA1 + COLU3
;Número 4 : FILA4 + COLU1
;Número 5 : FILA4 + COLU2
;Número 6 : FILA4 + COLU3
;Número 7 : FILA7 + COLU1
;Número 8 : FILA7 + COLU2
;Número 9 : FILA7 + COLU3
;Número 0 : FILA0 + COLU2
;Asterisco : FILA0 + COLU1
;Almohadilla: FILA0 + COLU3
org 0x0000
goto configuracion
org 0x0004
ISR:
banksel 0
btfsc INTCON,TMR0IF
goto intTMR0
intTMR1: bcf INTCON,TMR0IE
bcf T1CON,TMR1ON
bcf PIR1,TMR1IF
bsf INTCON,IOCIE
banksel PWM4DCH
clrf PWM4DCH
clrf PWM4DCL
retfie
intTMR0: bcf INTCON,TMR0IF
banksel PWM4DCH
clrf PWM4DCL
movf DutyColu,W
addwf DutyFila
rrf DutyFila
btfsc STATUS,C
bsf PWM4DCL,6
lsrf DutyFila
btfsc STATUS,C
bsf PWM4DCL,7
movf DutyFila,W
movwf PWM4DCH
movf IncFila,W
addwf PosFila,F
movf PosFila,W
;Si vuestro PIC no incluye la instrucción BRW
;aquí tendréis que hacer algo parecido a esto
;MOVLW (HIGH Onda_Fila)
;MOVWF PCLATH
call Onda_Fila
movwf DutyFila
movf IncColu,W
addwf PosColu,F
movf PosColu,W
;... y aquí lo mismo con Onda_Colu
call Onda_Colu
movwf DutyColu
retfie
configuracion:
;TMR0: FOSC/4 - PRESCALER 2:1 - INTERRUPCION DESACTIVADA
;Cuidado porque el OPTION_REG cambia mucho de un PIC a otro
banksel OPTION_REG
movlw b'01000000' ;WPUEN:Activado;TMR0CS:Fosc/4;PRE=2
movwf OPTION_REG
;TMR1: LFINTOSC - PRESCALER 1:1 - APAGADO
banksel T1CON
movlw b'11000000'
movwf T1CON
;TMR2: POST 1:1 - PRE 1:1 - ENCENDIDO
banksel T2CON
movlw b'00000100'
movwf T2CON
;PWM4 (CCPx): ACTIVADO - SALIDA PIN ACTIVADO
banksel PWM4CON
clrf PWM4DCL
clrf PWM4DCH
movlw b'11000000'
movwf PWM4CON
;PR2: .127
;A 16MHz nos da una frecuencia de salida de 31.250Hz,
;perfecto para el ancho de banda requerido, pero
;OS ACONSEJO un doble filtro RC 100nF y 1KOhm
banksel PR2
movlw .127
movwf PR2
clrf PosColu
clrf PosFila
banksel 0
clrf PIR1
bsf INTCON,PEIE
bsf INTCON,GIE
;EJEMPLO DE USO DE LAS MACROS
;Marcamos el número 0123456789*#
Marcar FILA0,COLU2;0
Marcar FILA1,COLU1;1
Marcar FILA1,COLU2;2
Marcar FILA1,COLU3;3
Marcar FILA4,COLU1;4
Marcar FILA4,COLU2;5
Marcar FILA4,COLU3;6
Marcar FILA7,COLU1;7
Marcar FILA7,COLU2;8
Marcar FILA7,COLU3;9
Marcar FILA0,COLU1;*
Marcar FILA0,COLU3;#