📄 adc.lst
字号:
__start:
__text_start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51C0 SUBI R28,0x10
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 36E0 CPI R30,0x60
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E00E9 CALL _main
_exit:
004A CFFF RJMP _exit
FILE: E:\projects\AVR\ADC\adc.c
(0001) //ICC-AVR application builder : 2009-2-5 19:27:04
(0002) // Target : M16
(0003) // Crystal: 4.0000Mhz INTERNAL
(0004)
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007)
(0008) #define PIN_RXD 0 //PD0 RXD
(0009) #define PIN_TXD 1 //PD1 TXD
(0010)
(0011) #define AD_SE_ADC0 0x00 //ADC0
(0012) #define AD_SE_ADC1 0x01 //ADC1
(0013) #define AD_SE_ADC2 0x02 //ADC2
(0014) #define AD_SE_ADC3 0x03 //ADC3
(0015) #define AD_SE_ADC4 0x04 //ADC4
(0016) #define AD_SE_ADC5 0x05 //ADC5
(0017) #define AD_SE_ADC6 0x06 //ADC6
(0018)
(0019) #define Vref 2650 //mV,参考电压,内部提供
(0020) #define Vref_type 0x60 //RIGHT对齐
(0021)
(0022) /*
(0023) ADMUX (ADC Multiplexer Select Register)
(0024) bit7 bit6
(0025) REFS1 REFS0 参考电压选择
(0026) 0 0 AREF,内部Vref关闭
(0027) 0 1 AVCC,AREF引脚外加滤波电容
(0028) 1 0 保留
(0029) 1 1 2.56V的片内基准电压源,AREF引脚外加滤波电容
(0030) bit5 ADC结果左对齐选择 1=左对齐 0=右对齐
(0031) bit4~0 选择32通道
(0032) */
(0033)
(0034) /*
(0035) ADCSRA (ADC Control and Status Register A)
(0036) bit7 ADEN ADC使能=1
(0037) bit6 ADSC 启动ADC开始转换=1
(0038) bit5 ADATE 自己触发使能
(0039) bit4 ADIF ADC中断标志
(0040) bit3 ADIE ADC中断使能
(0041) bit2:0 ADC 预分频选择位 111=128时钟分频
(0042) */
(0043)
(0044) void port_init(void)
(0045) {
(0046) PORTA = 0x00;
_port_init:
004B 2422 CLR R2
004C BA2B OUT 0x1B,R2
(0047) DDRA = 0x00;
004D BA2A OUT 0x1A,R2
(0048) PORTB = 0x00;
004E BA28 OUT 0x18,R2
(0049) DDRB = 0x00;
004F BA27 OUT 0x17,R2
(0050) PORTC = 0x00; //m103 output only
0050 BA25 OUT 0x15,R2
(0051) DDRC = 0x00;
0051 BA24 OUT 0x14,R2
(0052) PORTD = 0x00;
0052 BA22 OUT 0x12,R2
(0053) DDRD = 0x00;
0053 BA21 OUT 0x11,R2
0054 9508 RET
(0054) }
(0055)
(0056) //UART0 initialize
(0057) // desired baud rate: 9600
(0058) // actual: baud rate:4808 (0.2%)
(0059) // char size: 8 bit
(0060) // parity: Disabled
(0061) void uart0_init(void)
(0062) {
(0063) UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
0055 2422 CLR R2
0056 B82A OUT 0x0A,R2
(0064) UCSRA = 0x00;
0057 B82B OUT 0x0B,R2
(0065) //设置帧格式: 8 个数据位, 1 个停止位
(0066) UCSRC = (1<<URSEL)|(3<<UCSZ0);
0058 E886 LDI R24,0x86
0059 BD80 OUT 0x20,R24
(0067) //设置波特率
(0068) UBRRL = 0x19; //set baud rate lo
005A E189 LDI R24,0x19
005B B989 OUT 0x09,R24
(0069) UBRRH = 0x00; //set baud rate hi
005C BC20 OUT 0x20,R2
(0070) // 接收器与发送器使能
(0071) UCSRB = (1<<TXEN);
005D E088 LDI R24,0x8
005E B98A OUT 0x0A,R24
005F 9508 RET
(0072) }
(0073)
(0074) /*
(0075) void USART_Init( unsigned int baud )
(0076) {
(0077) //设置波特率
(0078) UBRRH = (unsigned char)(baud>>8);
(0079) UBRRL = (unsigned char)baud;
(0080) // 接收器与发送器使能
(0081) UCSRB = (1<<RXEN)|(1<<TXEN);
(0082) //设置帧格式: 8 个数据位, 2 个停止位
(0083) UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
(0084) }
(0085) */
(0086)
(0087) //ADC initialize
(0088) // Conversion time: 13uS
(0089) void adc_init(void)
(0090) {
(0091) ADCSR = 0x00; //disable adc
_adc_init:
0060 2422 CLR R2
0061 B826 OUT 0x06,R2
(0092) ADMUX = 0x00; //select adc input 0
0062 B827 OUT 0x07,R2
(0093) ACSR = 0x80;
0063 E880 LDI R24,0x80
0064 B988 OUT 0x08,R24
(0094) ADCSRA=(1<<ADEN)|(0<<ADSC)|(0<<ADIE)|(1<<ADPS2)|(0<<ADPS1)|(0<<ADPS0);
0065 E884 LDI R24,0x84
0066 B986 OUT 0x06,R24
0067 9508 RET
(0095) //ADCSR = 0x84;
(0096) }
(0097)
(0098) //call this routine to initialize all peripherals
(0099) void init_devices(void)
(0100) {
(0101) //stop errant interrupts until set up
(0102) CLI(); //disable all interrupts
_init_devices:
0068 94F8 BCLR 7
(0103) port_init();
0069 DFE1 RCALL _port_init
(0104) adc_init();
006A DFF5 RCALL _adc_init
(0105) uart0_init();
006B DFE9 RCALL _uart0_init
(0106)
(0107) MCUCR = 0x00;
006C 2422 CLR R2
006D BE25 OUT 0x35,R2
(0108) GICR = 0x00;
006E BE2B OUT 0x3B,R2
(0109) TIMSK = 0x00; //timer interrupt sources
006F BE29 OUT 0x39,R2
(0110) SEI(); //re-enable interrupts
0070 9478 BSET 7
0071 9508 RET
_read_adc:
adc_data --> R20
adc_port --> R16
0072 940E011B CALL push_gset1
(0111) //all peripherals are now initialized
(0112) }
(0113)
(0114) unsigned char read_adc(unsigned char adc_port)
(0115) { unsigned int adc_data;
(0116) ADMUX = Vref_type | adc_port; //设置AD端口
0074 2F80 MOV R24,R16
0075 6680 ORI R24,0x60
0076 B987 OUT 0x07,R24
(0117) ADCSRA |= ADCSRA |(1<<ADSC); //开始转换
0077 B186 IN R24,0x06
0078 6480 ORI R24,0x40
0079 B026 IN R2,0x06
007A 2A28 OR R2,R24
007B B826 OUT 0x06,R2
(0118) while ((ADCSRA&0x10)==0); //等待转换完成
007C 9B34 SBIS 0x06,4
007D CFFE RJMP 0x007C
(0119) ADCSRA |= (1<<ADIF); //清除标志位
007E 9A34 SBI 0x06,4
(0120) adc_data = ADC;
007F B144 IN R20,0x04
0080 B155 IN R21,0x05
(0121) return ADCH;
0081 B105 IN R16,0x05
0082 940E011E CALL pop_gset1
0084 9508 RET
(0122) }
(0123)
(0124) void uart_transmit( unsigned char data )
(0125) {
(0126) /* 等待发送缓冲器为空 */
(0127) while ( !( UCSRA & (1<<UDRE)) );
_uart_transmit:
data --> R16
0085 9B5D SBIS 0x0B,5
0086 CFFE RJMP _uart_transmit
(0128) /* 将数据放入缓冲器,发送数据 */
(0129) UDR = data;
0087 B90C OUT 0x0C,R16
0088 9508 RET
_delay:
j --> Y+4
i --> Y+0
a --> Y+12
0089 940E010B CALL push_arg4
008B 940E0119 CALL push_gset2
008D 9728 SBIW R28,0x8
(0130) }
(0131)
(0132) void delay(unsigned long a)
(0133) {
(0134) unsigned long i,j;
(0135) for(i = 0; i < a; i ++);
008E E040 LDI R20,0
008F E050 LDI R21,0
0090 E060 LDI R22,0
0091 E070 LDI R23,0
0092 01FE MOVW R30,R28
0093 8340 STD Z+0,R20
0094 8351 STD Z+1,R21
0095 8362 STD Z+2,R22
0096 8373 STD Z+3,R23
0097 C012 RJMP 0x00AA
0098 E041 LDI R20,1
0099 E050 LDI R21,0
009A E060 LDI R22,0
009B E070 LDI R23,0
009C 01FE MOVW R30,R28
009D 8020 LDD R2,Z+0
009E 8031 LDD R3,Z+1
009F 8042 LDD R4,Z+2
00A0 8053 LDD R5,Z+3
00A1 0E24 ADD R2,R20
00A2 1E35 ADC R3,R21
00A3 1E46 ADC R4,R22
00A4 1E57 ADC R5,R23
00A5 01FE MOVW R30,R28
00A6 8220 STD Z+0,R2
00A7 8231 STD Z+1,R3
00A8 8242 STD Z+2,R4
00A9 8253 STD Z+3,R5
00AA 01FE MOVW R30,R28
00AB 8424 LDD R2,Z+12
00AC 8435 LDD R3,Z+13
00AD 8446 LDD R4,Z+14
00AE 8457 LDD R5,Z+15
00AF 01FE MOVW R30,R28
00B0 8060 LDD R6,Z+0
00B1 8071 LDD R7,Z+1
00B2 8082 LDD R8,Z+2
00B3 8093 LDD R9,Z+3
00B4 1462 CP R6,R2
00B5 0473 CPC R7,R3
00B6 0484 CPC R8,R4
00B7 0495 CPC R9,R5
00B8 F2F8 BCS 0x0098
(0136) {for (j = 0; j < a; j ++)
00B9 E040 LDI R20,0
00BA E050 LDI R21,0
00BB E060 LDI R22,0
00BC E070 LDI R23,0
00BD 01FE MOVW R30,R28
00BE 8344 STD Z+4,R20
00BF 8355 STD Z+5,R21
00C0 8366 STD Z+6,R22
00C1 8377 STD Z+7,R23
00C2 C012 RJMP 0x00D5
00C3 E041 LDI R20,1
00C4 E050 LDI R21,0
00C5 E060 LDI R22,0
00C6 E070 LDI R23,0
00C7 01FE MOVW R30,R28
00C8 8024 LDD R2,Z+4
00C9 8035 LDD R3,Z+5
00CA 8046 LDD R4,Z+6
00CB 8057 LDD R5,Z+7
00CC 0E24 ADD R2,R20
00CD 1E35 ADC R3,R21
00CE 1E46 ADC R4,R22
00CF 1E57 ADC R5,R23
00D0 01FE MOVW R30,R28
00D1 8224 STD Z+4,R2
00D2 8235 STD Z+5,R3
00D3 8246 STD Z+6,R4
00D4 8257 STD Z+7,R5
00D5 01FE MOVW R30,R28
00D6 8424 LDD R2,Z+12
00D7 8435 LDD R3,Z+13
00D8 8446 LDD R4,Z+14
00D9 8457 LDD R5,Z+15
00DA 01FE MOVW R30,R28
00DB 8064 LDD R6,Z+4
00DC 8075 LDD R7,Z+5
00DD 8086 LDD R8,Z+6
00DE 8097 LDD R9,Z+7
00DF 1462 CP R6,R2
00E0 0473 CPC R7,R3
00E1 0484 CPC R8,R4
00E2 0495 CPC R9,R5
00E3 F2F8 BCS 0x00C3
(0137) {}
(0138) }
00E4 9628 ADIW R28,0x8
00E5 940E0110 CALL pop_gset2
00E7 9624 ADIW R28,4
00E8 9508 RET
_main:
volt --> Y+0
adc_tmp --> R10
00E9 9724 SBIW R28,4
(0139) }
(0140)
(0141) void main(void)
(0142) { unsigned long volt;
(0143) unsigned char adc_tmp;
(0144) init_devices();
00EA DF7D RCALL _init_devices
(0145)
(0146) DDRA = 0x00; //设置A口为不带上拉输入;
00EB 2422 CLR R2
00EC BA2A OUT 0x1A,R2
(0147) PORTA= 0x00;
00ED BA2B OUT 0x1B,R2
(0148) DDRD = 0xff; //设置C口为输出口;
00EE EF8F LDI R24,0xFF
00EF BB81 OUT 0x11,R24
(0149) PORTD= 0xff;
00F0 BB82 OUT 0x12,R24
(0150) //DDRD = 0xff;
(0151) DDRD = (1<<PIN_TXD); //TXD为输出
00F1 E082 LDI R24,2
00F2 BB81 OUT 0x11,R24
(0152) PORTD =0xFF;
00F3 EF8F LDI R24,0xFF
00F4 BB82 OUT 0x12,R24
(0153)
(0154)
(0155) ADMUX = Vref_type; //选择第一通道ADC0;
00F5 E680 LDI R24,0x60
00F6 B987 OUT 0x07,R24
(0156) ADCSRA = 0x84; //自由转换模式;启动A/D转换;
00F7 E884 LDI R24,0x84
00F8 B986 OUT 0x06,R24
(0157) delay(10000); //延时待系统稳定;
00F9 E100 LDI R16,0x10
00FA E217 LDI R17,0x27
00FB E020 LDI R18,0
00FC E030 LDI R19,0
00FD DF8B RCALL _delay
00FE C009 RJMP 0x0108
(0158) while(1)
(0159) {
(0160) //volt = read_adc(AD_SE_ADC0); //获取A/D转换数据
(0161) //volt = (volt * Vref)/1024;
(0162) adc_tmp = read_adc(AD_SE_ADC1);
00FF E001 LDI R16,1
0100 DF71 RCALL _read_adc
0101 2EA0 MOV R10,R16
(0163) //PORTD = adc_tmp;
(0164) uart_transmit(adc_tmp);
0102 DF82 RCALL _uart_transmit
(0165) delay(50000);
FILE: <library>
0103 E500 LDI R16,0x50
0104 EC13 LDI R17,0xC3
0105 E020 LDI R18,0
0106 E030 LDI R19,0
0107 DF81 RCALL _delay
0108 CFF6 RJMP 0x00FF
0109 9624 ADIW R28,4
010A 9508 RET
push_arg4:
010B 933A ST R19,-Y
010C 932A ST R18,-Y
push_arg2:
010D 931A ST R17,-Y
010E 930A ST R16,-Y
010F 9508 RET
pop_gset2:
0110 E0E2 LDI R30,2
0111 940C011F JMP pop
push_gset5:
0113 92FA ST R15,-Y
0114 92EA ST R14,-Y
push_gset4:
0115 92DA ST R13,-Y
0116 92CA ST R12,-Y
push_gset3:
0117 92BA ST R11,-Y
0118 92AA ST R10,-Y
push_gset2:
0119 937A ST R23,-Y
011A 936A ST R22,-Y
push_gset1:
011B 935A ST R21,-Y
011C 934A ST R20,-Y
011D 9508 RET
pop_gset1:
011E E0E1 LDI R30,1
pop:
011F 9149 LD R20,Y+
0120 9159 LD R21,Y+
0121 FDE0 SBRC R30,0
0122 9508 RET
0123 9169 LD R22,Y+
0124 9179 LD R23,Y+
0125 FDE1 SBRC R30,1
0126 9508 RET
0127 90A9 LD R10,Y+
0128 90B9 LD R11,Y+
0129 FDE2 SBRC R30,2
012A 9508 RET
012B 90C9 LD R12,Y+
012C 90D9 LD R13,Y+
012D FDE3 SBRC R30,3
012E 9508 RET
012F 90E9 LD R14,Y+
0130 90F9 LD R15,Y+
0131 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -