;#####################################################################
;#     Programa de Prueba y rutina de uso universal para el HT9200A  #
;#     Este es un encoder de DTMF serial que usa solo 3 pines de     #
;#     datos para operar.      x Leandro La Porta (lu2aoq)           #
;#####################################################################
        LIST P=16F84,   R=HEX, X=ON
        INCLUDE         "PICREG.EQU"
;
; la primera posicion de ram en el 16c84 comienza en 0Ch
;
contador0	equ	0x10
contador1	equ 	0x11
contador2	equ	0x12
tone		equ	0x13
tempa		equ	0x14
count		equ 	0x15
long		equ	0x16
;
#define		_CE	PORT_A,0	;Chip enable
#define		_SDA	PORT_A,2	;Serial data
#define		_SCL	PORT_A,3	;Serial clock
;
; para proposito de prueba:
#define		_LED	PORT_B,0	;ledbde prueba
#define		_gate	PORT_B,3	;4066 gate
;
RESET           ORG     000
                GOTO	START
START           movlw	.100
		call    delay
                bsf     STATUS,5	;cambio a banco 1
                movlw   b'00000000'	;seteo B como salida A como entrada
                movwf	TRISB
                movlw	b'00000000'
                movwf	TRISA
		bcf	STATUS,5	;cambio a banco 0
		clrf	PORT_A
		clrf	PORT_B
		bcf		_gate
		bsf		_CE
		bsf		_LED
		movlw	.100
		call	delay
		bcf		_LED
		goto	main
;
; Por supuesto para el programa de evaluacion no puede faltar la....
; ###############################################################
; #                        Rutina de delay                      #
; ###############################################################
;
; Si contador1 = 10, el delay es 1.07 segundos
; Contador1=1, el delay es .107 segundos
;
delay           MOVWF   contador1
DELAY2          MOVLW   .110
                MOVWF   contador0
DELAY1          NOP
                NOP
                NOP
                NOP
                DECFSZ  contador0,f
                GOTO    DELAY1
                DECFSZ  contador1,f
                GOTO    DELAY2          ;delay2 es para setear de nuevo 110
                RETLW   0
;
; ####################################################
; #   Rutina de control del HT9200A (Serial version) #
; ####################################################
; El dato debe estar en tone.
; tempa, count, y tone deben estar libres para usar
; el dato se mantiene en tone al finalizar la rutina
; se usan 4 pines para comandar el DTMF y un integrado extra,
; Estos son:
; _SCL	- Serial Clock
; _SDA	- Serial Data
; _CE	- Chip Enable (active low)
; _gate	- 4066 Switch (active high)
;
; Efectivamente el circuito requiere de una 4066 conectada a la salida
; de audio con un par de resistencias y 1 capacitor debido a que si
; desconecto por programa el tono y lo conecto de nuevo, sale un feo
; y molesto TAC de mucha amplitud que podria molestar en la transmision
; asi que es preferible transmitir los tonos seguidos uno atras del otro
; y producir la pausa por programa a travez del 4066, de este modo el
; tac solo se escuchara cuando se apague el chip luego de haber transmitido
; todos los tonos requeridos.
;
; estas etiquetas deben declararse al principio del programa.
;
; Tabla de equivalencias del integrado
;  --------------
;  |valor | Tono|
;  --------------
;  |   0  |  D  |
;  | 1-9  | 1-9 |
;  |  10  |  0  |
;  |  11  |  *  |
;  |  12  |  #  |
;  |  13  |  A  |
;  |  14  |  B  |
;  |  15  |  C  |
;  --------------
; Estas rutinas son 3:
; Startdtmf, que inicia el integrado, activandolo y dandole tiempo
; a que arranque el oscilador, no usa parametros de entrada ni de
; salida, utiliza la rutina delay para producir 10 ms de delay (startup)
; stopdtmf , esta rutina detiene el integrado poniendolo a dormir,
; en este estado el integrado consume menos de 10uA.
; no usa parametros de entrada ni devuelve nada.
; utiliza la variable count y la rutina wait50us.
; dtmf, esta es la rutina principal, el tono a transmitir debe estar
; en tone, no devuelve ningun valor, el tiempo promedio de esta
; rutina es 130 ms, para una duracion marca: 80ms espacio: 50ms
; utiliza las variables tempa, count, tone.
; llama a wait50us y a delay.
; tener en cuenta que los timmings de las 3 rutinas estan basadas
; en cristal de 2 mhz, debe ser recalculada para otro cristal aunque
; funcionan en 4 mhz con la mitad de tiempo de tonos perfectamente.
;
;
dtmf			movf	tone,w
			movwf	tempa
			movlw	.5
			movwf	count
loop2			call	wait50us
			clrc
			rrf		tempa,f
			btfss	STATUS,C
			goto	putlow
			bsf		_SDA
			goto	goclk
putlow			bcf		_SDA
goclk			nop			;aguantar antes de mandar
			nop			;pulso de clock.
			bcf		_SCL	;latcheado del IC
			call	wait50us
			bsf		_SCL
			decfsz	count	;5 bit counter 0=exit
			goto	loop2
			bsf		_gate	;tone out enable
			bsf		_SDA
			movlw	.50		;80 ms tono
			call	delay
			bcf		_gate 	;tone out disable
			movlw	.25
			call	delay		;40 ms de pausa
			retlw	0
;
; #########################
; #  Send Start DTMF tone #
; #########################
;
startdtmf		bcf	_gate
			bsf		_SCL	;clock debe comenzar desde high
			bcf		_CE		;HT9200A enable
			movlw	.5		;10 ms delay for osc startup
			call	delay
			retlw	0
;
; ########################
; #  Send Stop DTMF tone #
; ########################
;
stopdtmf		bcf	_gate 		;xlas dudas
			movlw	.5		;ahora enviar el stop code
			movwf	count
loop4			call	wait50us
			bcf		_SCL
			call	wait50us
			bsf		_SCL
			decfsz	count
			goto	loop4
			bsf	_CE
			retlw	0
;
; ##########################
; # rutinita de 50us delay #
; ##########################
; es requerida para producir los 100khz de clock
; que requiere el integrado para enviar la data serial
; usa las mismas variables que la rutina delay
; tener en cuenta que esta basada en un cristal de 2 mhz!
; para usar cristales mas altos deben agregarse nop's
u;
wait50us		movlw	.5
			movwf	contador0
			decfsz	contador0
			goto	$-1
			retlw	0
;
; ##################################
; # Programa princpipal de prueba  #
; ##################################
;
main			movlw	.1
			movwf	tone
			call	startdtmf	;activa el chip
loop1			bsf	_LED
			call	dtmf
			bcf	_LED
			incf	tone
			movf	tone,w
			clrz
			xorlw	.10
			btfss	STATUS,Z
			goto	loop1
			movlw	.12
			movwf	tone
			call	dtmf
			call	dtmf
			call	dtmf
			call	dtmf
			call	dtmf
			call	stopdtmf	;desactiva el chip
			movlw	.200
			call	delay
			goto	main
			end
