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

📄 can.s

📁 工业开关量检测模块的原代码,带断线检测功能
💻 S
📖 第 1 页 / 共 3 页
字号:
	sei
	.dbline -2
L63:
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r index 14 c
	.dbsym r pass_Flag 12 c
	.dbsym r i 12 c
	.dbsym r msg 10 pS[_VCI_CAN_OBJ]
	.dbend
	.area vector(rom, abs)
	.org 72
	jmp _can_ReceiveData
	.area text(rom, con, rel)
	.dbfile D:\报警系统设计资料\报警系统软件\测量模块基于CAN的系统网程序\开关量CAN网\can.c
	.dbfunc e can_ReceiveData _can_ReceiveData fV
;            msg -> y+0
;       RC_CANSI -> <dead>
;             nn -> <dead>
;       err_temp -> R10
;       sta_temp -> R14
;        RCtemp2 -> y+37
;            RCF -> R10,R11
;          tempp -> R12,R13
;        nb_data -> R14
;              i -> y+36
	.even
_can_ReceiveData::
	st -y,R0
	st -y,R1
	st -y,R2
	st -y,R3
	st -y,R4
	st -y,R5
	st -y,R6
	st -y,R7
	st -y,R16
	st -y,R17
	st -y,R18
	st -y,R19
	st -y,R24
	st -y,R25
	st -y,R30
	st -y,R31
	in R0,0x3f
	st -y,R0
	xcall push_gset5
	sbiw R28,39
	.dbline -1
	.dbline 203
; }
; 
; 
; #pragma interrupt_handler can_ReceiveData:19
; void can_ReceiveData (void)             //receive interrupt 
; {
	.dbline 209
; 	unsigned char nb_data;
; 	unsigned char i,nn,err_temp,sta_temp;
; 	unsigned int RC_CANSI,RCtemp2,tempp,RCF;
; 	VCI_CAN_OBJ msg[3];
; 	
; 	WDR();
	wdr
	.dbline 210
;     CANGIE &= ~((1<<ENRX)|(1<<ENTX));                  //关接收中断
	lds R24,219
	andi R24,207
	sts 219,R24
	.dbline 211
; 	RCtemp2=CANSIT2;                       //读取中断信息
	lds R2,224
	clr R3
	std y+38,R3
	std y+37,R2
	.dbline 212
; 	err_temp = CANTEC;                     //读取发送错误计数器
	lds R10,234
	.dbline 214
; 	
; 	if(err_temp>96)                       
	ldi R24,96
	cp R24,R10
	brsh L71
	.dbline 215
; 	RESET;
	jmp 0x00000
L71:
	.dbline 217
; 	
; 	err_temp = CANREC;                   //读取接收错误计数器
	lds R10,235
	.dbline 218
; 	if(err_temp>128)
	ldi R24,128
	cp R24,R10
	brsh L73
	.dbline 219
; 	RESET;
	jmp 0x00000
L73:
	.dbline 221
; 	
; 	if(RCtemp2&(0x07))
	ldd R24,y+37
	ldd R25,y+38
	andi R24,7
	andi R25,0
	cpi R24,0
	cpc R24,R25
	breq L75
X4:
	.dbline 222
; 	{
	.dbline 223
; 	for(i=0;i<3;i++)                    //查询前三个邮箱中断状态
	clr R0
	std y+36,R0
	xjmp L80
L77:
	.dbline 224
; 	{
	.dbline 225
; 	  tempp=(1<<i);
	ldd R18,y+36
	clr R19
	ldi R16,1
	ldi R17,0
	xcall lsl16
	movw R12,R16
	.dbline 226
; 	  RCF=(RCtemp2&tempp);
	ldd R10,y+37
	ldd R11,y+38
	and R10,R16
	and R11,R17
	.dbline 227
; 	   if(RCF!=0)
	tst R10
	brne X5
	tst R11
	breq L81
X5:
	.dbline 228
; 	    {  
	.dbline 229
; 		 CANPAGE = i<<4;
	ldd R24,y+36
	andi R24,#0x0F
	swap R24
	sts 237,R24
	.dbline 230
; 		 sta_temp = CANSTMOB;
	lds R14,238
	.dbline 231
; 		 CANSTMOB &= ~(1<<TXOK);
	lds R24,238
	andi R24,191
	sts 238,R24
	.dbline 232
; 		 CANCDMOB = 0x18; 
	ldi R24,24
	sts 239,R24
	.dbline 233
; 		 if(sta_temp&0x40)             //是发送完成中断
	mov R24,R14
	andi R24,64
	breq L83
	.dbline 234
; 		 {
	.dbline 235
; 		  send_count = 0;              //清发送计数器
	clr R2
	sts _send_count,R2
	.dbline 236
; 		     if(LED)
	.dbline 238
; 			 
; 	           PORTB |=  0x40;
	sbi 0x5,6
	xjmp L86
L85:
	.dbline 241
; 		      else 
; 			  
; 		       PORTB &=  0xbf;
	in R24,0x5
	andi R24,191
	out 0x5,R24
L86:
	.dbline 243
; 		   
; 		    WDR();
	wdr
	.dbline 244
; 		 }
L83:
	.dbline 245
; 		}
L81:
	.dbline 246
L78:
	.dbline 223
	ldd R0,y+36
	inc R0
	std y+36,R0
L80:
	.dbline 223
	ldd R24,y+36
	cpi R24,3
	brlo L77
	.dbline 247
; 	}
; 	}
	xjmp L76
L75:
	.dbline 248
; 	else if(RCtemp2&(0x38))
	ldd R24,y+37
	ldd R25,y+38
	andi R24,56
	andi R25,0
	cpi R24,0
	cpc R24,R25
	brne X8
	xjmp L87
X8:
X6:
	.dbline 249
; 	{
	.dbline 250
;     for(i=3;i<6;i++)                       //判断哪个邮箱产生接收中断
	ldi R24,3
	std y+36,R24
	xjmp L92
L89:
	.dbline 251
; 	 {
	.dbline 252
; 	  tempp=(1<<i);
	ldd R18,y+36
	clr R19
	ldi R16,1
	ldi R17,0
	xcall lsl16
	movw R12,R16
	.dbline 253
; 	  RCF=(RCtemp2&tempp);
	ldd R10,y+37
	ldd R11,y+38
	and R10,R16
	and R11,R17
	.dbline 254
; 	  if(RCF!=0)
	tst R10
	brne X7
	tst R11
	brne X9
	xjmp L93
X9:
X7:
	.dbline 255
; 	    {  
	.dbline 256
; 		    if(LED)
	.dbline 257
;              PORTB |= 0X80;
	sbi 0x5,7
	xjmp L96
L95:
	.dbline 259
; 			else
; 		      PORTB &= 0X7f;
	in R24,0x5
	andi R24,127
	out 0x5,R24
L96:
	.dbline 260
; 		  CANPAGE = i<<4;
	ldd R24,y+36
	andi R24,#0x0F
	swap R24
	sts 237,R24
	.dbline 261
; 		   WDR();
	wdr
	.dbline 262
; 		  for (nb_data = 0; nb_data <8; nb_data++)  
	clr R14
	xjmp L100
L97:
	.dbline 263
	.dbline 264
	ldi R24,12
	ldd R0,y+36
	mul R24,R0
	movw R2,R0
	ldi R24,<_rece_data-36+4
	ldi R25,>_rece_data-36+4
	add R2,R24
	adc R3,R25
	mov R30,R14
	clr R31
	add R30,R2
	adc R31,R3
	lds R2,250
	std z+0,R2
	.dbline 265
L98:
	.dbline 262
	inc R14
L100:
	.dbline 262
	mov R24,R14
	cpi R24,8
	brlo L97
	.dbline 266
; 	      {
; 	        rece_data[i-3].Data[nb_data]=CANMSG;
; 	       }
; 	   rece_data[i-3].ID = 0;
	ldi R24,12
	ldd R0,y+36
	mul R24,R0
	movw R30,R0
	ldi R24,<_rece_data-36
	ldi R25,>_rece_data-36
	add R30,R24
	adc R31,R25
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	.dbline 267
;        rece_data[i-3].ID |= ((unsigned long) CANIDT1<<24);    //get identifier
	ldi R24,12
	ldd R0,y+36
	mul R24,R0
	movw R2,R0
	ldi R24,<_rece_data-36
	ldi R25,>_rece_data-36
	add R2,R24
	adc R3,R25
	ldi R24,24
	ldi R25,0
	lds R16,243
	clr R17
	clr R18
	clr R19
	st -y,R24
	xcall lsl32
	movw R30,R2
	ldd R4,z+0
	ldd R5,z+1
	ldd R6,z+2
	ldd R7,z+3
	or R4,R16
	or R5,R17
	or R6,R18
	or R7,R19
	std z+0,R4
	std z+1,R5
	std z+2,R6
	std z+3,R7
	.dbline 268
;        rece_data[i-3].ID |= ((unsigned long) CANIDT2<<16);
	ldi R24,12
	ldd R0,y+36
	mul R24,R0
	movw R2,R0
	ldi R24,<_rece_data-36
	ldi R25,>_rece_data-36
	add R2,R24
	adc R3,R25
	lds R4,242
	clr R5
	clr R6
	clr R7
	movw R6,R4
	clr R4
	clr R5
	movw R30,R2
	ldd R20,z+0
	ldd R21,z+1
	ldd R22,z+2
	ldd R23,z+3
	or R20,R4
	or R21,R5
	or R22,R6
	or R23,R7
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	.dbline 269
;        rece_data[i-3].ID |= ((unsigned long) CANIDT3<<8);
	ldi R24,12
	ldd R0,y+36
	mul R24,R0
	movw R2,R0
	ldi R24,<_rece_data-36
	ldi R25,>_rece_data-36
	add R2,R24
	adc R3,R25
	ldi R24,8
	ldi R25,0
	lds R16,241
	clr R17
	clr R18
	clr R19
	st -y,R24
	xcall lsl32
	movw R30,R2
	ldd R4,z+0
	ldd R5,z+1
	ldd R6,z+2
	ldd R7,z+3
	or R4,R16
	or R5,R17
	or R6,R18
	or R7,R19
	std z+0,R4
	std z+1,R5
	std z+2,R6
	std z+3,R7
	.dbline 270
;        rece_data[i-3].ID |= (CANIDT4&0xF8);
	ldi R24,12
	ldd R0,y+36
	mul R24,R0
	movw R2,R0
	ldi R24,<_rece_data-36
	ldi R25,>_rece_data-36
	add R2,R24
	adc R3,R25
	lds R24,240
	clr R25
	andi R24,248
	andi R25,0
	movw R4,R24
	clr R6
	sbrc R5,7
	com R6
	clr R7
	sbrc R6,7
	com R7
	movw R30,R2
	ldd R20,z+0
	ldd R21,z+1
	ldd R22,z+2
	ldd R23,z+3
	or R20,R4
	or R21,R5
	or R22,R6
	or R23,R7
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	.dbline 271
;        rece_data[i-3].ID >>= 3;
	ldi R24,12
	ldd R0,y+36
	mul R24,R0
	movw R2,R0
	ldi R24,<_rece_data-36
	ldi R25,>_rece_data-36
	add R2,R24
	adc R3,R25
	ldi R24,3
	ldi R25,0
	movw R30,R2
	ldd R16,z+0
	ldd R17,z+1
	ldd R18,z+2
	ldd R19,z+3
	st -y,R24
	xcall asr32
	movw R30,R2
	std z+0,R16
	std z+1,R17
	std z+2,R18
	std z+3,R19
	.dbline 273
; 	   
; 	    CANSTMOB &= ~((1<<RXOK)|(1<<TXOK));
	lds R24,238
	andi R24,159
	sts 238,R24
	.dbline 274
; 		CANCDMOB = 0x98;                      //接收使能 
	ldi R24,152
	sts 239,R24
	.dbline 275
; 		 }
L93:
	.dbline 276
L90:
	.dbline 250
	ldd R0,y+36
	inc R0
	std y+36,R0
L92:
	.dbline 250
	ldd R24,y+36
	cpi R24,6
	brsh X10
	xjmp L89
X10:
	.dbline 277
; 	   }
; 	 }
L87:
L76:
	.dbline 279
; 		
; 		CANGIE |= (1<<ENRX);                   //开中断 
	lds R24,219
	ori R24,32
	sts 219,R24
	.dbline 280
; 		CANGIE |= (1<<ENTX);      
	lds R24,219
	ori R24,16
	sts 219,R24
	.dbline 281
; 		 WDR();
	wdr
	.dbline -2
L70:
	adiw R28,39
	xcall pop_gset5
	ld R0,y+
	out 0x3f,R0
	ld R31,y+
	ld R30,y+
	ld R25,y+
	ld R24,y+
	ld R19,y+
	ld R18,y+
	ld R17,y+
	ld R16,y+
	ld R7,y+
	ld R6,y+
	ld R5,y+
	ld R4,y+
	ld R3,y+
	ld R2,y+
	ld R1,y+
	ld R0,y+
	.dbline 0 ; func end
	reti
	.dbsym l msg 0 A[36:3]S[_VCI_CAN_OBJ]
	.dbsym l RC_CANSI 1 i
	.dbsym l nn 1 c
	.dbsym r err_temp 10 c
	.dbsym r sta_temp 14 c
	.dbsym l RCtemp2 37 i
	.dbsym r RCF 10 i
	.dbsym r tempp 12 i
	.dbsym r nb_data 14 c
	.dbsym l i 36 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile D:\报警系统设计资料\报警系统软件\测量模块基于CAN的系统网程序\开关量CAN网\can.c
_send_count::
	.blkb 1
	.dbsym e send_count _send_count c
_counterTemp::
	.blkb 1
	.dbsym e counterTemp _counterTemp c
_canbaud::
	.blkb 1
	.dbsym e canbaud _canbaud c

⌨️ 快捷键说明

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