📄 main.lis
字号:
01CA 80930300 sts _RESID+1,R24
01CE .dbline 157
01CE 282E mov R2,R24
01D0 200E add R2,R16
01D2 20920300 sts _RESID+1,R2
01D6 .dbline 158
01D6 00910200 lds R16,_RESID
01DA .dbline 159
01DA 000F lsl R16
01DC 000F lsl R16
01DE 000F lsl R16
01E0 000F lsl R16
01E2 000F lsl R16
01E4 .dbline 160
01E4 200E add R2,R16
01E6 20920300 sts _RESID+1,R2
01EA .dbline 161
01EA 20900200 lds R2,_RESID
01EE 2694 lsr R2
01F0 2694 lsr R2
01F2 2694 lsr R2
01F4 20920200 sts _RESID,R2
01F8 .dbline 162
01F8 L53:
01F8 .dbline -2
01F8 L50:
01F8 .dbline 0 ; func end
01F8 0895 ret
01FA .dbsym r k 16 c
01FA .dbend
01FA .dbfunc e usart_init _usart_init fV
.even
01FA _usart_init::
01FA 0E940000 xcall push_gset2
01FE .dbline -1
01FE .dbline 167
01FE ; else
01FE ; {//扩展帧处理方法,RESID[3]、RESID[4]不变
01FE ; k=k>>5;
01FE ; k=k<<2;
01FE ; RESID[1]=RESID[1]&0x03;
01FE ; RESID[1]=RESID[1]+k;
01FE ; k=RESID[0];
01FE ; k=k<<5;
01FE ; RESID[1]=RESID[1]+k;
01FE ; RESID[0]=RESID[0]>>3;//将RXB0SIDH,RXB0SIDL转化
01FE ; }
01FE ; }
01FE ; //##############################################################################
01FE ; //##############################USART初始化程序###########################//
01FE ; void usart_init(void)
01FE ; {
01FE .dbline 168
01FE ; UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收
01FE 88E1 ldi R24,24
0200 8AB9 out 0xa,R24
0202 .dbline 169
0202 ; UBRRL=(fosc/16/(bps+1))%256;
0202 80910100 lds R24,_bps
0206 90910200 lds R25,_bps+1
020A 0196 adiw R24,1
020C 1C01 movw R2,R24
020E 4424 clr R4
0210 5524 clr R5
0212 40E0 ldi R20,0
0214 58E0 ldi R21,8
0216 67E0 ldi R22,7
0218 70E0 ldi R23,0
021A 5A92 st -y,R5
021C 4A92 st -y,R4
021E 3A92 st -y,R3
0220 2A92 st -y,R2
0222 8A01 movw R16,R20
0224 9B01 movw R18,R22
0226 0E940000 xcall div32s
022A 40E0 ldi R20,0
022C 51E0 ldi R21,1
022E 60E0 ldi R22,0
0230 70E0 ldi R23,0
0232 7A93 st -y,R23
0234 6A93 st -y,R22
0236 5A93 st -y,R21
0238 4A93 st -y,R20
023A 0E940000 xcall mod32s
023E 09B9 out 0x9,R16
0240 .dbline 170
0240 ; UBRRH=(fosc/16/(bps+1))/256;
0240 80910100 lds R24,_bps
0244 90910200 lds R25,_bps+1
0248 0196 adiw R24,1
024A 1C01 movw R2,R24
024C 4424 clr R4
024E 5524 clr R5
0250 40E0 ldi R20,0
0252 58E0 ldi R21,8
0254 67E0 ldi R22,7
0256 70E0 ldi R23,0
0258 5A92 st -y,R5
025A 4A92 st -y,R4
025C 3A92 st -y,R3
025E 2A92 st -y,R2
0260 8A01 movw R16,R20
0262 9B01 movw R18,R22
0264 0E940000 xcall div32s
0268 40E0 ldi R20,0
026A 51E0 ldi R21,1
026C 60E0 ldi R22,0
026E 70E0 ldi R23,0
0270 7A93 st -y,R23
0272 6A93 st -y,R22
0274 5A93 st -y,R21
0276 4A93 st -y,R20
0278 0E940000 xcall div32s
027C 00BD out 0x20,R16
027E .dbline 171
027E ; UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
027E 86E8 ldi R24,134
0280 80BD out 0x20,R24
0282 .dbline 172
0282 ; bytetime=215983/bps;//215983=1000000*20/92.6,92.6=1024/11.0592,定时器分频为1024
0282 20900100 lds R2,_bps
0286 30900200 lds R3,_bps+1
028A 4424 clr R4
028C 5524 clr R5
028E 4FEA ldi R20,175
0290 5BE4 ldi R21,75
0292 63E0 ldi R22,3
0294 70E0 ldi R23,0
0296 5A92 st -y,R5
0298 4A92 st -y,R4
029A 3A92 st -y,R3
029C 2A92 st -y,R2
029E 8A01 movw R16,R20
02A0 9B01 movw R18,R22
02A2 0E940000 xcall div32s
02A6 00930100 sts _bytetime,R16
02AA .dbline 173
02AA ; bytetime=255-bytetime;//计算不同的波特率所要延时的初值,要附值给TCNT0,实现透明转换中用到
02AA 202E mov R2,R16
02AC 3324 clr R3
02AE 8FEF ldi R24,255
02B0 90E0 ldi R25,0
02B2 8219 sub R24,R2
02B4 9309 sbc R25,R3
02B6 80930100 sts _bytetime,R24
02BA .dbline -2
02BA L64:
02BA 0E940000 xcall pop_gset2
02BE .dbline 0 ; func end
02BE 0895 ret
02C0 .dbend
02C0 .dbfunc e putchar _putchar fV
02C0 ; c -> R16
.even
02C0 _putchar::
02C0 .dbline -1
02C0 .dbline 178
02C0 L66:
02C0 .dbline 178
02C0 L67:
02C0 .dbline 178
02C0 ; }
02C0 ;
02C0 ; //##########################串行通信##########################//
02C0 ; void putchar(uchar c)
02C0 ; {while(!(UCSRA&(1<<UDRE)));//判断上次发送有没有完成
02C0 5D9B sbis 0xb,5
02C2 FECF rjmp L66
02C4 .dbline 179
02C4 ; UDR=c;}
02C4 0CB9 out 0xc,R16
02C6 .dbline -2
02C6 L65:
02C6 .dbline 0 ; func end
02C6 0895 ret
02C8 .dbsym r c 16 c
02C8 .dbend
02C8 .dbfunc e INT1_17 _INT1_17 fV
02C8 ; j -> <dead>
02C8 ; k -> R20
02C8 ; R0 -> R22
02C8 ; i -> R20
.even
02C8 _INT1_17::
02C8 0E940000 xcall push_lset
02CC 0E940000 xcall push_gset2
02D0 .dbline -1
02D0 .dbline 182
02D0 ; //##############################中断服务程序##################################//
02D0 ; void INT1_17(void)
02D0 ; {
02D0 .dbline 183
02D0 ; uchar i,j,k,R0=0x66;
02D0 66E6 ldi R22,102
02D2 .dbline 184
02D2 ; GICR &=0x7f;
02D2 8BB7 in R24,0x3b
02D4 8F77 andi R24,127
02D6 8BBF out 0x3b,R24
02D8 .dbline 185
02D8 ; state=Read_state(0xa0);
02D8 00EA ldi R16,160
02DA BFDE xcall _Read_state
02DC 00930000 sts _state,R16
02E0 .dbline 187
02E0 ; //WriteSPI(0xa0);//读取2515状态指令,状态值附值给state
02E0 ; if((state&0x01)!=0)
02E0 00FF sbrs R16,0
02E2 5FC0 rjmp L70
02E4 .dbline 188
02E4 ; {//判断是不是接收缓冲器0满产生的中断
02E4 .dbline 189
02E4 ; k=Read_Byte(RXB0SIDL);//为了判断是标准帧还是扩展帧
02E4 02E6 ldi R16,98
02E6 CFDE xcall _Read_Byte
02E8 402F mov R20,R16
02EA .dbline 190
02EA ; if((k&0x08)==0)eflag=0;//置标准帧标志
02EA 03FD sbrc R16,3
02EC 04C0 rjmp L72
02EE .dbline 190
02EE 2224 clr R2
02F0 20920300 sts _eflag,R2
02F4 03C0 xjmp L73
02F6 L72:
02F6 .dbline 191
02F6 ; else eflag=1;//置扩展帧标志
02F6 81E0 ldi R24,1
02F8 80930300 sts _eflag,R24
02FC L73:
02FC .dbline 192
02FC ; DLC=Read_Byte(RXB0DLC);
02FC 05E6 ldi R16,101
02FE C3DE xcall _Read_Byte
0300 00931A00 sts _DLC,R16
0304 .dbline 193
0304 ; DLC &=0x0f;
0304 802F mov R24,R16
0306 8F70 andi R24,15
0308 80931A00 sts _DLC,R24
030C .dbline 194
030C ; RESID[0]=Read_Byte(RXB0SIDH);
030C 01E6 ldi R16,97
030E BBDE xcall _Read_Byte
0310 00930200 sts _RESID,R16
0314 .dbline 195
0314 ; RESID[1]=Read_Byte(RXB0SIDL);
0314 02E6 ldi R16,98
0316 B7DE xcall _Read_Byte
0318 00930300 sts _RESID+1,R16
031C .dbline 196
031C ; RESID[2]=Read_Byte(RXB0EID8);
031C 03E6 ldi R16,99
031E B3DE xcall _Read_Byte
0320 00930400 sts _RESID+2,R16
0324 .dbline 197
0324 ; RESID[3]=Read_Byte(RXB0EID0);//先读取所有ID
0324 04E6 ldi R16,100
0326 AFDE xcall _Read_Byte
0328 00930500 sts _RESID+3,R16
032C .dbline 198
032C ; Receive_all_ID_process();//处理RESID
032C 25DF xcall _Receive_all_ID_process
032E .dbline 199
032E 4427 clr R20
0330 0BC0 xjmp L80
0332 L77:
0332 .dbline 199
0332 062F mov R16,R22
0334 A8DE xcall _Read_Byte
0336 80E0 ldi R24,<_Rdate
0338 90E0 ldi R25,>_Rdate
033A E42F mov R30,R20
033C FF27 clr R31
033E E80F add R30,R24
0340 F91F adc R31,R25
0342 0083 std z+0,R16
0344 L78:
0344 .dbline 199
0344 4395 inc R20
0346 6395 inc R22
0348 L80:
0348 .dbline 199
0348 ; for(i=0;i<DLC;i++,R0++)Rdate[i]=Read_Byte(R0);//从2515缓冲区内读取收到的数据部分
0348 20901A00 lds R2,_DLC
034C 4215 cp R20,R2
034E 88F3 brlo L77
0350 .dbline 200
0350 ; if(eflag==0)
0350 20900300 lds R2,_eflag
0354 2220 tst R2
0356 39F4 brne L81
0358 .dbline 201
0358 ; {//如果是标准帧
0358 .dbline 202
0358 ; putchar(RESID[0]);
0358 00910200 lds R16,_RESID
035C B1DF xcall _putchar
035E .dbline 203
035E ; putchar(RESID[1]);//先送标准帧ID号
035E 00910300 lds R16,_RESID+1
0362 AEDF xcall _putchar
0364 .dbline 204
0364 ; }
0364 0CC0 xjmp L82
0366 L81:
0366 .dbline 206
0366 ; else
0366 ; {//如果是扩展帧
0366 .dbline 207
0366 ; putchar(RESID[0]);
0366 00910200 lds R16,_RESID
036A AADF xcall _putchar
036C .dbline 208
036C ; putchar(RESID[1]);
036C 00910300 lds R16,_RESID+1
0370 A7DF xcall _putchar
0372 .dbline 209
0372 ; putchar(RESID[2]);
0372 00910400 lds R16,_RESID+2
0376 A4DF xcall _putchar
0378 .dbline 210
0378 ; putchar(RESID[3]);//先送扩展帧ID号
0378 00910500 lds R16,_RESID+3
037C A1DF xcall _putchar
037E .dbline 211
037E ; }
037E L82:
037E .dbline 212
037E ; putchar(DLC);
037E 00911A00 lds R16,_DLC
0382 9EDF xcall _putchar
0384 .dbline 213
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -