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

📄 can232.lst

📁 本软件实现了232到CAN的具体转换的代码,对232和CAN都进行了很好的说明,编程环境是IAR
💻 LST
📖 第 1 页 / 共 3 页
字号:
    0113 9622      ADIW	R28,2
    0114 9508      RET
(0139)  }
(0140) //##############################################################################
(0141) void Receive_all_ID_process(void)//结合MCP2515数据手册来看
(0142) {uchar k;
(0143)  k=RESID[1];//先判断接收到的是不是标准帧,因为标准帧和扩展帧的ID处理不一样
_Receive_all_ID_process:
  k                    --> R16
    0115 9100007E  LDS	R16,RESID+1
(0144)  if((k&0x08)==0)
    0117 FD03      SBRC	R16,3
    0118 C01B      RJMP	0x0134
(0145)    {//如果是标准处理方法
(0146)     RESID[1]=RESID[1]>>5;
    0119 2E20      MOV	R2,R16
    011A 9426      LSR	R2
    011B 9426      LSR	R2
    011C 9426      LSR	R2
    011D 9426      LSR	R2
    011E 9426      LSR	R2
    011F 9220007E  STS	RESID+1,R2
(0147)     k=RESID[0]&0x1f;//借用k
    0121 9100007D  LDS	R16,RESID
    0123 710F      ANDI	R16,0x1F
(0148) 	k=k<<3;
    0124 0F00      LSL	R16
    0125 0F00      LSL	R16
    0126 0F00      LSL	R16
(0149) 	RESID[1]=RESID[1]+k;
    0127 0E20      ADD	R2,R16
    0128 9220007E  STS	RESID+1,R2
(0150) 	RESID[0]=RESID[0]>>5;
    012A 9020007D  LDS	R2,RESID
    012C 9426      LSR	R2
    012D 9426      LSR	R2
    012E 9426      LSR	R2
    012F 9426      LSR	R2
    0130 9426      LSR	R2
    0131 9220007D  STS	RESID,R2
(0151) 	}
    0133 C021      RJMP	0x0155
(0152)  else
(0153)     {//扩展帧处理方法,RESID[3]、RESID[4]不变
(0154) 	 k=k>>5;
    0134 9506      LSR	R16
    0135 9506      LSR	R16
    0136 9506      LSR	R16
    0137 9506      LSR	R16
    0138 9506      LSR	R16
(0155) 	 k=k<<2;
    0139 0F00      LSL	R16
    013A 0F00      LSL	R16
(0156) 	 RESID[1]=RESID[1]&0x03;
    013B 9180007E  LDS	R24,RESID+1
    013D 7083      ANDI	R24,3
    013E 9380007E  STS	RESID+1,R24
(0157) 	 RESID[1]=RESID[1]+k;
    0140 2E28      MOV	R2,R24
    0141 0E20      ADD	R2,R16
    0142 9220007E  STS	RESID+1,R2
(0158) 	 k=RESID[0];
    0144 9100007D  LDS	R16,RESID
(0159) 	 k=k<<5;
    0146 0F00      LSL	R16
    0147 0F00      LSL	R16
    0148 0F00      LSL	R16
    0149 0F00      LSL	R16
    014A 0F00      LSL	R16
(0160) 	 RESID[1]=RESID[1]+k;
    014B 0E20      ADD	R2,R16
    014C 9220007E  STS	RESID+1,R2
(0161) 	 RESID[0]=RESID[0]>>3;//将RXB0SIDH,RXB0SIDL转化
    014E 9020007D  LDS	R2,RESID
    0150 9426      LSR	R2
    0151 9426      LSR	R2
    0152 9426      LSR	R2
    0153 9220007D  STS	RESID,R2
(0162) 	}		 
    0155 9508      RET
_usart_init:
    0156 940E0346  CALL	push_gset2
(0163) }
(0164) //##############################################################################
(0165) //##############################USART初始化程序###########################//
(0166) void usart_init(void)
(0167) {
(0168)  UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收
    0158 E188      LDI	R24,0x18
    0159 B98A      OUT	0x0A,R24
(0169)  UBRRL=(fosc/16/(bps+1))%256;
    015A 91800061  LDS	R24,bps
    015C 91900062  LDS	R25,bps+1
    015E 9601      ADIW	R24,1
    015F 011C      MOVW	R2,R24
    0160 2444      CLR	R4
    0161 2455      CLR	R5
    0162 E040      LDI	R20,0
    0163 E058      LDI	R21,0x8
    0164 E067      LDI	R22,7
    0165 E070      LDI	R23,0
    0166 925A      ST	R5,-Y
    0167 924A      ST	R4,-Y
    0168 923A      ST	R3,-Y
    0169 922A      ST	R2,-Y
    016A 018A      MOVW	R16,R20
    016B 019B      MOVW	R18,R22
    016C 940E02CC  CALL	div32s
    016E E040      LDI	R20,0
    016F E051      LDI	R21,1
    0170 E060      LDI	R22,0
    0171 E070      LDI	R23,0
    0172 937A      ST	R23,-Y
    0173 936A      ST	R22,-Y
    0174 935A      ST	R21,-Y
    0175 934A      ST	R20,-Y
    0176 940E02CE  CALL	mod32s
    0178 B909      OUT	0x09,R16
(0170)  UBRRH=(fosc/16/(bps+1))/256;
    0179 91800061  LDS	R24,bps
    017B 91900062  LDS	R25,bps+1
    017D 9601      ADIW	R24,1
    017E 011C      MOVW	R2,R24
    017F 2444      CLR	R4
    0180 2455      CLR	R5
    0181 E040      LDI	R20,0
    0182 E058      LDI	R21,0x8
    0183 E067      LDI	R22,7
    0184 E070      LDI	R23,0
    0185 925A      ST	R5,-Y
    0186 924A      ST	R4,-Y
    0187 923A      ST	R3,-Y
    0188 922A      ST	R2,-Y
    0189 018A      MOVW	R16,R20
    018A 019B      MOVW	R18,R22
    018B 940E02CC  CALL	div32s
    018D E040      LDI	R20,0
    018E E051      LDI	R21,1
    018F E060      LDI	R22,0
    0190 E070      LDI	R23,0
    0191 937A      ST	R23,-Y
    0192 936A      ST	R22,-Y
    0193 935A      ST	R21,-Y
    0194 934A      ST	R20,-Y
    0195 940E02CC  CALL	div32s
    0197 BD00      OUT	0x20,R16
(0171)  UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
    0198 E886      LDI	R24,0x86
    0199 BD80      OUT	0x20,R24
(0172)  bytetime=215983/bps;//215983=1000000*20/92.6,92.6=1024/11.0592,定时器分频为1024
    019A 90200061  LDS	R2,bps
    019C 90300062  LDS	R3,bps+1
    019E 2444      CLR	R4
    019F 2455      CLR	R5
    01A0 EA4F      LDI	R20,0xAF
    01A1 E45B      LDI	R21,0x4B
    01A2 E063      LDI	R22,3
    01A3 E070      LDI	R23,0
    01A4 925A      ST	R5,-Y
    01A5 924A      ST	R4,-Y
    01A6 923A      ST	R3,-Y
    01A7 922A      ST	R2,-Y
    01A8 018A      MOVW	R16,R20
    01A9 019B      MOVW	R18,R22
    01AA 940E02CC  CALL	div32s
    01AC 9300007C  STS	bytetime,R16
(0173)  bytetime=255-bytetime;//计算不同的波特率所要延时的初值,要附值给TCNT0,实现透明转换中用到
    01AE 2E20      MOV	R2,R16
    01AF 2433      CLR	R3
    01B0 EF8F      LDI	R24,0xFF
    01B1 E090      LDI	R25,0
    01B2 1982      SUB	R24,R2
    01B3 0993      SBC	R25,R3
    01B4 9380007C  STS	bytetime,R24
    01B6 940E0337  CALL	pop_gset2
    01B8 9508      RET
(0174) } 
(0175) 
(0176) //##########################串行通信##########################//
(0177) void putchar(uchar c)
(0178) {while(!(UCSRA&(1<<UDRE)));//判断上次发送有没有完成
_putchar:
  c                    --> R16
    01B9 9B5D      SBIS	0x0B,5
    01BA CFFE      RJMP	_putchar
(0179)  UDR=c;}
    01BB B90C      OUT	0x0C,R16
    01BC 9508      RET
