📄 minid.lst
字号:
__text_start:
__start:
001A EFCF LDI R28,0xFF
001B E0D2 LDI R29,2
001C BFCD OUT 0x3D,R28
001D BFDE OUT 0x3E,R29
001E 52C0 SUBI R28,0x20
001F 40D0 SBCI R29,0
0020 EA0A LDI R16,0xAA
0021 8308 STD Y+0,R16
0022 2400 CLR R0
0023 E0E0 LDI R30,0
0024 E0F1 LDI R31,1
0025 E011 LDI R17,1
0026 31ED CPI R30,0x1D
0027 07F1 CPC R31,R17
0028 F011 BEQ 0x002B
0029 9201 ST R0,Z+
002A CFFB RJMP 0x0026
002B 8300 STD Z+0,R16
002C E3E4 LDI R30,0x34
002D E0F0 LDI R31,0
002E E0A0 LDI R26,0
002F E0B1 LDI R27,1
0030 E010 LDI R17,0
0031 33E4 CPI R30,0x34
0032 07F1 CPC R31,R17
0033 F021 BEQ 0x0038
0034 95C8 LPM
0035 9631 ADIW R30,1
0036 920D ST R0,X+
0037 CFF9 RJMP 0x0031
0038 D025 RCALL _main
_exit:
0039 CFFF RJMP _exit
FILE: E:\PMax\单片机源代码\函数库\MiniD\MiniD_20050711.c
(0001) //ICC-AVR application builder : 2005-7-11 14:38:07
(0002) // Target : M48
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include "Minid.h"
(0006)
(0007)
(0008) //函数定义
(0009) void adc_init(void); //ADC initialize
(0010) void adc_isr(void);
(0011) word AdcPedal(word adcp); //踏板信号转换为对应的控制值
(0012)
(0013)
(0014) void port_init(void)
(0015) {
(0016) PORTB = 0xff;
_port_init:
003A EF8F LDI R24,0xFF
003B B985 OUT 0x05,R24
(0017) DDRB = 0x00;
003C 2422 CLR R2
003D B824 OUT 0x04,R2
(0018) PORTC = 0xff; //m103 output only
003E B988 OUT 0x08,R24
(0019) DDRC = 0x00;
003F B827 OUT 0x07,R2
(0020) PORTD = 0xff;
0040 B98B OUT 0x0B,R24
(0021) DDRD = 0x00;
0041 B82A OUT 0x0A,R2
0042 9508 RET
(0022) }
(0023)
(0024) //call this routine to initialize all peripherals
(0025) void init_devices(void)
(0026) {
(0027) //stop errant interrupts until set up
(0028) CLI(); //disable all interrupts
_init_devices:
0043 94F8 BCLR 7
(0029) port_init();
0044 DFF5 RCALL _port_init
(0030) timer1_init();
0045 D04B RCALL _timer1_init
(0031)
(0032) MCUCR = 0x00;
0046 2422 CLR R2
0047 BE25 OUT 0x35,R2
(0033) EICRA = 0x00; //extended ext ints
0048 92200069 STS 0x69,R2
(0034) EIMSK = 0x00;
004A BA2D OUT 0x1D,R2
(0035)
(0036) TIMSK0 = 0x00; //timer 0 interrupt sources
004B 9220006E STS 0x6E,R2
(0037) TIMSK1 = 0x21; //timer 1 interrupt sources
004D E281 LDI R24,0x21
004E 9380006F STS 0x6F,R24
(0038) TIMSK2 = 0x00; //timer 2 interrupt sources
0050 92200070 STS 0x70,R2
(0039)
(0040) PCMSK0 = 0x00; //pin change mask 0
0052 9220006B STS 0x6B,R2
(0041) PCMSK1 = 0x00; //pin change mask 1
0054 9220006C STS 0x6C,R2
(0042) PCMSK2 = 0x00; //pin change mask 2
0056 9220006D STS 0x6D,R2
(0043) PCICR = 0x00; //pin change enable
0058 92200068 STS 0x68,R2
(0044) PRR = 0x00; //power controller
005A 92200064 STS 0x64,R2
(0045) SEI(); //re-enable interrupts
005C 9478 BSET 7
005D 9508 RET
_main:
d --> R20
jj --> R22
j --> R10
i --> Y+0
005E 9724 SBIW R28,4
(0046) //all peripherals are now initialized
(0047) }
(0048)
(0049) //
(0050) void main(void)
(0051) {
(0052) dword i;
(0053) word j,jj;
(0054) byte d;
(0055) init_devices();
005F DFE3 RCALL _init_devices
(0056)
(0057) //insert your functional code here...
(0058) PIDInit (&sPID);
0060 E00D LDI R16,0xD
0061 E011 LDI R17,1
0062 D228 RCALL _PIDInit
0063 C02A RJMP 0x008E
(0059) while (1)
(0060) {
(0061) i = g_DeltaEnc;
0064 90400106 LDS R4,g_DeltaEnc+2
0066 90500107 LDS R5,g_DeltaEnc+3
0068 90200104 LDS R2,g_DeltaEnc
006A 90300105 LDS R3,g_DeltaEnc+1
006C 01FE MOVW R30,R28
006D 8220 STD Z+0,R2
006E 8231 STD Z+1,R3
006F 8242 STD Z+2,R4
0070 8253 STD Z+3,R5
(0062) j ++;
0071 01C5 MOVW R24,R10
0072 9601 ADIW R24,1
0073 015C MOVW R10,R24
(0063) jj = AdcPedal(j);
0074 018C MOVW R16,R24
0075 D194 RCALL _AdcPedal
0076 01B8 MOVW R22,R16
(0064) sPID.I = 0;
0077 2422 CLR R2
0078 2433 CLR R3
0079 92300112 STS 0x112,R3
007B 92200111 STS 0x111,R2
(0065) sPID.P = 0;
007D 92300110 STS sPID+3,R3
007F 9220010F STS sPID+2,R2
(0066) sPID.SetValue = 5000;
0081 E888 LDI R24,0x88
0082 E193 LDI R25,0x13
0083 9390010E STS sPID+1,R25
0085 9380010D STS sPID,R24
(0067) d = PIDCalc(&sPID, i);
0087 01FE MOVW R30,R28
0088 8120 LDD R18,Z+0
0089 8131 LDD R19,Z+1
008A E00D LDI R16,0xD
008B E011 LDI R17,1
008C D20C RCALL _PIDCalc
008D 2F40 MOV R20,R16
008E CFD5 RJMP 0x0064
008F 9624 ADIW R28,4
0090 9508 RET
FILE: E:\PMax\单片机源代码\函数库\ENC\ENC.c
(0001) /*****************************************************************
(0002) * 文件名: ENC.c
(0003) * 版本号:
(0004) * 创作日期: 2005.7.7
(0005) * 作者: wangzq
(0006) * 功能说明: 采集转速数值
(0007)
(0008) * 其它说明: 使用AVR单片机Atmaga48, 晶振:8Mhz
(0009)
(0010) *****************************************************************/
(0011)
(0012)
(0013) /*****************************************************************
(0014)
(0015) * 修改日期:
(0016) * 修改人:
(0017) * 修改原因:
(0018)
(0019) *******************************************************************/
(0020)
(0021)
(0022) //包含文件
(0023) #include "ENC.h"
(0024)
(0025) //TIMER1 initialize - prescale:1
(0026) // WGM: 0) Normal, TOP=0xFFFF
(0027) // desired value:
(0028) // actual value: Out of range
(0029) void timer1_init(void)
(0030) {
(0031) TCCR1B = 0x00; //stop
_timer1_init:
0091 2422 CLR R2
0092 92200081 STS 0x81,R2
(0032) TCNT1H = 0x00 /*INVALID SETTING*/; //setup
0094 92200085 STS 0x85,R2
(0033) TCNT1L = 0x00 /*INVALID SETTING*/;
0096 92200084 STS 0x84,R2
(0034) OCR1AH = 0x00 /*INVALID SETTING*/;
0098 92200089 STS 0x89,R2
(0035) OCR1AL = 0x00 /*INVALID SETTING*/;
009A 92200088 STS 0x88,R2
(0036) OCR1BH = 0x00 /*INVALID SETTING*/;
009C 9220008B STS 0x8B,R2
(0037) OCR1BL = 0x00 /*INVALID SETTING*/;
009E 9220008A STS 0x8A,R2
(0038) ICR1H = 0x00 /*INVALID SETTING*/;
00A0 92200087 STS 0x87,R2
(0039) ICR1L = 0x00 /*INVALID SETTING*/;
00A2 92200086 STS 0x86,R2
(0040) TCCR1A = 0x00;
00A4 92200080 STS 0x80,R2
(0041) TCCR1B = 0xC1; //start Timer
00A6 EC81 LDI R24,0xC1
00A7 93800081 STS 0x81,R24
00A9 9508 RET
_timer1_capt_isr:
00AA 922A ST R2,-Y
00AB 923A ST R3,-Y
00AC 924A ST R4,-Y
00AD 925A ST R5,-Y
00AE 928A ST R8,-Y
00AF 929A ST R9,-Y
00B0 938A ST R24,-Y
00B1 939A ST R25,-Y
00B2 93EA ST R30,-Y
00B3 B62F IN R2,0x3F
00B4 922A ST R2,-Y
00B5 D4AD RCALL push_gset2
(0042) }
(0043)
(0044) #pragma interrupt_handler timer1_capt_isr:11
(0045) void timer1_capt_isr(void)
(0046) {
(0047) g_CntUpdate = ICR1L;
00B6 90200086 LDS R2,0x86
00B8 2433 CLR R3
00B9 9230010B STS g_CntUpdate+1,R3
00BB 9220010A STS g_CntUpdate,R2
(0048) g_CntUpdate |=(int)ICR1H << 8;
00BD 90200087 LDS R2,0x87
00BF 2433 CLR R3
00C0 2C32 MOV R3,R2
00C1 2422 CLR R2
00C2 9040010A LDS R4,g_CntUpdate
00C4 9050010B LDS R5,g_CntUpdate+1
00C6 2842 OR R4,R2
00C7 2853 OR R5,R3
00C8 9250010B STS g_CntUpdate+1,R5
00CA 9240010A STS g_CntUpdate,R4
(0049)
(0050) if ((TIFR1&0x01) != 0) //判断定时器1溢出
00CC 9BB0 SBIS 0x16,0
00CD C006 RJMP 0x00D4
(0051) {
(0052) g_TotalEnc++;
00CE 9180010C LDS R24,g_TotalEnc
00D0 5F8F SUBI R24,0xFF
00D1 9380010C STS g_TotalEnc,R24
(0053) TIFR1 |= 0x01; //取消定时器1溢出标志位
00D3 9AB0 SBI 0x16,0
(0054) }
(0055)
(0056) if (g_CntOld < g_CntUpdate)
00D4 9020010A LDS R2,g_CntUpdate
00D6 9030010B LDS R3,g_CntUpdate+1
00D8 90400108 LDS R4,g_CntOld
00DA 90500109 LDS R5,g_CntOld+1
00DC 1442 CP R4,R2
00DD 0453 CPC R5,R3
00DE F498 BCC 0x00F2
(0057) {
(0058) g_DeltaEnc = g_CntUpdate - g_CntOld;
00DF 0112 MOVW R2,R4
00E0 9040010A LDS R4,g_CntUpdate
00E2 9050010B LDS R5,g_CntUpdate+1
00E4 1842 SUB R4,R2
00E5 0853 SBC R5,R3
00E6 0112 MOVW R2,R4
00E7 2444 CLR R4
00E8 2455 CLR R5
00E9 92300105 STS g_DeltaEnc+1,R3
00EB 92200104 STS g_DeltaEnc,R2
00ED 92500107 STS g_DeltaEnc+3,R5
00EF 92400106 STS g_DeltaEnc+2,R4
(0059)
(0060) }
00F1 C020 RJMP 0x0112
(0061) else
(0062) {
(0063) g_DeltaEnc = (0x10000 - g_CntOld) + g_CntUpdate;
00F2 90200108 LDS R2,g_CntOld
00F4 90300109 LDS R3,g_CntOld+1
00F6 2444 CLR R4
00F7 2455 CLR R5
00F8 E040 LDI R20,0
00F9 E050 LDI R21,0
00FA E061 LDI R22,1
00FB E070 LDI R23,0
00FC 1942 SUB R20,R2
00FD 0953 SBC R21,R3
00FE 0964 SBC R22,R4
00FF 0975 SBC R23,R5
0100 9020010A LDS R2,g_CntUpdate
0102 9030010B LDS R3,g_CntUpdate+1
0104 2444 CLR R4
0105 2455 CLR R5
0106 0D42 ADD R20,R2
0107 1D53 ADC R21,R3
0108 1D64 ADC R22,R4
0109 1D75 ADC R23,R5
010A 93500105 STS g_DeltaEnc+1,R21
010C 93400104 STS g_DeltaEnc,R20
010E 93700107 STS g_DeltaEnc+3,R23
0110 93600106 STS g_DeltaEnc+2,R22
(0064) }
(0065)
(0066) if (g_TotalEnc > 10)
0112 E08A LDI R24,0xA
0113 9020010C LDS R2,g_TotalEnc
0115 1582 CP R24,R2
0116 F500 BCC 0x0137
(0067) g_TotalEnc = 10;
0117 9380010C STS g_TotalEnc,R24
(0068)
(0069) for (; g_TotalEnc != 0; g_TotalEnc--)
0119 C01D RJMP 0x0137
(0070) {
(0071) g_DeltaEnc += 0x10000;
011A E040 LDI R20,0
011B E050 LDI R21,0
011C E061 LDI R22,1
011D E070 LDI R23,0
011E 90400106 LDS R4,g_DeltaEnc+2
0120 90500107 LDS R5,g_DeltaEnc+3
0122 90200104 LDS R2,g_DeltaEnc
0124 90300105 LDS R3,g_DeltaEnc+1
0126 0E24 ADD R2,R20
0127 1E35 ADC R3,R21
0128 1E46 ADC R4,R22
0129 1E57 ADC R5,R23
012A 92300105 STS g_DeltaEnc+1,R3
012C 92200104 STS g_DeltaEnc,R2
012E 92500107 STS g_DeltaEnc+3,R5
0130 92400106 STS g_DeltaEnc+2,R4
0132 9180010C LDS R24,g_TotalEnc
0134 5081 SUBI R24,1
0135 9380010C STS g_TotalEnc,R24
0137 9020010C LDS R2,g_TotalEnc
0139 2022 TST R2
013A F6F9 BNE 0x011A
(0072) }
(0073) /*
(0074) g_DeltaEnc *= 125;
(0075) g_DeltaEnc /=1000;
(0076) g_DeltaEnc *= 72;
(0077) g_DeltaEnc = 60000000 / g_DeltaEnc;
(0078)
(0079) //if (g_DeltaEnc > 6000)
(0080) //g_DeltaEnc = 6000;
(0081) //g_DeltaEnc *= 0xff;
(0082) //g_DeltaEnc /=6000;
(0083) */
(0084) g_TotalEnc = 0; //速度溢出标志清零
013B 2422 CLR R2
013C 9220010C STS g_TotalEnc,R2
(0085) g_CntOld = g_CntUpdate; //准备下次采样
013E 9020010A LDS R2,g_CntUpdate
0140 9030010B LDS R3,g_CntUpdate+1
0142 92300109 STS g_CntOld+1,R3
0144 92200108 STS g_CntOld,R2
0146 D410 RCALL pop_gset2
0147 9029 LD R2,Y+
0148 BE2F OUT 0x3F,R2
0149 91E9 LD R30,Y+
014A 9199 LD R25,Y+
014B 9189 LD R24,Y+
014C 9099 LD R9,Y+
014D 9089 LD R8,Y+
014E 9059 LD R5,Y+
014F 9049 LD R4,Y+
0150 9039 LD R3,Y+
0151 9029 LD R2,Y+
0152 9518 RETI
_timer1_ovf_isr:
0153 938A ST R24,-Y
0154 939A ST R25,-Y
0155 B78F IN R24,0x3F
0156 938A ST R24,-Y
(0086) }
(0087)
(0088)
(0089)
(0090) #pragma interrupt_handler timer1_ovf_isr:14
(0091) void timer1_ovf_isr(void)
(0092) {
(0093) g_TotalEnc ++; //速度溢出标志
0157 9180010C LDS R24,g_TotalEnc
0159 5F8F SUBI R24,0xFF
015A 9380010C STS g_TotalEnc,R24
015C 9189 LD R24,Y+
015D BF8F OUT 0x3F,R24
015E 9199 LD R25,Y+
015F 9189 LD R24,Y+
0160 9518 RETI
FILE: E:\PMax\单片机源代码\函数库\ADC\ADC.c
(0001) /*****************************************************************
(0002) * 文件名: ADC.c
(0003) * 版本号:
(0004) * 创作日期: 2005.7.7
(0005) * 作者: fengzm
(0006) * 功能说明: 可采集7个AD通道的值,使用了RC滤波;
(0007) * 其它说明: 使用AVR单片机Atmaga48, 晶振:8Mhz
(0008) 调用ADC文件的时候只需要输入通道号即可,如ADC(7);
(0009) *****************************************************************/
(0010)
(0011)
(0012) /*****************************************************************
(0013)
(0014) * 修改日期: 2005.7.8
(0015) * 修改人: wangzq
(0016) * 修改原因: 优化代码
(0017) 定时器0溢出触发A/D转换
(0018) 修改g_AdcNum改变通道号,默认值0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -