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

📄 main.lis

📁 本软件实现了232到CAN的具体转换的代码,对232和CAN都进行了很好的说明,编程环境是IAR
💻 LIS
📖 第 1 页 / 共 4 页
字号:
 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 + -