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