' Stepper motor / throttle control program ' ' Provide for display and contol of stepper ' motor as part of a throttle control system ' ' this program uses display messages ' stored in an external serial EEPROM. ' ' ' Created 10/15/95 ' Mitchell S. Cottrell ' ' Revision 1: 11/14/95 ' Mitchell S. Cottrell ' Add external EEPROM and ' Count cycle code ' 2: 11/16/95 MSC ' make bug fixes for display problems ' ' ' ' ' ________________________________________________________ steppoint var nib '1 of 4 point for stepper motor coil state stepcount var byte 'count of current stepper position stepdir var bit 'direction to step steplength var byte 'number of steps to move stepwait var byte 'dwell time for steps I var byte 'temp variable t var byte current_point var byte 'pointer value point_1_steps var byte 'auto mode pointer point_2_steps var byte auto_steps var byte auto_dir var bit point var nib 'set point pointer mode var byte 'mode variable 0 - 4 mode_button var byte 'button variable P1_button var byte 'button variable P2_button var byte 'button variable coils var outb 'motor coil output counter var byte 'counter index variable count_register var byte 'counter register magnitude var byte ' number transmit value number var word ' dp var nib ' decimal point position tnumber var byte ' wait_count var byte ' wait cycle counter value hold_count var byte 'hold count cylce value enable var byte 'level of enable line ok triglev var byte 'trigger line level trigger var in9 'trigger line clear var bit 'temporary bit for clear display function first var number.highbyte second var number.lowbyte cs var out15 'Define Chip Select Line shiftreg var number 'Define a WORD for a shift Reg Clocks var nib 'Define a nibble for the number 'of bits to clock out dir15 = 1 'set the CS pin to output ReadEE con $C00 'Define the read command bits WriteEE con $A00 'Define the write command bits ' Data for the location of display messages data @ 8 , word 0 data @ 10 , 13 data @ 11 , word 13 data @ 13 , 11 data @ 14 , word 24 data @ 16 , 3 data @ 17 , word 27 data @ 19 , 18 data @ 20 , word 45 data @ 22 , 14 data @ 23 , word 59 data @ 25 , 14 data @ 26 , word 73 data @ 28 , 18 data @ 29 , word 91 data @ 31 , 16 data @ 32 , word 107 data @ 34 , 17 data @ 35 , word 124 data @ 37 , 18 data @ 38 , word 142 data @ 40 , 13 data @ 41 , word 155 data @ 43 , 13 data @ 44 , word 168 data @ 46 , 24 data @ 47 , word 192 data @ 49 , 24 data @ 50 , word 216 data @ 52 , 3 data @ 53 , word 219 data @ 55 , 9 data @ 56 , word 228 data @ 58 , 11 data @ 59 , word 239 data @ 61 , 7 data @ 62 , word 246 data @ 64 , 8 data @ 65 , word 254 data @ 67 , 7 data @ 68 , word 261 data @ 70 , 17 data @ 71 , word 278 data @ 73 , 16 data @ 74 , word 294 data @ 76 , 23 data @ 77 , word 317 data @ 79 , 0 ' startinga address of display map map_start con 8 ' location of all status and count values ' to be held between runs end_count data @3 , (3) start_count data @2 , (1) point_1 data @0 ,(1) point_2 data @1 ,(1) ' Intiialize variables mode_button=0 P1_button =0 P2_button =0 ' check values for trigger levels ' and be sure they are just 1 or 0 read 4, enable read 5, triglev if enable=0 then enable_ok if enable=1 then enable_ok enable=1 write 4,enable enable_ok: if triglev=0 then triglev_ok if triglev=1 then triglev_ok triglev=1 write 5,triglev triglev_ok: auto_wait con 1 hometime con 1 stepmax con 50 stepwait=hometime dirL=%11111000 dir8=0 dir9=0 t=0 mode_button = 0 P1_button=0 P2_button=0 ' +++++++++++++++++++++++++++++++++++++++++++++++++++ startprog: 'top of program gohome: stepcount=200 steppoint=0 stepdir=0 steplength=100 gosub stepit stepdir=1 steplength=1 pause 100 gosub stepit stepcount=0 athome: serout 3,813,[$0a] 'serout 3,813,["AT HOME 0"] t=0 gosub send_message mode=0 ' top of mode set loop. mode_loop_top: branch mode,[start_man,start_set,count_set_start,set_trig_levels,start_2_pos,start_auto] goto error_loop change_mode: mode=mode+1 if mode<6 then mode_loop_top mode=0 goto mode_loop_top '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' Manual Mode Sub start_man: serout 3,813,[$0a] 'serout 3,813,["MANUAL MODE "] t=1 gosub send_message gosub press_1_or_2 clear=1 Waiting_on_button_manual: button 0,0,0,0,mode_button,1,change_mode button 1,0,0,0,P1_button,1,manual_step_fwd button 2,0,0,0,P2_button,1,manual_step_back goto waiting_on_button_manual manual_step_fwd: stepdir=1 goto make_manual_step manual_step_back: stepdir=0 make_manual_step: steplength=1 gosub stepit if clear=0 then skipclear serout 3,813,[$0a] clear=0 skipclear: serout 3,813,[$0d] 'serout 3,813,["MANUAL MODE "] t=1 gosub send_message serout 3,813,[$1b,15] gosub display_position 'serout 3,813,[" Deg "] t=2 gosub send_message goto waiting_on_button_manual '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ count_set_start: serout 3,813,[$0a] 'serout 3,813,["SET COUNT # 1 or 2 "] t=3 gosub send_message gosub press_1_or_2 Waiting_on_count_set: button 0,0,0,0,mode_button,1,change_mode button 1,0,0,0,P1_button,1,start_count_set_1 button 2,0,0,0,P2_button,1,start_count_set_2 goto Waiting_on_count_set start_count_set_1: counter = 1 serout 3,813,[$0a] 'serout 3,813,["SET WAIT COUNT "] t=4 gosub send_message goto start_count_set start_count_set_2: counter = 2 serout 3,813,[$0a] 'serout 3,813,["SET HOLD COUNT "] t=5 gosub send_message start_count_set: read 1+counter,count_register count_change_top: serout 3,813,[$1b,$13] number = count_register magnitude = 100 gosub send_number wait_for_count_button: button 0,0,0,0,mode_button,1,change_count_done button 1,0,50,1,P1_button,1,count_plus button 2,0,50,10,P2_button,1,count_minus goto wait_for_count_button count_plus: count_register = count_register + 1 if count_register < 250 then count_change_top count_register = 250 goto count_change_top count_minus: if count_register = 0 then count_change_top count_register = count_register - 1 goto count_change_top change_count_done: write 1+counter,count_register goto count_set_start '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' set levels sub set_trigger_levels: set_trig_levels: serout 3,813,[$0a] 'serout 3,813,["SET TRIGGER LEVELS "] t=06 gosub send_message gosub press_1_or_2 Waiting_on_level_set: button 0,0,0,0,mode_button,1,change_mode button 1,0,0,0,P1_button,1,start_level_1 button 2,0,0,0,P2_button,1,start_level_2 goto waiting_on_level_set start_level_1: serout 3,813,[$0a] 'serout 3,813,["SET ENABLE LEVEL "] t=7 gosub send_message serout 3,813,[$1B,25] if enable = 1 then enable1 serout 3,813,[$30] goto waiting_on_enab_level_set enable1: serout 3,813,[$31] Waiting_on_enab_level_set: button 0,0,0,0,mode_button,1,set_trigger_levels button 1,0,0,0,P1_button,1,set_enable_1 button 2,0,0,0,P2_button,1,set_enable_0 goto waiting_on_enab_level_set set_enable_1: enable=1 write 4,enable goto start_level_1 set_enable_0: enable=0 write 4,enable goto start_level_1 start_level_2: serout 3,813,[$0a] t=8 gosub send_message serout 3,813,[$1B,25] if triglev = 1 then triglev1 serout 3,813,[$30] goto waiting_on_trigger_level_set triglev1: serout 3,813,[$31] Waiting_on_trigger_level_set: button 0,0,0,0,mode_button,1,set_trigger_levels button 1,0,0,0,P1_button,1,set_trig_1 button 2,0,0,0,P2_button,1,set_trig_0 goto waiting_on_trigger_level_set set_trig_1: triglev=1 write 5,triglev goto start_level_2 set_trig_0: triglev=0 write 5,triglev goto start_level_2 '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' set point 1 Mode Sub start_set: serout 3,813,[$0a] 'serout 3,813,["SET POINT # 1 or 2 "] t=9 gosub send_message gosub press_1_or_2 Waiting_on_start_set: button 0,0,0,0,mode_button,1,change_mode button 1,0,0,0,P1_button,1,start_set_1 button 2,0,0,0,P2_button,1,start_set_2 goto waiting_on_start_set start_set_1: p1_button=0 point=1 goto start_set_position start_set_2: p2_button=0 point=2 start_set_position read point-1,t gosub move_to_point serout 3,813,[$0a] setting_location: 'serout 3,813,["SETTING POINT "] t=10 gosub send_message serout 3,813,[" ",point+$30," "] gosub display_position waiting_for_set_change: button 0,0,0,0,mode_button,1,done_set_position button 1,0,0,0,P1_button,1,move_fwd_one button 2,0,0,0,P2_button,1,move_back_one goto waiting_for_set_change Move_fwd_one: stepdir=1 goto set_move move_back_one: stepdir=0 set_move: steplength=1 gosub stepit serout 3,813,[$0d] goto setting_location done_set_position: ' fininshed changing position ' write results to eeprom write point-1,stepcount goto start_set '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' two position Mode Sub Start_2_pos: serout 3,813,[$0a] 'serout 3,813,["AUTO/MAN MODE "] t=11 gosub send_message gosub press_1_or_2 Waiting_on_2_pos_start: button 0,0,0,0,mode_button,1,change_mode button 1,0,0,0,P1_button,1,go_set_1 button 2,0,0,0,P2_button,1,go_set_2 goto waiting_on_2_pos_start go_set_1: read 0,t gosub move_to_point serout 3,813,[$0a] 'serout 3,813,["AUTO/MAN MODE [Point 1] "] t=12 gosub send_message serout 3,813,[$1b,27] goto update_2_pos_disp go_set_2: read 1,t gosub move_to_point serout 3,813,[$0a] 'serout 3,813,["AUTO/MAN MODE [Point 2] "] t=13 gosub send_message serout 3,813,[$1b,27] update_2_pos_disp: gosub display_position 'serout 3,813,[" Deg"] t=2 gosub send_message goto Waiting_on_2_pos_start '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' Auto Mode Sub start_auto: serout 3,813,[$0a] 'serout 3,813,["AUTO MODE "] t=15 gosub send_message gosub press_1_or_2 Waiting_on_auto_start: button 0,0,0,0,mode_button,1,change_mode button 1,0,0,0,P1_button,1,go_auto button 2,0,0,0,P2_button,1,go_auto goto waiting_on_auto_start go_auto: read 2,wait_count read 3,hold_count serout 3,813,[$0a] 'serout 3,813,["AUTO ACTIVE "] t=16 gosub send_message serout 3,813,[$1b,$13] 'serout 3,813,["Waiting "] t=17 gosub send_message gosub send_blanks read 0,point_1_steps 'read point 1 data read 1,point_2_steps 'read point 2 data if point_1_steps > point_2_steps then auto_invert auto_dir=1 'if 2>1 then set auto_dir auto_steps=point_2_steps-point_1_steps 'calculate number ofsteps goto skip_auto_invert auto_invert: 'if 1>2 then do this auto_dir=0 'set auto_dir auto_steps=point_1_steps-point_2_steps 'calculate number of skip_auto_invert: read 0,t 'get point 1 in "t" gosub move_to_point 'go to point #1 point=1 'set pointer '--------------------------- ' high speed loop Auto_loop_top: wait_for_enable if in0 = 0 then start_auto if in8 <>enable then wait_for_enable 'check to see if input high or low ' '-------------- if wait_count=0 then move_to_point_2 serout 3,813,[$1b,$13] 'serout 3,813,["Counting "] t=18 gosub send_message gosub send_blanks count_register=0 counter=wait_count gosub watch_count_line ' goto point 2 move_to_point_2: if auto_dir=0 then flip_point_2 gosub Auto_fast_move_fwd: goto done_point_2_move flip_point_2: gosub Auto_fast_move_back: done_point_2_move: stepcount=point_2_steps point=2 if hold_count=0 then lock_at_2 serout 3,813,[$1b,$13] 'serout 3,813,["Holding "] t=19 gosub send_message gosub send_blanks count_register=0 counter=hold_count gosub watch_count_line '-------------------- ' goto point1 if auto_dir=0 then flip_point_1 gosub Auto_fast_move_back: goto done_point_1_move flip_point_1: gosub Auto_fast_move_fwd: done_point_1_move: stepcount=point_1_steps point=1 goto go_auto '------------------------- lock_at_2: serout 3,813,[$1b,$13] 'serout 3,813,["Locked at point 2 "] t=20 gosub send_message locked if in0= 1 then locked goto go_auto '-------------------------- Watch_count_line: if trigger <> triglev then watch_count_line Wait_for_opposite: if trigger = triglev then wait_for_opposite count_register = count_register + 1 if count_register < counter then watch_count_line return return '------------------------- Auto_fast_move_fwd: for i=1 to auto_steps steppoint=steppoint+1 if steppoint<=4 then auto_fwd_ok steppoint=1 auto_fwd_ok: lookup steppoint, [%0000,%0110,%1010,%1001,%0101],coils 'ccw ' pause auto_wait next return '------------------------- Auto_fast_move_back: for i=1 to auto_steps steppoint=steppoint-1 if steppoint=>1 then auto_back_ok steppoint=4 auto_back_ok: lookup steppoint, [%0000,%0110,%1010,%1001,%0101],coils 'ccw ' pause auto_wait next return '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' display position info Display_position: number = stepcount*18 dp=2 magnitude = 100 gosub send_number return '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' move to Point Sub ' destination is in variable "t" move_to_point: if t>stepcount then move_toward_fwd steplength=stepcount-t stepdir=0 goto stepit move_toward_fwd: steplength = t-stepcount stepdir=1 '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' step Sub Stepit: for i=1 to steplength if stepdir=0 then gobackwards if stepcount = stepmax then nextstep steppoint=steppoint+1 stepcount=stepcount+1 goto jumppastbackwards gobackwards: if stepcount=0 then nextstep steppoint=steppoint-1 stepcount=stepcount-1 jumppastbackwards: if steppoint>=1 then not_less_than_1 steppoint=4 not_less_than_1: if steppoint<=4 then not_greater_than_4 steppoint=1 not_greater_than_4: 'lookup steppoint, [%0000,%0101,%1001,%1010,%0110],coils ' cw lookup steppoint, [%0000,%0110,%1010,%1001,%0101],coils 'ccw 'pause stepwait nextstep: next end_of_routine: return '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ press_1_or_2: serout 3,813,[$1b,23] 'serout 3,813,[" < PRESS 1 OR 2 >"] t=21 gosub send_message return '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 'send number subroutine send_number: send_next_number: tnumber=0 if number < magnitude then send_tnumber get_tnumber: tnumber=tnumber + 1 number=number -magnitude if number >= magnitude then get_tnumber send_tnumber: serout 3,813,[tnumber+$30] if magnitude = 1 then done_send magnitude = magnitude / 10 if dp=0 then send_next_number dp=dp-1 if dp>0 then send_next_number serout 3,813,[$2e] goto send_next_number done_send: return '+++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' ' send string of blanks ' send_blanks serout 3,813,[" "] return '+++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' get message from prom and send it to display send_message: t=(t*3)+map_start read t,second 'high byte of number read t+1,first 'low byte of number read t+2,magnitude 'length of message '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' Read Prom subroutine ReadProm: shiftreg = number 'define the address to be read shiftreg=shiftreg|readEE 'OR on the read command bits clocks=12 'define 12 bits to clock out 'this is the length of the 'command word cs=1 'start the command with a CS on gosub shift_out 'Goto the shift out subroutine for t= 1 to magnitude gosub shift_in 'get the data in the shift in 'subroutine serout 3,813,[second] next cs=0 'finish the command with a CS 'off command '++++++++++++++++++++++++++++++++++++++ ' Shift Data Out subroutine Shift_out: shiftreg = shiftreg rev clocks 'reverse the "clocks"number 'of bits from the MSB to the 'LSB position shiftout 13,14,0,[shiftreg\clocks] 'shift out "clock" number of 'bits from the variable 'shiftreg with the data on pin '13 and clock pin on 14. The 'mode is 0 (LSB first) Return 'done.. return to the main '++++++++++++++++++++++++++++++++++++++ 'shift data in subroutine shift_in: shiftreg=0 'set the shiftreg var to 0 shiftin 13,14,2,[shiftreg\8] 'clock in the data on pin 13 'into the variable shiftreg 'using pin 14 as the clock pin 'the mode is 2, MSB first 'with data valid after the 'clock. return 'done.. retrurn to the main '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' error Sub error_loop: serout 3,813,[$0a] 'serout 3,813,["Error... Shutting down"] t=22 gosub send_message zero_coils: coils=0 goto zero_coils