_INT1_17:
  j                    --> Y+1
  k                    --> R20
  R0                   --> R22
  i                    --> R20
    01BD 940E035F  CALL	push_lset
    01BF 940E0346  CALL	push_gset2
(0180) //##############################中断服务程序##################################//
(0181) void INT1_17(void)
(0182) {
(0183) uchar i,j,k,R0=0x66;
    01C1 E666      LDI	R22,0x66
(0184) GICR &=0x7f;
    01C2 B78B      IN	R24,0x3B
    01C3 778F      ANDI	R24,0x7F
    01C4 BF8B      OUT	0x3B,R24
(0185) state=Read_state(0xa0);
    01C5 EA00      LDI	R16,0xA0
    01C6 DEBF      RCALL	_Read_state
    01C7 9300007B  STS	state,R16
(0186) //WriteSPI(0xa0);//读取2515状态指令,状态值附值给state
(0187) if((state&0x01)!=0)
    01C9 FF00      SBRS	R16,0
    01CA C05F      RJMP	0x022A
(0188)    {//判断是不是接收缓冲器0满产生的中断
(0189)     k=Read_Byte(RXB0SIDL);//为了判断是标准帧还是扩展帧
    01CB E602      LDI	R16,0x62
    01CC DECF      RCALL	_Read_Byte
    01CD 2F40      MOV	R20,R16
(0190) 	if((k&0x08)==0)eflag=0;//置标准帧标志
    01CE FD03      SBRC	R16,3
    01CF C004      RJMP	0x01D4
    01D0 2422      CLR	R2
    01D1 92200063  STS	eflag,R2
    01D3 C003      RJMP	0x01D7
(0191)    	 else eflag=1;//置扩展帧标志
    01D4 E081      LDI	R24,1
    01D5 93800063  STS	eflag,R24
(0192) 	DLC=Read_Byte(RXB0DLC);
    01D7 E605      LDI	R16,0x65
    01D8 DEC3      RCALL	_Read_Byte
    01D9 9300007A  STS	DLC,R16
(0193) 	DLC &=0x0f;
    01DB 2F80      MOV	R24,R16
    01DC 708F      ANDI	R24,0xF
    01DD 9380007A  STS	DLC,R24
(0194) 	RESID[0]=Read_Byte(RXB0SIDH);
    01DF E601      LDI	R16,0x61
    01E0 DEBB      RCALL	_Read_Byte
    01E1 9300007D  STS	RESID,R16
(0195) 	RESID[1]=Read_Byte(RXB0SIDL);
    01E3 E602      LDI	R16,0x62
    01E4 DEB7      RCALL	_Read_Byte
    01E5 9300007E  STS	RESID+1,R16
(0196) 	RESID[2]=Read_Byte(RXB0EID8);
    01E7 E603      LDI	R16,0x63
    01E8 DEB3      RCALL	_Read_Byte
    01E9 9300007F  STS	RESID+2,R16
(0197) 	RESID[3]=Read_Byte(RXB0EID0);//先读取所有ID
    01EB E604      LDI	R16,0x64
    01EC DEAF      RCALL	_Read_Byte
    01ED 93000080  STS	RESID+3,R16
(0198) 	Receive_all_ID_process();//处理RESID
    01EF DF25      RCALL	_Receive_all_ID_process
(0199) 	for(i=0;i<DLC;i++,R0++)Rdate[i]=Read_Byte(R0);//从2515缓冲区内读取收到的数据部分
    01F0 2744      CLR	R20
    01F1 C00B      RJMP	0x01FD
    01F2 2F06      MOV	R16,R22
    01F3 DEA8      RCALL	_Read_Byte
    01F4 E780      LDI	R24,0x70
    01F5 E090      LDI	R25,0
    01F6 2FE4      MOV	R30,R20
    01F7 27FF      CLR	R31
    01F8 0FE8      ADD	R30,R24
    01F9 1FF9      ADC	R31,R25
    01FA 8300      STD	Z+0,R16
    01FB 9543      INC	R20
    01FC 9563      INC	R22
    01FD 9020007A  LDS	R2,DLC
    01FF 1542      CP	R20,R2
    0200 F388      BCS	0x01F2
(0200) 	if(eflag==0)
    0201 90200063  LDS	R2,eflag
    0203 2022      TST	R2
    0204 F439      BNE	0x020C
(0201) 	  {//如果是标准帧
(0202) 	   putchar(RESID[0]);
    0205 9100007D  LDS	R16,RESID
    0207 DFB1      RCALL	_putchar
(0203) 	   putchar(RESID[1]);//先送标准帧ID号
    0208 9100007E  LDS	R16,RESID+1
    020A DFAE      RCALL	_putchar
(0204) 	   }
    020B C00C      RJMP	0x0218
(0205) 	else 
(0206) 	  {//如果是扩展帧
(0207) 	   putchar(RESID[0]);
    020C 9100007D  LDS	R16,RESID
    020E DFAA      RCALL	_putchar
(0208) 	   putchar(RESID[1]);
    020F 9100007E  LDS	R16,RESID+1
    0211 DFA7      RCALL	_putchar
(0209) 	   putchar(RESID[2]);
    0212 9100007F  LDS	R16,RESID+2
    0214 DFA4      RCALL	_putchar
(0210) 	   putchar(RESID[3]);//先送扩展帧ID号    
    0215 91000080  LDS	R16,RESID+3
    0217 DFA1      RCALL	_putchar
(0211) 	  }
(0212) 	putchar(DLC);
    0218 9100007A  LDS	R16,DLC
    021A DF9E      RCALL	_putchar
(0213) 	for(i=0;i<DLC;i++)putchar(Rdate[i]);//再送接收到的DLC位数
    021B 2744      CLR	R20
    021C C009      RJMP	0x0226
    021D E780      LDI	R24,0x70
    021E E090      LDI	R25,0
    021F 2FE4      MOV	R30,R20
    0220 27FF      CLR	R31
    0221 0FE8      ADD	R30,R24
    0222 1FF9      ADC	R31,R25
    0223 8100      LDD	R16,Z+0
    0224 DF94      RCALL	_putchar
    0225 9543      INC	R20
    0226 9020007A  LDS	R2,DLC
    0228 1542      CP	R20,R2
    0229 F398      BCS	0x021D
(0214) 	}
(0215) Write_Byte(CANINTF,0x00);//接收完一次必须对中断标志位清0
    022A 2722      CLR	R18
    022B E20C      LDI	R16,0x2C
    022C DE8C      RCALL	_Write_Byte
(0216) GICR |=0x80;
    022D B78B      IN	R24,0x3B
    022E 6880      ORI	R24,0x80
    022F BF8B      OUT	0x3B,R24
    0230 940E0337  CALL	pop_gset2
    0232 940E0376  CALL	pop_lset
    0234 9518      RETI
_Usart_receive:
    0235 922A      ST	R2,-Y
    0236 938A      ST	R24,-Y
    0237 939A      ST	R25,-Y
    0238 93EA      ST	R30,-Y
    0239 93FA      ST	R31,-Y
    023A B62F      IN	R2,0x3F
    023B 922A      ST	R2,-Y
(0217) }
(0218) //####################################
(0219) void Usart_receive(void)//定义接收中断服务程序
(0220) {Tdate[usart_number]=UDR;
    023C E684      LDI	R24,0x64
    023D E090      LDI	R25,0
    023E 91E00078  LDS	R30,usart_number
    0240 91F00079  LDS	R31,usart_number+1
    0242 0FE8      ADD	R30,R24
    0243 1FF9      ADC	R31,R25
    0244 B02C      IN	R2,0x0C
    0245 8220      STD	Z+0,R2
(0221)  usart_number++;
    0246 91800078  LDS	R24,usart_number
    0248 91900079  LDS	R25,usart_number+1
    024A 9601      ADIW	R24,1
    024B 93900079  STS	usart_number+1,R25
    024D 93800078  STS	usart_number,R24
(0222)  TIMSK=0x05;//打开T1,T0中断屏蔽
    024F E085      LDI	R24,5
    0250 BF89      OUT	0x39,R24
(0223)  TCCR0=0x05;//设T0分频数为1024
    0251 BF83      OUT	0x33,R24
(0224)  TCNT0=bytetime;//设T0时间常数,从此值开始计数
    0252 9020007C  LDS	R2,bytetime
    0254 BE22      OUT	0x32,R2
    0255 9029      LD	R2,Y+
    0256 BE2F      OUT	0x3F,R2
    0257 91F9      LD	R31,Y+
    0258 91E9      LD	R30,Y+
    0259 9199      LD	R25,Y+
    025A 9189      LD	R24,Y+
    025B 9029      LD	R2,Y+
    025C 9518      RETI
_Timer0:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -