📄 ir_judge.asm
字号:
;****************************************************************;
; IR Judge
;
; Carrier Frequency: 38K
; IR transmit output pin: PRTC[0]
; IR receive input pins: PRTD[0](front side)
; PRTD[1](left side)
; PRTD[2](right side)
;
; Written by: lixy
; Date: 2004-04-08
;****************************************************************;
;================================================================;
;Constant Area
;================================================================;
c_prtc012_1 equ #00000111b
c_prtc012_0 equ #11111000b
c_prtd012_1 equ #00000111b
c_prtd0_1 equ #00000001b
c_prtd0_0 equ #11111110b
c_prtd1_1 equ #00000010b
c_prtd1_0 equ #11111101b
c_prtd2_1 equ #00000100b
c_prtd2_0 equ #11111011b
;c_38k_pulse equ #22 ;the total number of 38k IR pulse transmitted(23*26us=598us)
;//04-03-17// revise the ir groups total number (primer value is 20)
;c_ir_group equ #12 ;the interval between 38k pulse groups in one IR group
;end revise //04-03-17//
c_ir_rcv_f equ #10
c_ir_rcv_l equ #10
c_ir_rcv_r equ #10
c_flg_f_rcved equ #1 ;表示前面有障碍物
c_flg_l_rcved equ #2 ;表示左面有障碍物
c_flg_r_rcved equ #3 ;表示右边有障碍物
c_flg_f_l_rcved equ #4 ;表示前左有障碍物
c_flg_f_r_rcved equ #5 ;表示前右有障碍物
c_flg_l_r_rcved equ #6 ;表示左右有障碍物
c_flg_f_l_r_rcved equ #7 ;表示前左右都有障碍物
c_offset_f equ #0
;--------------------------------------以下为左转的开始偏移
c_offset_l_20 equ #72 ;=9(row)*8(column) left 20 degree
c_offset_l_40 equ #80 ;=10(row)*8(column) left 40 degree
c_offset_l_60 equ #88 ;=11(row)*8(column) left 60 degree
c_offset_l_80 equ #96 ;=12(row)*8(column) left 80 degree
c_offset_l_100 equ #104 ;=13(row)*8(column) left 100 degree
c_offset_l_120 equ #112 ;=14(row)*8(column) left 120 degree
;--------------------------------------以下为右转的开始偏移
c_offset_r_20 equ #144 ;=18(row)*8(column) right 20 degree
c_offset_r_40 equ #152 ;=19(row)*8(column) right 40 degree
c_offset_r_60 equ #160 ;=20(row)*8(column) right 60 degree
c_offset_r_80 equ #168 ;=21(row)*8(column) right 80 degree
c_offset_r_100 equ #176 ;=22(row)*8(column) right 100 degree
c_offset_r_120 equ #184 ;=23(row)*8(column) right 120 degree
;;-------------------------------------以下为红外左右转表的开始偏移
;//04-03-17// add for swerve when detceting the obstacles
c_offset_l_20_ir equ #240 ;=30(row)*8(column) left 20 degree
c_offset_l_40_ir equ #248 ;=31(row)*8(column) left 40 degree
c_offset_l_60_ir equ #256 ;=32(row)*8(column) left 60 degree
c_offset_r_20_ir equ #312 ;=39(row)*8(column) right 20 degree
c_offset_r_40_ir equ #320 ;=40(row)*8(column) right 40 degree
c_offset_r_60_ir equ #328 ;=41(row)*8(column) right 60 degree
;end adding //04-03-17//
c_rnd_range_1 equ #1 ;random number range is 1
c_rnd_range_2 equ #2 ;random number range is 2
c_rnd_range_3 equ #3 ;random number range is 3
c_rnd_range_4 equ #4 ;random number range is 4
c_rnd_range_5 equ #5 ;random number range is 5
c_rnd_range_6 equ #6 ;random number range is 6
c_rnd_range_8 equ #8 ;random number range is 8
c_delay_short equ #120 ;delay short constant
;================================================================;
;IR Data Area
;================================================================;
.area ir_judge_var(data)
flg_ir_received:: .ds 1 ;接收后的状态(0-7表示)(哪个地方有障外)the flag of received IR
flg_l_or_r:: .ds 1 ;the flag of turn left or turn right when detect obstacles in front or front-left-right of the mouse
;cnt_38k_pulse:: .ds 1 ;IR transmitted pulse counter
;cnt_ir_group:: .ds 1
cnt_ir_rcv_f:: .ds 1
cnt_ir_rcv_l:: .ds 1
cnt_ir_rcv_r:: .ds 1
;temp_delay_short:: .ds 1 ;short delay variable
;================================================================;
;IR Code Area
;================================================================;
.area ir_judge_code(code)
;*********************************************************************
; intput:flg_motor_status,flg_ir_judge(接收是否完成)
; cnt_ir_rcv_f,cnt_ir_rcv_l,cnt_ir_rcv_r(中,左,右接收的红外个数)
;
; output:
;*********************************************************************
ir_judge::
;//20040701
; lda flg_motor_status ;at stop status?(stop: flg_motor_status=4)
; cmpe #4
; brnz if_judge_ir
;
; lda #0 ;/*04-03-02*/
; sta flg_ir_received ;added for eyes keep lighting normally when stopping.
; br judge_ir_end ;if at stop status, not transmit ir.
if_judge_ir:
lda flg_ir_judge ;if judge IR?(是否接收发射完成了?)
cmpe #1
brnz ir_judge_end
lda #0
sta flg_ir_judge
judge_ir:
call ir_received_judge ;接收判断子程序
;************/*04-02-26*/***************;
lda flg_ir_received
cmpe #c_flg_f_rcved
brz judge_ir_end
cmpe #c_flg_f_l_r_rcved
brz judge_ir_end
lda flg_l_or_r
xora #1
sta flg_l_or_r
;***************************************;
judge_ir_end:
; lda #0 ;clear the flag and the counters
; sta cnt_ir_group
; sta cnt_ir_rcv_f
; sta cnt_ir_rcv_l
; sta cnt_ir_rcv_r
ir_judge_end:
ret
;----------------------------------------------------------------;
;IR Received Judge Subroutine接收判断子程序
;----------------------------------------------------------------;
ir_received_judge::
f_judge:
lda cnt_ir_rcv_f
cmpe #c_ir_rcv_f
brnc f_no_l_judge
f_yes_l_judge:
lda cnt_ir_rcv_l
cmpe #c_ir_rcv_l
brnc f_yes_l_no_r_judge
f_yes_l_yes_r_judge:
lda cnt_ir_rcv_r
cmpe #c_ir_rcv_r
brnc f_yes_l_yes_r_no
;*************/*04-02-26*/**************;
f_yes_l_yes_r_yes:
lda #c_flg_f_l_r_rcved ;左右前方有障碍,左转或右转
sta flg_ir_received
lda flg_l_or_r
anda #1
brnz f_l_r_turn_right ;0 turn left, 1 turn right
f_l_r_turn_left: ;左转;//04-03-17// revise the initial offset
lda #>c_offset_l_40_ir ;为什么这样写>(可能是想表明这里是送进查表里的)
sta m_offset_ini_h ;查表地址开始值
lda #<c_offset_l_40_ir
sta m_offset_ini
lda #c_rnd_range_1
sta m_rnd_range ;m_rnd_range为所求的随机数的大小
br ir_received_set
f_l_r_turn_right: ;右转
lda #>c_offset_r_40_ir
sta m_offset_ini_h
lda #<c_offset_r_40_ir
sta m_offset_ini
lda #c_rnd_range_1
sta m_rnd_range
br ir_received_set
;***************************************;
f_yes_l_yes_r_no:
lda #c_flg_f_l_rcved ;左前方有障碍,右转
sta flg_ir_received
lda #>c_offset_r_40_ir
sta m_offset_ini_h
lda #<c_offset_r_40_ir
sta m_offset_ini
lda #c_rnd_range_1
sta m_rnd_range
br ir_received_set
f_yes_l_no_r_judge:
lda cnt_ir_rcv_r
cmpe #c_ir_rcv_r
brnc f_yes_l_no_r_no
f_yes_l_no_r_yes:
lda #c_flg_f_r_rcved ;右前方有障碍,左转
sta flg_ir_received
lda #>c_offset_l_40_ir
sta m_offset_ini_h
lda #<c_offset_l_40_ir
sta m_offset_ini
lda #c_rnd_range_1
sta m_rnd_range
br ir_received_set
f_yes_l_no_r_no:
lda #c_flg_f_rcved ;前方有障碍,左转或右转
sta flg_ir_received
;*************/*04-02-26*/**************;
lda flg_l_or_r
anda #1
brnz f_turn_right ;0 turn left, 1 turn right
f_turn_left: ;左转
lda #>c_offset_l_40_ir
sta m_offset_ini_h
lda #<c_offset_l_40_ir
sta m_offset_ini
lda #c_rnd_range_1
sta m_rnd_range
br ir_received_set
f_turn_right: ;右转
lda #>c_offset_r_40_ir
sta m_offset_ini_h
lda #<c_offset_r_40_ir
sta m_offset_ini
lda #c_rnd_range_1
sta m_rnd_range
br ir_received_set
;No Front ***************************************;
f_no_l_judge:
lda cnt_ir_rcv_l
cmpe #c_ir_rcv_l
brnc f_no_l_no_r_judge
f_no_l_yes_r_judge:
lda cnt_ir_rcv_r
cmpe #c_ir_rcv_r
brnc f_no_l_yes_r_no
f_no_l_yes_r_yes:
lda #c_flg_l_r_rcved ;左右方有障碍,前行
sta flg_ir_received
lda #c_offset_f
sta m_offset_ini
lda #c_rnd_range_8
sta m_rnd_range
br ir_received_set
f_no_l_yes_r_no:
lda #c_flg_l_rcved ;左方有障碍,右转
sta flg_ir_received
lda #>c_offset_r_40_ir
sta m_offset_ini_h
lda #<c_offset_r_40_ir
sta m_offset_ini
lda #c_rnd_range_1
sta m_rnd_range
br ir_received_set
f_no_l_no_r_judge:
lda cnt_ir_rcv_r
cmpe #c_ir_rcv_r
brnc f_no_l_no_r_no
f_no_l_no_r_yes:
lda #c_flg_r_rcved ;右方有障碍,左转
sta flg_ir_received
lda #>c_offset_l_40_ir
sta m_offset_ini_h
lda #<c_offset_l_40_ir
sta m_offset_ini
lda #c_rnd_range_1
sta m_rnd_range
br ir_received_set
f_no_l_no_r_no:
lda #0 ;没有障碍
sta flg_ir_received
ret
ir_received_set: ;/*04-02-19*/
lda #2 ;有IR时产生新随机数的标志为2
sta flg_new_random
lda #0
sta cnt_ctrl_pulse ;clear control pulse counter in Timer1 Service Routine.
sta cnt_ctrl_pulse+1 ;/*04-02-23*/
ir_received_judge_end:
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -