⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ir_rcv_int.asl

📁 一款智能老鼠的玩具源代码
💻 ASL
字号:
+                     1 ;****************************************************************;
+                     2 ;INT2_isr Service Routine
+                     3 ;
+                     4 ; function: IR Receiver judge
+                     5 ; Extern Interrupt High to low trigger
+                     6 ;
+                     7 ; Written by: Mr.Kelvin Yuan
+                     8 ; Date: 2004-06-30
+                     9 ;
+                    10 ;****************************************************************;
+                    11 
+                    12 ;================================================================;
+                    13 ;Constant Area
+                    14 ;================================================================;
+                    15 ;//04-03-17// revise for reducing the ir detect interval time
0016                 16 cnt_ir_lead_min		equ	#22	;standard value shall be 24(2.5ms+0.5ms=3ms),3ms/125us
001D                 17 cnt_ir_lead_max		equ	#29	;3.5ms+125us,1ms=8
0013                 18 cnt_ir_data_max		equ	#19	;standard is 16(2.0ms),+4(0.5ms)
0004                 19 cnt_ir_data_min		equ	#4      ;the minium data 0 is 1ms,0.5ms is limited(4)
000C                 20 cnt_ir_data0_max	equ	#12	;>=1.5ms is 1(2ms,16),<1.5ms is 0(1ms,8)
000F                 21 mouse_self_data		equ	#00001111b ;receive mouse self data
005A                 22 cheese_broadcast_data	equ	#01011010b ;receive cheese broadcast data
00E1                 23 cheese_touched_data	equ	#11100001b ;receive cheese touched data
+                    24 ;================================================================;
+                    25 ;Data Area
+                    26 ;================================================================;
+B 00 01

+                    27        .area    INT1_var(data)
0000                 28 temp_a_3::		.ds	1
0001                 29 temp_op1_3::		.ds	1
0002                 30 temp_dp_3::		.ds	1
0003                 31 status_ir_rcv::		.ds	1	;0 states no data received,1 is lead received ready
+                    32 ;2 is data1 received ready;3 is data2 received ready,4 is data1 reverse ready,5 is data2 reverse ready
+                    33 ;6 is mouse_self ok,7 states cheese broadcast sign received,8 states cheese touched received.
0004                 34 ir_rcv_data::		.ds	1
+                    35 ;ir_rcv_data_temp::	.ds	1
+                    36 ;cnt_broadcast_tmr::	.ds	2
0005                 37 flg_rcv_broadcast::	.ds	1    ;1 broadcast sign received,it will be clear in 2s(timer2)
0006                 38 temp_count::		.ds	2    ;for test
0008                 39 flg_rcv_touched::	.ds	1    ;touched sign be received flag
+                    40 ;cnt_ir_rcv_temp :	.ds 	5 ;for test
0009                 41 flg_rcv_barrier::	.ds	1	;barrier sign received
+                    42 ;================================================================;
+                    43 ;Code Area
+                    44 ;================================================================;
+B 00 02

