
點擊放大
點擊放大
點擊放大#2 F84程序,
;******************************************************** ; ; Stepper Motor controller ; ; Author : Seiichi Inoue ;********************************************************
list p=pic16f84a include p16f84a.inc __config _hs_osc & _wdt_off & _pwrte_on & _cp_off errorlevel -302 ;Eliminate bank warning
;**************** Label Definition ******************** cblock h'0c' mode ;Operation mode ;0=stop 1=right 2=left count1 ;Wait counter count2 ;Wait counter(for 1msec) endc
rb0 equ 0 ;RB0 of PORTB rb1 equ 1 ;RB1 of PORTB rb2 equ 2 ;RB2 of PORTB rb5 equ 5 ;RB5 of PORTB rb7 equ 7 ;RB7 of PORTB
;**************** Program Start *********************** org 0 ;Reset Vector goto init org 4 ;Interrupt Vector clrf intcon ;Clear Interruption reg
;**************** Initial Process ********************* init bsf status,rp0 ;Change to Bank1 clrf trisa ;Set PORTA all OUT MOVlw b'00100111' ;RB0,1,2.5=IN RB7=OUT MOVwf trisb ;Set PORTB MOVlw b'10000000' ;RBPU=1 Pull up not use MOVwf option_reg ;Set OPTION_REG bcf status,rp0 ;Change to Bank0 clrf mode ;Set mode = stop clrf count1 ;Clear counter clrf count2 ;Clear counter MOVlw b'00000101' ;Set PORTA initial value MOVwf porta ;Write PORTA bsf portb,rb7 ;Set RB7 = 1 btfsc portb,rb5 ;RB5 = 0 ? goto $-1 ;No. Wait
start ;************* Check switch condition ***************** btfsc portb,rb1 ;RB1(stop key) = ON ? goto check1 ;No. Next clrf mode ;Yes. Set stop mode goto drive ;No. Jump to motor drive check1 btfsc portb,rb2 ;RB2(right key) = ON ? goto check2 ;No. Next MOVlw d'1' ;Yes. Set right mode MOVwf mode ;Save mode goto drive ;No. Jump to motor drive check2 btfsc portb,rb0 ;RB0(left key) = ON ? goto drive ;No. Jump to motor drive MOVlw d'2' ;Yes. Set left mode MOVwf mode ;Save mode
;******************** Motor drive ********************* drive MOVf mode,w ;Read mode bz start ;mode = stop bsf portb,rb7 ;Set RB7 = 1 btfsc portb,rb5 ;RB5 = 0 ? goto $-1 ;No. Wait MOVlw d'5' ;Set loop count(5msec) MOVwf count1 ;Save loop count loop call timer ;Wait 1msec decfsz count1,f ;count - 1 = 0 ? goto loop ;No. Continue bcf portb,rb7 ;Set RB7 = 0 btfss portb,rb5 ;RB5 = 1 ? goto $-1 ;No. Wait MOVf porta,w ;Read PORTA sublw b'000000101' ;Check motor position bnz drive2 ;Unmatch MOVf mode,w ;Read mode sublw d'1' ;Right ? bz drive1 ;Yes. Right MOVlw b'00001001' ;No. Set Left data goto drive_end ;Jump to PORTA write drive1 MOVlw b'00000110' ;Set Right data goto drive_end ;Jump to PORTA write ;------- drive2 MOVf porta,w ;Read PORTA sublw b'000000110' ;Check motor position bnz drive4 ;Unmatch MOVf mode,w ;Read mode sublw d'1' ;Right ? bz drive3 ;Yes. Right MOVlw b'00000101' ;No. Set Left data goto drive_end ;Jump to PORTA write drive3 MOVlw b'00001010' ;Set Right data goto drive_end ;Jump to PORTA write ;------- drive4 MOVf porta,w ;Read PORTA sublw b'000001010' ;Check motor position bnz drive6 ;Unmatch MOVf mode,w ;Read mode sublw d'1' ;Right ? bz drive5 ;Yes. Right MOVlw b'00000110' ;No. Set Left data goto drive_end ;Jump to PORTA write drive5 MOVlw b'00001001' ;Set Right data goto drive_end ;Jump to PORTA write ;------- drive6 MOVf porta,w ;Read PORTA sublw b'000001001' ;Check motor position bnz drive8 ;Unmatch MOVf mode,w ;Read mode sublw d'1' ;Right ? bz drive7 ;Yes. Right MOVlw b'00001010' ;No. Set Left data goto drive_end ;Jump to PORTA write drive7 MOVlw b'00000101' ;Set Right data goto drive_end ;Jump to PORTA write ;------- drive8 MOVlw b'00000101' ;Compulsion setting
drive_end MOVwf porta ;Write PORTA goto start ;Jump to start
;************* 1msec Timer Subroutine ***************** timer MOVlw d'200' ;Set loop count MOVwf count2 ;Save loop count tmlp nop ;Time adjust nop ;Time adjust decfsz count2,f ;count - 1 = 0 ? goto tmlp ;No. Continue return ;Yes. Count end
;******************************************************** ; END of Stepper Motor controller ;********************************************************
end

|