
	LIST P=16F871
	#INCLUDE "P16F871.INC"   
	ERRORLEVEL      -302    ;SUPRIME LA ADVERTENCIA SOBRE LOS BANCOS DE MEMORIA
	__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC

#define BANCO0 bcf STATUS,5
#define BANCO1 BSF STATUS,5

;**VARIABLES**
AUX_LOW			EQU H'20'
AUX_HIGH		EQU H'21'
THIGH			EQU H'22'
TLOW			EQU H'23'
PDel0			EQU	H'24'
PDel1			EQU	H'25'
AUX				EQU	H'26'

  ORG     0x00
  GOTO    INICIO              

;**********************************PROGRAMA PRINCIPAL********************************

INICIO 	BANCO1
		MOVLW 0xF9	
		MOVWF TRISC	;PONGO PIN 1 y 2 DEL PUERTO C COMO SALIDA.
 		BANCO0
		CLRF PORTC
		
EMPEZAR
		MOVLW .31				
		MOVWF TLOW				;VARIABLE PARA LA DURACIÓN DEL CERO
		MOVLW .1
		MOVWF THIGH				;VARIABLE PARA LA DURACIÓN DEL UNO

CARGAR_VARIABLES	MOVF	TLOW,W		;GUARDO LAS VARIABLS TLOW Y THIGH EN AUXILIARES
					MOVWF 	AUX_LOW
					MOVF	THIGH,W
					MOVWF 	AUX_HIGH

UNO		DECFSZ AUX_HIGH,F		;DURACIÓN DEL UNO, SEGÚN THIGH
		GOTO $+2
		GOTO CERO
		BSF	PORTC,1
		CALL DEMORA
		GOTO UNO

CERO	DECFSZ AUX_LOW,F	;DURACIÓN DEL CERO, SEGÚN TLOW
		GOTO $+2
		GOTO SEGUIR
		BCF PORTC,1
		CALL DEMORA
		GOTO CERO

SEGUIR	INCF THIGH,F
		DECFSZ TLOW,F
		GOTO CARGAR_VARIABLES	

		CALL DEMORA2
		MOVLW D'2'
		ADDWF TLOW,F
		SUBWF THIGH,F
		

CARGAR_VARIABLES_1	MOVF	TLOW,W		;GUARDO LAS VARIABLS TLOW Y THIGH EN AUXILIARES
					MOVWF 	AUX_LOW
					MOVF	THIGH,W
					MOVWF 	AUX_HIGH

CERO_1	DECFSZ AUX_LOW,F		;DURACIÓN DEL CERO, SEGÚN TLOW
		GOTO $+2
		GOTO UNO_1
		BCF	PORTC,1
		CALL DEMORA
		GOTO CERO_1

UNO_1	DECFSZ AUX_HIGH,F	;DURACIÓN DEL UNO, SEGÚN THIGH
		GOTO $+2 
		GOTO SEGUIR_1
		BSF PORTC,1
		CALL DEMORA
		GOTO UNO_1

SEGUIR_1	INCF TLOW,F
		DECFSZ THIGH,F
		GOTO CARGAR_VARIABLES_1

EMPEZAR2
		MOVLW .31				
		MOVWF TLOW				;VARIABLE PARA LA DURACIÓN DEL CERO
		MOVLW .1
		MOVWF THIGH				;VARIABLE PARA LA DURACIÓN DEL UNO

CARGAR_VARIABLES2	MOVF	TLOW,W		;GUARDO LAS VARIABLS TLOW Y THIGH EN AUXILIARES
					MOVWF 	AUX_LOW
					MOVF	THIGH,W
					MOVWF 	AUX_HIGH

UNO2		DECFSZ AUX_HIGH,F		;DURACIÓN DEL UNO, SEGÚN THIGH
		GOTO $+2
		GOTO CERO2
		BSF	PORTC,2
		CALL DEMORA
		GOTO UNO2

CERO2	DECFSZ AUX_LOW,F	;DURACIÓN DEL CERO, SEGÚN TLOW
		GOTO $+2
		GOTO SEGUIR2
		BCF PORTC,2
		CALL DEMORA
		GOTO CERO2

SEGUIR2	INCF THIGH,F
		DECFSZ TLOW,F
		GOTO CARGAR_VARIABLES2	

		CALL DEMORA2
		MOVLW D'2'
		ADDWF TLOW,F
		SUBWF THIGH,F
		

CARGAR_VARIABLES_12	MOVF	TLOW,W		;GUARDO LAS VARIABLS TLOW Y THIGH EN AUXILIARES
					MOVWF 	AUX_LOW
					MOVF	THIGH,W
					MOVWF 	AUX_HIGH

CERO_12	DECFSZ AUX_LOW,F		;DURACIÓN DEL CERO, SEGÚN TLOW
		GOTO $+2
		GOTO UNO_12
		BCF	PORTC,2
		CALL DEMORA
		GOTO CERO_12

UNO_12	DECFSZ AUX_HIGH,F	;DURACIÓN DEL UNO, SEGÚN THIGH
		GOTO $+2 
		GOTO SEGUIR_12
		BSF PORTC,2
		CALL DEMORA
		GOTO UNO_12

SEGUIR_12	INCF TLOW,F
		DECFSZ THIGH,F
		GOTO CARGAR_VARIABLES_12

		GOTO EMPEZAR

;-------------------------------------------------------------
DEMORA  movlw     .2        ; 1 set numero de repeticion 
        movwf     PDel0     ; 1 |
PLoop0  clrwdt              ; 1 clear watchdog
        decfsz    PDel0, 1  ; 1 + (1) es el tiempo 0  ?
        goto      PLoop0    ; 2 no, loop
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.
;-------------------------------------------------------------

;-------------------------------------------------------------
;DEMORA DE 8.33333333 ms (MEDIO CICLO DE SENOIDAL)
DEMORA1  movlw     .37      ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop11  movlw     .187     ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop21  clrwdt             ; 1 clear watchdog
PDelL11  goto PDelL21       ; 2 ciclos delay
PDelL21  
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop21   ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop11   ; 2 no, loop
        return              ; 2+2 Fin.
;-------------------------------------------------------------

;-------------------------------------------------------------
DEMORA2  movlw     .98      ; 1 set numero de repeticion 
        movwf     PDel0     ; 1 |
PLoop02  clrwdt             ; 1 clear watchdog
        decfsz    PDel0, 1  ; 1 + (1) es el tiempo 0  ?
        goto      PLoop02   ; 2 no, loop
PDelL12  goto PDelL22       ; 2 ciclos delay
PDelL22  clrwdt             ; 1 ciclo delay
        return              ; 2+2 Fin.
;-------------------------------------------------------------


   END                 ;fin de programa