+                    45        .area    INT2_isr(code)
+                    46 
0000                 47 INT2_isr::
+                    48  
0000 FD 00           49 	sta	temp_a_3
0002 F0 22           50 	lda	r_op1
0004 FD 01           51 	sta	temp_op1_3
0006 F0 21           52 	lda	r_dp
0008 FD 02           53 	sta	temp_dp_3
+                    54 
000A F1 03           55 	lda	status_ir_rcv
000C A7 00           56 	cmpe	#0             		;0 is the first entry interrupt
000E 06 00 A2        57 	brz	ir_rcv_first
0011 A7 01           58 	cmpe	#1     			;1 is the second entry intterrup
0013 06 00 89        59 	brz	ir_rcv_lead		;lead code judge
0016 F1 00           60 	lda	cnt_ir_rcv
+                    61 
0018 A7 13           62 	cmpe	#cnt_ir_data_max	;cnt_ir_rcv>=cnt_ir_data_max,c=1,error
001A 04 00 58        63 	brc	ir_rcv_data_err		;error process
001D A7 04           64 	cmpe	#cnt_ir_data_min	;cnt_ir_rcv<cnt_ir_data_min,c=0,psuedo pulse,no process
+                    65 ;20040707
001F 05 00 58        66 	brnc	ir_rcv_data_err
+                    67 ;      	brnc	INT2_isr_end            ;psuedo pulse,skip,wait for the next int,count continue
0022 A7 0C           68 	cmpe 	#cnt_ir_data0_max	;>=1.5ms is 1,<1.5ms c=0,
+                    69 ;	brc	ir_rcv_data_1
+                    70 ;ir_rcv_data_1:
0024 F1 04           71 	lda	ir_rcv_data
0026 7E              72 	rolc
0027 FD 04           73 	sta	ir_rcv_data
0029 F1 03           74 	lda	status_ir_rcv
+                    75 ; cmpe	#2
+                    76 ; brnz	ir_rcv_data_test1
+                    77 ; lda	cnt_ir_rcv
+                    78 ; sta	cnt_ir_rcv_temp         ;for test
+                    79 ; br	test_return
+                    80 ;ir_rcv_data_test1:
+                    81 ; cmpe	#3
+                    82 ; brnz	ir_rcv_data_test2
+                    83 ; lda	cnt_ir_rcv
+                    84 ; sta	cnt_ir_rcv_temp+1         ;for test
+                    85 ; br	test_return
+                    86 ;ir_rcv_data_test2:
+                    87 ; cmpe	#4
+                    88 ; brnz	ir_rcv_data_test3
+                    89 ; lda	cnt_ir_rcv
+                    90 ; sta	cnt_ir_rcv_temp+2         ;for test
+                    91 ; br	test_return
+                    92 ;ir_rcv_data_test3:
+                    93 ; cmpe	#5
+                    94 ; brnz	test_return
+                    95 ; lda	cnt_ir_rcv
+                    96 ; sta	cnt_ir_rcv_temp+3         ;for test
+                    97 ; nop
+                    98 ;test_return:
+                    99 
002B F3 00          100 	lda	#0
002D FD 00          101 	sta	cnt_ir_rcv
002F F1 03          102 	lda	status_ir_rcv
0031 A7 09          103 	cmpe	#9			;is the last data reverse?
0033 06 00 3C       104 	brz	ir_rcv_data_ok
0036 1F             105 	inca
0037 FD 03          106 	sta	status_ir_rcv
0039 02 00 AD       107 	br	INT2_isr_end
+                   108 ;ir_rcv_data_check:
+                   109 ;	lda	ir_rcv_data
+                   110 ;	sta	ir_rcv_data_temp
+                   111 ;	adda	#0		;clear cy
+                   112 ;	rorc
+                   113 ;	adda	#0		;celar cy
+                   114 ;	rorc
+                   115 ;	sta	ir_rcv_data
+                   116 ;	lda	ir_rcv_data_temp
+                   117 ;	anda	#03		;mask b7-b3
+                   118 ;	xora	#03		;reverse the last 2bit
+                   119 ;	cmpe	ir_rcv_data
+                   120 ;	brz	ir_rcv_data_ok
+                   121 
+                   122 	
003C                123 ir_rcv_data_ok:
003C F1 06          124 	lda	temp_count      ;for test
003E 1F             125 	inca
003F FD 06          126 	sta	temp_count
0041 F1 07          127 	lda	temp_count+1
0043 9B 00          128 	addc	#0
0045 FD 07          129 	sta	temp_count+1
0047 F1 04          130 	lda	ir_rcv_data
0049 A7 0F          131 	cmpe	#mouse_self_data
004B 06 00 82       132 	brz	ir_rcv_data_ok_self
004E A7 5A          133 	cmpe	#cheese_broadcast_data
0050 06 00 75       134 	brz	ir_rcv_data_ok_bc
0053 A7 E1          135 	cmpe	#cheese_touched_data
0055 06 00 63       136 	brz	ir_rcv_data_ok_touched
0058                137 ir_rcv_data_err:
0058 F3 00          138 	lda	#0		;data wrong
005A FD 03          139 	sta	status_ir_rcv
005C FD 00          140 	sta	cnt_ir_rcv
005E FD 04          141 	sta	ir_rcv_data
0060 02 00 AD       142 	br	INT2_isr_end
+                   143 
0063                144 ir_rcv_data_ok_touched:         ;maouse be touched,game will over
0063 F1 05          145 	lda	flg_rcv_broadcast   ;it is wrong that touched sign is received before broadcast sign received
0065 A7 01          146 	cmpe	#1
0067 07 00 58       147 	brnz	ir_rcv_data_err
006A F3 01          148 	lda	#1
006C FD 08          149 	sta	flg_rcv_touched
006E F3 00          150 	lda	#0
0070 FD 00          151 	sta	status_ir_transmit	;stop transmit IR
0072 02 00 58       152 	br	ir_rcv_data_err       ;the result is ok, only initial all,	
+                   153 ;	br	INT2_isr_end
+                   154 	
0075                155 ir_rcv_data_ok_bc:
0075 F3 00          156 	lda	#0			;broadcast sign is received,will slow tx IR
+                   157 ;	sta	status_ir_rcv           ;has set the flag,restore the status
0077 FD 00          158 	sta	cnt_broadcast_tmr
0079 FD 01          159 	sta	cnt_broadcast_tmr+1
007B F3 01          160 	lda	#1
007D FD 05          161 	sta	flg_rcv_broadcast      ;setup the received broadcast flag
+                   162 
007F 02 00 58       163 	br	ir_rcv_data_err       ;the result is ok, only initial all,
+                   164 
0082                165 ir_rcv_data_ok_self:
0082 F3 01          166 	lda	#1			;barrier, will change director
0084 FD 09          167 	sta	flg_rcv_barrier
0086 02 00 58       168 	br	ir_rcv_data_err       ;the result is ok, only initial all,
+                   169 ;ir_rcv_error:	
+                   170 ;	lda	#0
+                   171 ;	sta	cnt_ir_rcv
+                   172 ;	sta	status_ir_rcv
+                   173 ;	br	INT2_isr_end
0089                174 ir_rcv_lead:
0089 F1 00          175 	lda	cnt_ir_rcv
+                   176 ;//考虑到要滤除毛刺,最小判断去掉?
+                   177 ;	cmpe	#cnt_ir_lead_min  	;cnt_ir_rcv>=cnt_ir_lead_min,c=1 ok
+                   178 ;	brnc	INT2_isr_end		;c=0,too small,error,jump and exit
008B A7 1D          179 	cmpe	#cnt_ir_lead_max	;cnt_ir_rcv>=cnt_ir_lead_max,c=1 jump
008D 04 00 58       180 	brc	ir_rcv_data_err		;too big,error and exit,the status will be cleared in timer1_isr
0090 A7 16          181 	cmpe	#cnt_ir_lead_min        ;c/=1,is too small,error.c=1 is ok,
0092 05 00 58       182 	brnc	ir_rcv_data_err
0095 F3 02          183 	lda	#2
0097 FD 03          184 	sta	status_ir_rcv           ;lead ok,ready to receive data
0099 F3 00          185 	lda	#0
009B FD 04          186 	sta	ir_rcv_data		;clear receive data registor
009D FD 00          187 	sta	cnt_ir_rcv              ;clear ir receive counter,it will increase in timer1_isr 
009F 02 00 AD       188 	br	INT2_isr_end
00A2                189 ir_rcv_first:
00A2 F3 01          190 	lda	#1            ;the first entry INT,
00A4 FD 03          191 	sta	status_ir_rcv
00A6 F3 00          192 	lda	#0
00A8 FD 00          193 	sta	cnt_ir_rcv
00AA 02 00 AD       194 	br	INT2_isr_end
00AD                195 INT2_isr_end:
+                   196 ;	lda	#10000000b		;draw up the INT2 port
+                   197 ;	ora	r_prtd
+                   198 ;	sta	r_prtd  
+                   199 	
00AD F1 02          200 	lda	temp_dp_3
00AF FC 21          201 	sta	r_dp
00B1 F1 01          202 	lda	temp_op1_3
00B3 FC 22          203 	sta	r_op1
00B5 F1 00          204 	lda	temp_a_3
00B7 25             205 	reti			;/*04-06-30/
+
+Symbol Table
+
+  2 INT2_isr                           0000 GR
+  2 INT2_isr_end                       00AD R
+    cheese_broadcast_data           =  005A 
+    cheese_touched_data             =  00E1 
+    cnt_broadcast_tmr                  **** GX
+    cnt_ir_data0_max                =  000C 
+    cnt_ir_data_max                 =  0013 
+    cnt_ir_data_min                 =  0004 
+    cnt_ir_lead_max                 =  001D 
+    cnt_ir_lead_min                 =  0016 
+    cnt_ir_rcv                         **** GX
+  1 flg_rcv_barrier                    0009 GR
+  1 flg_rcv_broadcast                  0005 GR
+  1 flg_rcv_touched                    0008 GR
+  1 ir_rcv_data                        0004 GR
+  2 ir_rcv_data_err                    0058 R
+  2 ir_rcv_data_ok                     003C R
+  2 ir_rcv_data_ok_bc                  0075 R
+  2 ir_rcv_data_ok_self                0082 R
+  2 ir_rcv_data_ok_touched             0063 R
+  2 ir_rcv_first                       00A2 R
+  2 ir_rcv_lead                        0089 R
+    mouse_self_data                 =  000F 
+  1 status_ir_rcv                      0003 GR
+    status_ir_transmit                 **** GX
+  1 temp_a_3                           0000 GR
+  1 temp_count                         0006 GR
+  1 temp_dp_3                          0002 GR
+  1 temp_op1_3                         0001 GR
+
+
+Area Table
+
+   0 .                                  size    0   flags 0
+   1 INT1_var                           size    A   flags 2
+   2 INT2_isr                           size   B8   flags 1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -