?? can.s
字號:
.dbline 88
L18:
.dbline 73
inc R20
L20:
.dbline 73
cpi R20,15
brlo L17
.dbline 96
; CANMSG = 0; //clear data
; }
;
; //bit timing -> datasheet page 260 (check table) 250Kbps
; //CANBT1 = 0x02; //16Mhz,1Mbps
; //CANBT2 = 0x04;
; //CANBT3 = 0x13;
;
; //canbaud= EEPROM_read(0x0020);
; CANBT1 = CanBaud[2][0];
ldi R30,<_CanBaud+6
ldi R31,>_CanBaud+6
lpm R30,Z
sts 226,R30
.dbline 97
; CANBT2 = CanBaud[2][1];
ldi R30,<_CanBaud+6+1
ldi R31,>_CanBaud+6+1
lpm R30,Z
sts 227,R30
.dbline 98
; CANBT3 = CanBaud[2][2];
ldi R30,<_CanBaud+6+2
ldi R31,>_CanBaud+6+2
lpm R30,Z
sts 228,R30
.dbline 102
;
; //configure MObi
; /******************************************************************/
; for (i=0; i<15; i++)
clr R20
xjmp L33
L30:
.dbline 103
.dbline 104
mov R24,R20
andi R24,#0x0F
swap R24
sts 237,R24
.dbline 105
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 106
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 107
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 108
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 109
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 110
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 111
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 112
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 114
ldi R24,144
sts 239,R24
.dbline 115
nop
.dbline 116
L31:
.dbline 102
inc R20
L33:
.dbline 102
cpi R20,15
brsh X2
xjmp L30
X2:
.dbline 119
; {
; CANPAGE = (i<<4); //MOb number 0
; CANIDT1 = CANIDT[i][0]; //clear ID
; CANIDT2 = CANIDT[i][1];
; CANIDT3 = CANIDT[i][2];
; CANIDT4 = CANIDT[i][3];
; CANIDM1 = CANIDM[i][0]; //clear mask
; CANIDM2 = CANIDM[i][1];
; CANIDM3 = CANIDM[i][2];
; CANIDM4 = CANIDM[i][3]; //0 = ignore bit
; //CANIDM4 = (1<<IDEMSK); //identifier extention mask
; CANCDMOB = (2<<CONMOB) | (1<<IDE); //reception, ext. ID,rev2.0B
; NOP();
; }
;
; //CANHPMOB = (2<<HPMOB);
; CANGCON = (1<<ENASTB); //start CAN interface, enable mode
ldi R24,2
sts 216,R24
.dbline 124
; /***********************************************************************/
; //interrupts
; //CANGIE = (1<<ENIT) | (1<<ENRX); //enable receive interrupt
;
; CANGIE = (1<<ENIT) | (1<<ENTX)| (1<<ENRX); //enable receive interrupt and transmitte interrupt
ldi R24,176
sts 219,R24
.dbline 126
; ///////////////////////////////////////////////////////////////////////
; CANIE1 = 0xff;
ldi R24,255
sts 223,R24
.dbline 127
; CANIE2 = 0x7f; //enable ALL MObs interrupt
ldi R24,127
sts 222,R24
.dbline 128
; CANSIT1 = 0; //clear MOb status interrupt
clr R2
sts 225,R2
.dbline 129
; CANSIT2 = 0;
sts 224,R2
.dbline 132
;
; /////////////////////////// Enable Mob0 transmit/////////////////////
; CLI();
cli
.dbline 133
; CANPAGE = (1<<4);
ldi R24,16
sts 237,R24
.dbline 134
; CANCDMOB |= (1<<CONMOB0);
lds R24,239
ori R24,64
sts 239,R24
L40:
.dbline 137
L41:
.dbline 137
; /////////////////////////////////////////////////////////////////////
;
; while (!(CANGSTA & (1<<ENFG))); //wait until module ready
lds R24,217
andi R24,4
breq L40
.dbline 139
;
; CANGCON |= (1<<ENA); //enable CAN controller
lds R24,216
ori R24,2
sts 216,R24
.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
; i -> R10
; msg -> R12,R13
.even
_can_tx::
xcall push_gset4
movw R12,R16
.dbline -1
.dbline 146
; }
;
; /*******************************************************************
; CAN transmission via mailbox 1 (polling)
; *******************************************************************/
; void can_tx (VCI_CAN_OBJ msg)
; {
.dbline 149
; unsigned char i;
; //enable MOb1, auto increment index, start with index = 0
; CANPAGE = (1<<4);
ldi R24,16
sts 237,R24
.dbline 151
;
; CANCDMOB = (1<<IDE) | (8<<DLC0); //set IDE bit rev2.0B, data length = 8
ldi R24,24
sts 239,R24
.dbline 154
;
;
; msg.ID <<= 3; //write 29 Bit identifier
ldi R24,3
ldi R25,0
movw R30,R12
ldd R16,z+0
ldd R17,z+1
ldd R18,z+2
ldd R19,z+3
st -y,R24
xcall lsl32
movw R30,R12
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 155
; 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 156
; CANIDT3 = (unsigned char) (msg.ID>>8);
ldi R24,8
ldi R25,0
st -y,R24
xcall asr32
sts 241,R16
.dbline 157
; CANIDT2 = (unsigned char) (msg.ID>>16);
movw R30,R12
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R2,R4
sts 242,R2
.dbline 158
; 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 160
;
; for(i=0;i<8;i++)
clr R10
xjmp L47
L44:
.dbline 161
.dbline 163
movw R24,R12
adiw R24,4
mov R30,R10
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
sts 250,R2
.dbline 164
L45:
.dbline 160
inc R10
L47:
.dbline 160
mov R24,R10
cpi R24,8
brlo L44
.dbline 167
; {
;
; CANMSG = msg.Data[i];
; }
; // for (i=0; i<8; i++) //put data in mailbox 6
;
; CANCDMOB |= (1<<CONMOB0); //enable transmission
lds R24,239
ori R24,64
sts 239,R24
.dbline -2
L43:
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r i 10 c
.dbsym r msg 12 pS[_VCI_CAN_OBJ]
.dbend
.area data(ram, con, rel)
.dbfile F:\測量模塊\16MCan\can.c
_CAN_tx_OverFlow::
.blkb 2
.word 60000
.area data(ram, con, rel)
.dbfile F:\測量模塊\16MCan\can.c
.dbsym e CAN_tx_OverFlow _CAN_tx_OverFlow i
.area text(rom, con, rel)
.dbfile F:\測量模塊\16MCan\can.c
.dbfunc e can_tx_buff _can_tx_buff fV
; tx_msg -> R20,R21
.even
_can_tx_buff::
xcall push_gset1
movw R20,R16
sbiw R28,12
.dbline -1
.dbline 181
;
; //while (!(CANSTMOB & (1<<TXOK))); //wait until complete
; //CANSTMOB &= ~(1<<TXOK); //reset flag
; }
;
;
; #define can_TX_BUFFER_SIZE 8
; VCI_CAN_OBJ tx_msg_buff[can_TX_BUFFER_SIZE];
; Uchar can_sendingP;
; Uchar can_willsendP;
; Uchar can_tx_count;
; Uint CAN_tx_OverFlow= 60000;
; void can_tx_buff(VCI_CAN_OBJ tx_msg)
; {
.dbline 182
; CAN_tx_OverFlow = 60000;
ldi R24,60000
ldi R25,234
sts _CAN_tx_OverFlow+1,R25
sts _CAN_tx_OverFlow,R24
xjmp L50
L49:
.dbline 184
; while (can_tx_count == can_TX_BUFFER_SIZE)
; {
.dbline 185
; CAN_tx_OverFlow--;
lds R24,_CAN_tx_OverFlow
lds R25,_CAN_tx_OverFlow+1
sbiw R24,1
sts _CAN_tx_OverFlow+1,R25
sts _CAN_tx_OverFlow,R24
.dbline 186
; if(CAN_tx_OverFlow<=50)
ldi R24,50
ldi R25,0
lds R2,_CAN_tx_OverFlow
lds R3,_CAN_tx_OverFlow+1
cp R24,R2
cpc R25,R3
brlo L52
.dbline 187
; {
.dbline 188
; can_tx_count = 0;
clr R2
sts _can_tx_count,R2
.dbline 189
; can_sendingP = can_willsendP;
lds R2,_can_willsendP
sts _can_sendingP,R2
.dbline 190
; CANSTMOB &= ~(1<<TXOK);
lds R24,238
andi R24,191
sts 238,R24
.dbline 191
; CAN_tx_OverFlow = 60000;
ldi R24,60000
ldi R25,234
sts _CAN_tx_OverFlow+1,R25
sts _CAN_tx_OverFlow,R24
.dbline 192
; }
L52:
.dbline 193
L50:
.dbline 183
lds R24,_can_tx_count
cpi R24,8
breq L49
.dbline 194
; }
; if(can_tx_count || (CANGSTA & (1<<TXBSY)))
tst R24
brne L56
lds R24,217
andi R24,16
breq L54
L56:
.dbline 195
; {
.dbline 196
; tx_msg_buff[can_willsendP] = tx_msg;
lds R2,_can_willsendP
ldi R24,12
mul R24,R2
movw R2,R0
ldi R24,<_tx_msg_buff
ldi R25,>_tx_msg_buff
add R2,R24
adc R3,R25
ldi R16,12
ldi R17,0
st -y,R3
st -y,R2
st -y,R21
st -y,R20
xcall asgnblk
.dbline 197
; if(++can_willsendP == can_TX_BUFFER_SIZE)
lds R24,_can_willsendP
subi R24,255 ; addi 1
mov R2,R24
sts _can_willsendP,R2
cpi R24,8
brne L57
.dbline 198
; can_willsendP = 0;
clr R2
sts _can_willsendP,R2
L57:
.dbline 199
; ++can_tx_count;
lds R24,_can_tx_count
subi R24,255 ; addi 1
sts _can_tx_count,R24
.dbline 200
; }
xjmp L55
L54:
.dbline 202
; else
; {
.dbline 203
; if(can_willsendP != can_sendingP)
lds R2,_can_sendingP
lds R3,_can_willsendP
cp R3,R2
breq L59
.dbline 204
; {
.dbline 205
; NOP();
nop
.dbline 206
; can_willsendP=0;
clr R2
sts _can_willsendP,R2
.dbline 207
; can_sendingP=0;
sts _can_sendingP,R2
.dbline 208
; }
L59:
.dbline 209
movw R24,R28
ldi R16,12
ldi R17,0
st -y,R25
st -y,R24
st -y,R21
st -y,R20
xcall asgnblk
movw R16,R28
xcall _can_tx
.dbline 210
L55:
.dbline -2
L48:
adiw R28,12
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r tx_msg 20 pS[_VCI_CAN_OBJ]
.dbend
.area vector(rom, abs)
.org 72
jmp _can_ReceiveData
.area text(rom, con, rel)
.dbfile F:\測量模塊\16MCan\can.c
.dbfunc e can_ReceiveData _can_ReceiveData fV
; RCFlag -> <dead>
; RCtemp2 -> R10,R11
; RCtemp1 -> R12,R13
; temp -> y+210
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號