📄 can232.lst
字号:
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 + -