?? 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 + -