;=============================================================
;	Программа к драйверу шагового двигателя с сайта RoboZone.su 
;
; Ver 1.01
; Напр пит 24в
; ШИМ 4,0 кГц , работа шим-50% , удержание шим-20%
; шаг/полушаг
; ручное лево/право
;
;
;
;
;
;
;
;==============================================================

#include <p16f628a.inc>

        cblock 0x30
      lc0, lc1, lc2, lc3, lc4, lc5, lc6, lc7;
    endc

          __CONFIG  H'3F50'  ;  

;===========================================================

step	 		equ     20h		; step
Reg_1	 		equ     21h     ; 1/2-step
Reg_2	 		equ     22h     ;
test			equ		23h		;
Reg_3	 		equ     26h     ;
Reg_4	 		equ     27h     ;
Reg_5	 		equ     28h		;
Reg_6	 		equ     29h     ;
Reg_7	 		equ     2Ah     ;

Reg_step		equ     71h     ; step : 1/2-step

W_Temp    		equ     7Dh     ;
Stat_Temp 		equ     7Eh     ;
PCLATH_Temp 	equ     7Fh     ;

;================================================================
        org     0             	;
        goto    Start         	;

        org     4             	;
;===============================================================
;	Обработка прерываний
;===============================================================                                        
Prer    movwf   W_Temp        	; Скопировать содержимое регистра W в регистр W_Temp.
        movf    STATUS,W      	; Скопировать содержимое регистра Status в регистр W.
		clrf	STATUS			;
        movwf   Stat_Temp     	; Скопировать содержимое регистра W в регистр Stat_Temp.
        movf    PCLATH,W		;
        movwf   PCLATH_Temp 	;
        clrf    PCLATH			;

        btfsc   INTCON,1      	; флаг прер INT
        goto    _Int           	; 
        btfsc   INTCON,2      	; флаг прер TMR0
        goto    Cc_p          	; 

        goto    EndInt        	; Возврат из прерывания

;------------------------------------------------         
_Int	bcf     INTCON,1      	; Сброс флага прерывания по INT.
        movlw   .128          	; настойка скважности
        movwf   CCPR1L 			;
        btfss 	PORTB,1     	; лево/право                  
		goto	_Irs			;

_Drs   	decf 	step, F         ;    
		goto	_bino			;

_Irs    incf 	step, F         ;  

_bino	bcf		step,7         	; xxxxx000
		bcf		step,6         	; 
		bcf		step,5         	; 
		bcf		step,4         	; 
		bcf		step,3         	; 

        btfss 	PORTA,5			; step : 1/2-step 
		goto	_s1				; какой шаг ?

_s2    	call	p_22			;
		goto	_s3				;

_s1    	call	p_21			;
_s3     movwf 	PORTB           ;
		goto	_p6				;

;-------------------------
Cc_p

        goto    EndInt        	; Возврат из прерывания

;------------------------
                           
_p6     bcf 	INTCON,INTF		;
        clrf 	TMR1H           ;
        clrf 	TMR1L           ;
        bcf 	PIR1,TMR1IF		;

;------------------
EndInt	movf   	PCLATH_Temp,W 	;
        movwf	PCLATH  		;
        movf    Stat_Temp,W   	; Скопировать содержимое регистра Stat_Temp в регистр W.
        movwf   STATUS        	; Скопировать содержимое регистра W в регистр Status.
        swapf   W_Temp,F      	; Поменять местами старший и младший полубайты регистра W_Temp
        swapf   W_Temp,W      	; Поменять местами старший и младший полубайты регистра W_Temp
        retfie                	; Возврат из прерывания по стеку.
                     
;====================================================
p_21    movf 	step,W          ; шаг 
    	addwf   PCL,F	        ;
        retlw	b'11000000'  	;  0
        retlw	b'01100000'  	;  0
        retlw	b'00110000'  	;  0
        retlw	b'10010000'  	;  0
        retlw	b'11000000'  	;  0
        retlw	b'01100000'  	;  0
        retlw	b'00110000'  	;  0
        retlw	b'10010000'  	;  0

;====================================================
p_22    movf 	step,W          ; 1/2 шаг 
    	addwf   PCL,F	        ;
        retlw	b'10000000'  	;  0
        retlw	b'11000000'  	;  0
        retlw	b'01000000'  	;  0
        retlw	b'01100000'  	;  0
        retlw	b'00100000'  	;  0
        retlw	b'00110000'  	;  0
        retlw	b'00010000'  	;  0
        retlw	b'10010000'  	;  0

;===============================================================
;	Старт программы
;===============================================================
Start:	movlw 	b'00100001'		; 0x21                             
        movwf 	T1CON           ; 1:4 Prescale value 
								; 1 = Enables Timer1               
        CLRF 	PORTA           ;                  
        CLRF 	PORTB           ;                  
        movlw 	b'11100111'		; 0xE7                             
        bsf 	STATUS,RP0      ; Bank 1                 
        movwf 	TRISA           ;                 
        bcf 	STATUS,RP0      ; Bank 0
        CLRF 	PORTA           ;                  
        movlw 	0x0F            ;                 
        bsf 	STATUS,RP0      ; Bank 1                     
        movwf 	TRISB           ;                 
        bcf 	STATUS,RP0      ; Bank 0
        clrf 	PORTB           ;                  
        clrf 	0x22            ;                  
        clrf 	TMR1H           ;                  
        clrf 	TMR1L           ;                  
        bcf 	PIR1,TMR1IF     ; TMR1 Overflow Interrupt Flag bit                  

;------------------------------------------
    	movlw 	0x05            ;  
        movwf 	Reg_2         ;  

p_12    btfss 	PIR1,TMR1IF     ;               
        goto 	p_12			;                   

        clrf 	TMR1H           ;                  
        clrf 	TMR1L           ;                  
        bcf 	PIR1,TMR1IF     ; 5-циклов                        
        decfsz 	Reg_2,F         ;                  
        goto 	p_12			;

;----------------------------------
    	movlw 	b'00000110'		;  b'00110110'               
        movwf 	CMCON           ;                 
        movlw 	0x0F            ;                  
        bsf 	STATUS,RP0      ;                  
        movwf 	TRISB           ;                 
        bcf 	STATUS,RP0      ;                   
        clrf 	PORTB           ;                  
        movlw 	b'10000111'		; 0x87                             
        bsf 	STATUS,RP0      ;                  
        movwf 	OPTION_REG		; PORTB pull-ups are disabled
								; Prescaler Rate = 1 : 256
;----------------------------------------
        bsf 	STATUS,RP0      ;                  
        movlw	.255            ; настойка частоты (максимальная разрядность шим+1)
        movwf   PR2             ;
        bcf 	STATUS,RP0      ;                   

        movlw   .128           	; настойка скважности
        movwf   CCPR1L 			;

        movlw   b'01000100'   	; таймер включен, предделитель 5 мг = 1:1 - 5 000 000 гц
        movwf   T2CON 			;
        movlw   b'00001100'   	; режим ШИМ (4.5-младшие разряды)
        movwf   CCP1CON 		; 
;-------------------------------------------
	;	movlw 	b'00100001'		; 0x21                             
     ;   movwf 	T1CON           ; 1:4 Prescale value 
								; 1 = Enables Timer1       
;-----------------------------------------
	    movlw 	0x00            ;                  
        movwf 	step            ;                 

        CLRF 	TMR1H           ;                  
        CLRF 	TMR1L           ;                  
        BCF 	PIR1, 0         ;                   

		bsf		PORTB,7			;
        movlw 	b'11010000'		;                          
        movwf 	INTCON          ;                 

    	bcf 	STATUS,RP1      ;                  
        bsf 	STATUS,RP0      ;           
        bcf 	TRISB,3			;
        bcf 	STATUS,RP0      ; 
  
;==============================================
;	Основной цикл програмы
;=============================================
Cikl   	btfss	PORTA,7    		; pravo
        goto    z1         		;
        btfss   PORTA,6    		; levo
        goto    z2         		;
        clrf    test       		;

        btfss 	PIR1,TMR1IF     ;                 
        goto 	p_16			;                  

        movlw   .50           	; ток удержания 300 msec 
        movwf   CCPR1L 			; настойка скважности
        goto 	Cikl			;                  

p_16
	    goto 	Cikl			;                  

;--------------------------------

z1 		decf 	step, F         ;    
		goto	_bin_o			;

z2     	incf 	step, F         ;  

_bin_o  movlw   .128          	; настойка скважности
        movwf   CCPR1L 			;
		bcf		step,7         	; xxxxx000
		bcf		step,6         	; 
		bcf		step,5         	; 
		bcf		step,4         	; 
		bcf		step,3         	; 

        btfss 	PORTA,5			; step : 1/2-step 
		goto	_s15			; какой шаг ?

_s25    call	p_22			;
		goto	_s35			;

_s15    call	p_21			;
_s35    movwf 	PORTB           ;
        btfss   test,0     		; step
		goto	_pz2			;
		goto	_pz1			;

_pz1    call    pauza      ;
        goto 	Cikl			;    

_pz2    bcf     INTCON,1   ;******* bsf
        bsf     test,0     ;
        call    pauza1     ;
        bcf     INTCON,1   ;******* bsf
        goto    Cikl       ;

;----------------------------
pauza   movlw     0x3F     	;  **** 8
        movwf     lc2      	;
sw4     movlw     0x2F     	;
        movwf     lc3      	;
sw5	  	nop				  	;
        decfsz    lc3,f    	;
        goto      sw5     	;
        decfsz    lc2,f    	;
        goto      sw4      	; 

        retlw     .0       	;

;-----------------------------------------------
pauza1  movlw     0xF0     	;  **** 8
        movwf     lc2      	;
sw14    movlw     0xEF     	;
        movwf     lc3      	;
sw15	nop				   	;
        decfsz    lc3,f    	;
        goto      sw15     	;
        decfsz    lc2,f    	;
        goto      sw14     	; 
        retlw     .0       	;

;=========================================================                                               
      End  


