⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.s

📁 avr_comp模拟比较器
💻 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 + -