📄 minid.lst
字号:
0490 8253 STD Z+3,R5
(0104) pidtemp *= (pp->I);
0491 01F5 MOVW R30,R10
0492 8024 LDD R2,Z+4
0493 8035 LDD R3,Z+5
0494 2444 CLR R4
0495 2455 CLR R5
0496 01FE MOVW R30,R28
0497 8060 LDD R6,Z+0
0498 8071 LDD R7,Z+1
0499 8082 LDD R8,Z+2
049A 8093 LDD R9,Z+3
049B 925A ST R5,-Y
049C 924A ST R4,-Y
049D 923A ST R3,-Y
049E 922A ST R2,-Y
049F 0183 MOVW R16,R6
04A0 0194 MOVW R18,R8
04A1 D386 RCALL empy32s
04A2 01FE MOVW R30,R28
04A3 8300 STD Z+0,R16
04A4 8311 STD Z+1,R17
04A5 8322 STD Z+2,R18
04A6 8333 STD Z+3,R19
(0105) result += pidtemp; // 积分项
04A7 01FE MOVW R30,R28
04A8 8020 LDD R2,Z+0
04A9 8031 LDD R3,Z+1
04AA 8042 LDD R4,Z+2
04AB 8053 LDD R5,Z+3
04AC 01FE MOVW R30,R28
04AD 8064 LDD R6,Z+4
04AE 8075 LDD R7,Z+5
04AF 8086 LDD R8,Z+6
04B0 8097 LDD R9,Z+7
04B1 0C62 ADD R6,R2
04B2 1C73 ADC R7,R3
04B3 1C84 ADC R8,R4
04B4 1C95 ADC R9,R5
04B5 01FE MOVW R30,R28
04B6 8264 STD Z+4,R6
04B7 8275 STD Z+5,R7
04B8 8286 STD Z+6,R8
04B9 8297 STD Z+7,R9
(0106)
(0107)
(0108) // pidtemp = derror;
(0109) // pidtemp *= (pp->D);
(0110) // result += pidtemp; // 微分项
(0111)
(0112) SumDu += result;
04BA 01FE MOVW R30,R28
04BB 8024 LDD R2,Z+4
04BC 8035 LDD R3,Z+5
04BD 8046 LDD R4,Z+6
04BE 8057 LDD R5,Z+7
04BF 90800144 LDS R8,SumDu+2
04C1 90900145 LDS R9,SumDu+3
04C3 90600142 LDS R6,SumDu
04C5 90700143 LDS R7,SumDu+1
04C7 0C62 ADD R6,R2
04C8 1C73 ADC R7,R3
04C9 1C84 ADC R8,R4
04CA 1C95 ADC R9,R5
04CB 92700143 STS SumDu+1,R7
04CD 92600142 STS SumDu,R6
04CF 92900145 STS SumDu+3,R9
04D1 92800144 STS SumDu+2,R8
(0113)
(0114) if (SumDu <= 0)
04D3 E040 LDI R20,0
04D4 E050 LDI R21,0
04D5 E060 LDI R22,0
04D6 E070 LDI R23,0
04D7 1546 CP R20,R6
04D8 0557 CPC R21,R7
04D9 0568 CPC R22,R8
04DA 0579 CPC R23,R9
04DB F014 BLT 0x04DE
(0115) {
(0116) K = 0;
04DC 24AA CLR R10
(0117) }
04DD C069 RJMP 0x0547
(0118)
(0119) else
(0120) {
(0121) result = SumDu;
04DE 90400144 LDS R4,SumDu+2
04E0 90500145 LDS R5,SumDu+3
04E2 90200142 LDS R2,SumDu
04E4 90300143 LDS R3,SumDu+1
04E6 01FE MOVW R30,R28
04E7 8224 STD Z+4,R2
04E8 8235 STD Z+5,R3
04E9 8246 STD Z+6,R4
04EA 8257 STD Z+7,R5
(0122) result /= 3000;
04EB EB48 LDI R20,0xB8
04EC E05B LDI R21,0xB
04ED E060 LDI R22,0
04EE E070 LDI R23,0
04EF 01FE MOVW R30,R28
04F0 8024 LDD R2,Z+4
04F1 8035 LDD R3,Z+5
04F2 8046 LDD R4,Z+6
04F3 8057 LDD R5,Z+7
04F4 937A ST R23,-Y
04F5 936A ST R22,-Y
04F6 935A ST R21,-Y
04F7 934A ST R20,-Y
04F8 0181 MOVW R16,R2
04F9 0192 MOVW R18,R4
04FA D2B2 RCALL div32s
04FB 01FE MOVW R30,R28
04FC 8304 STD Z+4,R16
04FD 8315 STD Z+5,R17
04FE 8326 STD Z+6,R18
04FF 8337 STD Z+7,R19
(0123)
(0124) if (result > 1000)
0500 EE48 LDI R20,0xE8
0501 E053 LDI R21,3
0502 E060 LDI R22,0
0503 E070 LDI R23,0
0504 01FE MOVW R30,R28
0505 8024 LDD R2,Z+4
0506 8035 LDD R3,Z+5
0507 8046 LDD R4,Z+6
0508 8057 LDD R5,Z+7
0509 1542 CP R20,R2
050A 0553 CPC R21,R3
050B 0564 CPC R22,R4
050C 0575 CPC R23,R5
050D F44C BGE 0x0517
(0125) result = 1000;
050E EE48 LDI R20,0xE8
050F E053 LDI R21,3
0510 E060 LDI R22,0
0511 E070 LDI R23,0
0512 01FE MOVW R30,R28
0513 8344 STD Z+4,R20
0514 8355 STD Z+5,R21
0515 8366 STD Z+6,R22
0516 8377 STD Z+7,R23
(0126)
(0127) result *= 0xff;
0517 01FE MOVW R30,R28
0518 8024 LDD R2,Z+4
0519 8035 LDD R3,Z+5
051A 8046 LDD R4,Z+6
051B 8057 LDD R5,Z+7
051C EF4F LDI R20,0xFF
051D E050 LDI R21,0
051E E060 LDI R22,0
051F E070 LDI R23,0
0520 925A ST R5,-Y
0521 924A ST R4,-Y
0522 923A ST R3,-Y
0523 922A ST R2,-Y
0524 018A MOVW R16,R20
0525 019B MOVW R18,R22
0526 D301 RCALL empy32s
0527 01FE MOVW R30,R28
0528 8304 STD Z+4,R16
0529 8315 STD Z+5,R17
052A 8326 STD Z+6,R18
052B 8337 STD Z+7,R19
(0128) result /=1000;
052C EE48 LDI R20,0xE8
052D E053 LDI R21,3
052E E060 LDI R22,0
052F E070 LDI R23,0
0530 01FE MOVW R30,R28
0531 8024 LDD R2,Z+4
0532 8035 LDD R3,Z+5
0533 8046 LDD R4,Z+6
0534 8057 LDD R5,Z+7
0535 937A ST R23,-Y
0536 936A ST R22,-Y
0537 935A ST R21,-Y
0538 934A ST R20,-Y
0539 0181 MOVW R16,R2
053A 0192 MOVW R18,R4
053B D271 RCALL div32s
053C 01FE MOVW R30,R28
053D 8304 STD Z+4,R16
053E 8315 STD Z+5,R17
053F 8326 STD Z+6,R18
0540 8337 STD Z+7,R19
(0129)
(0130) K = result;
0541 01FE MOVW R30,R28
0542 80A4 LDD R10,Z+4
(0131) K = PIDBound(K, Fact_Value); //计算控制值上限
0543 0196 MOVW R18,R12
0544 2D0A MOV R16,R10
0545 D005 RCALL _PIDBound
0546 2EA0 MOV R10,R16
(0132) }
(0133)
(0134) return K;
0547 2D0A MOV R16,R10
0548 9628 ADIW R28,0x8
0549 D30E RCALL pop_gset5
054A 9508 RET
(0135) }
(0136)
(0137) byte PIDBound(byte K, word Fact_Value)
(0138) {
(0139) //if (K >0x7f )
(0140) //{
(0141) // K = 0x7f;
(0142) //}
(0143)
(0144) return K;
_PIDBound:
Fact_Value --> R18
K --> R16
054B 9508 RET
FILE: D:\bak\新建文件夹\函数库\IIC\IIC.C
(0001) /*****************************************************************
(0002) * 文件名: IIC.c
(0003) * 版本号:
(0004) * 创作日期: 2005.7.7
(0005) * 作者: fengzm
(0006) * 功能说明: IIC数据传输
(0007) * 其它说明: 使用AVR单片机Atmega48, 晶振:8Mhz
(0008) 注意:发送START信号之后软件不要清零TWCR的"TWSTA"位。
(0009) *****************************************************************/
(0010)
(0011)
(0012) /*****************************************************************
(0013)
(0014) * 修改日期: 2005.7.8
(0015) * 修改人: wangzq
(0016) * 修改原因: 格式调整
(0017)
(0018) 说明:
(0019) FirstData = 0; IicData = 待发数据;START_IIC();开始发送数据。
(0020) FirstData == 0xff 表示发送结束。
(0021) *******************************************************************/
(0022)
(0023)
(0024) //包含文件
(0025) #include "IIC.h"
(0026)
(0027)
(0028)
(0029) // TWI initialize
(0030) // bit rate:32,prescal:1,rate:100Khz;
(0031) void twi_init(void)
(0032) {
(0033) TWCR = 0x00; //disable twi
_twi_init:
054C 2422 CLR R2
054D 922000BC STS 0xBC,R2
(0034) TWBR = 0x20; //set bit rate equal 32
054F E280 LDI R24,0x20
0550 938000B8 STS 0xB8,R24
(0035) TWSR = 0x00; //set prescale clock/1
0552 922000B9 STS 0xB9,R2
(0036) TWAR = 0x00; //set slave address
0554 922000BA STS 0xBA,R2
(0037) TWCR = 0x85; //enable twi
0556 E885 LDI R24,0x85
0557 938000BC STS 0xBC,R24
0559 9508 RET
_twi_isr:
IicTwsr --> R16
055A 922A ST R2,-Y
055B 930A ST R16,-Y
055C 931A ST R17,-Y
055D 938A ST R24,-Y
055E 939A ST R25,-Y
055F 93EA ST R30,-Y
0560 B62F IN R2,0x3F
0561 922A ST R2,-Y
(0038) }
(0039)
(0040) #pragma interrupt_handler twi_isr:25
(0041) void twi_isr(void)
(0042) {
(0043) byte IicTwsr;
(0044)
(0045) IicTwsr = TWSR & 0xF8;
0562 910000B9 LDS R16,0xB9
0564 7F08 ANDI R16,0xF8
(0046) switch (IicTwsr)
0565 2711 CLR R17
0566 3200 CPI R16,0x20
0567 E0E0 LDI R30,0
0568 071E CPC R17,R30
0569 F151 BEQ 0x0594
056A E280 LDI R24,0x20
056B E090 LDI R25,0
056C 1780 CP R24,R16
056D 0791 CPC R25,R17
056E F074 BLT 0x057D
056F 3008 CPI R16,0x8
0570 E0E0 LDI R30,0
0571 071E CPC R17,R30
0572 F0B9 BEQ 0x058A
0573 3008 CPI R16,0x8
0574 E0E0 LDI R30,0
0575 071E CPC R17,R30
0576 F40C BGE 0x0578
0577 C045 RJMP 0x05BD
0578 3108 CPI R16,0x18
0579 E0E0 LDI R30,0
057A 071E CPC R17,R30
057B F0C1 BEQ 0x0594
057C C040 RJMP 0x05BD
057D 3208 CPI R16,0x28
057E E0E0 LDI R30,0
057F 071E CPC R17,R30
0580 F109 BEQ 0x05A2
0581 3208 CPI R16,0x28
0582 E0E0 LDI R30,0
0583 071E CPC R17,R30
0584 F1C4 BLT 0x05BD
0585 3300 CPI R16,0x30
0586 E0E0 LDI R30,0
0587 071E CPC R17,R30
0588 F0C9 BEQ 0x05A2
0589 C033 RJMP 0x05BD
(0047) {
(0048) case 0x08:
(0049) TWDR = 0x58; //发送命令;
058A E588 LDI R24,0x58
058B 938000BB STS 0xBB,R24
(0050) START_IIC(); //开始发送
058D E885 LDI R24,0x85
058E 938000BC STS 0xBC,R24
(0051) g_FirstData = 0;
0590 2422 CLR R2
0591 9220013D STS g_FirstData,R2
(0052) break;
0593 C031 RJMP 0x05C5
(0053)
(0054) case 0x18:
(0055) case 0x20:
(0056) if (g_FirstData == 0)
0594 9020013D LDS R2,g_FirstData
0596 2022 TST R2
0597 F569 BNE 0x05C5
(0057) {
(0058) TWDR=0x00; //发送命令;
0598 2422 CLR R2
0599 922000BB STS 0xBB,R2
(0059) START_IIC(); //开始发送
059B E885 LDI R24,0x85
059C 938000BC STS 0xBC,R24
(0060) g_FirstData = 1;
059E E081 LDI R24,1
059F 9380013D STS g_FirstData,R24
(0061) }
(0062) break;
05A1 C023 RJMP 0x05C5
(0063)
(0064) case 0x28:
(0065) case 0x30:
(0066) if (g_FirstData == 2)
05A2 9180013D LDS R24,g_FirstData
05A4 3082 CPI R24,2
05A5 F441 BNE 0x05AE
(0067) {
(0068) TWCR |= 0x10; //发出停止位,停止发送;
05A6 918000BC LDS R24,0xBC
05A8 6180 ORI R24,0x10
05A9 938000BC STS 0xBC,R24
(0069) g_FirstData = 0xff; //发送完成;
05AB EF8F LDI R24,0xFF
05AC 9380013D STS g_FirstData,R24
(0070) }
(0071) if (g_FirstData == 1)
05AE 9180013D LDS R24,g_FirstData
05B0 3081 CPI R24,1
05B1 F499 BNE 0x05C5
(0072) {
(0073) TWDR = g_IicData; //发送数据;
05B2 9020013C LDS R2,g_IicData
05B4 922000BB STS 0xBB,R2
(0074) START_IIC(); //开始发送
05B6 E885 LDI R24,0x85
05B7 938000BC STS 0xBC,R24
(0075) g_FirstData = 2;
05B9 E082 LDI R24,2
05BA 9380013D STS g_FirstData,R24
(0076) }
(0077) break;
05BC C008 RJMP 0x05C5
(0078)
(0079) default:
(0080) TWCR |= 0x10; //发出停止位,停止发送;
05BD 918000BC LDS R24,0xBC
05BF 6180 ORI R24,0x10
05C0 938000BC STS 0xBC,R24
(0081) g_FirstData = 0xff; //发送完成;
05C2 EF8F LDI R24,0xFF
05C3 9380013D STS g_FirstData,R24
(0082) break;
05C5 9029 LD R2,Y+
05C6 BE2F OUT 0x3F,R2
05C7 91E9 LD R30,Y+
05C8 9199 LD R25,Y+
05C9 9189 LD R24,Y+
05CA 9119 LD R17,Y+
05CB 9109 LD R16,Y+
05CC 9029 LD R2,Y+
05CD 9518 RETI
FILE: D:\bak\新建文件夹\minid0712.c
(0001) /*****************************************************************
(0002) * 文件名: main.c
(0003) * 版本号:
(0004) * 创作日期: 2005.7.12
(0005) * 作者: fengzm
(0006) * 功能说明: 主函数
(0007) * 其它说明: 使用AVR单片机Atmega48, 晶振:8Mhz
(0008)
(0009) *****************************************************************/
(0010)
(0011)
(0012) /*****************************************************************
(0013)
(0014) * 修改日期:
(0015) * 修改人:
(0016) * 修改原因
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -