📄 minid.lst
字号:
__start:
__text_start:
001A EFCF LDI R28,0xFF
001B E0D4 LDI R29,4
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 34E6 CPI R30,0x46
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 D63F RCALL _main
_exit:
0039 CFFF RJMP _exit
FILE: D:\bak\新建文件夹\函数库\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;
(0019) g_ValueAdc返回A/D转换后的滤波值;
(0020) g_AdcEnd 0xff表示当前返回值有效;
(0021) *******************************************************************/
(0022)
(0023)
(0024) //包含文件
(0025) #include "ADC.h"
(0026)
(0027) // ADC initialize
(0028) // Conversion time: 13uS,CLOCK/8;
(0029) void adc_init(void)
(0030) {
(0031) ADCSRA = 0x00; //disable adc
_adc_init:
003A 2422 CLR R2
003B 9220007A STS 0x7A,R2
(0032) ADMUX = 0x00; //select adc input 0
003D 9220007C STS 0x7C,R2
(0033) ACSR = 0x80; //not need the compare function
003F E880 LDI R24,0x80
0040 BF80 OUT 0x30,R24
(0034) ADCSRB = 0x04; //定时器0溢出触发转换
0041 E084 LDI R24,4
0042 9380007B STS 0x7B,R24
0044 9508 RET
_adc_isr:
j --> Y+0
0045 920A ST R0,-Y
0046 921A ST R1,-Y
0047 922A ST R2,-Y
0048 923A ST R3,-Y
0049 924A ST R4,-Y
004A 925A ST R5,-Y
004B 926A ST R6,-Y
004C 927A ST R7,-Y
004D 928A ST R8,-Y
004E 929A ST R9,-Y
004F 930A ST R16,-Y
0050 931A ST R17,-Y
0051 932A ST R18,-Y
0052 933A ST R19,-Y
0053 938A ST R24,-Y
0054 93EA ST R30,-Y
0055 93FA ST R31,-Y
0056 B60F IN R0,0x3F
0057 920A ST R0,-Y
0058 D807 RCALL push_gset2
0059 9724 SBIW R28,4
(0035) }
(0036)
(0037) #pragma interrupt_handler adc_isr:22
(0038) void adc_isr(void)
(0039) {
(0040) dword j;
(0041)
(0042) j =ADCL; //Read 8 low bits first (impo
005A 90200078 LDS R2,0x78
005C 2433 CLR R3
005D 2444 CLR R4
005E 2455 CLR R5
005F 01FE MOVW R30,R28
0060 8220 STD Z+0,R2
0061 8231 STD Z+1,R3
0062 8242 STD Z+2,R4
0063 8253 STD Z+3,R5
(0043) j |=(int)ADCH << 8; //read 2 high bits and shift into topbyte
0064 90200079 LDS R2,0x79
0066 2433 CLR R3
0067 2C32 MOV R3,R2
0068 2422 CLR R2
0069 2444 CLR R4
006A FC37 SBRC R3,7
006B 9440 COM R4
006C 2455 CLR R5
006D FC47 SBRC R4,7
006E 9450 COM R5
006F 01FE MOVW R30,R28
0070 8060 LDD R6,Z+0
0071 8071 LDD R7,Z+1
0072 8082 LDD R8,Z+2
0073 8093 LDD R9,Z+3
0074 2862 OR R6,R2
0075 2873 OR R7,R3
0076 2884 OR R8,R4
0077 2895 OR R9,R5
0078 01FE MOVW R30,R28
0079 8260 STD Z+0,R6
007A 8271 STD Z+1,R7
007B 8282 STD Z+2,R8
007C 8293 STD Z+3,R9
(0044)
(0045) j *= ADCK; //RC filtering
007D 01FE MOVW R30,R28
007E 8020 LDD R2,Z+0
007F 8031 LDD R3,Z+1
0080 8042 LDD R4,Z+2
0081 8053 LDD R5,Z+3
0082 E042 LDI R20,2
0083 E050 LDI R21,0
0084 E060 LDI R22,0
0085 E070 LDI R23,0
0086 925A ST R5,-Y
0087 924A ST R4,-Y
0088 923A ST R3,-Y
0089 922A ST R2,-Y
008A 018A MOVW R16,R20
008B 019B MOVW R18,R22
008C D79B RCALL empy32s
008D 01FE MOVW R30,R28
008E 8300 STD Z+0,R16
008F 8311 STD Z+1,R17
0090 8322 STD Z+2,R18
0091 8333 STD Z+3,R19
(0046) j += (10-ADCK) * g_ValueAdc;
0092 9120013E LDS R18,g_ValueAdc
0094 9130013F LDS R19,g_ValueAdc+1
0096 E008 LDI R16,0x8
0097 E010 LDI R17,0
0098 D77F RCALL empy16s
0099 0118 MOVW R2,R16
009A 2444 CLR R4
009B 2455 CLR R5
009C 01FE MOVW R30,R28
009D 8060 LDD R6,Z+0
009E 8071 LDD R7,Z+1
009F 8082 LDD R8,Z+2
00A0 8093 LDD R9,Z+3
00A1 0C62 ADD R6,R2
00A2 1C73 ADC R7,R3
00A3 1C84 ADC R8,R4
00A4 1C95 ADC R9,R5
00A5 01FE MOVW R30,R28
00A6 8260 STD Z+0,R6
00A7 8271 STD Z+1,R7
00A8 8282 STD Z+2,R8
00A9 8293 STD Z+3,R9
(0047) j /=10;
00AA E04A LDI R20,0xA
00AB E050 LDI R21,0
00AC E060 LDI R22,0
00AD E070 LDI R23,0
00AE 01FE MOVW R30,R28
00AF 8020 LDD R2,Z+0
00B0 8031 LDD R3,Z+1
00B1 8042 LDD R4,Z+2
00B2 8053 LDD R5,Z+3
00B3 937A ST R23,-Y
00B4 936A ST R22,-Y
00B5 935A ST R21,-Y
00B6 934A ST R20,-Y
00B7 0181 MOVW R16,R2
00B8 0192 MOVW R18,R4
00B9 D6ED RCALL div32u
00BA 01FE MOVW R30,R28
00BB 8300 STD Z+0,R16
00BC 8311 STD Z+1,R17
00BD 8322 STD Z+2,R18
00BE 8333 STD Z+3,R19
(0048) g_ValueAdc = j;
00BF 01FE MOVW R30,R28
00C0 8020 LDD R2,Z+0
00C1 8031 LDD R3,Z+1
00C2 9230013F STS g_ValueAdc+1,R3
00C4 9220013E STS g_ValueAdc,R2
(0049)
(0050) g_AdcEnd = 0xff; //set the flag of end
00C6 EF8F LDI R24,0xFF
00C7 93800141 STS g_AdcEnd,R24
(0051) ADMUX = g_AdcNum; //通道选择
00C9 90200140 LDS R2,g_AdcNum
00CB 9220007C STS 0x7C,R2
00CD 9624 ADIW R28,4
00CE D785 RCALL pop_gset2
00CF 9009 LD R0,Y+
00D0 BE0F OUT 0x3F,R0
00D1 91F9 LD R31,Y+
00D2 91E9 LD R30,Y+
00D3 9189 LD R24,Y+
00D4 9139 LD R19,Y+
00D5 9129 LD R18,Y+
00D6 9119 LD R17,Y+
00D7 9109 LD R16,Y+
00D8 9099 LD R9,Y+
00D9 9089 LD R8,Y+
00DA 9079 LD R7,Y+
00DB 9069 LD R6,Y+
00DC 9059 LD R5,Y+
00DD 9049 LD R4,Y+
00DE 9039 LD R3,Y+
00DF 9029 LD R2,Y+
00E0 9019 LD R1,Y+
00E1 9009 LD R0,Y+
00E2 9518 RETI
_AdcPedal:
get --> Y+0
i --> R12
adcp --> R10
00E3 D778 RCALL push_gset4
00E4 0158 MOVW R10,R16
00E5 9724 SBIW R28,4
(0052) }
(0053)
(0054) //************************************************
(0055) //踏板信号转换为对应的控制值
(0056) //前踩:200-6000 对应10-300
(0057) //待机:位7:1 位6:0
(0058) //后一:高位 11
(0059) //后二:高位 01
(0060) //************************************************
(0061) word AdcPedal(word adcp)
(0062) {
(0063) byte i;
(0064) dword get;
(0065)
(0066) i = 0;
00E6 24CC CLR R12
(0067)
(0068) if (adcp <= PEDAL_STOP)
00E7 ED86 LDI R24,0xD6
00E8 E091 LDI R25,1
00E9 158A CP R24,R10
00EA 059B CPC R25,R11
00EB F020 BCS 0x00F0
(0069) {
(0070) i = 0x3;
00EC E083 LDI R24,3
00ED 2EC8 MOV R12,R24
(0071) adcp = 0;
00EE 24AA CLR R10
00EF 24BB CLR R11
(0072) }
(0073)
(0074) if ((adcp>PEDAL_STOP) && (adcp<PEDAL_STARTL))
00F0 ED86 LDI R24,0xD6
00F1 E091 LDI R25,1
00F2 158A CP R24,R10
00F3 059B CPC R25,R11
00F4 F448 BCC 0x00FE
00F5 01C5 MOVW R24,R10
00F6 3184 CPI R24,0x14
00F7 E0E2 LDI R30,2
00F8 079E CPC R25,R30
00F9 F420 BCC 0x00FE
(0075) {
(0076) i = 0x2;
00FA E082 LDI R24,2
00FB 2EC8 MOV R12,R24
(0077) adcp = 0;
00FC 24AA CLR R10
00FD 24BB CLR R11
(0078) }
(0079)
(0080) if (adcp >= PEDAL_STARTL)
00FE 01C5 MOVW R24,R10
00FF 3184 CPI R24,0x14
0100 E0E2 LDI R30,2
0101 079E CPC R25,R30
0102 F408 BCC 0x0104
0103 C050 RJMP 0x0154
(0081) {
(0082) if (adcp > PEDAL_STARTH)
0104 EA8D LDI R24,0xAD
0105 E093 LDI R25,3
0106 158A CP R24,R10
0107 059B CPC R25,R11
0108 F408 BCC 0x010A
(0083) {
(0084) adcp = PEDAL_STARTH;
0109 015C MOVW R10,R24
(0085) }
(0086) get = adcp - PEDAL_STARTL;
010A 01C5 MOVW R24,R10
010B 5184 SUBI R24,0x14
010C 4092 SBCI R25,2
010D 011C MOVW R2,R24
010E 2444 CLR R4
010F 2455 CLR R5
0110 01FE MOVW R30,R28
0111 8220 STD Z+0,R2
0112 8231 STD Z+1,R3
0113 8242 STD Z+2,R4
0114 8253 STD Z+3,R5
(0087) get *= 5800; //(6000-200)/20;
0115 01FE MOVW R30,R28
0116 8020 LDD R2,Z+0
0117 8031 LDD R3,Z+1
0118 8042 LDD R4,Z+2
0119 8053 LDD R5,Z+3
011A EA48 LDI R20,0xA8
011B E156 LDI R21,0x16
011C E060 LDI R22,0
011D E070 LDI R23,0
011E 925A ST R5,-Y
011F 924A ST R4,-Y
0120 923A ST R3,-Y
0121 922A ST R2,-Y
0122 018A MOVW R16,R20
0123 019B MOVW R18,R22
0124 D703 RCALL empy32s
0125 01FE MOVW R30,R28
0126 8300 STD Z+0,R16
0127 8311 STD Z+1,R17
0128 8322 STD Z+2,R18
0129 8333 STD Z+3,R19
(0088) get /= (PEDAL_STARTH - PEDAL_STARTL);
012A E949 LDI R20,0x99
012B E051 LDI R21,1
012C E060 LDI R22,0
012D E070 LDI R23,0
012E 01FE MOVW R30,R28
012F 8020 LDD R2,Z+0
0130 8031 LDD R3,Z+1
0131 8042 LDD R4,Z+2
0132 8053 LDD R5,Z+3
0133 937A ST R23,-Y
0134 936A ST R22,-Y
0135 935A ST R21,-Y
0136 934A ST R20,-Y
0137 0181 MOVW R16,R2
0138 0192 MOVW R18,R4
0139 D66D RCALL div32u
013A 01FE MOVW R30,R28
013B 8300 STD Z+0,R16
013C 8311 STD Z+1,R17
013D 8322 STD Z+2,R18
013E 8333 STD Z+3,R19
(0089) get += 200; //200/20;
013F EC48 LDI R20,0xC8
0140 E050 LDI R21,0
0141 E060 LDI R22,0
0142 E070 LDI R23,0
0143 01FE MOVW R30,R28
0144 8020 LDD R2,Z+0
0145 8031 LDD R3,Z+1
0146 8042 LDD R4,Z+2
0147 8053 LDD R5,Z+3
0148 0E24 ADD R2,R20
0149 1E35 ADC R3,R21
014A 1E46 ADC R4,R22
014B 1E57 ADC R5,R23
014C 01FE MOVW R30,R28
014D 8220 STD Z+0,R2
014E 8231 STD Z+1,R3
014F 8242 STD Z+2,R4
0150 8253 STD Z+3,R5
(0090) adcp = get;
0151 01FE MOVW R30,R28
0152 80A0 LDD R10,Z+0
0153 80B1 LDD R11,Z+1
(0091) }
(0092)
(0093) if (i == 3) //后一状态
0154 2D8C MOV R24,R12
0155 3083 CPI R24,3
0156 F419 BNE 0x015A
(0094) {
(0095) adcp |= 0xC000;
0157 01C5 MOVW R24,R10
0158 6C90 ORI R25,0xC0
0159 015C MOVW R10,R24
(0096) }
(0097) if (i == 2) //待机状态
015A 2D8C MOV R24,R12
015B 3082 CPI R24,2
015C F419 BNE 0x0160
(0098) {
(0099) adcp |= 0x8000;
015D 01C5 MOVW R24,R10
015E 6890 ORI R25,0x80
015F 015C MOVW R10,R24
(0100) }
(0101)
(0102) return adcp; //返回脚踏板转速值
0160 0185 MOVW R16,R10
0161 9624 ADIW R28,4
0162 D6F3 RCALL pop_gset4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -