;****************************************************************************** ;* basic stepper motor drive test program. 30/01/2001 * ;* * ;* David Duffy - Audio Visual Devices - david@audiovisualdevices.com.au * ;* * ;* clock is 4MHz ceramic resonator. * ;****************************************************************************** list p=16f84a _CP_ON equ h'000F' _CP_OFF equ h'3FFF' _PWRTE_ON equ h'3FF7' _PWRTE_OFF equ h'3FFF' _WDT_ON equ h'3FFF' _WDT_OFF equ h'3FFB' _LP_OSC equ h'3FFC' _XT_OSC equ h'3FFD' _HS_OSC equ h'3FFE' _RC_OSC equ h'3FFF' __FUSES _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF status equ 03h ;status flags register port_a equ 05h ;port a data register port_b equ 06h ;port b data register option_reg equ 81h ;option register tris_a equ 85h ;port a direction register tris_b equ 86h ;port b direction register cblock 0ch ; db1 ;delay variable 1 db2 ;delay variable 2 temp1 ; s_count ; endc ; #define carry status,0 ;carry flag in status reg #define zero status,2 ;zero flag in status reg #define rp0 status,5 ;page select bit in status reg ;****************************************************************************** ;* physical port defines. * ;****************************************************************************** #define l_clk port_a,0 ;ucn5821 motor driver clock #define l_data port_a,1 ;ucn5821 motor driver data #define l_str port_a,2 ;ucn5821 motor driver strobe #define l_en port_a,3 ;ucn5821 motor driver enable (active low) ;****************************************************************************** org 000h ;start of program memory goto initialise ;jump to initialise ;****************************************************************************** initialise: ; movlw b'00001100' ;set up mask movwf port_a ;set port_a initial levels movlw b'00000000' ;set up mask movwf port_b ;set port_b initial levels bsf rp0 ;select to ram bank 1 movlw b'00000000' ;set up mask movwf tris_a ;set port_a i/o directions movlw b'11111111' ;set up mask movwf tris_b ;set port_a i/o directions movlw b'00000000' ; movwf option_reg ; bcf rp0 ;select ram bank 0 ;****************************************************************************** start: call delay_1000 ;wait 1 second after power-up clrw ;no windings on call load_ucn ;send pattern to ucn5821 driver chip bcf l_en ;enable the driver chip main: movlw b'00010000' ;winding 1 on call load_ucn ;send pattern to ucn5821 driver chip call delay_4 ;wait 4ms movlw b'00110000' ;windings 1 & 2 on call load_ucn ;send pattern to ucn5821 driver chip call delay_4 ;wait 4ms movlw b'00100000' ;winding 2 on call load_ucn ;send pattern to ucn5821 driver chip call delay_4 ;wait 4ms movlw b'01100000' ;windings 2 & 3 on call load_ucn ;send pattern to ucn5821 driver chip call delay_4 ;wait 4ms movlw b'01000000' ;winding 3 on call load_ucn ;send pattern to ucn5821 driver chip call delay_4 ;wait 4ms movlw b'11000000' ;windings 3 & 4 on call load_ucn ;send pattern to ucn5821 driver chip call delay_4 ;wait 4ms movlw b'10000000' ;winding 4 on call load_ucn ;send pattern to ucn5821 driver chip call delay_4 ;wait 4ms movlw b'10010000' ;windings 4 & 1 on call load_ucn ;send pattern to ucn5821 driver chip call delay_4 ;wait 4ms goto main ;do it over & over! ;****************************************************************************** ;* enters with motor data in w and clocks it (MSB first) into the * ;* ucn5821 driver ic. * ;****************************************************************************** load_ucn: ; movwf temp1 ;get entry byte movlw .8 ; movwf s_count ;8 bits to a byte lu_loop: ; bcf l_data ;assume bit is a 0 btfsc temp1,7 ;is msb a 1 ? bsf l_data ;yes, set s_data high rlf temp1,f ;rotate next bit into msb nop ;1us data setup time bsf l_clk ;set clock high nop ;1us clock pulse width bcf l_clk ;set clock low decfsz s_count,f ;last bit to send ? goto lu_loop ;no, loop around bsf l_str ;set strobe high nop ;1us strobe pulse width bcf l_str ;set strobe low return ;exit routine ;****************************************************************************** ;* various delays (in milliseconds) * ;****************************************************************************** delay_4: movlw .1 ;4ms delay movwf db1 ;set outer loop count goto time_delay ;get going! delay_1000 movlw .244 ;1000ms delay movwf db1 ;set outer loop count goto time_delay ;get going! time_delay ;outer loop start clrf db2 ;clear inner loop delay_l ;inner loop start nop ;waste 16us in loop nop ; nop ; nop ; nop ; nop ; nop ; nop ; nop ; nop ; nop ; nop ; nop ; decfsz db2,f ;256 x 16 cycle inner loop goto delay_l ;do more inner loops decfsz db1,f ;n cycle outer loop goto time_delay ;do more outer loops return ;exit when all done ;****************************************************************************** end