;*******************************************************
;*            PROGRAMA de DETECCION de PWM             *
;*                                                     *
;*	Descripción: Detecta a la entrada una señal PWM    *
;*				 y calcula la anchura del estado alto  *
;*				 enviando una señal por puerto rs-232  *
;*				 según convenga.                       *
;*                                                     *
;*	           *
;*                                                     *
;*	Fecha: Febrero de 2010                             *
;*                                                     *
;*******************************************************

;---------------------CABECERA---------------------

list p=16F84A
#include P16F84A.inc
__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

;---------------------VARIABLES--------------------

tx			EQU			7
pulsador	EQU			4
LED0		EQU			0
LED1		EQU			1
pulso		EQU			0x19
bucle8		EQU			0x20
Contador	EQU			0x21
selector	EQU			0x22
caracter	EQU			0x23
estado		EQU			0x24
copiaw		EQU			0x25
copias		EQU			0x26
duracion	EQU			0x27
aux			EQU			0x28
envio		EQU			0x29

;--------------------PROGRAMA-----------------------

RESET:		org			0x00
			goto		INICIO
			org			0x04
			goto		INTER

INICIO: 	clrf		estado
			clrf		duracion
			bsf			selector,0
			movlw		b'01010011'
			movwf		caracter
			bsf			STATUS,RP0
			movlw		b'01111111'
			movwf		TRISB
			movlw		b'11111100'
			movwf		TRISA
			movlw		b'01000011'
			movwf		OPTION_REG
			bcf			STATUS,RP0
			bsf			PORTA,1
			bcf			PORTA,0
			movlw		b'10011000'
			movwf		INTCON
			bsf			PORTB,tx
			goto		MAIN

MAIN:		btfsc		selector,0
			goto		CALC
			movlw		d'94'
			subwf		duracion,0
			btfsc		STATUS,Z
			bsf			estado,0
			btfsc		STATUS,C
			goto		SELECT
			bsf			estado,0
SELECT:		btfss		estado,0
			goto		MAIN
CALC:		movlw		d'123'
			subwf		duracion,0
			btfsc		STATUS,Z
			goto		TRANSMIS
			btfsc		STATUS,0
			goto		TRANSMIS
			goto		MAIN

INTER:		movwf		copiaw
			swapf		STATUS,w
			movwf		copias
			btfsc		INTCON,1
			goto		SIGNAL
			btfsc		INTCON,0
			goto		BOTON
FIN_INTER:	swapf		copias,w
			movwf		STATUS
			swapf		copiaw,f
			swapf		copiaw,w
			retfie

SIGNAL:		bsf			STATUS,RP0
			btfsc		OPTION_REG,6
			goto		START
			goto		READ

START:		bcf			OPTION_REG,6
			bcf			STATUS,RP0
			nop
			nop
			movlw		d'1'
			movwf		TMR0
			bcf			INTCON,1
			goto		FIN_INTER

READ:		bsf			OPTION_REG,6
			bcf			STATUS,RP0
			nop
			movfw		TMR0
			movwf		aux
			movlw		d'1'
			subwf		aux,W
			movwf		duracion
			bcf			INTCON,1
			bsf			estado,1
			goto		FIN_INTER

TRANSMIS:	btfss		estado,1
			goto		MAIN
			movlw		d'8'
			movwf		bucle8
			movf		caracter,0
			movwf		envio
			bcf			PORTB,tx
			call		RETA_208
BUCLETX:	bcf			STATUS,C
			bcf			PORTB,tx
			rrf			envio
			btfsc		STATUS,C
			bsf			PORTB,tx
			call		RETA_208
			decfsz		bucle8
			goto		BUCLETX
			bsf			PORTB,tx
			call		RETA_208
			clrf		estado
			goto		MAIN
			

BOTON:		btfss		PORTB,pulsador
			goto		BOTON
			movf		PORTB,1
			bcf			INTCON,0
			btfss		selector,0
			goto		MULTI
			bcf			selector,0
			bcf			PORTA,LED1
			bsf			PORTA,LED0
			goto		FIN_INTER

MULTI:		bsf			selector,0
			bcf			PORTA,LED0	
			bsf			PORTA,LED1
			goto		FIN_INTER

RETA_208:	movlw		d'68'
			movwf		Contador
BUCLE:		decfsz		Contador
			goto		BUCLE
			return

			
			
End

