www.pudn.com > xunjijiqiren.rar > Motor.lis
.module Motor.c
.area data(ram, con, rel)
0000 _Ek::
0000 .blkb 2
.area idata
0000 0000 .word 0
.area data(ram, con, rel)
0002 .dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c
0002 .dbsym e Ek _Ek I
0002 _Ek_1::
0002 .blkb 2
.area idata
0002 0000 .word 0
.area data(ram, con, rel)
0004 .dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c
0004 .dbsym e Ek_1 _Ek_1 I
0004 _Ek_2::
0004 .blkb 2
.area idata
0004 0000 .word 0
.area data(ram, con, rel)
0006 .dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c
0006 .dbsym e Ek_2 _Ek_2 I
0006 _flage::
0006 .blkb 1
.area idata
0006 00 .byte 0
.area data(ram, con, rel)
0007 .dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c
0007 .dbsym e flage _flage c
.area text(rom, con, rel)
0000 .dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c
0000 .dbfunc e Putdata _Putdata fV
0000 ; i -> R20,R21
0000 ; data -> R16,R17
.even
0000 _Putdata::
0000 00D0 rcall push_gset1
0002 .dbline -1
0002 .dbline 30
0002 ; //***************************FileName:Motor.C************************
0002 ; //***************************ICCAVR6.30编译**************************
0002 ; #include
0002 ; #include
0002 ; #include
0002 ;
0002 ; //***************************全局变量定义**************************//
0002 ; #define U1 5
0002 ; char Data[10]; //接收数据数组
0002 ; int adress; //数据地址
0002 ; int a; //采样时间次数
0002 ; float t; //采样时间.s
0002 ; int itime; //给定采样时间的次数
0002 ; int Ek=0; //本次偏差
0002 ; int Ek_1=0; //上次偏差
0002 ; int Ek_2=0; //上上次偏差
0002 ; char flage=0; //监控标志
0002 ; union chang1 //float数据与char数据转换
0002 ; {char c[4];
0002 ; float x;
0002 ; }floatxin;
0002 ; union chang2 //int数据与char数据转换
0002 ; {char c[2];
0002 ; int x;
0002 ; }intxin;
0002 ;
0002 ; //**************************串口数据发送函数***********************//
0002 ; //说明:串口数据发送采用查询方式,每一帧发送10个字节
0002 ; void Putdata(char data[10])
0002 ; {int i;
0002 .dbline 31
0002 ; for(i=0;i<=9;i++)
0002 4427 clr R20
0004 5527 clr R21
0006 .dbline 32
0006 L6:
0006 .dbline 32
0006 L7:
0006 .dbline 32
0006 5D9B sbis 0xb,5
0008 FECF rjmp L6
000A .dbline 33
000A E42F mov R30,R20
000C F52F mov R31,R21
000E E00F add R30,R16
0010 F11F adc R31,R17
0012 2080 ldd R2,z+0
0014 2CB8 out 0xc,R2
0016 .dbline 33
0016 L3:
0016 .dbline 31
0016 4F5F subi R20,255 ; offset = 1
0018 5F4F sbci R21,255
001A .dbline 31
001A 89E0 ldi R24,9
001C 90E0 ldi R25,0
001E 8417 cp R24,R20
0020 9507 cpc R25,R21
0022 8CF7 brge L7
0024 .dbline -2
0024 .dbline 34
0024 ; {while(!(USR&(1< R16,R17
.even
0028 _GetOutputADC::
0028 .dbline -1
0028 .dbline 38
0028 ;
0028 ; //**************************读AD转换结果***************************//
0028 ; int GetOutputADC()
0028 ; {int temp;
0028 .dbline 39
0028 ; temp=ADCH;
0028 05B1 in R16,0x5
002A 1127 clr R17
002C .dbline 40
002C ; temp=temp<<8;
002C 102F mov R17,R16
002E 0027 clr R16
0030 .dbline 41
0030 ; return(temp+ADCL);
0030 24B0 in R2,0x4
0032 3324 clr R3
0034 020D add R16,R2
0036 131D adc R17,R3
0038 .dbline -2
0038 L9:
0038 .dbline 0 ; func end
0038 0895 ret
003A .dbsym r temp 16 I
003A .dbend
003A .dbfunc e Upspeed _Upspeed fV
.even
003A _Upspeed::
003A 2297 sbiw R28,2
003C .dbline -1
003C .dbline 46
003C ; }
003C ;
003C ; //***************************电机加速函数**************************//
003C ; void Upspeed()
003C ; {EEPROMReadBytes(0x0010,intxin.c,2);
003C .dbline 46
003C 82E0 ldi R24,2
003E 90E0 ldi R25,0
0040 9983 std y+1,R25
0042 8883 std y+0,R24
0044 20E0 ldi R18,<_intxin
0046 30E0 ldi R19,>_intxin
0048 00E1 ldi R16,16
004A 10E0 ldi R17,0
004C 00D0 rcall _EEPROMReadBytes
004E .dbline 47
004E ; intxin.c[0]+=Data[6];
004E 20901600 lds R2,_Data+6
0052 30900000 lds R3,_intxin
0056 320C add R3,R2
0058 30920000 sts _intxin,R3
005C .dbline 48
005C ; intxin.c[1]+=Data[7];
005C 20901700 lds R2,_Data+7
0060 30900100 lds R3,_intxin+1
0064 320C add R3,R2
0066 30920100 sts _intxin+1,R3
006A .dbline 49
006A ; EEPROMWriteBytes(0x0010,intxin.c,2);
006A 82E0 ldi R24,2
006C 90E0 ldi R25,0
006E 9983 std y+1,R25
0070 8883 std y+0,R24
0072 20E0 ldi R18,<_intxin
0074 30E0 ldi R19,>_intxin
0076 00E1 ldi R16,16
0078 10E0 ldi R17,0
007A 00D0 rcall _EEPROMWriteBytes
007C .dbline -2
007C .dbline 50
007C ; }
007C L10:
007C 2296 adiw R28,2
007E .dbline 0 ; func end
007E 0895 ret
0080 .dbend
0080 .dbfunc e Downspeed _Downspeed fV
.even
0080 _Downspeed::
0080 2297 sbiw R28,2
0082 .dbline -1
0082 .dbline 54
0082 ;
0082 ; //***************************电机减速函数**************************//
0082 ; void Downspeed()
0082 ; {
0082 .dbline 55
0082 ; EEPROMReadBytes(0x0010,intxin.c,2);
0082 82E0 ldi R24,2
0084 90E0 ldi R25,0
0086 9983 std y+1,R25
0088 8883 std y+0,R24
008A 20E0 ldi R18,<_intxin
008C 30E0 ldi R19,>_intxin
008E 00E1 ldi R16,16
0090 10E0 ldi R17,0
0092 00D0 rcall _EEPROMReadBytes
0094 .dbline 56
0094 ; intxin.c[0]-=Data[6];
0094 20901600 lds R2,_Data+6
0098 30900000 lds R3,_intxin
009C 3218 sub R3,R2
009E 30920000 sts _intxin,R3
00A2 .dbline 57
00A2 ; intxin.c[1]-=Data[7];
00A2 20901700 lds R2,_Data+7
00A6 30900100 lds R3,_intxin+1
00AA 3218 sub R3,R2
00AC 30920100 sts _intxin+1,R3
00B0 .dbline 58
00B0 ; EEPROMWriteBytes(0x0010,intxin.c,2);
00B0 82E0 ldi R24,2
00B2 90E0 ldi R25,0
00B4 9983 std y+1,R25
00B6 8883 std y+0,R24
00B8 20E0 ldi R18,<_intxin
00BA 30E0 ldi R19,>_intxin
00BC 00E1 ldi R16,16
00BE 10E0 ldi R17,0
00C0 00D0 rcall _EEPROMWriteBytes
00C2 .dbline -2
00C2 .dbline 59
00C2 ; }
00C2 L14:
00C2 2296 adiw R28,2
00C4 .dbline 0 ; func end
00C4 0895 ret
00C6 .dbend
00C6 .dbfunc e PIDB _PIDB fV
00C6 ; speed -> R14,R15
00C6 ; z -> y+20
00C6 ; u -> y+14
00C6 ; t -> R10,R11
00C6 ; y -> R12,R13
00C6 ; temp1 -> R20
00C6 ; k -> y+2
00C6 ; i -> y+18
.even
00C6 _PIDB::
00C6 00D0 rcall push_gset5
00C8 6697 sbiw R28,22
00CA .dbline -1
00CA .dbline 63
00CA ;
00CA ; //***************************PID调节函数***************************//
00CA ; void PIDB()
00CA ; {int y; //本次速度值
00CA .dbline 71
00CA ; float u; //电压差值
00CA ; int z; //输出增量
00CA ; int t; //采样时间
00CA ; char temp1; //暂存
00CA ; int i;
00CA ; int speed; //速度设定
00CA ; float k[3]; //PID参数记录
00CA ; for (i=0;i<=2;i++)
00CA 0024 clr R0
00CC 1124 clr R1
00CE 1B8A std y+19,R1
00D0 0A8A std y+18,R0
00D2 L19:
00D2 .dbline 72
00D2 .dbline 72
00D2 84E0 ldi R24,4
00D4 90E0 ldi R25,0
00D6 9983 std y+1,R25
00D8 8883 std y+0,R24
00DA 20E0 ldi R18,<_floatxin
00DC 30E0 ldi R19,>_floatxin
00DE 0A89 ldd R16,y+18
00E0 1B89 ldd R17,y+19
00E2 000F lsl R16
00E4 111F rol R17
00E6 000F lsl R16
00E8 111F rol R17
00EA 00D0 rcall _EEPROMReadBytes
00EC .dbline 73
00EC 8C2F mov R24,R28
00EE 9D2F mov R25,R29
00F0 0296 adiw R24,2
00F2 EA89 ldd R30,y+18
00F4 FB89 ldd R31,y+19
00F6 EE0F lsl R30
00F8 FF1F rol R31
00FA EE0F lsl R30
00FC FF1F rol R31
00FE E80F add R30,R24
0100 F91F adc R31,R25
0102 40900400 lds R4,_floatxin+2
0106 50900500 lds R5,_floatxin+2+1
010A 20900200 lds R2,_floatxin
010E 30900300 lds R3,_floatxin+1
0112 2082 std z+0,R2
0114 3182 std z+1,R3
0116 4282 std z+2,R4
0118 5382 std z+3,R5
011A .dbline 73
011A L20:
011A .dbline 71
011A 8A89 ldd R24,y+18
011C 9B89 ldd R25,y+19
011E 0196 adiw R24,1
0120 9B8B std y+19,R25
0122 8A8B std y+18,R24
0124 .dbline 71
0124 82E0 ldi R24,2
0126 90E0 ldi R25,0
0128 0A88 ldd R0,y+18
012A 1B88 ldd R1,y+19
012C 8015 cp R24,R0
012E 9105 cpc R25,R1
0130 84F6 brge L19
0132 .dbline 74
0132 ; {EEPROMReadBytes(i*4,floatxin.c,4);
0132 ; k[i]=floatxin.x;}
0132 ; EEPROMReadBytes(0x0010,intxin.c,1); //读EEPROM
0132 81E0 ldi R24,1
0134 9983 std y+1,R25
0136 8883 std y+0,R24
0138 20E0 ldi R18,<_intxin
013A 30E0 ldi R19,>_intxin
013C 00E1 ldi R16,16
013E 10E0 ldi R17,0
0140 00D0 rcall _EEPROMReadBytes
0142 .dbline 75
0142 ; speed=intxin.x;
0142 E0900000 lds R14,_intxin
0146 F0900100 lds R15,_intxin+1
014A .dbline 76
014A ; t=itime*0.0001275;
014A 00E0 ldi R16,L23
014E 00D0 rcall lpm32
0150 3A93 st -y,R19
0152 2A93 st -y,R18
0154 1A93 st -y,R17
0156 0A93 st -y,R16
0158 00910600 lds R16,_itime
015C 10910700 lds R17,_itime+1
0160 00D0 rcall int2fp
0162 3A93 st -y,R19
0164 2A93 st -y,R18
0166 1A93 st -y,R17
0168 0A93 st -y,R16
016A 00D0 rcall mpy32f
016C 00D0 rcall fp2int
016E A02E mov R10,R16
0170 B12E mov R11,R17
0172 .dbline 77
0172 ; y = TCNT1;
0172 CCB4 in R12,0x2c
0174 DDB4 in R13,0x2d
0176 .dbline 78
0176 ; Ek=y-speed;
0176 2C2C mov R2,R12
0178 3D2C mov R3,R13
017A 2E18 sub R2,R14
017C 3F08 sbc R3,R15
017E 30920100 sts _Ek+1,R3
0182 20920000 sts _Ek,R2
0186 .dbline 79
0186 ; u=k[0]*((Ek-Ek_1)+(t/k[1])*Ek+(k[2]/t)*(Ek-2*Ek_1+Ek_2));
0186 EC2F mov R30,R28
0188 FD2F mov R31,R29
018A 2280 ldd R2,z+2
018C 3380 ldd R3,z+3
018E 4480 ldd R4,z+4
0190 5580 ldd R5,z+5
0192 5A92 st -y,R5
0194 4A92 st -y,R4
0196 3A92 st -y,R3
0198 2A92 st -y,R2
019A 20900200 lds R2,_Ek_1
019E 30900300 lds R3,_Ek_1+1
01A2 00910000 lds R16,_Ek
01A6 10910100 lds R17,_Ek+1
01AA 0219 sub R16,R2
01AC 1309 sbc R17,R3
01AE 00D0 rcall int2fp
01B0 3A93 st -y,R19
01B2 2A93 st -y,R18
01B4 1A93 st -y,R17
01B6 0A93 st -y,R16
01B8 0A2D mov R16,R10
01BA 1B2D mov R17,R11
01BC 00D0 rcall int2fp
01BE 3A93 st -y,R19
01C0 2A93 st -y,R18
01C2 1A93 st -y,R17
01C4 0A93 st -y,R16
01C6 EC2F mov R30,R28
01C8 FD2F mov R31,R29
01CA ; stack offset 12
01CA 2288 ldd R2,z+18
01CC 3388 ldd R3,z+19
01CE 4488 ldd R4,z+20
01D0 5588 ldd R5,z+21
01D2 5A92 st -y,R5
01D4 4A92 st -y,R4
01D6 3A92 st -y,R3
01D8 2A92 st -y,R2
01DA 00D0 rcall div32fs
01DC 00910000 lds R16,_Ek
01E0 10910100 lds R17,_Ek+1
01E4 00D0 rcall int2fp
01E6 3A93 st -y,R19
01E8 2A93 st -y,R18
01EA 1A93 st -y,R17
01EC 0A93 st -y,R16
01EE 00D0 rcall mpy32fs
01F0 00D0 rcall add32fs
01F2 EC2F mov R30,R28
01F4 FD2F mov R31,R29
01F6 ; stack offset 8
01F6 2288 ldd R2,z+18
01F8 3388 ldd R3,z+19
01FA 4488 ldd R4,z+20
01FC 5588 ldd R5,z+21
01FE 5A92 st -y,R5
0200 4A92 st -y,R4
0202 3A92 st -y,R3
0204 2A92 st -y,R2
0206 0A2D mov R16,R10
0208 1B2D mov R17,R11
020A 00D0 rcall int2fp
020C 3A93 st -y,R19
020E 2A93 st -y,R18
0210 1A93 st -y,R17
0212 0A93 st -y,R16
0214 00D0 rcall div32fs
0216 20900200 lds R2,_Ek_1
021A 30900300 lds R3,_Ek_1+1
021E 220C lsl R2
0220 331C rol R3
0222 00910000 lds R16,_Ek
0226 10910100 lds R17,_Ek+1
022A 0219 sub R16,R2
022C 1309 sbc R17,R3
022E 20900400 lds R2,_Ek_2
0232 30900500 lds R3,_Ek_2+1
0236 020D add R16,R2
0238 131D adc R17,R3
023A 00D0 rcall int2fp
023C 3A93 st -y,R19
023E 2A93 st -y,R18
0240 1A93 st -y,R17
0242 0A93 st -y,R16
0244 00D0 rcall mpy32fs
0246 00D0 rcall add32fs
0248 00D0 rcall mpy32f
024A EC2F mov R30,R28
024C FD2F mov R31,R29
024E 0687 std z+14,R16
0250 1787 std z+15,R17
0252 208B std z+16,R18
0254 318B std z+17,R19
0256 .dbline 80
0256 ; z=u/U1*0xFF;
0256 00E0 ldi R16,L26
025A 00D0 rcall lpm32
025C 3A93 st -y,R19
025E 2A93 st -y,R18
0260 1A93 st -y,R17
0262 0A93 st -y,R16
0264 EC2F mov R30,R28
0266 FD2F mov R31,R29
0268 ; stack offset 4
0268 2288 ldd R2,z+18
026A 3388 ldd R3,z+19
026C 4488 ldd R4,z+20
026E 5588 ldd R5,z+21
0270 5A92 st -y,R5
0272 4A92 st -y,R4
0274 3A92 st -y,R3
0276 2A92 st -y,R2
0278 00E0 ldi R16,L27
027C 00D0 rcall lpm32
027E 3A93 st -y,R19
0280 2A93 st -y,R18
0282 1A93 st -y,R17
0284 0A93 st -y,R16
0286 00D0 rcall div32fs
0288 00D0 rcall mpy32f
028A 00D0 rcall fp2int
028C 1D8B std y+21,R17
028E 0C8B std y+20,R16
0290 .dbline 81
0290 ; temp1=OCR2;
0290 43B5 in R20,0x23
0292 .dbline 82
0292 ; if(flage==1) //监控状态
0292 80910600 lds R24,_flage
0296 8130 cpi R24,1
0298 91F4 brne L28
029A .dbline 83
029A ; {Data[4]=0xD0;
029A .dbline 83
029A 80ED ldi R24,208
029C 80931400 sts _Data+4,R24
02A0 .dbline 84
02A0 ; Data[5]=temp1;
02A0 40931500 sts _Data+5,R20
02A4 .dbline 85
02A4 ; Data[6]=y>>8;
02A4 2C2C mov R2,R12
02A6 3D2C mov R3,R13
02A8 232C mov R2,R3
02AA 3324 clr R3
02AC 27FC sbrc R2,7
02AE 3094 com R3
02B0 20921600 sts _Data+6,R2
02B4 .dbline 86
02B4 ; Data[7]=y;
02B4 C0921700 sts _Data+7,R12
02B8 .dbline 87
02B8 ; Putdata(Data);}
02B8 00E0 ldi R16,<_Data
02BA 10E0 ldi R17,>_Data
02BC A1DE rcall _Putdata
02BE .dbline 87
02BE L28:
02BE .dbline 88
02BE ; temp1=temp1+z;
02BE 242E mov R2,R20
02C0 3324 clr R3
02C2 0C88 ldd R0,y+20
02C4 1D88 ldd R1,y+21
02C6 200C add R2,R0
02C8 311C adc R3,R1
02CA 422D mov R20,R2
02CC .dbline 89
02CC ; if(temp1<=0) //结果小于0时输出0
02CC 2224 clr R2
02CE 2416 cp R2,R20
02D0 08F0 brlo L34
02D2 .dbline 90
02D2 ; temp1 = 0x00;
02D2 4427 clr R20
02D4 L34:
02D4 .dbline 91
02D4 ; if(temp1>=0xF0) //结果大于0xF0时输出0xF0
02D4 403F cpi R20,240
02D6 08F0 brlo L36
02D8 .dbline 92
02D8 ; temp1 = 0xF0;
02D8 40EF ldi R20,240
02DA L36:
02DA .dbline 93
02DA ; OCR2=temp1;
02DA 43BD out 0x23,R20
02DC .dbline 94
02DC ; Ek_2 = Ek_1;
02DC 20900200 lds R2,_Ek_1
02E0 30900300 lds R3,_Ek_1+1
02E4 30920500 sts _Ek_2+1,R3
02E8 20920400 sts _Ek_2,R2
02EC .dbline 95
02EC ; Ek_1 = Ek;
02EC 20900000 lds R2,_Ek
02F0 30900100 lds R3,_Ek+1
02F4 30920300 sts _Ek_1+1,R3
02F8 20920200 sts _Ek_1,R2
02FC .dbline 96
02FC ; TCNT1 = 0x0000; //计数器清零
02FC 2224 clr R2
02FE 3324 clr R3
0300 3DBC out 0x2d,R3
0302 2CBC out 0x2c,R2
0304 .dbline -2
0304 .dbline 97
0304 ; }
0304 L18:
0304 6696 adiw R28,22
0306 00D0 rcall pop_gset5
0308 .dbline 0 ; func end
0308 0895 ret
030A .dbsym r speed 14 I
030A .dbsym l z 20 I
030A .dbsym l u 14 D
030A .dbsym r t 10 I
030A .dbsym r y 12 I
030A .dbsym r temp1 20 c
030A .dbsym l k 2 A[12:3]D
030A .dbsym l i 18 I
030A .dbend
030A .dbfunc e USARTInit _USARTInit fV
030A ; baudrate -> R16,R17
.even
030A _USARTInit::
030A .dbline -1
030A .dbline 101
030A ;
030A ; //***************************串口初始化函数************************//
030A ; void USARTInit(int baudrate)
030A ; {UCR = (1<_Data+4
0348 00910E00 lds R16,_adress
034C 10910F00 lds R17,_adress+1
0350 00D0 rcall _EEPROMReadBytes
0352 0BC0 rjmp L41
0354 L40:
0354 .dbline 110
0354 ; else
0354 ; EEPROMReadBytes(adress,&Data[6],2);
0354 82E0 ldi R24,2
0356 90E0 ldi R25,0
0358 9983 std y+1,R25
035A 8883 std y+0,R24
035C 20E0 ldi R18,<_Data+6
035E 30E0 ldi R19,>_Data+6
0360 00910E00 lds R16,_adress
0364 10910F00 lds R17,_adress+1
0368 00D0 rcall _EEPROMReadBytes
036A L41:
036A .dbline 111
036A ; switch(adress)
036A 80910E00 lds R24,_adress
036E 90910F00 lds R25,_adress+1
0372 8430 cpi R24,4
0374 E0E0 ldi R30,0
0376 9E07 cpc R25,R30
0378 99F1 breq L50
037A 84E0 ldi R24,4
037C 90E0 ldi R25,0
037E 20900E00 lds R2,_adress
0382 30900F00 lds R3,_adress+1
0386 8215 cp R24,R2
0388 9305 cpc R25,R3
038A 4CF0 brlt L61
038C L60:
038C 20900E00 lds R2,_adress
0390 30900F00 lds R3,_adress+1
0394 2220 tst R2
0396 11F4 brne X1
0398 3320 tst R3
039A F1F0 breq L48
039C X1:
039C 34C0 rjmp L47
039E L61:
039E 80910E00 lds R24,_adress
03A2 90910F00 lds R25,_adress+1
03A6 8830 cpi R24,8
03A8 E0E0 ldi R30,0
03AA 9E07 cpc R25,R30
03AC E9F0 breq L52
03AE 8830 cpi R24,8
03B0 E0E0 ldi R30,0
03B2 9E07 cpc R25,R30
03B4 44F1 brlt L47
03B6 L62:
03B6 80910E00 lds R24,_adress
03BA 90910F00 lds R25,_adress+1
03BE 8C30 cpi R24,12
03C0 E0E0 ldi R30,0
03C2 9E07 cpc R25,R30
03C4 A9F0 breq L54
03C6 8E30 cpi R24,14
03C8 E0E0 ldi R30,0
03CA 9E07 cpc R25,R30
03CC A9F0 breq L56
03CE 8031 cpi R24,16
03D0 E0E0 ldi R30,0
03D2 9E07 cpc R25,R30
03D4 A9F0 breq L58
03D6 17C0 rjmp L47
03D8 X2:
03D8 .dbline 112
03D8 L48:
03D8 .dbline 112
03D8 ; {case 0x0000:Data[3]=0xE4;break;
03D8 84EE ldi R24,228
03DA 80931300 sts _Data+3,R24
03DE .dbline 112
03DE 13C0 rjmp L47
03E0 L50:
03E0 .dbline 113
03E0 ; case 0x0004:Data[3]=0xE5;break;
03E0 85EE ldi R24,229
03E2 80931300 sts _Data+3,R24
03E6 .dbline 113
03E6 0FC0 rjmp L47
03E8 L52:
03E8 .dbline 114
03E8 ; case 0x0008:Data[3]=0xE6;break;
03E8 86EE ldi R24,230
03EA 80931300 sts _Data+3,R24
03EE .dbline 114
03EE 0BC0 rjmp L47
03F0 L54:
03F0 .dbline 115
03F0 ; case 0x000C:Data[3]=0xE7;break;
03F0 87EE ldi R24,231
03F2 80931300 sts _Data+3,R24
03F6 .dbline 115
03F6 07C0 rjmp L47
03F8 L56:
03F8 .dbline 116
03F8 ; case 0x000E:Data[3]=0xE8;break;
03F8 88EE ldi R24,232
03FA 80931300 sts _Data+3,R24
03FE .dbline 116
03FE 03C0 rjmp L47
0400 L58:
0400 .dbline 117
0400 89EE ldi R24,233
0402 80931300 sts _Data+3,R24
0406 .dbline 117
0406 .dbline 118
0406 L47:
0406 .dbline -2
0406 .dbline 119
0406 ; case 0x0010:Data[3]=0xE9;break;
0406 ; default :break;}
0406 ; }
0406 L39:
0406 2296 adiw R28,2
0408 .dbline 0 ; func end
0408 0895 ret
040A .dbend
040A .dbfunc e readdata _readdata fV
040A ; tempdata -> R22
040A ; trandata -> R20,R21
040A ; data -> R20
.even
040A _readdata::
040A 00D0 rcall push_gset2
040C 402F mov R20,R16
040E .dbline -1
040E .dbline 123
040E ;
040E ; //***************************读数据函数****************************//
040E ; void readdata(char data)
040E ; {int trandata;
040E .dbline 125
040E ; char tempdata;
040E ; if(data==0xE)
040E 4E30 cpi R20,14
0410 11F4 brne L64
0412 .dbline 126
0412 ; Eepromdata();
0412 7FDF rcall _Eepromdata
0414 23C0 rjmp L65
0416 L64:
0416 .dbline 128
0416 ; else
0416 ; {switch(data)
0416 .dbline 128
0416 5527 clr R21
0418 4130 cpi R20,1
041A E0E0 ldi R30,0
041C 5E07 cpc R21,R30
041E 49F0 breq L69
0420 4230 cpi R20,2
0422 E0E0 ldi R30,0
0424 5E07 cpc R21,R30
0426 41F0 breq L70
0428 4330 cpi R20,3
042A E0E0 ldi R30,0
042C 5E07 cpc R21,R30
042E 49F0 breq L71
0430 0BC0 rjmp L67
0432 X3:
0432 .dbline 129
0432 L69:
0432 .dbline 129
0432 ; {case 1:trandata=TCNT1;break; //读TCNT1
0432 4CB5 in R20,0x2c
0434 5DB5 in R21,0x2d
0436 .dbline 129
0436 08C0 rjmp L67
0438 L70:
0438 .dbline 130
0438 ; case 2:trandata=(int)(tempdata=TCNT0);break;//读TCNT0
0438 22B6 in R2,0x32
043A 622D mov R22,R2
043C 422D mov R20,R2
043E 5527 clr R21
0440 .dbline 130
0440 03C0 rjmp L67
0442 L71:
0442 .dbline 131
0442 ; case 3:trandata=GetOutputADC();break;//读A/D转换结果
0442 F2DD rcall _GetOutputADC
0444 402F mov R20,R16
0446 512F mov R21,R17
0448 .dbline 131
0448 .dbline 132
0448 ; default :break;}
0448 L67:
0448 .dbline 133
0448 ; Data[6]=(char)trandata;//数据低八位
0448 40931600 sts _Data+6,R20
044C .dbline 134
044C ; Data[7]=(char)(trandata>>8);//数据高八位
044C 242E mov R2,R20
044E 352E mov R3,R21
0450 232C mov R2,R3
0452 3324 clr R3
0454 27FC sbrc R2,7
0456 3094 com R3
0458 20921700 sts _Data+7,R2
045C .dbline 135
045C ; }
045C L65:
045C .dbline 136
045C ; Putdata(Data);
045C 00E0 ldi R16,<_Data
045E 10E0 ldi R17,>_Data
0460 CFDD rcall _Putdata
0462 .dbline -2
0462 .dbline 137
0462 ; }
0462 L63:
0462 00D0 rcall pop_gset2
0464 .dbline 0 ; func end
0464 0895 ret
0466 .dbsym r tempdata 22 c
0466 .dbsym r trandata 20 I
0466 .dbsym r data 20 c
0466 .dbend
0466 .dbfunc e order _order fV
.even
0466 _order::
0466 00D0 rcall push_gset1
0468 .dbline -1
0468 .dbline 141
0468 ;
0468 ; //***************************命令函数******************************//
0468 ; void order(void)
0468 ; {switch (Data[4])
0468 .dbline 141
0468 40911400 lds R20,_Data+4
046C 5527 clr R21
046E 403C cpi R20,192
0470 E0E0 ldi R30,0
0472 5E07 cpc R21,R30
0474 09F1 breq L79
0476 413C cpi R20,193
0478 E0E0 ldi R30,0
047A 5E07 cpc R21,R30
047C F9F0 breq L80
047E 423C cpi R20,194
0480 E0E0 ldi R30,0
0482 5E07 cpc R21,R30
0484 F9F0 breq L81
0486 433C cpi R20,195
0488 E0E0 ldi R30,0
048A 5E07 cpc R21,R30
048C 21F1 breq L82
048E 443C cpi R20,196
0490 E0E0 ldi R30,0
0492 5E07 cpc R21,R30
0494 49F1 breq L83
0496 453C cpi R20,197
0498 E0E0 ldi R30,0
049A 5E07 cpc R21,R30
049C 39F1 breq L84
049E 463C cpi R20,198
04A0 E0E0 ldi R30,0
04A2 5E07 cpc R21,R30
04A4 29F1 breq L85
04A6 483C cpi R20,200
04A8 E0E0 ldi R30,0
04AA 5E07 cpc R21,R30
04AC 41F1 breq L86
04AE 493C cpi R20,201
04B0 E0E0 ldi R30,0
04B2 5E07 cpc R21,R30
04B4 41F1 breq L87
04B6 2AC0 rjmp L76
04B8 X4:
04B8 .dbline 142
04B8 L79:
04B8 .dbline 142
04B8 ; {case 0xC0:PORTB=PORTB|0x04;break; //停止
04B8 C29A sbi 0x18,2
04BA .dbline 142
04BA 28C0 rjmp L76
04BC L80:
04BC .dbline 143
04BC ; case 0xC1:PORTB=PORTB&0xFB;break; //启动
04BC 88B3 in R24,0x18
04BE 8B7F andi R24,251
04C0 88BB out 0x18,R24
04C2 .dbline 143
04C2 24C0 rjmp L76
04C4 L81:
04C4 .dbline 145
04C4 ; case 0xC2: //正转
04C4 ; {PORTB=PORTB&0xFC|0x02;
04C4 .dbline 145
04C4 88B3 in R24,0x18
04C6 8C7F andi R24,252
04C8 8260 ori R24,2
04CA 88BB out 0x18,R24
04CC .dbline 146
04CC ; PORTD=PORTD&0x3F|0x40;
04CC 82B3 in R24,0x12
04CE 8F73 andi R24,63
04D0 8064 ori R24,64
04D2 82BB out 0x12,R24
04D4 .dbline 147
04D4 ; break;}
04D4 1BC0 rjmp L76
04D6 L82:
04D6 .dbline 149
04D6 ; case 0xC3: //反转
04D6 ; {PORTB=PORTB&0xFC|0x01;
04D6 .dbline 149
04D6 88B3 in R24,0x18
04D8 8C7F andi R24,252
04DA 8160 ori R24,1
04DC 88BB out 0x18,R24
04DE .dbline 150
04DE ; PORTD=PORTD&0x3F|0x80;
04DE 82B3 in R24,0x12
04E0 8F73 andi R24,63
04E2 8068 ori R24,128
04E4 82BB out 0x12,R24
04E6 .dbline 151
04E6 ; break;}
04E6 12C0 rjmp L76
04E8 L83:
04E8 .dbline 152
04E8 ; case 0xC4:Upspeed();break; //加速
04E8 A8DD rcall _Upspeed
04EA .dbline 152
04EA 10C0 rjmp L76
04EC L84:
04EC .dbline 153
04EC ; case 0xC5:Downspeed();break; //减速
04EC C9DD rcall _Downspeed
04EE .dbline 153
04EE 0EC0 rjmp L76
04F0 L85:
04F0 .dbline 155
04F0 ; case 0xC6: //制动
04F0 ; {PORTB=PORTB|0x03;
04F0 .dbline 155
04F0 88B3 in R24,0x18
04F2 8360 ori R24,3
04F4 88BB out 0x18,R24
04F6 .dbline 156
04F6 ; PORTD=PORTD&0x3F;
04F6 82B3 in R24,0x12
04F8 8F73 andi R24,63
04FA 82BB out 0x12,R24
04FC .dbline 157
04FC ; break;}
04FC 07C0 rjmp L76
04FE L86:
04FE .dbline 158
04FE ; case 0xC8:flage=1;break; //监控
04FE 81E0 ldi R24,1
0500 80930600 sts _flage,R24
0504 .dbline 158
0504 03C0 rjmp L76
0506 L87:
0506 .dbline 159
0506 2224 clr R2
0508 20920600 sts _flage,R2
050C .dbline 159
050C .dbline 160
050C L76:
050C .dbline -2
050C .dbline 162
050C ; case 0xC9:flage=0;break; //退出监控
050C ; default :break;
050C ; }
050C ; }
050C L74:
050C 00D0 rcall pop_gset1
050E .dbline 0 ; func end
050E 0895 ret
0510 .dbend
0510 .dbfunc e Datadisposal _Datadisposal fV
0510 ; operation -> R20
0510 ; temp -> R22,R23
.even
0510 _Datadisposal::
0510 00D0 rcall push_gset2
0512 2297 sbiw R28,2
0514 .dbline -1
0514 .dbline 167
0514 ;
0514 ;
0514 ; //***************************数据处理函数**************************//
0514 ; void Datadisposal(void)
0514 ; {char operation;
0514 .dbline 169
0514 ; int temp;
0514 ; operation=Data[3];
0514 40911300 lds R20,_Data+3
0518 .dbline 170
0518 ; temp=Data[4];
0518 60911400 lds R22,_Data+4
051C 7727 clr R23
051E .dbline 171
051E ; temp=temp<<8;
051E 762F mov R23,R22
0520 6627 clr R22
0522 .dbline 172
0522 ; adress=temp+Data[5];
0522 20901500 lds R2,_Data+5
0526 3324 clr R3
0528 462E mov R4,R22
052A 572E mov R5,R23
052C 420C add R4,R2
052E 531C adc R5,R3
0530 50920F00 sts _adress+1,R5
0534 40920E00 sts _adress,R4
0538 .dbline 173
0538 ; switch(operation&0x0F)
0538 642F mov R22,R20
053A 7727 clr R23
053C 6F70 andi R22,15
053E 7070 andi R23,0
0540 6030 cpi R22,0
0542 6707 cpc R22,R23
0544 49F0 breq L95
0546 X5:
0546 6130 cpi R22,1
0548 E0E0 ldi R30,0
054A 7E07 cpc R23,R30
054C 51F0 breq L96
054E 6230 cpi R22,2
0550 E0E0 ldi R30,0
0552 7E07 cpc R23,R30
0554 91F0 breq L98
0556 12C0 rjmp L93
0558 X6:
0558 .dbline 174
0558 L95:
0558 .dbline 174
0558 ; {case 0:readdata(operation>>4);break;
0558 042F mov R16,R20
055A 0295 swap R16
055C 0F70 andi R16,#0x0F
055E 55DF rcall _readdata
0560 .dbline 174
0560 0DC0 rjmp L93
0562 L96:
0562 .dbline 175
0562 ; case 1:EEPROMWriteBytes(adress,&Data[6],2);break;
0562 82E0 ldi R24,2
0564 90E0 ldi R25,0
0566 9983 std y+1,R25
0568 8883 std y+0,R24
056A 20E0 ldi R18,<_Data+6
056C 30E0 ldi R19,>_Data+6
056E 00910E00 lds R16,_adress
0572 10910F00 lds R17,_adress+1
0576 00D0 rcall _EEPROMWriteBytes
0578 .dbline 175
0578 01C0 rjmp L93
057A L98:
057A .dbline 176
057A 75DF rcall _order
057C .dbline 176
057C .dbline 177
057C L93:
057C .dbline -2
057C .dbline 179
057C ; case 2:order();break;
057C ; default :break;
057C ; }
057C ; }
057C L88:
057C 2296 adiw R28,2
057E 00D0 rcall pop_gset2
0580 .dbline 0 ; func end
0580 0895 ret
0582 .dbsym r operation 20 c
0582 .dbsym r temp 22 I
0582 .dbend
0582 .dbfunc e main _main fV
.even
0582 _main::
0582 .dbline -1
0582 .dbline 183
0582 ;
0582 ; //***************************主函数********************************//
0582 ; void main()
0582 ; {USARTInit(25); //初始化串口
0582 .dbline 183
0582 09E1 ldi R16,25
0584 10E0 ldi R17,0
0586 C1DE rcall _USARTInit
0588 .dbline 184
0588 ; TCNT1=00; //定时器1初始化
0588 2224 clr R2
058A 3324 clr R3
058C 3DBC out 0x2d,R3
058E 2CBC out 0x2c,R2
0590 .dbline 185
0590 ; TCCR1B=0x06;
0590 86E0 ldi R24,6
0592 8EBD out 0x2e,R24
0594 .dbline 186
0594 ; DDRB=0x0F; //I/O口初始化
0594 8FE0 ldi R24,15
0596 87BB out 0x17,R24
0598 .dbline 187
0598 ; DDRD=0xC0;
0598 80EC ldi R24,192
059A 81BB out 0x11,R24
059C .dbline 188
059C ; TIMSK=0x40; //中断初始化
059C 80E4 ldi R24,64
059E 89BF out 0x39,R24
05A0 .dbline 189
05A0 ; OCR2 = 0x0F; //PWM初始化
05A0 8FE0 ldi R24,15
05A2 83BD out 0x23,R24
05A4 .dbline 190
05A4 ; TCCR2=0x72;
05A4 82E7 ldi R24,114
05A6 85BD out 0x25,R24
05A8 .dbline 191
05A8 ; PORTB=PORTB&0xFC|0x01;
05A8 88B3 in R24,0x18
05AA 8C7F andi R24,252
05AC 8160 ori R24,1
05AE 88BB out 0x18,R24
05B0 .dbline 192
05B0 ; PORTD=PORTD&0x3F|0x80;
05B0 82B3 in R24,0x12
05B2 8F73 andi R24,63
05B4 8068 ori R24,128
05B6 82BB out 0x12,R24
05B8 .dbline 193
05B8 ; SEI();
05B8 7894 sei
05BA L100:
05BA .dbline 194
05BA .dbline 194
05BA L101:
05BA .dbline 194
05BA FFCF rjmp L100
05BC X7:
05BC .dbline -2
05BC .dbline 195
05BC ; do{} while(1); //等待中断
05BC ; }
05BC L99:
05BC .dbline 0 ; func end
05BC 0895 ret
05BE .dbend
.area vector(rom, abs)
.org 22
0016 DFC2 rjmp _UART_RXC
.area text(rom, con, rel)
05BE .dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c
05BE .dbfunc e UART_RXC _UART_RXC fV
05BE ; i -> R20
.even
05BE _UART_RXC::
05BE 00D0 rcall push_lset
05C0 00D0 rcall push_gset1
05C2 .dbline -1
05C2 .dbline 200
05C2 ;
05C2 ; //***************************串行接收中断服务程序******************//
05C2 ; #pragma interrupt_handler UART_RXC:12
05C2 ; void UART_RXC(void)
05C2 ; {char i=0;
05C2 .dbline 200
05C2 4427 clr R20
05C4 .dbline 201
05C4 ; CLI();
05C4 F894 cli
05C6 .dbline 202
05C6 ; Data[0]=UDR;
05C6 2CB0 in R2,0xc
05C8 20921000 sts _Data,R2
05CC .dbline 203
05CC ; if(Data[0]==0x55) //起始位检测
05CC 822D mov R24,R2
05CE 8535 cpi R24,85
05D0 C1F4 brne L104
05D2 .dbline 204
05D2 ; {do
05D2 .dbline 205
05D2 L109:
05D2 .dbline 205
05D2 L110:
05D2 .dbline 205
05D2 ; {while(!(USR&(1<_Data
05DC E42F mov R30,R20
05DE FF27 clr R31
05E0 E80F add R30,R24
05E2 F91F adc R31,R25
05E4 2CB0 in R2,0xc
05E6 2082 std z+0,R2
05E8 .dbline 208
05E8 ; if(i==9)
05E8 4930 cpi R20,9
05EA 09F4 brne L112
05EC .dbline 209
05EC 01C0 rjmp L108
05EE L112:
05EE .dbline 209
05EE L107:
05EE .dbline 209
05EE ; break;} while(1);
05EE F1CF rjmp L110
05F0 L108:
05F0 .dbline 210
05F0 ; if((Data[8]==0xFE)&&(Data[9]==0xFF)) //检测结束位
05F0 80911800 lds R24,_Data+8
05F4 8E3F cpi R24,254
05F6 29F4 brne L114
05F8 80911900 lds R24,_Data+9
05FC 8F3F cpi R24,255
05FE 09F4 brne L114
0600 .dbline 211
0600 87DF rcall _Datadisposal
0602 L114:
0602 .dbline 211
0602 ; Datadisposal();}
0602 L104:
0602 .dbline 212
0602 ; SEI();
0602 7894 sei
0604 .dbline -2
0604 .dbline 213
0604 ; }
0604 L103:
0604 00D0 rcall pop_gset1
0606 00D0 rcall pop_lset
0608 .dbline 0 ; func end
0608 1895 reti
060A .dbsym r i 20 c
060A .dbend
.area vector(rom, abs)
.org 8
0008 05C3 rjmp _TIM2_OVF
.area text(rom, con, rel)
060A .dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c
060A .dbfunc e TIM2_OVF _TIM2_OVF fV
.even
060A _TIM2_OVF::
060A 00D0 rcall push_lset
060C 2297 sbiw R28,2
060E .dbline -1
060E .dbline 218
060E ;
060E ; //***************************定时器2中断服务程序*******************//
060E ; #pragma interrupt_handler TIM2_OVF:5
060E ; void TIM2_OVF(void)
060E ; {CLI();
060E .dbline 218
060E F894 cli
0610 .dbline 219
0610 ; EEPROMReadBytes(0x000C,&itime,2);//读采样次数
0610 82E0 ldi R24,2
0612 90E0 ldi R25,0
0614 9983 std y+1,R25
0616 8883 std y+0,R24
0618 20E0 ldi R18,<_itime
061A 30E0 ldi R19,>_itime
061C 0CE0 ldi R16,12
061E 10E0 ldi R17,0
0620 00D0 rcall _EEPROMReadBytes
0622 .dbline 220
0622 ; a++;
0622 80910C00 lds R24,_a
0626 90910D00 lds R25,_a+1
062A 0196 adiw R24,1
062C 90930D00 sts _a+1,R25
0630 80930C00 sts _a,R24
0634 .dbline 221
0634 ; if(a==itime) //时间窗口判断,
0634 20900600 lds R2,_itime
0638 30900700 lds R3,_itime+1
063C 8215 cp R24,R2
063E 9305 cpc R25,R3
0640 39F4 brne L119
0642 .dbline 222
0642 ; {a = 0;
0642 .dbline 222
0642 2224 clr R2
0644 3324 clr R3
0646 30920D00 sts _a+1,R3
064A 20920C00 sts _a,R2
064E .dbline 223
064E ; PIDB();}
064E 3BDD rcall _PIDB
0650 .dbline 223
0650 L119:
0650 .dbline 224
0650 ; SEI();
0650 7894 sei
0652 .dbline -2
0652 .dbline 225
0652 ; }
0652 L118:
0652 2296 adiw R28,2
0654 00D0 rcall pop_lset
0656 .dbline 0 ; func end
0656 1895 reti
0658 .dbend
.area bss(ram, con, rel)
0000 .dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c
0000 _intxin::
0000 .blkb 2
0002 .dbsym e intxin _intxin X
0002 _floatxin::
0002 .blkb 4
0006 .dbsym e floatxin _floatxin X
0006 _itime::
0006 .blkb 2
0008 .dbsym e itime _itime I
0008 _t::
0008 .blkb 4
000C .dbsym e t _t D
000C _a::
000C .blkb 2
000E .dbsym e a _a I
000E _adress::
000E .blkb 2
0010 .dbsym e adress _adress I
0010 _Data::
0010 .blkb 10
001A .dbsym e Data _Data A[10:10]c
.area lit(rom, con, rel)
0000 L27:
0000 0000A040 .word 0x0,0x40a0
0004 L26:
0004 00007F43 .word 0x0,0x437f
0008 L23:
0008 85B10539 .word 0xb185,0x3905