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