📄 set_rules.asl
字号:
+ 1 ;****************************************************************;
+ 2 ; Set Rules
+ 3 ;
+ 4 ; Function: set some limits to the movement rules
+ 5 ;
+ 6 ; Written by: lixy
+ 7 ; Date: 2004-03-02
+ 8 ;****************************************************************;
+ 9 ;================================================================;
+ 10 ;Constant Area
+ 11 ;================================================================;
001C 12 c_mtr_tab_row equ #28 ;motor move status totoal number range is 0~c_mtr_tab_row+1
0008 13 c_rnd_range_f equ #8 ;random number range is 8
0000 14 c_offset_f_ini equ #0
+ 15
0000 16 c_flg_left equ #0
0001 17 c_flg_right equ #1
0002 18 c_flg_backup equ #2
0003 19 c_flg_ahead equ #3
+ 20 ;//04-04-13// add
0004 21 c_flg_stop equ #4
+ 22
+ 23
001A 24 c_rnd_range_not_stop equ #26
+ 25 ;end add //04-04-13//
0002 26 c_flg_l_rcved equ #2
0003 27 c_flg_r_rcved equ #3
0004 28 c_flg_f_l_rcved equ #4
0005 29 c_flg_f_r_rcved equ #5
0001 30 c_rnd_range_1 equ #1 ;random number range is 1
+ 31 ;c_rnd_range_2 equ #2 ;random number range is 2
+ 32 ;c_rnd_range_3 equ #3 ;random number range is 3
+ 33 ;c_rnd_range_4 equ #4 ;random number range is 4
+ 34 ;c_rnd_range_5 equ #5 ;random number range is 5
+ 35 ;c_rnd_range_6 equ #6 ;random number range is 6
+ 36 ;c_rnd_range_8 equ #8 ;random number range is 8
+ 37 ;c_offset_f equ #0
+ 38 ;;--------------------------------------以下为左转的开始偏移
+ 39 ;c_offset_l_20 equ #72 ;=9(row)*8(column) left 20 degree
+ 40 ;c_offset_l_40 equ #80 ;=10(row)*8(column) left 40 degree
+ 41 ;c_offset_l_60 equ #88 ;=11(row)*8(column) left 60 degree
+ 42 ;c_offset_l_80 equ #96 ;=12(row)*8(column) left 80 degree
+ 43 ;c_offset_l_100 equ #104 ;=13(row)*8(column) left 100 degree
+ 44 ;c_offset_l_120 equ #112 ;=14(row)*8(column) left 120 degree
+ 45 ;;--------------------------------------以下为右转的开始偏移
+ 46 ;c_offset_r_20 equ #144 ;=18(row)*8(column) right 20 degree
+ 47 ;c_offset_r_40 equ #152 ;=19(row)*8(column) right 40 degree
+ 48 ;c_offset_r_60 equ #160 ;=20(row)*8(column) right 60 degree
+ 49 ;c_offset_r_80 equ #168 ;=21(row)*8(column) right 80 degree
+ 50 ;c_offset_r_100 equ #176 ;=22(row)*8(column) right 100 degree
+ 51 ;c_offset_r_120 equ #184 ;=23(row)*8(column) right 120 degree
+ 52 ;;;-------------------------------------以下为红外左右转表的开始偏移
+ 53 ;;//04-03-17// add for swerve when detceting the obstacles
00F0 54 c_offset_l_20_ir equ #240 ;=30(row)*8(column) left 20 degree
00F8 55 c_offset_l_40_ir equ #248 ;=31(row)*8(column) left 40 degree
+ 56 ;c_offset_l_60_ir equ #256 ;=32(row)*8(column) left 60 degree
0138 57 c_offset_r_20_ir equ #312 ;=39(row)*8(column) right 20 degree
0140 58 c_offset_r_40_ir equ #320 ;=40(row)*8(column) right 40 degree
+ 59 ;c_offset_r_60_ir equ #328 ;=41(row)*8(column) right 60 degree
+ 60 ;;end adding //04-03-17//
+ 61 ;================================================================;
+ 62 ;Data Area
+ 63 ;================================================================;
+B 00 01
+ 64 .area set_rules_var(data)
+ 65
0000 66 temp_flg_ir_received:: .ds 1 ;store the last flg_ir_received value
0001 67 flg_last_barrier:: .ds 1 ;there is barrier at the last time
+ 68 ;================================================================;
+ 69 ;Code Area
+ 70 ;================================================================;
+B 00 02
+ 71 .area set_rules_code(code)
+ 72
0000 73 Run_judge::
0000 F1 00 74 lda flg_rcv_barrier ;Is there any barrier sign ahead?
0002 A7 01 75 cmpe #1
0004 06 00 2E 76 brz front_barrier
0007 F1 00 77 lda flg_new_random ;there isn't barrier
0009 A7 00 78 cmpe #0
000B 07 00 1D 79 brnz Run_next_status ;the last status finished(flg_new_random=1 or 2)
+ 80 ;--------------------------------------------------------------------------------
+ 81 ;no barrier at this times,the last status isn't finished
000E F1 01 82 lda flg_last_barrier
0010 A7 01 83 cmpe #1
0012 06 00 16 84 brz last_barrier_ahead ;if the last barrier,will go ahead
0015 24 85 ret ;no barrier at this times and last times ,the last status isn't finished,no change,go on the current status
0016 86 last_barrier_ahead:
0016 F3 00 87 lda #0 ;no barrier at this times,barrier at last times,last status isn't finished
0018 FD 01 88 sta flg_last_barrier ;go ahead
001A 02 00 85 89 br next_status_ahead
+ 90 ;------------------------------------------------------------------------------------
+ 91 ;no barrier at this time,the last status has be finished
001D 92 Run_next_status:
001D F1 01 93 lda flg_last_barrier ;the last status has be finished
001F A7 00 94 cmpe #0
0021 06 00 27 95 brz Run_random_status ;there isn't barrier in the previous status,will random except backup
0024 02 00 16 96 br last_barrier_ahead ;no barrier at this time,barrier at last time,current status finished,go ahead
0027 97 Run_random_status:
0027 F3 03 98 lda #3 ;no barrier at this time and last time,last status finished
0029 FD 00 99 sta rnd_num
002B 02 00 5C 100 br next_status_l_r_ahead ;the next status will be left,right,(backup),ahead
+ 101 ;------------------------------------------------------------------------------------------
+ 102 ;barrier at the front
002E 103 front_barrier:
002E F3 01 104 lda #1
0030 FD 01 105 sta flg_last_barrier
0032 F1 00 106 lda flg_motor_status ;if the previous status is turning left or right, the next status is left or right too.
0034 A7 03 107 cmpe #c_flg_ahead
0036 06 00 58 108 brz next_status_l_r_b ;the next status is a random except ahead
0039 F1 00 109 lda flg_new_random
003B A7 00 110 cmpe #0
003D 06 00 57 111 brz pre_status_continue ;if the previous status is going on,no change director and continue the last status
0040 F1 00 112 lda flg_motor_status
0042 A7 00 113 cmpe #c_flg_left
0044 06 00 A5 114 brz next_status_left ;repeat the last status
0047 A7 01 115 cmpe #c_flg_right
0049 06 00 9A 116 brz next_status_right ;repeat the last status
004C A7 02 117 cmpe #c_flg_backup ;the previous status is backup
004E 06 00 7A 118 brz next_status_backup ;repeat backup
0051 A7 04 119 cmpe #c_flg_stop ;if the previous status is stop, not stop next.
0053 06 00 A5 120 brz next_status_left ;turn left(assume),may turn right
0056 24 121 ret
0057 122 pre_status_continue:
+ 123 ; lda #0 ;go on the last status till it is finished(flg_new_random=1)
+ 124 ; sta flg_rcv_barrier
0057 24 125 ret
0058 126 next_status_l_r_b:
0058 F3 02 127 lda #2 ;0 will turn left,1 will turn right,2 will turn backup
005A FD 00 128 sta m_rnd_range
005C 129 next_status_l_r_ahead:
005C F3 00 130 lda #0
005E FD 00 131 sta rnd_num
0060 20 00 00 132 call read_random
0063 F1 00 133 lda rnd_num
0065 A7 00 134 cmpe #c_flg_left
0067 06 00 A5 135 brz next_status_left
006A A7 01 136 cmpe #c_flg_right
006C 06 00 9A 137 brz next_status_right
006F A7 02 138 cmpe #c_flg_backup
0071 06 00 7A 139 brz next_status_backup
0074 A7 03 140 cmpe #c_flg_ahead
0076 06 00 85 141 brz next_status_ahead
0079 24 142 ret
007A 143 next_status_backup:
007A F1 00 144 lda flg_rcv_barrier
007C A7 00 145 cmpe #0
007E 06 00 9A 146 brz next_status_right ;assume,if no barrier,it cann't backup
+ 147 ; backup
+ 148
+ 149
0081 02 00 AD 150 br next_status_set_end
0084 24 151 ret
0085 152 next_status_ahead:
0085 F3 00 153 lda #>c_offset_f_ini
0087 FD 00 154 sta m_offset_ini_h
0089 F3 00 155 lda #<c_offset_f_ini
008B FD 00 156 sta m_offset_ini
008D F3 08 157 lda #c_rnd_range_f
008F FD 00 158 sta m_rnd_range
0091 F3 00 159 lda #0
0093 FD 00 160 sta flg_new_random
0095 FD 00 161 sta cnt_ctrl_pulse ;clear control pulse counter in Timer1 Service Routine.
0097 FD 01 162 sta cnt_ctrl_pulse+1 ;/*04-02-23*/
0099 24 163 ret
009A 164 next_status_right: ;右转
009A F3 01 165 lda #>c_offset_r_40_ir
009C FD 00 166 sta m_offset_ini_h
009E F3 40 167 lda #<c_offset_r_40_ir
00A0 FD 00 168 sta m_offset_ini
00A2 02 00 AD 169 br next_status_set_end
00A5 170 next_status_left: ;左转
00A5 F3 00 171 lda #>c_offset_l_40_ir
00A7 FD 00 172 sta m_offset_ini_h
00A9 F3 F8 173 lda #<c_offset_l_40_ir
00AB FD 00 174 sta m_offset_ini
00AD 175 next_status_set_end:
00AD F3 01 176 lda #c_rnd_range_1
00AF FD 00 177 sta m_rnd_range
00B1 F3 00 178 lda #0
00B3 FD 00 179 sta flg_new_random
00B5 FD 00 180 sta cnt_ctrl_pulse ;clear control pulse counter in Timer1 Service Routine.
00B7 FD 01 181 sta cnt_ctrl_pulse+1 ;/*04-02-23*/
00B9 24 182 ret
+ 183
+ 184
+ 185
+ 186
+ 187 ;set_rules::
+ 188 ; ;lda flg_new_random
+ 189 ; cmpe #1
+ 190 ;; brnz set_rules_end
+ 191 ; brnz rules_for_ir ;if the flg_new_random is 2, set some rules for run when received ir.
+ 192 ;
+ 193 ;;-------------------------------------这是flg_new_random==1时的设置一些规则,即是没有障碍物的情况下。
+ 194 ;rules_for_free_run: ;
+ 195 ; lda flg_motor_status ;if the previous status is turning left or right, the next move status is straight forward.
+ 196 ; cmpe #c_flg_stop ;if the previous status is stop, not stop next.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -