📄 main.lis
字号:
.module main.c
.area text(rom, con, rel)
0000 .dbfile D:\桌面\avr程序设计\模拟比较器\main.c
0000 .dbfunc e port_init _port_init fV
.even
0000 _port_init::
0000 .dbline -1
0000 .dbline 41
0000 ; //ICC-AVR application builder : 2007-3-15 8:22:58
0000 ; // Target : M16
0000 ; // Crystal: 7.3728Mhz
0000 ;
0000 ; #include <iom16v.h>
0000 ; #include <macros.h>
0000 ; #include "delay.h"
0000 ;
0000 ; //管脚定义
0000 ; #define LED0 0 //PB0
0000 ; #define AIN_P 2 //PB2(AIN0)
0000 ; #define AIN_N 3 //PB3(AIN1)
0000 ;
0000 ; //宏定义
0000 ; #define LED0_ON() PORTB|= (1<<LED0) //输出高电平,灯亮
0000 ; #define LED0_OFF() PORTB&=~(1<<LED0) //输出低电平,灯灭
0000 ;
0000 ; //常量定义
0000 ; /*
0000 ; 模拟比较器的正输入端由 ACBG位决定,=0选择AIN0引脚,=1选择1.23V内部能隙基准源
0000 ;
0000 ; 模拟比较器多工输入 (不常用,因为ADC将无法使用)
0000 ; 可以选择ADC7..0 之中的任意一个来代替模拟比较器的负极输入端。
0000 ; ADC复用器可用来完成这个功能。
0000 ; 当然,为了使用这个功能首先必须关掉ADC。
0000 ; 如果模拟比较器复用器使 能位(SFIOR 中的ACME) 被置位,且ADC 也已经关掉(ADCSRA 寄存器的ADEN 为0),
0000 ; 则可以通过ADMUX 寄存器的MUX2..0 来选择替代模拟比较器负极输入的管脚,
0000 ; 如果ACME 清零或ADEN 置位,则模拟比较器的负极输入为AIN1。
0000 ;
0000 ; */
0000 ; #define AC_ADC0 0x00 //ADC0
0000 ; #define AC_ADC1 0x01 //ADC1
0000 ; #define AC_ADC2 0x02 //ADC2
0000 ; #define AC_ADC3 0x03 //ADC3
0000 ; #define AC_ADC4 0x04 //ADC4
0000 ; #define AC_ADC5 0x05 //ADC5
0000 ; #define AC_ADC6 0x06 //ADC6
0000 ; #define AC_ADC7 0x07 //ADC7
0000 ;
0000 ; void port_init(void)
0000 ; {
0000 .dbline 42
0000 ; PORTA = 0x00;
0000 2224 clr R2
0002 2BBA out 0x1b,R2
0004 .dbline 43
0004 ; DDRA = 0x00;
0004 2ABA out 0x1a,R2
0006 .dbline 44
0006 ; PORTB = ~((1<<AIN_P)|(1<<AIN_N)); //作模拟比较器输入时,不可使能内部上拉电阻。
0006 83EF ldi R24,243
0008 88BB out 0x18,R24
000A .dbline 45
000A ; DDRB = (1<<LED0); //PB0作输出
000A 81E0 ldi R24,1
000C 87BB out 0x17,R24
000E .dbline 46
000E ; PORTC = 0x00; //m103 output only
000E 25BA out 0x15,R2
0010 .dbline 47
0010 ; DDRC = 0x00;
0010 24BA out 0x14,R2
0012 .dbline 48
0012 ; PORTD = 0x00;
0012 22BA out 0x12,R2
0014 .dbline 49
0014 ; DDRD = 0x00;
0014 21BA out 0x11,R2
0016 .dbline -2
0016 L1:
0016 .dbline 0 ; func end
0016 0895 ret
0018 .dbend
0018 .dbfunc e comparator_init _comparator_init fV
.even
0018 _comparator_init::
0018 .dbline -1
0018 .dbline 55
0018 ; }
0018 ;
0018 ; //Comparator initialize
0018 ; // trigger on: Output toggle
0018 ; void comparator_init(void)
0018 ; {
0018 .dbline 56
0018 ; ACSR = ACSR & 0xF7; //ensure interrupt is off before changing
0018 88B1 in R24,0x8
001A 877F andi R24,247
001C 88B9 out 0x8,R24
001E .dbline 57
001E ; ACSR = 0xCC;
001E 8CEC ldi R24,204
0020 88B9 out 0x8,R24
0022 .dbline -2
0022 L2:
0022 .dbline 0 ; func end
0022 0895 ret
0024 .dbend
.area vector(rom, abs)
.org 64
0040 0C941200 jmp _ana_comp_isr
.area text(rom, con, rel)
0024 .dbfile D:\桌面\avr程序设计\模拟比较器\main.c
0024 .dbfunc e ana_comp_isr _ana_comp_isr fV
.even
0024 _ana_comp_isr::
0024 0E940000 xcall push_lset
0028 .dbline -1
0028 .dbline 65
0028 ; //ACSR=(1<<ACIE);
0028 ; // 使能模拟比较器中断,比较器输出变化即可触发中断,AIN0为正输入端,AIN1为负输入端。
0028 ;
0028 ; }
0028 ;
0028 ; #pragma interrupt_handler ana_comp_isr:17
0028 ; void ana_comp_isr(void)
0028 ; {
0028 .dbline 68
0028 ; //analog comparator compare event
0028 ; //硬件自动清除ACI标志位
0028 ; delay_us(10);
0028 0AE0 ldi R16,10
002A 10E0 ldi R17,0
002C 0E940000 xcall _delay_us
0030 .dbline 69
0030 ; if ((ACSR&(1<<ACO))==0) //检测ACO
0030 4599 sbic 0x8,5
0032 02C0 rjmp L4
0034 .dbline 70
0034 ; LED0_ON(); //如果AIN0<AIN1(ACO=0),LED亮
0034 C09A sbi 0x18,0
0036 01C0 xjmp L5
0038 L4:
0038 .dbline 72
0038 ; else
0038 ; LED0_OFF(); //否则 LED灭
0038 C098 cbi 0x18,0
003A L5:
003A .dbline 73
003A ; delay_ms(200); //当电压差接近0V时,模拟比较器会产生临界抖动,故延时200mS令肉眼能看到
003A 08EC ldi R16,200
003C 10E0 ldi R17,0
003E 0E940000 xcall _delay_ms
0042 .dbline -2
0042 L3:
0042 0E940000 xcall pop_lset
0046 .dbline 0 ; func end
0046 1895 reti
0048 .dbend
0048 .dbfunc e init_devices _init_devices fV
.even
0048 _init_devices::
0048 .dbline -1
0048 .dbline 78
0048 ; }
0048 ;
0048 ; //call this routine to initialize all peripherals
0048 ; void init_devices(void)
0048 ; {
0048 .dbline 80
0048 ; //stop errant interrupts until set up
0048 ; CLI(); //disable all interrupts
0048 F894 cli
004A .dbline 81
004A ; port_init();
004A DADF xcall _port_init
004C .dbline 82
004C ; comparator_init();
004C E5DF xcall _comparator_init
004E .dbline 84
004E ;
004E ; MCUCR = 0x00;
004E 2224 clr R2
0050 25BE out 0x35,R2
0052 .dbline 85
0052 ; GICR = 0x00;
0052 2BBE out 0x3b,R2
0054 .dbline 86
0054 ; TIMSK = 0x00; //timer interrupt sources
0054 29BE out 0x39,R2
0056 .dbline 87
0056 ; SEI(); //re-enable interrupts
0056 7894 sei
0058 .dbline -2
0058 L6:
0058 .dbline 0 ; func end
0058 0895 ret
005A .dbend
005A .dbfunc e main _main fV
.even
005A _main::
005A .dbline -1
005A .dbline 92
005A ; //all peripherals are now initialized
005A ; }
005A ;
005A ; void main(void)
005A ; {
005A .dbline 93
005A ; init_devices();
005A F6DF xcall _init_devices
005C L8:
005C .dbline 95
005C L9:
005C .dbline 94
005C FFCF xjmp L8
005E X0:
005E .dbline -2
005E L7:
005E .dbline 0 ; func end
005E 0895 ret
0060 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -