;*******************************
;Macro y rutina de temporización que se ajustan en función de la frecuencia de trabajo Fosc. En el programa principal 
;se debe definir:
;a)	La frecuencia de trabajo (en hz) mediante ... "#define Fosc xxxxxxxx"
;b)	Las variables de trabajo Temporal_1, Temporal_2 y Temporal_3 mediante ... "Temporal_x	equ	0xXX"
;
;El usuario llama a la macro desde su programa principal mediante ... "Delay xxxx Milis"
;
;Se obtiene una precisión razonable con valores de temporización desde 1 hasta 2000 mS y a frecuencias Fosc 
;que van desde 1MHz hasta 48MHz

#define         Milis			* D'1000000'
       
Delay	macro	tiempo_ns	;tiempo_ns expresa en ns el tiempo de temporización deseado
	
	ifndef Fosc			;En el programa principal se ha definir la frecuencia de trabajo en Hz								
	messg "ERROR !! - Establecer la frecuencia de trabajo (p.e. #define	Fosc 4000000)"
	exitm
	endif

	radix dec												;Operaciones en base decimal
	variable ciclo_instruc_ns =  (( 1000000000 ) / (Fosc / 4 ))	;Calcula ciclo de instrucción en función de la frecuencia Fosc
	variable ciclos = (tiempo_ns / ciclo_instruc_ns)		;Calcula el nº de ciclos necesarios para la temporización deseada
  
				movlw	upper (ciclos/4)+1
				movwf	Temporal_1
				movlw	high (ciclos/4)+1
				movwf	Temporal_2
				movlw	low (ciclos/4)
				movwf	Temporal_3		;Carga las variables de temporización con el nº de ciclos calculado
				call	MSE_Delay
 
 endm

MSE_Delay			clrwdt					;Bucles de temporización
				decfsz	Temporal_3,f
				goto	MSE_Delay
				decfsz	Temporal_2,f
				goto	MSE_Delay
				decfsz	Temporal_1,f
				goto	MSE_Delay
				return




