📄 can.s
字号:
; 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 + -