📄 adc.s
字号:
.module adc.c
.area text(rom, con, rel)
.dbfile E:\projects\AVR\ADC\adc.c
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 45
; //ICC-AVR application builder : 2009-2-5 19:27:04
; // Target : M16
; // Crystal: 4.0000Mhz INTERNAL
;
; #include <iom16v.h>
; #include <macros.h>
;
; #define PIN_RXD 0 //PD0 RXD
; #define PIN_TXD 1 //PD1 TXD
;
; #define AD_SE_ADC0 0x00 //ADC0
; #define AD_SE_ADC1 0x01 //ADC1
; #define AD_SE_ADC2 0x02 //ADC2
; #define AD_SE_ADC3 0x03 //ADC3
; #define AD_SE_ADC4 0x04 //ADC4
; #define AD_SE_ADC5 0x05 //ADC5
; #define AD_SE_ADC6 0x06 //ADC6
;
; #define Vref 2650 //mV,参考电压,内部提供
; #define Vref_type 0x60 //RIGHT对齐
;
; /*
; ADMUX (ADC Multiplexer Select Register)
; bit7 bit6
; REFS1 REFS0 参考电压选择
; 0 0 AREF,内部Vref关闭
; 0 1 AVCC,AREF引脚外加滤波电容
; 1 0 保留
; 1 1 2.56V的片内基准电压源,AREF引脚外加滤波电容
; bit5 ADC结果左对齐选择 1=左对齐 0=右对齐
; bit4~0 选择32通道
; */
;
; /*
; ADCSRA (ADC Control and Status Register A)
; bit7 ADEN ADC使能=1
; bit6 ADSC 启动ADC开始转换=1
; bit5 ADATE 自己触发使能
; bit4 ADIF ADC中断标志
; bit3 ADIE ADC中断使能
; bit2:0 ADC 预分频选择位 111=128时钟分频
; */
;
; void port_init(void)
; {
.dbline 46
; PORTA = 0x00;
clr R2
out 0x1b,R2
.dbline 47
; DDRA = 0x00;
out 0x1a,R2
.dbline 48
; PORTB = 0x00;
out 0x18,R2
.dbline 49
; DDRB = 0x00;
out 0x17,R2
.dbline 50
; PORTC = 0x00; //m103 output only
out 0x15,R2
.dbline 51
; DDRC = 0x00;
out 0x14,R2
.dbline 52
; PORTD = 0x00;
out 0x12,R2
.dbline 53
; DDRD = 0x00;
out 0x11,R2
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e uart0_init _uart0_init fV
.even
_uart0_init::
.dbline -1
.dbline 62
; }
;
; //UART0 initialize
; // desired baud rate: 9600
; // actual: baud rate:4808 (0.2%)
; // char size: 8 bit
; // parity: Disabled
; void uart0_init(void)
; {
.dbline 63
; UCSRB = 0x00; //disable while setting baud rate
clr R2
out 0xa,R2
.dbline 64
; UCSRA = 0x00;
out 0xb,R2
.dbline 66
; //设置帧格式: 8 个数据位, 1 个停止位
; UCSRC = (1<<URSEL)|(3<<UCSZ0);
ldi R24,134
out 0x20,R24
.dbline 68
; //设置波特率
; UBRRL = 0x19; //set baud rate lo
ldi R24,25
out 0x9,R24
.dbline 69
; UBRRH = 0x00; //set baud rate hi
out 0x20,R2
.dbline 71
; // 接收器与发送器使能
; UCSRB = (1<<TXEN);
ldi R24,8
out 0xa,R24
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbend
.dbfunc e adc_init _adc_init fV
.even
_adc_init::
.dbline -1
.dbline 90
; }
;
; /*
; void USART_Init( unsigned int baud )
; {
; //设置波特率
; UBRRH = (unsigned char)(baud>>8);
; UBRRL = (unsigned char)baud;
; // 接收器与发送器使能
; UCSRB = (1<<RXEN)|(1<<TXEN);
; //设置帧格式: 8 个数据位, 2 个停止位
; UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
; }
; */
;
; //ADC initialize
; // Conversion time: 13uS
; void adc_init(void)
; {
.dbline 91
; ADCSR = 0x00; //disable adc
clr R2
out 0x6,R2
.dbline 92
; ADMUX = 0x00; //select adc input 0
out 0x7,R2
.dbline 93
; ACSR = 0x80;
ldi R24,128
out 0x8,R24
.dbline 94
; ADCSRA=(1<<ADEN)|(0<<ADSC)|(0<<ADIE)|(1<<ADPS2)|(0<<ADPS1)|(0<<ADPS0);
ldi R24,132
out 0x6,R24
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 100
; //ADCSR = 0x84;
; }
;
; //call this routine to initialize all peripherals
; void init_devices(void)
; {
.dbline 102
; //stop errant interrupts until set up
; CLI(); //disable all interrupts
cli
.dbline 103
; port_init();
xcall _port_init
.dbline 104
; adc_init();
xcall _adc_init
.dbline 105
; uart0_init();
xcall _uart0_init
.dbline 107
;
; MCUCR = 0x00;
clr R2
out 0x35,R2
.dbline 108
; GICR = 0x00;
out 0x3b,R2
.dbline 109
; TIMSK = 0x00; //timer interrupt sources
out 0x39,R2
.dbline 110
; SEI(); //re-enable interrupts
sei
.dbline -2
L4:
.dbline 0 ; func end
ret
.dbend
.dbfunc e read_adc _read_adc fc
; adc_data -> R20,R21
; adc_port -> R16
.even
_read_adc::
xcall push_gset1
.dbline -1
.dbline 115
; //all peripherals are now initialized
; }
;
; unsigned char read_adc(unsigned char adc_port)
; { unsigned int adc_data;
.dbline 116
; ADMUX = Vref_type | adc_port; //设置AD端口
mov R24,R16
ori R24,96
out 0x7,R24
.dbline 117
; ADCSRA |= ADCSRA |(1<<ADSC); //开始转换
in R24,0x6
ori R24,64
in R2,0x6
or R2,R24
out 0x6,R2
L6:
.dbline 118
L7:
.dbline 118
; while ((ADCSRA&0x10)==0); //等待转换完成
sbis 0x6,4
rjmp L6
.dbline 119
; ADCSRA |= (1<<ADIF); //清除标志位
sbi 0x6,4
.dbline 120
; adc_data = ADC;
in R20,0x4
in R21,0x5
.dbline 121
; return ADCH;
in R16,0x5
.dbline -2
L5:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r adc_data 20 i
.dbsym r adc_port 16 c
.dbend
.dbfunc e uart_transmit _uart_transmit fV
; data -> R16
.even
_uart_transmit::
.dbline -1
.dbline 125
; }
;
; void uart_transmit( unsigned char data )
; {
L10:
.dbline 127
L11:
.dbline 127
; /* 等待发送缓冲器为空 */
; while ( !( UCSRA & (1<<UDRE)) );
sbis 0xb,5
rjmp L10
.dbline 129
; /* 将数据放入缓冲器,发送数据 */
; UDR = data;
out 0xc,R16
.dbline -2
L9:
.dbline 0 ; func end
ret
.dbsym r data 16 c
.dbend
.dbfunc e delay _delay fV
; j -> y+4
; i -> y+0
; a -> y+12
.even
_delay::
xcall push_arg4
xcall push_gset2
sbiw R28,8
.dbline -1
.dbline 133
; }
;
; void delay(unsigned long a)
; {
.dbline 135
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
xjmp L17
L14:
.dbline 135
L15:
.dbline 135
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
L17:
.dbline 135
; unsigned long i,j;
; for(i = 0; i < a; i ++);
movw R30,R28
ldd R2,z+12
ldd R3,z+13
ldd R4,z+14
ldd R5,z+15
movw R30,R28
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brlo L14
.dbline 136
; {for (j = 0; j < a; j ++)
.dbline 136
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+4,R20
std z+5,R21
std z+6,R22
std z+7,R23
xjmp L21
L18:
.dbline 137
.dbline 137
L19:
.dbline 136
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+4,R2
std z+5,R3
std z+6,R4
std z+7,R5
L21:
.dbline 136
movw R30,R28
ldd R2,z+12
ldd R3,z+13
ldd R4,z+14
ldd R5,z+15
movw R30,R28
ldd R6,z+4
ldd R7,z+5
ldd R8,z+6
ldd R9,z+7
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brlo L18
.dbline 138
; {}
; }
.dbline -2
L13:
adiw R28,8
xcall pop_gset2
adiw R28,4
.dbline 0 ; func end
ret
.dbsym l j 4 l
.dbsym l i 0 l
.dbsym l a 12 l
.dbend
.dbfunc e main _main fV
; volt -> y+0
; adc_tmp -> R10
.even
_main::
sbiw R28,4
.dbline -1
.dbline 142
; }
;
; void main(void)
; { unsigned long volt;
.dbline 144
; unsigned char adc_tmp;
; init_devices();
xcall _init_devices
.dbline 146
;
; DDRA = 0x00; //设置A口为不带上拉输入;
clr R2
out 0x1a,R2
.dbline 147
; PORTA= 0x00;
out 0x1b,R2
.dbline 148
; DDRD = 0xff; //设置C口为输出口;
ldi R24,255
out 0x11,R24
.dbline 149
; PORTD= 0xff;
out 0x12,R24
.dbline 151
; //DDRD = 0xff;
; DDRD = (1<<PIN_TXD); //TXD为输出
ldi R24,2
out 0x11,R24
.dbline 152
; PORTD =0xFF;
ldi R24,255
out 0x12,R24
.dbline 155
;
;
; ADMUX = Vref_type; //选择第一通道ADC0;
ldi R24,96
out 0x7,R24
.dbline 156
; ADCSRA = 0x84; //自由转换模式;启动A/D转换;
ldi R24,132
out 0x6,R24
.dbline 157
; delay(10000); //延时待系统稳定;
ldi R16,16
ldi R17,39
ldi R18,0
ldi R19,0
xcall _delay
xjmp L24
L23:
.dbline 159
.dbline 162
ldi R16,1
xcall _read_adc
mov R10,R16
.dbline 164
xcall _uart_transmit
.dbline 165
ldi R16,80
ldi R17,195
ldi R18,0
ldi R19,0
xcall _delay
.dbline 168
L24:
.dbline 158
xjmp L23
X0:
.dbline -2
L22:
adiw R28,4
.dbline 0 ; func end
ret
.dbsym l volt 0 l
.dbsym r adc_tmp 10 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -