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

📄 模拟比较器.lst

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