      #include p16f84a.inc
       __config b'11111111110010'    ;   11-RC    10-HS
                    ;
     cblock 0x15               

                   ;  
	rTempW
	rTempZ
	rTempSTATUS
                    ; 
	rShimFlag     ; . 
	rStop         ;  
	rPOL          ;   +
	rNEG          ;   -
	rDir

	rcnt1         ;  
	rcnt2
	rcnt3	
     endc  
					        ;  
							;         
							;      . 
							;   .    
							;  250...     
  
	cPOL_Rapido_Fechar   equ .130		;     
	cNEG_Rapido_Fechar   equ .170		;
	
	cPOL_Devagar_Fechar  equ .145		;    
	cNEG_Devagar_Fechar  equ .155		; 
	
	cPOL_Rapido_Abrir    equ .170		;    
	cNEG_Rapido_Abrir    equ .130		;

	cPOL_Devagar_Abrir   equ .155		;    
	cNEG_Devagar_Abrir   equ .145		;

	cPOL_Stop  			 equ .150 		;   
	cNEG_Stop  			 equ .150	 	;
                             


	 org 0
     goto start
;------------------------------------------
        ; 
	 org 4
     goto interrupt
;------------------------------------------
start                    ;  
    bcf STATUS,RP1
    bcf STATUS,RP0
    bcf INTCON,GIE       ;  
    bsf INTCON,T0IE      ;   
    bsf STATUS,RP0
    movlw b'10010000'    ; TMR0 .  3  
    movwf OPTION_REG
	clrf TRISB 
    bcf STATUS,RP0
;------------------------------------------
    
	clrf rStop     
	clrf rNEG
	clrf rPOL
    clrf rShimFlag
    clrf PORTB
    clrf TMR0
                          ; 
    bsf INTCON,GIE ; 
;----------------------------------------------------------------------------
;   
main

proga
	call  Stop
	call  delay
	call  Devagar_Fechar
	call  delay 
	call  Rapido_Fechar
	call  delay
	call  Devagar_Fechar
	call  delay 
	call  Stop
	call  delay
	call  Devagar_Abrir
	call  delay
	call  Rapido_Abrir
	call  delay
	call  Devagar_Abrir
	call  delay
	goto proga



Rapido_Fechar
	movlw cPOL_Rapido_Fechar
	movwf rPOL
	movlw cNEG_Rapido_Fechar
	movwf rNEG
	return

Devagar_Fechar
	movlw cPOL_Devagar_Fechar
	movwf rPOL
	movlw cNEG_Devagar_Fechar
	movwf rNEG
	return

Rapido_Abrir
	movlw cPOL_Rapido_Abrir
	movwf rPOL
	movlw cNEG_Rapido_Abrir
	movwf rNEG
	return
	return	

Devagar_Abrir
	movlw cPOL_Devagar_Abrir
	movwf rPOL
	movlw cNEG_Devagar_Abrir
	movwf rNEG
	return

Stop
	movlw cPOL_Stop
	movwf rPOL
	movlw cNEG_Stop
	movwf rNEG
	return


	             
delay
		movlw .255         ;    .
		movwf rcnt1
            movlw .255
            movwf rcnt2
                movlw .30
                movwf rcnt3      
                                                     
dloop
                decfsz rcnt1,1    ;  1.  
		        goto $+2          ;  0   
                decfsz rcnt2,1    ; 
	            goto dloop          
                decfsz rcnt3,1      
                goto dloop
                return 
  	    
;----------------------------------------------------------------------------
; 
interrupt
                                            ; 
    movwf rTempW                                ; W
    movf STATUS,w                                
    movwf rTempSTATUS                           ; STATUS 

	btfss rShimFlag,0                ;      
    goto PWM_ON
    goto PWM_OFF

PWM_ON
	bsf   rShimFlag,0           ;  rShimFlag

	bcf  PORTB,1				;    1-2	
	bcf  PORTB,2
	nop
	nop
	nop				
	bsf  PORTB,0				;    0-3                  
	bsf  PORTB,3                         
    goto Exit_InstTMR0_OFF

	    	
PWM_OFF 
	bcf   rShimFlag,0			;  rShimFlag	
                      
	bcf   PORTB,3				;    3-0
	bcf   PORTB,0
	nop
	nop
	nop
	bsf   PORTB,2				;    2-1				
	bsf   PORTB,1
	goto Exit_InstTMR0_ON
	
	
Exit_InstTMR0_ON
	movfw rNEG             ;   .   
    movwf TMR0             
	goto RezetTOIF         

Exit_InstTMR0_OFF
	movfw rPOL             ;   
    movwf TMR0		
	goto RezetTOIF

RezetTOIF
	bcf INTCON,T0IF        ;    
                   
					        ; 
    movf rTempSTATUS,w
    movwf STATUS
    movf rTempW,w

    retfie                                     ;   
;------------------------------------------
  end
