;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; TAXI PHONE con microcontrolador 16F628A
;
; Nota: El numero marcado por este programa no está aprobado
; Coloque el numero telefónico a ser marcado en la tabla 1
;
; Frecuencia de funcionamiento 4MHz
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LIST P = 16F628A
INCLUDE <P16F628A.INC>
ERRORLEVEL -302
__CONFIG _BODEN_OFF&_BOREN_ON&_CP_ON&_DATA_CP_ON&_PWRTE_ON&_WDT_ON&_LVP_OFF&_MCLRE_ON&_INTOSC_OSC_NOCLKOUT
;................................................
;Definición de pines
#DEFINE PULSADOR PORTB,3 ;Pin de entrada del pulsador
;Definición de la RAM
NUM_DISCA EQU .32 ;20h Numero que se está discando
TEMP EQU .33 ;21h Reguistro temporal
CARRIER EQU .34 ;22h Carrier DTMF
TONO_LOW EQU .35 ;23h Tono bajo
DEC_TONO_L EQU .36 ;24h Decrementar tono bajo
TONO_HIGH EQU .37 ;25h Tono alto
DEC_TONO_H EQU .38 ;26h Decrementar tono alto
CONT_1 EQU .39 ;27h Rutina de retardo
CONT_2 EQU .40 ;28h Rutina de retardo
CONT_3 EQU .41 ;29h Rutina de retardo
;................................................
ORG .0
bcf STATUS,RP0 ;Selecciono el banco de memoria 0
bcf STATUS,RP1
goto INICIO
ORG .4
bcf INTCON,GIE ;Desactivo todas las intrerrupciones
return
;................................................
;Table 1 Tabla que almacena el numero a discar
;0A = 0
;01 = 1
;02 = 2
;03 = 3
;04 = 4
;05 = 5
;06 = 6
;07 = 7
;08 = 8
;09 = 9
;Colocar tantos RETLW como dígitos tenga el numero que se desea discar
;Para finalizar colocar el valor RETLW 0Eh para indicar que ya no hay numeros a discar
;En el ejemplo el numero discado es: 0112329255
Table1
addwf PCL,F
retlw 0Ah ;0
retlw 01h ;1
retlw 01h ;1
retlw 02h ;2
retlw 03h ;3
retlw 02h ;2
retlw 09h ;9
retlw 02h ;2
retlw 05h ;5
retlw 05h ;5
retlw 0Eh ;E = fin del numero
;................................................
;Table2 tonos bajos del DTMF
Table2
addwf PCL,F
nop
retlw 75h ;1
retlw 75h ;2
retlw 75h ;3
retlw 6Bh ;4
retlw 6Bh ;5
retlw 6Bh ;6
retlw 60h ;7
retlw 60h ;8
retlw 60h ;9
retlw 57h ;0
;................................................
;Table3 tonos altos del DTMF
Table3
addwf PCL,F
nop
retlw 44h ;1
retlw 3Dh ;2
retlw 37h ;3
retlw 44h ;4
retlw 3Dh ;5
retlw 37h ;6
retlw 44h ;7
retlw 3Dh ;8
retlw 38h ;9
retlw 3Dh ;0
;................................................
;Short delay between tone approx 50mS
Del1
clrwdt ;Reseteo el WDT
movlw .80
movwf CONT_2
Del1A
decfsz CONT_1,F
goto Del1A
decfsz CONT_2,F
goto Del1A
retlw .0
;................................................
;Retardo de 0.7sec
Del2
clrwdt ;Reseteo el WDT
nop
nop
nop
nop
nop
nop
nop
decfsz CONT_1,F
goto Del2
decfsz CONT_2,F
goto Del2
retlw .0
;................................................
;Retardo de 0.1sec
Del3
movlw .110
movwf CONT_1
PLoop1
movlw .181
movwf CONT_2
PLoop2
clrwdt ;Reseteo el WDT
clrwdt ;Reseteo el WDT
decfsz CONT_2,F
goto PLoop2
decfsz CONT_1,F
goto PLoop1
retlw .0
;................................................
;Discado del numero por medio de DTMF
Dial1
movf NUM_DISCA,W ;Cargo el dígito a discar en W
call Table1
movwf CARRIER ;Cargo en CARRIER el numero a discar
movlw 0Eh ;Verifico que el valor anterior no sea 0Eh
xorwf CARRIER,W
btfsc STATUS,Z
goto Main5 ;Si es 0Eh salgo de la rutina de discado
movf CARRIER,W
call Table2
movwf TONO_LOW ;Cargo el reguistro con el valor para el tono bajo
movwf DEC_TONO_L ;Cargo el reguistro con el valor para el tono bajo
movf CARRIER,W
call Table3
movwf TONO_HIGH ;Cargo el reguistro con el valor para el tono alto
movwf DEC_TONO_H ;Cargo el reguistro con el valor para el tono alto
goto DTMF1
Dial2
call Del1 ;Llamada a retardo antes de discarl el proximo dígito
call Del1 ;Llamada a retardo antes de discarl el proximo dígito
incf NUM_DISCA,F ;Incremento el dígito a discar
goto Dial1
;................................................
;Rutina que genera el DTMF
DTMF1
movlw .160 ;Cantidad de ciclos del tono de discado
movwf TEMP
DTMF2
decfsz DEC_TONO_H,F ;Decremento el reguistro del tono alto
goto DTMF3
movlw .16
xorwf PORTB,F ;Seteo la salida adecuada
movf TONO_HIGH,W ;Cargo W con el valor para el tono alto
movwf DEC_TONO_H ;Re-Cargo el reguistro de decremento de tono alto con el valor inicial
DTMF3
decfsz DEC_TONO_L,F ;Decremento el reguistro del tono bajo
goto DTMF2
movlw .32
xorwf PORTB,F ;Seteo la salida adecuada
movf TONO_LOW,W ;To re-load low-tone file
movwf DEC_TONO_L ;Re-load low-tone file
decfsz TEMP,F ;Decrement loops file
goto DTMF2
goto Dial2
;................................................
INICIO
clrwdt ;Reseteo el WDT
movlw .7 ;Desactivo los comparadores
movwf CMCON
clrf PORTA ;Borro el puerto A
clrf PORTB ;Borro el puerto B
bsf STATUS,RP0 ;Cambio al banco de memoria 1
movlw B'01111111' ;Todo el puerto A como entrada
movwf TRISA
movlw B'11001111' ;RB4 y RB5 como salidas y el resto entradas
movwf TRISB
movlw B'10001111' ;Prescaler en 128 asignado al WDT
movwf OPTION_REG ;Cargo el reguistro OPTION
bcf STATUS,RP0 ;Cambio al banco de memoria 0
Main1
call Del2 ;Llamada a retardo
call Del2 ;Llamada a retardo
clrf NUM_DISCA ;Borro todos los reguistros a usar
clrf TEMP
clrf CARRIER
clrf TONO_LOW
clrf DEC_TONO_L
clrf TONO_HIGH
clrf DEC_TONO_H
clrf CONT_1
clrf CONT_2
clrf CONT_3
Main2
movf NUM_DISCA,W
call Table1
xorlw .0
btfss STATUS,Z
goto Main3
incf NUM_DISCA,F
goto Main2
Main3
btfsc PULSADOR ;Verifico el pulsador, si esta en alto salto
goto Main4 ;si está en bajo salto a la rutina Main4
Sw
clrwdt ;Reseteo el WDT
btfss PULSADOR ;Verifico el pulsador, si esta en bajo salto
goto Sw ;Si es alto salto a Sw
call Del3 ;Llamada a retardo
btfss PULSADOR ;Verifico el pulsador, si esta en bajo salto
goto Sw ;Si es alto salto a Sw
Main4
clrwdt ;Reseteo el WDT
goto Dial1 ;Salto a la rutina de discado
Main5
movlw .166 ;Rutina de retardo de 2min para luego de discar
movwf CONT_3
RET
call Del2 ;Llamada a retardo
decfsz CONT_3,F
goto RET
goto Main1 ;Reinicio todo el proceso desde la posición Main1
;................................................
end