📄 adc.lis
字号:
.module adc.c
.area text(rom, con, rel)
0000 .dbfile E:\projects\AVR\ADC\adc.c
0000 .dbfunc e port_init _port_init fV
.even
0000 _port_init::
0000 .dbline -1
0000 .dbline 45
0000 ; //ICC-AVR application builder : 2009-2-5 19:27:04
0000 ; // Target : M16
0000 ; // Crystal: 4.0000Mhz INTERNAL
0000 ;
0000 ; #include <iom16v.h>
0000 ; #include <macros.h>
0000 ;
0000 ; #define PIN_RXD 0 //PD0 RXD
0000 ; #define PIN_TXD 1 //PD1 TXD
0000 ;
0000 ; #define AD_SE_ADC0 0x00 //ADC0
0000 ; #define AD_SE_ADC1 0x01 //ADC1
0000 ; #define AD_SE_ADC2 0x02 //ADC2
0000 ; #define AD_SE_ADC3 0x03 //ADC3
0000 ; #define AD_SE_ADC4 0x04 //ADC4
0000 ; #define AD_SE_ADC5 0x05 //ADC5
0000 ; #define AD_SE_ADC6 0x06 //ADC6
0000 ;
0000 ; #define Vref 2650 //mV,参考电压,内部提供
0000 ; #define Vref_type 0x60 //RIGHT对齐
0000 ;
0000 ; /*
0000 ; ADMUX (ADC Multiplexer Select Register)
0000 ; bit7 bit6
0000 ; REFS1 REFS0 参考电压选择
0000 ; 0 0 AREF,内部Vref关闭
0000 ; 0 1 AVCC,AREF引脚外加滤波电容
0000 ; 1 0 保留
0000 ; 1 1 2.56V的片内基准电压源,AREF引脚外加滤波电容
0000 ; bit5 ADC结果左对齐选择 1=左对齐 0=右对齐
0000 ; bit4~0 选择32通道
0000 ; */
0000 ;
0000 ; /*
0000 ; ADCSRA (ADC Control and Status Register A)
0000 ; bit7 ADEN ADC使能=1
0000 ; bit6 ADSC 启动ADC开始转换=1
0000 ; bit5 ADATE 自己触发使能
0000 ; bit4 ADIF ADC中断标志
0000 ; bit3 ADIE ADC中断使能
0000 ; bit2:0 ADC 预分频选择位 111=128时钟分频
0000 ; */
0000 ;
0000 ; void port_init(void)
0000 ; {
0000 .dbline 46
0000 ; PORTA = 0x00;
0000 2224 clr R2
0002 2BBA out 0x1b,R2
0004 .dbline 47
0004 ; DDRA = 0x00;
0004 2ABA out 0x1a,R2
0006 .dbline 48
0006 ; PORTB = 0x00;
0006 28BA out 0x18,R2
0008 .dbline 49
0008 ; DDRB = 0x00;
0008 27BA out 0x17,R2
000A .dbline 50
000A ; PORTC = 0x00; //m103 output only
000A 25BA out 0x15,R2
000C .dbline 51
000C ; DDRC = 0x00;
000C 24BA out 0x14,R2
000E .dbline 52
000E ; PORTD = 0x00;
000E 22BA out 0x12,R2
0010 .dbline 53
0010 ; DDRD = 0x00;
0010 21BA out 0x11,R2
0012 .dbline -2
0012 L1:
0012 .dbline 0 ; func end
0012 0895 ret
0014 .dbend
0014 .dbfunc e uart0_init _uart0_init fV
.even
0014 _uart0_init::
0014 .dbline -1
0014 .dbline 62
0014 ; }
0014 ;
0014 ; //UART0 initialize
0014 ; // desired baud rate: 9600
0014 ; // actual: baud rate:4808 (0.2%)
0014 ; // char size: 8 bit
0014 ; // parity: Disabled
0014 ; void uart0_init(void)
0014 ; {
0014 .dbline 63
0014 ; UCSRB = 0x00; //disable while setting baud rate
0014 2224 clr R2
0016 2AB8 out 0xa,R2
0018 .dbline 64
0018 ; UCSRA = 0x00;
0018 2BB8 out 0xb,R2
001A .dbline 66
001A ; //设置帧格式: 8 个数据位, 1 个停止位
001A ; UCSRC = (1<<URSEL)|(3<<UCSZ0);
001A 86E8 ldi R24,134
001C 80BD out 0x20,R24
001E .dbline 68
001E ; //设置波特率
001E ; UBRRL = 0x19; //set baud rate lo
001E 89E1 ldi R24,25
0020 89B9 out 0x9,R24
0022 .dbline 69
0022 ; UBRRH = 0x00; //set baud rate hi
0022 20BC out 0x20,R2
0024 .dbline 71
0024 ; // 接收器与发送器使能
0024 ; UCSRB = (1<<TXEN);
0024 88E0 ldi R24,8
0026 8AB9 out 0xa,R24
0028 .dbline -2
0028 L2:
0028 .dbline 0 ; func end
0028 0895 ret
002A .dbend
002A .dbfunc e adc_init _adc_init fV
.even
002A _adc_init::
002A .dbline -1
002A .dbline 90
002A ; }
002A ;
002A ; /*
002A ; void USART_Init( unsigned int baud )
002A ; {
002A ; //设置波特率
002A ; UBRRH = (unsigned char)(baud>>8);
002A ; UBRRL = (unsigned char)baud;
002A ; // 接收器与发送器使能
002A ; UCSRB = (1<<RXEN)|(1<<TXEN);
002A ; //设置帧格式: 8 个数据位, 2 个停止位
002A ; UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
002A ; }
002A ; */
002A ;
002A ; //ADC initialize
002A ; // Conversion time: 13uS
002A ; void adc_init(void)
002A ; {
002A .dbline 91
002A ; ADCSR = 0x00; //disable adc
002A 2224 clr R2
002C 26B8 out 0x6,R2
002E .dbline 92
002E ; ADMUX = 0x00; //select adc input 0
002E 27B8 out 0x7,R2
0030 .dbline 93
0030 ; ACSR = 0x80;
0030 80E8 ldi R24,128
0032 88B9 out 0x8,R24
0034 .dbline 94
0034 ; ADCSRA=(1<<ADEN)|(0<<ADSC)|(0<<ADIE)|(1<<ADPS2)|(0<<ADPS1)|(0<<ADPS0);
0034 84E8 ldi R24,132
0036 86B9 out 0x6,R24
0038 .dbline -2
0038 L3:
0038 .dbline 0 ; func end
0038 0895 ret
003A .dbend
003A .dbfunc e init_devices _init_devices fV
.even
003A _init_devices::
003A .dbline -1
003A .dbline 100
003A ; //ADCSR = 0x84;
003A ; }
003A ;
003A ; //call this routine to initialize all peripherals
003A ; void init_devices(void)
003A ; {
003A .dbline 102
003A ; //stop errant interrupts until set up
003A ; CLI(); //disable all interrupts
003A F894 cli
003C .dbline 103
003C ; port_init();
003C E1DF xcall _port_init
003E .dbline 104
003E ; adc_init();
003E F5DF xcall _adc_init
0040 .dbline 105
0040 ; uart0_init();
0040 E9DF xcall _uart0_init
0042 .dbline 107
0042 ;
0042 ; MCUCR = 0x00;
0042 2224 clr R2
0044 25BE out 0x35,R2
0046 .dbline 108
0046 ; GICR = 0x00;
0046 2BBE out 0x3b,R2
0048 .dbline 109
0048 ; TIMSK = 0x00; //timer interrupt sources
0048 29BE out 0x39,R2
004A .dbline 110
004A ; SEI(); //re-enable interrupts
004A 7894 sei
004C .dbline -2
004C L4:
004C .dbline 0 ; func end
004C 0895 ret
004E .dbend
004E .dbfunc e read_adc _read_adc fc
004E ; adc_data -> R20,R21
004E ; adc_port -> R16
.even
004E _read_adc::
004E 0E940000 xcall push_gset1
0052 .dbline -1
0052 .dbline 115
0052 ; //all peripherals are now initialized
0052 ; }
0052 ;
0052 ; unsigned char read_adc(unsigned char adc_port)
0052 ; { unsigned int adc_data;
0052 .dbline 116
0052 ; ADMUX = Vref_type | adc_port; //设置AD端口
0052 802F mov R24,R16
0054 8066 ori R24,96
0056 87B9 out 0x7,R24
0058 .dbline 117
0058 ; ADCSRA |= ADCSRA |(1<<ADSC); //开始转换
0058 86B1 in R24,0x6
005A 8064 ori R24,64
005C 26B0 in R2,0x6
005E 282A or R2,R24
0060 26B8 out 0x6,R2
0062 L6:
0062 .dbline 118
0062 L7:
0062 .dbline 118
0062 ; while ((ADCSRA&0x10)==0); //等待转换完成
0062 349B sbis 0x6,4
0064 FECF rjmp L6
0066 .dbline 119
0066 ; ADCSRA |= (1<<ADIF); //清除标志位
0066 349A sbi 0x6,4
0068 .dbline 120
0068 ; adc_data = ADC;
0068 44B1 in R20,0x4
006A 55B1 in R21,0x5
006C .dbline 121
006C ; return ADCH;
006C 05B1 in R16,0x5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -