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

📄 can.s

📁 工业开关量检测模块的原代码,带断线检测功能
💻 S
📖 第 1 页 / 共 3 页
字号:
;         CANIDM1 = 0;            	//clear mask
	sts 247,R2
	.dbline 93
;         CANIDM2 = 0;
	sts 246,R2
	.dbline 94
;         CANIDM3 = 0;
	sts 245,R2
	.dbline 95
;         CANIDM4 = 0;
	sts 244,R2
	.dbline 96
;         for (j=0; j<8; j++)
	clr R22
	xjmp L28
L25:
	.dbline 97
	clr R2
	sts 250,R2
L26:
	.dbline 96
	inc R22
L28:
	.dbline 96
	cpi R22,8
	brlo L25
	.dbline 99
	lds R24,_Pass_Flag
	subi R24,255    ; addi 1
	sts _Pass_Flag,R24
	.dbline 100
L22:
	.dbline 83
	inc R20
L24:
	.dbline 83
	cpi R20,15
	brlo L21
	.dbline 101
;             CANMSG = 0;         //clear data
; 			
; 	     Pass_Flag = Pass_Flag + 1;		
;     }
; 	  if(Pass_Flag!=0x0f)
	lds R24,_Pass_Flag
	cpi R24,15
	breq L29
	.dbline 102
; 	    RESET;
	jmp 0x00000
L29:
	.dbline 104
; 		
; 	 WDR();
	wdr
	.dbline 105
; 	CANBT1 = CanBaud[2][0];         
	ldi R30,<_CanBaud+6
	ldi R31,>_CanBaud+6
	lpm R30,Z
	sts 226,R30
	.dbline 106
;     CANBT2 = CanBaud[2][1];
	ldi R30,<_CanBaud+6+1
	ldi R31,>_CanBaud+6+1
	lpm R30,Z
	sts 227,R30
	.dbline 107
;     CANBT3 = CanBaud[2][2];
	ldi R30,<_CanBaud+6+2
	ldi R31,>_CanBaud+6+2
	lpm R30,Z
	sts 228,R30
	.dbline 112
; 	
;     //configure MObi
; 	/******************************************************************/
; 	
; 	 Pass_Flag = 0x00;
	clr R2
	sts _Pass_Flag,R2
	.dbline 113
;    for (i=0; i<3; i++)
	clr R20
	xjmp L39
L36:
	.dbline 114
	.dbline 115
	mov R24,R20
	andi R24,#0x0F
	swap R24
	sts 237,R24
	.dbline 116
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDT
	ldi R25,>_CANIDT
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 243,R2
	.dbline 117
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDT+1
	ldi R25,>_CANIDT+1
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 242,R2
	.dbline 118
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDT+2
	ldi R25,>_CANIDT+2
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 241,R2
	.dbline 119
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDT+3
	ldi R25,>_CANIDT+3
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 240,R2
	.dbline 120
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDM
	ldi R25,>_CANIDM
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 247,R2
	.dbline 121
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDM+1
	ldi R25,>_CANIDM+1
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 246,R2
	.dbline 122
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDM+2
	ldi R25,>_CANIDM+2
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 245,R2
	.dbline 123
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDM+3
	ldi R25,>_CANIDM+3
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 244,R2
	.dbline 125
	ldi R24,24
	sts 239,R24
	.dbline 126
	nop
	.dbline 127
	lds R24,_Pass_Flag
	subi R24,255    ; addi 1
	sts _Pass_Flag,R24
	.dbline 128
L37:
	.dbline 113
	inc R20
L39:
	.dbline 113
	cpi R20,3
	brsh X2
	xjmp L36
X2:
	.dbline 130
;    {
; 	 CANPAGE = (i<<4);                   //MOb 0,1,2设置为发送模式
;      CANIDT1 = CANIDT[i][0];        		//初始化 ID
;      CANIDT2 = CANIDT[i][1];
;      CANIDT3 = CANIDT[i][2];
;      CANIDT4 = CANIDT[i][3];
;      CANIDM1 = CANIDM[i][0];            	//初始化 mask
;      CANIDM2 = CANIDM[i][1];
;      CANIDM3 = CANIDM[i][2];
;      CANIDM4 = CANIDM[i][3];               //0 = ignore bit
;     //CANIDM4 = (1<<IDEMSK);                          //identifier extention mask
;      CANCDMOB = (1<<IDE)|(8<<DLC0);     //reception, ext. ID,rev2.0B
; 	 NOP();
; 	 Pass_Flag = Pass_Flag + 1;		
; 	}
; 	 
; 	  if(Pass_Flag!=0x03)
	lds R24,_Pass_Flag
	cpi R24,3
	breq L46
	.dbline 131
; 	    RESET;
	jmp 0x00000
L46:
	.dbline 133
; 		
; 	 WDR();
	wdr
	.dbline 135
; 	 
; 	  Pass_Flag = 0x00;
	clr R2
	sts _Pass_Flag,R2
	.dbline 136
; 	for(i=3;i<6;i++)                       
	ldi R20,3
	xjmp L51
L48:
	.dbline 137
	.dbline 138
	mov R24,R20
	andi R24,#0x0F
	swap R24
	sts 237,R24
	.dbline 139
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDT
	ldi R25,>_CANIDT
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 243,R2
	.dbline 140
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDT+1
	ldi R25,>_CANIDT+1
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 242,R2
	.dbline 141
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDT+2
	ldi R25,>_CANIDT+2
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 241,R2
	.dbline 142
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDT+3
	ldi R25,>_CANIDT+3
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 240,R2
	.dbline 143
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDM
	ldi R25,>_CANIDM
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 247,R2
	.dbline 144
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDM+1
	ldi R25,>_CANIDM+1
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 246,R2
	.dbline 145
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDM+2
	ldi R25,>_CANIDM+2
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 245,R2
	.dbline 146
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDM+3
	ldi R25,>_CANIDM+3
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 244,R2
	.dbline 147
	ldi R24,152
	sts 239,R24
	.dbline 148
	nop
	.dbline 149
	lds R24,_Pass_Flag
	subi R24,255    ; addi 1
	sts _Pass_Flag,R24
	.dbline 150
L49:
	.dbline 136
	inc R20
L51:
	.dbline 136
	cpi R20,6
	brsh X3
	xjmp L48
X3:
	.dbline 151
; 	{
; 	 CANPAGE = (i<<4);                   //MOb3,4,5设置为接受模式
;      CANIDT1 = CANIDT[i][0];        		//初始化 ID
;      CANIDT2 = CANIDT[i][1];
;      CANIDT3 = CANIDT[i][2];
;      CANIDT4 = CANIDT[i][3];
;      CANIDM1 = CANIDM[i][0];            	//初始化 mask
;      CANIDM2 = CANIDM[i][1];
;      CANIDM3 = CANIDM[i][2];
;      CANIDM4 = CANIDM[i][3];               //0 = ignore bit
;      CANCDMOB = (2<<CONMOB0)|(1<<IDE)|(8<<DLC0);     //reception, ext. ID,rev2.0B
; 	 NOP();
; 	  Pass_Flag = Pass_Flag + 1;		
; 	}
; 	   if(Pass_Flag!=0x03)
	lds R24,_Pass_Flag
	cpi R24,3
	breq L58
	.dbline 152
; 	    RESET;
	jmp 0x00000
L58:
	.dbline 154
; 		
; 	CANGCON = (1<<ENASTB);                //start CAN interface, enable mod
	ldi R24,2
	sts 216,R24
	.dbline 156
; 	
; 	CANGIE = (1<<ENIT)| (1<<ENRX)|(1<<ENTX);    //enable receive interrupt and transmitte interrupt 
	ldi R24,176
	sts 219,R24
	.dbline 157
; 	CANIE1 = 0x00;                  
	clr R2
	sts 223,R2
	.dbline 158
; 	CANIE2 = 0x3f;                              //enable ALL MObs interrupt
	ldi R24,63
	sts 222,R24
	.dbline 160
;     
; 	 WDR();
	wdr
L60:
	.dbline 161
L61:
	.dbline 161
;     while (!(CANGSTA & (1<<ENFG)));         //wait until module ready
	lds R24,217
	andi R24,4
	breq L60
	.dbline 163
; 	
;     CANGCON |= (1<<ENA);      //enable CAN controller
	lds R24,216
	ori R24,2
	sts 216,R24
	.dbline 165
; 	
; 	SEI();
	sei
	.dbline -2
L2:
	adiw R28,4
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r temp2 10 i
	.dbsym r temp1 22 i
	.dbsym l temp 0 l
	.dbsym r j 22 c
	.dbsym r i 20 c
	.dbend
	.dbfunc e can_tx _can_tx fV
	.dbstruct 0 12 _VCI_CAN_OBJ
	.dbfield 0 ID L
	.dbfield 4 Data A[8:8]c
	.dbend
;          index -> R14
;      pass_Flag -> R12
;              i -> R12
;            msg -> R10,R11
	.even
_can_tx::
	xcall push_gset5
	movw R10,R16
	.dbline -1
	.dbline 174
; }
; 
; 
; 
; /*******************************************************************
; CAN transmission via mailbox 1 (polling)
; *******************************************************************/
; void can_tx (VCI_CAN_OBJ msg)
; {
	.dbline 176
;     unsigned char i,index,pass_Flag;
; 	pass_Flag = 0x01;
	clr R12
	inc R12
	.dbline 177
; 	CLI();
	cli
	.dbline 178
; 	index =(unsigned char) (msg.ID%256);   
	ldi R20,0
	ldi R21,1
	ldi R22,0
	ldi R23,0
	movw R30,R10
	ldd R16,z+0
	ldd R17,z+1
	ldd R18,z+2
	ldd R19,z+3
	st -y,R23
	st -y,R22
	st -y,R21
	st -y,R20
	xcall mod32s
	mov R14,R16
	.dbline 179
; 	pass_Flag <<= 1;
	lsl R12
	.dbline 180
; 	msg.ID <<= 3;     
	ldi R24,3
	ldi R25,0
	movw R30,R10
	ldd R16,z+0
	ldd R17,z+1
	ldd R18,z+2
	ldd R19,z+3
	st -y,R24
	xcall lsl32
	movw R30,R10
	std z+0,R16
	std z+1,R17
	std z+2,R18
	std z+3,R19
	.dbline 181
;     CANPAGE = (index<<4);
	mov R24,R14
	andi R24,#0x0F
	swap R24
	sts 237,R24
	.dbline 182
;     CANCDMOB = (1<<IDE) |(8<<DLC0);   
	ldi R24,24
	sts 239,R24
	.dbline 183
; 	pass_Flag <<= 1;                                               
	lsl R12
	.dbline 184
;     CANIDT4 = (unsigned char) (msg.ID&0xF8);
	ldi R20,248
	ldi R21,0
	ldi R22,0
	ldi R23,0
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	sts 240,R2
	.dbline 185
;     CANIDT3 = (unsigned char) (msg.ID>>8);
	ldi R24,8
	ldi R25,0
	st -y,R24
	xcall asr32
	sts 241,R16
	.dbline 186
;     CANIDT2 = (unsigned char) (msg.ID>>16);
	movw R30,R10
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R2,R4
	sts 242,R2
	.dbline 187
; 	pass_Flag <<= 1;
	lsl R12
	.dbline 188
;     CANIDT1 = (unsigned char) (msg.ID>>24);
	ldi R24,24
	ldi R25,0
	ldd R16,z+0
	ldd R17,z+1
	ldd R18,z+2
	ldd R19,z+3
	st -y,R24
	xcall asr32
	sts 243,R16
	.dbline 189
; 	if(pass_Flag!=0x08)
	mov R24,R12
	cpi R24,8
	breq L64
	.dbline 190
; 	  RESET;
	jmp 0x00000
L64:
	.dbline 191
;     for(i=0;i<8;i++)                               
	clr R12
	xjmp L69
L66:
	.dbline 192
	.dbline 194
	movw R24,R10
	adiw R24,4
	mov R30,R12
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 250,R2
	.dbline 195
L67:
	.dbline 191
	inc R12
L69:
	.dbline 191
	mov R24,R12
	cpi R24,8
	brlo L66
	.dbline 196
;       {
; 	   
;        CANMSG = msg.Data[i];
; 	  }        
;     CANCDMOB |= (1<<CONMOB0);           //enable transmission
	lds R24,239
	ori R24,64
	sts 239,R24
	.dbline 197
; 	SEI();

⌨️ 快捷键说明

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