📄 main.lis
字号:
0094 L25:
0094 .dbline 84
0094 ; while(!(SPSR&0x80)); //等待SPIF置位,等数据发送完毕
0094 779B sbis 0xe,7
0096 FECF rjmp L24
0098 .dbline 85
0098 ; clear=SPSR;
0098 6EB1 in R22,0xe
009A .dbline 86
009A ; clear=SPDR; //通过先读SPSR,紧接着访问SPDR来对SPIF清零
009A 6FB1 in R22,0xf
009C .dbline 88
009C ;
009C ; SPDR=Address; //送地址
009C AFB8 out 0xf,R10
009E L27:
009E .dbline 89
009E L28:
009E .dbline 89
009E ; while(!(SPSR&0x80));
009E 779B sbis 0xe,7
00A0 FECF rjmp L27
00A2 .dbline 90
00A2 ; clear=SPSR;
00A2 6EB1 in R22,0xe
00A4 .dbline 91
00A4 ; clear=SPDR;
00A4 6FB1 in R22,0xf
00A6 .dbline 93
00A6 ;
00A6 ; SPDR=0x00; //发空数据,启动数据发送以接收数据
00A6 2224 clr R2
00A8 2FB8 out 0xf,R2
00AA L30:
00AA .dbline 94
00AA L31:
00AA .dbline 94
00AA ; while(!(SPSR&0x80));
00AA 779B sbis 0xe,7
00AC FECF rjmp L30
00AE .dbline 95
00AE ; clear=SPSR;
00AE 6EB1 in R22,0xe
00B0 .dbline 96
00B0 ; clear=SPDR;
00B0 6FB1 in R22,0xf
00B2 .dbline 98
00B2 ;
00B2 ; date=SPDR; //接收数据
00B2 4FB1 in R20,0xf
00B4 .dbline 99
00B4 ; Set_CS(1); //关SPI器件DS1722
00B4 01E0 ldi R16,1
00B6 BADF xcall _Set_CS
00B8 .dbline 100
00B8 ; return date;
00B8 042F mov R16,R20
00BA .dbline -2
00BA L23:
00BA 0E940000 xcall pop_gset3
00BE .dbline 0 ; func end
00BE 0895 ret
00C0 .dbsym r date 20 c
00C0 .dbsym r clear 22 c
00C0 .dbsym r Address 10 c
00C0 .dbend
00C0 .dbfunc e Write_Byte _Write_Byte fV
00C0 ; clear -> R20
00C0 ; Data -> R22
00C0 ; Address -> R10
.even
00C0 _Write_Byte::
00C0 0E940000 xcall push_gset3
00C4 622F mov R22,R18
00C6 A02E mov R10,R16
00C8 .dbline -1
00C8 .dbline 104
00C8 ; }
00C8 ; //**向2515指定地址Address写一个字节数据Data**//
00C8 ; void Write_Byte(uchar Address,uchar Data)
00C8 ; {uchar clear;
00C8 .dbline 105
00C8 ; Set_CS(0); //使能SPI器件2515
00C8 0027 clr R16
00CA B0DF xcall _Set_CS
00CC .dbline 107
00CC ;
00CC ; SPDR=0x02; //送2515写命令为0x02
00CC 82E0 ldi R24,2
00CE 8FB9 out 0xf,R24
00D0 L34:
00D0 .dbline 108
00D0 L35:
00D0 .dbline 108
00D0 ; while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
00D0 779B sbis 0xe,7
00D2 FECF rjmp L34
00D4 .dbline 109
00D4 ; clear=SPSR;
00D4 4EB1 in R20,0xe
00D6 .dbline 110
00D6 ; clear=SPDR;
00D6 4FB1 in R20,0xf
00D8 .dbline 112
00D8 ;
00D8 ; SPDR=Address; //送地址,启动SPI时钟
00D8 AFB8 out 0xf,R10
00DA L37:
00DA .dbline 113
00DA L38:
00DA .dbline 113
00DA ; while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
00DA 779B sbis 0xe,7
00DC FECF rjmp L37
00DE .dbline 114
00DE ; clear=SPSR;
00DE 4EB1 in R20,0xe
00E0 .dbline 115
00E0 ; clear=SPDR; //通过先读SPSR,紧接着访问SPDR来对SPIF清零
00E0 4FB1 in R20,0xf
00E2 .dbline 117
00E2 ;
00E2 ; SPDR=Data;
00E2 6FB9 out 0xf,R22
00E4 L40:
00E4 .dbline 118
00E4 L41:
00E4 .dbline 118
00E4 ; while(!(SPSR&0x80));
00E4 779B sbis 0xe,7
00E6 FECF rjmp L40
00E8 .dbline 119
00E8 ; clear=SPSR;
00E8 4EB1 in R20,0xe
00EA .dbline 120
00EA ; clear=SPDR;
00EA 4FB1 in R20,0xf
00EC .dbline 121
00EC ; Set_CS(1); //关SPI器件
00EC 01E0 ldi R16,1
00EE 9EDF xcall _Set_CS
00F0 .dbline -2
00F0 L33:
00F0 0E940000 xcall pop_gset3
00F4 .dbline 0 ; func end
00F4 0895 ret
00F6 .dbsym r clear 20 c
00F6 .dbsym r Data 22 c
00F6 .dbsym r Address 10 c
00F6 .dbend
00F6 .dbfunc e load_Standard_ID_dates _load_Standard_ID_dates fV
00F6 ; TIDL -> R12
00F6 ; TIDH -> R14
00F6 ; j -> R20
00F6 ; T0 -> R22
00F6 ; i -> R10
00F6 ; num -> y+10
.even
00F6 _load_Standard_ID_dates::
00F6 1A93 st -y,r17
00F8 0A93 st -y,r16
00FA 0E940000 xcall push_gset5
00FE .dbline -1
00FE .dbline 128
00FE ; }
00FE ; //****************************************************************************//
00FE ; //###########################对CAN的一些操作####################################
00FE ; //***************************要发送的数据包***********************************//
00FE ; void load_Standard_ID_dates(uchar num)//给标准帧装载ID和数据
00FE ; //选用发送缓冲器0,num:要发送的个数(最大8个)
00FE ; {
00FE .dbline 129
00FE ; uchar i,j,T0=0x36;
00FE 66E3 ldi R22,54
0100 .dbline 131
0100 ; uchar TIDH,TIDL;
0100 ; i=TID[1]>>3;j=TID[0]<<5;j=j+i;i=TID[1]<<5;
0100 A0900F00 lds R10,_TID+1
0104 A694 lsr R10
0106 A694 lsr R10
0108 A694 lsr R10
010A .dbline 131
010A 40910E00 lds R20,_TID
010E 440F lsl R20
0110 440F lsl R20
0112 440F lsl R20
0114 440F lsl R20
0116 440F lsl R20
0118 .dbline 131
0118 4A0D add R20,R10
011A .dbline 131
011A A0900F00 lds R10,_TID+1
011E AA0C lsl R10
0120 AA0C lsl R10
0122 AA0C lsl R10
0124 AA0C lsl R10
0126 AA0C lsl R10
0128 .dbline 132
0128 ; TIDL=i;TIDH=j;//将数组TID中的值转化为TIDH,TIDL以便给TXB0SIDH,TXB0SIDL附值
0128 CA2C mov R12,R10
012A .dbline 132
012A E42E mov R14,R20
012C .dbline 133
012C ; Write_Byte(CANCTRL,0x80);//CAN工作在配置模式
012C 20E8 ldi R18,128
012E 0FE0 ldi R16,15
0130 C7DF xcall _Write_Byte
0132 .dbline 134
0132 ; Write_Byte(CNF1,can_boud);
0132 20910000 lds R18,_can_boud
0136 0AE2 ldi R16,42
0138 C3DF xcall _Write_Byte
013A .dbline 135
013A ; Write_Byte(TXB0SIDH,TIDH);
013A 2E2D mov R18,R14
013C 01E3 ldi R16,49
013E C0DF xcall _Write_Byte
0140 .dbline 136
0140 ; Write_Byte(TXB0SIDL,TIDL);
0140 2C2D mov R18,R12
0142 02E3 ldi R16,50
0144 BDDF xcall _Write_Byte
0146 .dbline 137
0146 ; Write_Byte(TXB0DLC,num);//
0146 2A85 ldd R18,y+10
0148 05E3 ldi R16,53
014A BADF xcall _Write_Byte
014C .dbline 138
014C 82E0 ldi R24,2
014E A82E mov R10,R24
0150 0BC0 xjmp L49
0152 L46:
0152 .dbline 138
0152 80E0 ldi R24,<_Tdate
0154 90E0 ldi R25,>_Tdate
0156 EA2D mov R30,R10
0158 FF27 clr R31
015A E80F add R30,R24
015C F91F adc R31,R25
015E 2081 ldd R18,z+0
0160 062F mov R16,R22
0162 AEDF xcall _Write_Byte
0164 L47:
0164 .dbline 138
0164 A394 inc R10
0166 6395 inc R22
0168 L49:
0168 .dbline 138
0168 ; for(i=2;i<num+2;i++,T0++)Write_Byte(T0,Tdate[i]);
0168 8A85 ldd R24,y+10
016A 8E5F subi R24,254 ; addi 2
016C A816 cp R10,R24
016E 88F3 brlo L46
0170 .dbline -2
0170 L43:
0170 0E940000 xcall pop_gset5
0174 2296 adiw R28,2
0176 .dbline 0 ; func end
0176 0895 ret
0178 .dbsym r TIDL 12 c
0178 .dbsym r TIDH 14 c
0178 .dbsym r j 20 c
0178 .dbsym r T0 22 c
0178 .dbsym r i 10 c
0178 .dbsym l num 10 c
0178 .dbend
0178 .dbfunc e Receive_all_ID_process _Receive_all_ID_process fV
0178 ; k -> R16
.even
0178 _Receive_all_ID_process::
0178 .dbline -1
0178 .dbline 142
0178 ; }
0178 ; //##############################################################################
0178 ; void Receive_all_ID_process(void)//结合MCP2515数据手册来看
0178 ; {uchar k;
0178 .dbline 143
0178 ; k=RESID[1];//先判断接收到的是不是标准帧,因为标准帧和扩展帧的ID处理不一样
0178 00910300 lds R16,_RESID+1
017C .dbline 144
017C ; if((k&0x08)==0)
017C 03FD sbrc R16,3
017E 1BC0 rjmp L52
0180 .dbline 145
0180 ; {//如果是标准处理方法
0180 .dbline 146
0180 ; RESID[1]=RESID[1]>>5;
0180 202E mov R2,R16
0182 2694 lsr R2
0184 2694 lsr R2
0186 2694 lsr R2
0188 2694 lsr R2
018A 2694 lsr R2
018C 20920300 sts _RESID+1,R2
0190 .dbline 147
0190 ; k=RESID[0]&0x1f;//借用k
0190 00910200 lds R16,_RESID
0194 0F71 andi R16,31
0196 .dbline 148
0196 ; k=k<<3;
0196 000F lsl R16
0198 000F lsl R16
019A 000F lsl R16
019C .dbline 149
019C ; RESID[1]=RESID[1]+k;
019C 200E add R2,R16
019E 20920300 sts _RESID+1,R2
01A2 .dbline 150
01A2 ; RESID[0]=RESID[0]>>5;
01A2 20900200 lds R2,_RESID
01A6 2694 lsr R2
01A8 2694 lsr R2
01AA 2694 lsr R2
01AC 2694 lsr R2
01AE 2694 lsr R2
01B0 20920200 sts _RESID,R2
01B4 .dbline 151
01B4 ; }
01B4 21C0 xjmp L53
01B6 L52:
01B6 .dbline 153
01B6 .dbline 154
01B6 0695 lsr R16
01B8 0695 lsr R16
01BA 0695 lsr R16
01BC 0695 lsr R16
01BE 0695 lsr R16
01C0 .dbline 155
01C0 000F lsl R16
01C2 000F lsl R16
01C4 .dbline 156
01C4 80910300 lds R24,_RESID+1
01C8 8370 andi R24,3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -