📄 模拟比较器.lst
字号:
__start:
__text_start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51C0 SUBI R28,0x10
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 36E0 CPI R30,0x60
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E0078 CALL _main
_exit:
004A CFFF RJMP _exit
FILE: D:\桌面\avr程序设计\模拟比较器\main.c
(0001) //ICC-AVR application builder : 2007-3-15 8:22:58
(0002) // Target : M16
(0003) // Crystal: 7.3728Mhz
(0004)
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) #include "delay.h"
(0008)
(0009) //管脚定义
(0010) #define LED0 0 //PB0
(0011) #define AIN_P 2 //PB2(AIN0)
(0012) #define AIN_N 3 //PB3(AIN1)
(0013)
(0014) //宏定义
(0015) #define LED0_ON() PORTB|= (1<<LED0) //输出高电平,灯亮
(0016) #define LED0_OFF() PORTB&=~(1<<LED0) //输出低电平,灯灭
(0017)
(0018) //常量定义
(0019) /*
(0020) 模拟比较器的正输入端由 ACBG位决定,=0选择AIN0引脚,=1选择1.23V内部能隙基准源
(0021)
(0022) 模拟比较器多工输入 (不常用,因为ADC将无法使用)
(0023) 可以选择ADC7..0 之中的任意一个来代替模拟比较器的负极输入端。
(0024) ADC复用器可用来完成这个功能。
(0025) 当然,为了使用这个功能首先必须关掉ADC。
(0026) 如果模拟比较器复用器使 能位(SFIOR 中的ACME) 被置位,且ADC 也已经关掉(ADCSRA 寄存器的ADEN 为0),
(0027) 则可以通过ADMUX 寄存器的MUX2..0 来选择替代模拟比较器负极输入的管脚,
(0028) 如果ACME 清零或ADEN 置位,则模拟比较器的负极输入为AIN1。
(0029)
(0030) */
(0031) #define AC_ADC0 0x00 //ADC0
(0032) #define AC_ADC1 0x01 //ADC1
(0033) #define AC_ADC2 0x02 //ADC2
(0034) #define AC_ADC3 0x03 //ADC3
(0035) #define AC_ADC4 0x04 //ADC4
(0036) #define AC_ADC5 0x05 //ADC5
(0037) #define AC_ADC6 0x06 //ADC6
(0038) #define AC_ADC7 0x07 //ADC7
(0039)
(0040) void port_init(void)
(0041) {
(0042) PORTA = 0x00;
_port_init:
004B 2422 CLR R2
004C BA2B OUT 0x1B,R2
(0043) DDRA = 0x00;
004D BA2A OUT 0x1A,R2
(0044) PORTB = ~((1<<AIN_P)|(1<<AIN_N)); //作模拟比较器输入时,不可使能内部上拉电阻。
004E EF83 LDI R24,0xF3
004F BB88 OUT 0x18,R24
(0045) DDRB = (1<<LED0); //PB0作输出
0050 E081 LDI R24,1
0051 BB87 OUT 0x17,R24
(0046) PORTC = 0x00; //m103 output only
0052 BA25 OUT 0x15,R2
(0047) DDRC = 0x00;
0053 BA24 OUT 0x14,R2
(0048) PORTD = 0x00;
0054 BA22 OUT 0x12,R2
(0049) DDRD = 0x00;
0055 BA21 OUT 0x11,R2
0056 9508 RET
(0050) }
(0051)
(0052) //Comparator initialize
(0053) // trigger on: Output toggle
(0054) void comparator_init(void)
(0055) {
(0056) ACSR = ACSR & 0xF7; //ensure interrupt is off before changing
_comparator_init:
0057 B188 IN R24,0x08
0058 7F87 ANDI R24,0xF7
0059 B988 OUT 0x08,R24
(0057) ACSR = 0xCC;
005A EC8C LDI R24,0xCC
005B B988 OUT 0x08,R24
005C 9508 RET
_ana_comp_isr:
005D 940E011E CALL push_lset
(0058) //ACSR=(1<<ACIE);
(0059) // 使能模拟比较器中断,比较器输出变化即可触发中断,AIN0为正输入端,AIN1为负输入端。
(0060)
(0061) }
(0062)
(0063) #pragma interrupt_handler ana_comp_isr:17
(0064) void ana_comp_isr(void)
(0065) {
(0066) //analog comparator compare event
(0067) //硬件自动清除ACI标志位
(0068) delay_us(10);
005F E00A LDI R16,0xA
0060 E010 LDI R17,0
0061 940E00AF CALL _delay_us
(0069) if ((ACSR&(1<<ACO))==0) //检测ACO
0063 9945 SBIC 0x08,5
0064 C002 RJMP 0x0067
(0070) LED0_ON(); //如果AIN0<AIN1(ACO=0),LED亮
0065 9AC0 SBI 0x18,0
0066 C001 RJMP 0x0068
(0071) else
(0072) LED0_OFF(); //否则 LED灭
0067 98C0 CBI 0x18,0
(0073) delay_ms(200); //当电压差接近0V时,模拟比较器会产生临界抖动,故延时200mS令肉眼能看到
0068 EC08 LDI R16,0xC8
0069 E010 LDI R17,0
006A 940E00BD CALL _delay_ms
006C 940E0135 CALL pop_lset
006E 9518 RETI
(0074) }
(0075)
(0076) //call this routine to initialize all peripherals
(0077) void init_devices(void)
(0078) {
(0079) //stop errant interrupts until set up
(0080) CLI(); //disable all interrupts
_init_devices:
006F 94F8 BCLR 7
(0081) port_init();
0070 DFDA RCALL _port_init
(0082) comparator_init();
0071 DFE5 RCALL _comparator_init
(0083)
(0084) MCUCR = 0x00;
0072 2422 CLR R2
0073 BE25 OUT 0x35,R2
(0085) GICR = 0x00;
0074 BE2B OUT 0x3B,R2
(0086) TIMSK = 0x00; //timer interrupt sources
0075 BE29 OUT 0x39,R2
(0087) SEI(); //re-enable interrupts
0076 9478 BSET 7
0077 9508 RET
(0088) //all peripherals are now initialized
(0089) }
(0090)
(0091) void main(void)
(0092) {
(0093) init_devices();
_main:
0078 DFF6 RCALL _init_devices
(0094) while(1)
0079 CFFF RJMP 0x0079
007A 9508 RET
FILE: D:\桌面\avr程序设计\模拟比较器\delay.c
(0001) /****************************
(0002) ** file_name delay.c **
(0003) ** describe 软件延时函数 **
(0004) ** auther 古欣 **
(0005) ** Time 2007-1-31 **
(0006) *****************************/
(0007) #include "delay.h"
(0008) /***********************
(0009) ** 8M晶振下 1us
(0010) ** 也可以宏定义 8个asm("nop");
(0011) ** #define delay_1us asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
(0012) ***********************/
(0013) void delay_1us(void)
(0014) {
(0015) asm("nop");
_delay_1us:
007B 0000 NOP
007C 9508 RET
(0016) }
(0017)
(0018) /***********************
(0019) **8M时为 1000.25us
(0020) **4M时为 999.5us
(0021) **xtal 为晶振频率,单位为Mhz
(0022) ************************/
(0023) void delay_1ms(void)
(0024) {
(0025) unsigned int i;
(0026) for(i=(xtal*143-2);i>0;i--)
_delay_1ms:
i --> R16
007D E706 LDI R16,0x76
007E E014 LDI R17,4
007F C002 RJMP 0x0082
0080 5001 SUBI R16,1
0081 4010 SBCI R17,0
0082 3000 CPI R16,0
0083 0701 CPC R16,R17
0084 F7D9 BNE 0x0080
0085 9508 RET
_delay_1s:
i --> R20
0086 940E0107 CALL push_gset1
(0027) ;
(0028) }
(0029)
(0030) /***********************
(0031) ** 1S延时,误差可能稍大
(0032) ** 250ms*4=1000ms
(0033) ************************/
(0034) void delay_1s(void)
(0035) {
(0036) unsigned int i;
(0037) for(i=250;i>0;i--) //250ms*4=1000ms
0088 EF4A LDI R20,0xFA
0089 E050 LDI R21,0
008A C003 RJMP 0x008E
(0038) delay_1ms();
008B DFF1 RCALL _delay_1ms
008C 5041 SUBI R20,1
008D 4050 SBCI R21,0
008E 3040 CPI R20,0
008F 0745 CPC R20,R21
0090 F7D1 BNE 0x008B
(0039) for(i=250;i>0;i--)
0091 EF4A LDI R20,0xFA
0092 E050 LDI R21,0
0093 C003 RJMP 0x0097
(0040) delay_1ms();
0094 DFE8 RCALL _delay_1ms
0095 5041 SUBI R20,1
0096 4050 SBCI R21,0
0097 3040 CPI R20,0
0098 0745 CPC R20,R21
0099 F7D1 BNE 0x0094
(0041) for(i=250;i>0;i--)
009A EF4A LDI R20,0xFA
009B E050 LDI R21,0
009C C003 RJMP 0x00A0
(0042) delay_1ms();
009D DFDF RCALL _delay_1ms
009E 5041 SUBI R20,1
009F 4050 SBCI R21,0
00A0 3040 CPI R20,0
00A1 0745 CPC R20,R21
00A2 F7D1 BNE 0x009D
(0043) for(i=250;i>0;i--)
00A3 EF4A LDI R20,0xFA
00A4 E050 LDI R21,0
00A5 C003 RJMP 0x00A9
(0044) delay_1ms();
00A6 DFD6 RCALL _delay_1ms
00A7 5041 SUBI R20,1
00A8 4050 SBCI R21,0
00A9 3040 CPI R20,0
00AA 0745 CPC R20,R21
00AB F7D1 BNE 0x00A6
00AC 940E010A CALL pop_gset1
00AE 9508 RET
_delay_us:
i --> R20
n --> R22
00AF 940E0105 CALL push_gset2
00B1 01B8 MOVW R22,R16
(0045) }
(0046)
(0047) /***********************
(0048) **微秒级延时
(0049) ************************/
(0050) void delay_us(unsigned int n)
(0051) {
(0052) unsigned int i;
(0053) for(i=n;i>0;i--)
00B2 01AB MOVW R20,R22
00B3 C003 RJMP 0x00B7
(0054) delay_1us();
00B4 DFC6 RCALL _delay_1us
00B5 5041 SUBI R20,1
00B6 4050 SBCI R21,0
00B7 3040 CPI R20,0
00B8 0745 CPC R20,R21
00B9 F7D1 BNE 0x00B4
00BA 940E00FC CALL pop_gset2
00BC 9508 RET
_delay_ms:
i --> R20
n --> R22
00BD 940E0105 CALL push_gset2
00BF 01B8 MOVW R22,R16
(0055) }
(0056)
(0057) /***********************
(0058) **毫秒级延时
(0059) ************************/
(0060) void delay_ms(unsigned int n)
(0061) {
(0062) unsigned int i;
(0063) for(i=n;i>0;i--)
00C0 01AB MOVW R20,R22
00C1 C003 RJMP 0x00C5
(0064) delay_1ms();
00C2 DFBA RCALL _delay_1ms
00C3 5041 SUBI R20,1
00C4 4050 SBCI R21,0
00C5 3040 CPI R20,0
00C6 0745 CPC R20,R21
00C7 F7D1 BNE 0x00C2
00C8 940E00FC CALL pop_gset2
00CA 9508 RET
_delay_s:
j --> R20
i --> R22
n --> R22
00CB 940E0105 CALL push_gset2
00CD 01B8 MOVW R22,R16
(0065) }
(0066)
(0067) /***********************
(0068) **秒级延时,太浪费资源,不建议使用
(0069) ************************/
(0070) void delay_s(unsigned int n)
(0071) {
(0072) unsigned int i,j;
(0073) for(j=n;j>0;j--)
00CE 01AB MOVW R20,R22
00CF C026 RJMP 0x00F6
(0074) {
(0075) for(i=250;i>0;i--) //250ms*4=1000ms
00D0 EF6A LDI R22,0xFA
00D1 E070 LDI R23,0
00D2 C003 RJMP 0x00D6
(0076) delay_1ms();
00D3 DFA9 RCALL _delay_1ms
00D4 5061 SUBI R22,1
00D5 4070 SBCI R23,0
00D6 3060 CPI R22,0
00D7 0767 CPC R22,R23
00D8 F7D1 BNE 0x00D3
(0077) for(i=250;i>0;i--)
00D9 EF6A LDI R22,0xFA
00DA E070 LDI R23,0
00DB C003 RJMP 0x00DF
(0078) delay_1ms();
00DC DFA0 RCALL _delay_1ms
00DD 5061 SUBI R22,1
00DE 4070 SBCI R23,0
00DF 3060 CPI R22,0
00E0 0767 CPC R22,R23
00E1 F7D1 BNE 0x00DC
(0079) for(i=250;i>0;i--)
00E2 EF6A LDI R22,0xFA
00E3 E070 LDI R23,0
00E4 C003 RJMP 0x00E8
(0080) delay_1ms();
00E5 DF97 RCALL _delay_1ms
00E6 5061 SUBI R22,1
00E7 4070 SBCI R23,0
00E8 3060 CPI R22,0
00E9 0767 CPC R22,R23
00EA F7D1 BNE 0x00E5
(0081) for(i=250;i>0;i--)
00EB EF6A LDI R22,0xFA
00EC E070 LDI R23,0
00ED C003 RJMP 0x00F1
(0082) delay_1ms();
FILE: <library>
00EE DF8E RCALL _delay_1ms
00EF 5061 SUBI R22,1
00F0 4070 SBCI R23,0
00F1 3060 CPI R22,0
00F2 0767 CPC R22,R23
00F3 F7D1 BNE 0x00EE
00F4 5041 SUBI R20,1
00F5 4050 SBCI R21,0
00F6 3040 CPI R20,0
00F7 0745 CPC R20,R21
00F8 F6B9 BNE 0x00D0
00F9 940E00FC CALL pop_gset2
00FB 9508 RET
pop_gset2:
00FC E0E2 LDI R30,2
00FD 940C010B JMP pop
push_gset5:
00FF 92FA ST R15,-Y
0100 92EA ST R14,-Y
push_gset4:
0101 92DA ST R13,-Y
0102 92CA ST R12,-Y
push_gset3:
0103 92BA ST R11,-Y
0104 92AA ST R10,-Y
push_gset2:
0105 937A ST R23,-Y
0106 936A ST R22,-Y
push_gset1:
0107 935A ST R21,-Y
0108 934A ST R20,-Y
0109 9508 RET
pop_gset1:
010A E0E1 LDI R30,1
pop:
010B 9149 LD R20,Y+
010C 9159 LD R21,Y+
010D FDE0 SBRC R30,0
010E 9508 RET
010F 9169 LD R22,Y+
0110 9179 LD R23,Y+
0111 FDE1 SBRC R30,1
0112 9508 RET
0113 90A9 LD R10,Y+
0114 90B9 LD R11,Y+
0115 FDE2 SBRC R30,2
0116 9508 RET
0117 90C9 LD R12,Y+
0118 90D9 LD R13,Y+
0119 FDE3 SBRC R30,3
011A 9508 RET
011B 90E9 LD R14,Y+
011C 90F9 LD R15,Y+
011D 9508 RET
push_lset:
011E 93FA ST R31,-Y
011F 93EA ST R30,-Y
0120 93BA ST R27,-Y
0121 93AA ST R26,-Y
0122 939A ST R25,-Y
0123 938A ST R24,-Y
0124 933A ST R19,-Y
0125 932A ST R18,-Y
0126 931A ST R17,-Y
0127 930A ST R16,-Y
0128 929A ST R9,-Y
0129 928A ST R8,-Y
012A 927A ST R7,-Y
012B 926A ST R6,-Y
012C 925A ST R5,-Y
012D 924A ST R4,-Y
012E 923A ST R3,-Y
012F 922A ST R2,-Y
0130 921A ST R1,-Y
0131 920A ST R0,-Y
0132 B60F IN R0,0x3F
0133 920A ST R0,-Y
0134 9508 RET
pop_lset:
0135 9009 LD R0,Y+
0136 BE0F OUT 0x3F,R0
0137 9009 LD R0,Y+
0138 9019 LD R1,Y+
0139 9029 LD R2,Y+
013A 9039 LD R3,Y+
013B 9049 LD R4,Y+
013C 9059 LD R5,Y+
013D 9069 LD R6,Y+
013E 9079 LD R7,Y+
013F 9089 LD R8,Y+
0140 9099 LD R9,Y+
0141 9109 LD R16,Y+
0142 9119 LD R17,Y+
0143 9129 LD R18,Y+
0144 9139 LD R19,Y+
0145 9189 LD R24,Y+
0146 9199 LD R25,Y+
0147 91A9 LD R26,Y+
0148 91B9 LD R27,Y+
0149 91E9 LD R30,Y+
014A 91F9 LD R31,Y+
014B 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -