📄 main.lis
字号:
0384 4427 clr R20
0386 09C0 xjmp L90
0388 L87:
0388 .dbline 213
0388 80E0 ldi R24,<_Rdate
038A 90E0 ldi R25,>_Rdate
038C E42F mov R30,R20
038E FF27 clr R31
0390 E80F add R30,R24
0392 F91F adc R31,R25
0394 0081 ldd R16,z+0
0396 94DF xcall _putchar
0398 L88:
0398 .dbline 213
0398 4395 inc R20
039A L90:
039A .dbline 213
039A ; for(i=0;i<DLC;i++)putchar(Rdate[i]);//再送接收到的DLC位数
039A 20901A00 lds R2,_DLC
039E 4215 cp R20,R2
03A0 98F3 brlo L87
03A2 .dbline 214
03A2 ; }
03A2 L70:
03A2 .dbline 215
03A2 ; Write_Byte(CANINTF,0x00);//接收完一次必须对中断标志位清0
03A2 2227 clr R18
03A4 0CE2 ldi R16,44
03A6 8CDE xcall _Write_Byte
03A8 .dbline 216
03A8 ; GICR |=0x80;
03A8 8BB7 in R24,0x3b
03AA 8068 ori R24,128
03AC 8BBF out 0x3b,R24
03AE .dbline -2
03AE L69:
03AE 0E940000 xcall pop_gset2
03B2 0E940000 xcall pop_lset
03B6 .dbline 0 ; func end
03B6 1895 reti
03B8 .dbsym l j 1 c
03B8 .dbsym r k 20 c
03B8 .dbsym r R0 22 c
03B8 .dbsym r i 20 c
03B8 .dbend
03B8 .dbfunc e Usart_receive _Usart_receive fV
.even
03B8 _Usart_receive::
03B8 2A92 st -y,R2
03BA 8A93 st -y,R24
03BC 9A93 st -y,R25
03BE EA93 st -y,R30
03C0 FA93 st -y,R31
03C2 2FB6 in R2,0x3f
03C4 2A92 st -y,R2
03C6 .dbline -1
03C6 .dbline 220
03C6 ; }
03C6 ; //####################################
03C6 ; void Usart_receive(void)//定义接收中断服务程序
03C6 ; {Tdate[usart_number]=UDR;
03C6 .dbline 220
03C6 80E0 ldi R24,<_Tdate
03C8 90E0 ldi R25,>_Tdate
03CA E0911800 lds R30,_usart_number
03CE F0911900 lds R31,_usart_number+1
03D2 E80F add R30,R24
03D4 F91F adc R31,R25
03D6 2CB0 in R2,0xc
03D8 2082 std z+0,R2
03DA .dbline 221
03DA ; usart_number++;
03DA 80911800 lds R24,_usart_number
03DE 90911900 lds R25,_usart_number+1
03E2 0196 adiw R24,1
03E4 90931900 sts _usart_number+1,R25
03E8 80931800 sts _usart_number,R24
03EC .dbline 222
03EC ; TIMSK=0x05;//打开T1,T0中断屏蔽
03EC 85E0 ldi R24,5
03EE 89BF out 0x39,R24
03F0 .dbline 223
03F0 ; TCCR0=0x05;//设T0分频数为1024
03F0 83BF out 0x33,R24
03F2 .dbline 224
03F2 ; TCNT0=bytetime;//设T0时间常数,从此值开始计数
03F2 20900100 lds R2,_bytetime
03F6 22BE out 0x32,R2
03F8 .dbline -2
03F8 L91:
03F8 2990 ld R2,y+
03FA 2FBE out 0x3f,R2
03FC F991 ld R31,y+
03FE E991 ld R30,y+
0400 9991 ld R25,y+
0402 8991 ld R24,y+
0404 2990 ld R2,y+
0406 .dbline 0 ; func end
0406 1895 reti
0408 .dbend
0408 .dbfunc e Timer0 _Timer0 fV
.even
0408 _Timer0::
0408 0E940000 xcall push_lset
040C .dbline -1
040C .dbline 228
040C ; }
040C ; //##############定时器中断0,串行数据流控制
040C ; void Timer0(void)
040C ; {TIMSK=0x00;//关T0中断屏蔽
040C .dbline 228
040C 2224 clr R2
040E 29BE out 0x39,R2
0410 .dbline 229
0410 ; TCNT0=0x00;//
0410 22BE out 0x32,R2
0412 .dbline 230
0412 ; TCCR0=0x00;//T0停止计数
0412 23BE out 0x33,R2
0414 .dbline 231
0414 ; if((usart_number>2)&&(usart_number<11))
0414 82E0 ldi R24,2
0416 90E0 ldi R25,0
0418 20901800 lds R2,_usart_number
041C 30901900 lds R3,_usart_number+1
0420 8215 cp R24,R2
0422 9305 cpc R25,R3
0424 E8F4 brsh L93
0426 C101 movw R24,R2
0428 8B30 cpi R24,11
042A E0E0 ldi R30,0
042C 9E07 cpc R25,R30
042E C0F4 brsh L93
0430 .dbline 232
0430 ; {
0430 .dbline 233
0430 ; TID[0]=Tdate[0];TID[1]=Tdate[1];
0430 20900400 lds R2,_Tdate
0434 20920E00 sts _TID,R2
0438 .dbline 233
0438 20900500 lds R2,_Tdate+1
043C 20920F00 sts _TID+1,R2
0440 .dbline 234
0440 ; load_Standard_ID_dates(usart_number-2);//对2515发送缓冲器0和ID寄存器进行数据装载
0440 082F mov R16,R24
0442 0250 subi R16,2
0444 1040 sbci R17,0
0446 57DE xcall _load_Standard_ID_dates
0448 .dbline 235
0448 ; usart_number=0;
0448 2224 clr R2
044A 3324 clr R3
044C 30921900 sts _usart_number+1,R3
0450 20921800 sts _usart_number,R2
0454 .dbline 236
0454 ; Write_Byte(CANCTRL,0x00);//选定工作模式
0454 2227 clr R18
0456 0FE0 ldi R16,15
0458 33DE xcall _Write_Byte
045A .dbline 237
045A ; WriteSPI(CAN_RTS_TXB0);//发送缓冲器0请求发送
045A 01E8 ldi R16,129
045C EFDD xcall _WriteSPI
045E .dbline 238
045E ; }
045E 06C0 xjmp L94
0460 L93:
0460 .dbline 239
0460 2224 clr R2
0462 3324 clr R3
0464 30921900 sts _usart_number+1,R3
0468 20921800 sts _usart_number,R2
046C L94:
046C .dbline -2
046C L92:
046C 0E940000 xcall pop_lset
0470 .dbline 0 ; func end
0470 1895 reti
0472 .dbend
0472 .dbfunc e CAN_Initialize _CAN_Initialize fV
.even
0472 _CAN_Initialize::
0472 .dbline -1
0472 .dbline 243
0472 ; else usart_number=0;
0472 ; }
0472 ; //##############################CAN(2515)初始化程序###########################//
0472 ; void CAN_Initialize(void)
0472 ; {
0472 .dbline 244
0472 ; WriteSPI(CAN_RESET);
0472 00EC ldi R16,192
0474 E3DD xcall _WriteSPI
0476 .dbline 245
0476 ; delay(20);
0476 04E1 ldi R16,20
0478 C3DD xcall _delay
047A .dbline 246
047A ; Write_Byte(CANCTRL,0x80);//CAN工作在配置模式
047A 20E8 ldi R18,128
047C 0FE0 ldi R16,15
047E 20DE xcall _Write_Byte
0480 .dbline 247
0480 ; Write_Byte(CNF1,can_boud);
0480 20910000 lds R18,_can_boud
0484 0AE2 ldi R16,42
0486 1CDE xcall _Write_Byte
0488 .dbline 248
0488 ; Write_Byte(CNF2,0x80 | PHSEG1_3TQ | PRSEG_1TQ);//Set CNF2
0488 20E9 ldi R18,144
048A 09E2 ldi R16,41
048C 19DE xcall _Write_Byte
048E .dbline 249
048E ; Write_Byte(CNF3,PHSEG2_3TQ);
048E 22E0 ldi R18,2
0490 08E2 ldi R16,40
0492 16DE xcall _Write_Byte
0494 .dbline 251
0494 ; //0x80+0x10+0x00,相位缓冲段2由CNF3确定,相位缓冲段1为3TQ,传播段为1TQ
0494 ; Write_Byte(RXB0CTRL,0xf0);//接收类型选择,接收所有报文
0494 20EF ldi R18,240
0496 00E6 ldi R16,96
0498 13DE xcall _Write_Byte
049A .dbline 252
049A ; Write_Byte(CANINTF,0x00);//接收完一次必须对中断标志位清0
049A 2227 clr R18
049C 0CE2 ldi R16,44
049E 10DE xcall _Write_Byte
04A0 .dbline 253
04A0 ; Write_Byte(CANINTE,0x01);//接收缓冲器0满中断使能
04A0 21E0 ldi R18,1
04A2 0BE2 ldi R16,43
04A4 0DDE xcall _Write_Byte
04A6 .dbline 254
04A6 ; Write_Byte(CANCTRL,0x00);//选定正常工作模式
04A6 2227 clr R18
04A8 0FE0 ldi R16,15
04AA 0ADE xcall _Write_Byte
04AC .dbline -2
04AC L97:
04AC .dbline 0 ; func end
04AC 0895 ret
04AE .dbend
04AE .dbfunc e AVR_Initialize _AVR_Initialize fV
.even
04AE _AVR_Initialize::
04AE .dbline -1
04AE .dbline 258
04AE ; }
04AE ; //##############################系统初始化程序################################//
04AE ; void AVR_Initialize(void) //初始化
04AE ; {
04AE .dbline 259
04AE ; DDRB=0xff; //SPI口
04AE 8FEF ldi R24,255
04B0 87BB out 0x17,R24
04B2 .dbline 260
04B2 ; PORTB=0xff;
04B2 88BB out 0x18,R24
04B4 .dbline 261
04B4 ; DDRD=0xf0;//将外部中断引脚设定为输入
04B4 80EF ldi R24,240
04B6 81BB out 0x11,R24
04B8 .dbline 262
04B8 ; PORTD=0x7f;
04B8 8FE7 ldi R24,127
04BA 82BB out 0x12,R24
04BC .dbline 263
04BC ; SPCR=0b01011100;//关中断(SPIE=0),使能SPI(SPE=1),MSB首先发送(DORD=0)
04BC 8CE5 ldi R24,92
04BE 8DB9 out 0xd,R24
04C0 .dbline 268
04C0 ; //选择微机为主机模式(MSTR=1)
04C0 ; //空闲时SCK 为高电平(CPOL=1)
04C0 ; //在SCK 的结束沿采样(CPHA=1)以保证数据稳定
04C0 ; //SPR1=0和SPR0=0,SCK=fosc/4
04C0 ; SPSR |=0x01;//SPI的速度加倍
04C0 709A sbi 0xe,0
04C2 .dbline 269
04C2 ; MCUCR=0x0a;//设置外部中断的中断触发方式为下降沿触发
04C2 8AE0 ldi R24,10
04C4 85BF out 0x35,R24
04C6 .dbline 270
04C6 ; GICR=0xc0;//通用中断控制寄存器设置,打开中断INT0和INT1
04C6 80EC ldi R24,192
04C8 8BBF out 0x3b,R24
04CA .dbline 271
04CA ; SREG=0x80;//开全局中断
04CA 80E8 ldi R24,128
04CC 8FBF out 0x3f,R24
04CE .dbline -2
04CE L98:
04CE .dbline 0 ; func end
04CE 0895 ret
04D0 .dbend
04D0 .dbfunc e main _main fV
.even
04D0 _main::
04D0 .dbline -1
04D0 .dbline 275
04D0 ; }
04D0 ; //##################################主程序####################################//
04D0 ; void main()
04D0 ; {
04D0 .dbline 276
04D0 ; AVR_Initialize(); //I/O口及中断初始化
04D0 EEDF xcall _AVR_Initialize
04D2 .dbline 277
04D2 ; CAN_Initialize();
04D2 CFDF xcall _CAN_Initialize
04D4 .dbline 278
04D4 ; usart_init();
04D4 92DE xcall _usart_init
04D6 .dbline 279
04D6 ; UCSRB |=0x80;//接收中断使能
04D6 579A sbi 0xa,7
04D8 .dbline -2
04D8 L99:
04D8 .dbline 0 ; func end
04D8 0895 ret
04DA .dbend
.area bss(ram, con, rel)
0000 .dbfile F:\小制作\can,usb,以太网学习板\232转CAN学习程序\main.c
0000 _state::
0000 .blkb 1
0001 .dbsym e state _state c
0001 _bytetime::
0001 .blkb 1
0002 .dbsym e bytetime _bytetime c
0002 _RESID::
0002 .blkb 4
0006 .dbsym e RESID _RESID A[4:4]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -