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

📄 ad7705.lst

📁 基于mega128上实现ad7705的驱动程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    005C EFCF      LDI	R28,0xFF
    005D E1D0      LDI	R29,0x10
    005E BFCD      OUT	0x3D,R28
    005F BFDE      OUT	0x3E,R29
    0060 51C0      SUBI	R28,0x10
    0061 40D0      SBCI	R29,0
    0062 EA0A      LDI	R16,0xAA
    0063 8308      STD	Y+0,R16
    0064 2400      CLR	R0
    0065 E1E6      LDI	R30,0x16
    0066 E0F1      LDI	R31,1
    0067 E011      LDI	R17,1
    0068 32E4      CPI	R30,0x24
    0069 07F1      CPC	R31,R17
    006A F011      BEQ	0x006D
    006B 9201      ST	R0,Z+
    006C CFFB      RJMP	0x0068
    006D 8300      STD	Z+0,R16
    006E EAE2      LDI	R30,0xA2
    006F E0F0      LDI	R31,0
    0070 E0A0      LDI	R26,0
    0071 E0B1      LDI	R27,1
    0072 E010      LDI	R17,0
    0073 3BE8      CPI	R30,0xB8
    0074 07F1      CPC	R31,R17
    0075 F021      BEQ	0x007A
    0076 95C8      LPM
    0077 9631      ADIW	R30,1
    0078 920D      ST	R0,X+
    0079 CFF9      RJMP	0x0073
    007A 940E0417  CALL	_main
_exit:
    007C CFFF      RJMP	_exit
FILE: D:\各种模块设计\模块程序集\ad7705\delay.h
(0001) #ifndef delay_h
(0002) #define delay_h
(0003) #define XTAL 8  
(0004) 
(0005) void delay_1us(void)                 //1us延时函数
(0006)   {
(0007)    asm("nop");
_delay_1us:
    007D 0000      NOP
    007E 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R22
    007F 940E0544  CALL	push_gset2
    0081 01B8      MOVW	R22,R16
(0008)   }
(0009) 
(0010) void delay_nus(unsigned int n)       //N us延时函数
(0011)   {
(0012)    unsigned int i=0;
    0082 2744      CLR	R20
    0083 2755      CLR	R21
(0013)    for (i=0;i<n;i++)
    0084 C003      RJMP	0x0088
(0014)    delay_1us();
    0085 DFF7      RCALL	_delay_1us
    0086 5F4F      SUBI	R20,0xFF
    0087 4F5F      SBCI	R21,0xFF
    0088 1746      CP	R20,R22
    0089 0757      CPC	R21,R23
    008A F3D0      BCS	0x0085
    008B 940E0535  CALL	pop_gset2
    008D 9508      RET
(0015)   }
(0016)   
(0017) void delay_1ms(void)                 //1ms延时函数
(0018)   {
(0019)    unsigned int i;
(0020)    for (i=0;i<(unsigned int)(XTAL*143-2);i++);
_delay_1ms:
  i                    --> R16
    008E 2700      CLR	R16
    008F 2711      CLR	R17
    0090 C002      RJMP	0x0093
    0091 5F0F      SUBI	R16,0xFF
    0092 4F1F      SBCI	R17,0xFF
    0093 3706      CPI	R16,0x76
    0094 E0E4      LDI	R30,4
    0095 071E      CPC	R17,R30
    0096 F3D0      BCS	0x0091
    0097 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    0098 940E0544  CALL	push_gset2
    009A 01B8      MOVW	R22,R16
(0021)   }
(0022)   
(0023) void delay_nms(unsigned int n)       //N ms延时函数
(0024)   {
(0025)     unsigned int i=0;
    009B 2744      CLR	R20
    009C 2755      CLR	R21
(0026)     for (i=0;i<n;i++)
    009D C003      RJMP	0x00A1
(0027)      {
(0028)        delay_1ms();
    009E DFEF      RCALL	_delay_1ms
    009F 5F4F      SUBI	R20,0xFF
    00A0 4F5F      SBCI	R21,0xFF
    00A1 1746      CP	R20,R22
    00A2 0757      CPC	R21,R23
    00A3 F3D0      BCS	0x009E
    00A4 940E0535  CALL	pop_gset2
    00A6 9508      RET
_init_adc7705:
  i                    --> R20
    00A7 940E0546  CALL	push_gset1
FILE: D:\各种模块设计\模块程序集\ad7705\7705.h
(0001) #include"delay.h"
(0002) #define N  7
(0003) /****************************************************************************/
(0004) //功能: AD7705与Atmega64硬件接口
(0005) //输入: 无
(0006) //输出: 无
(0007) //备注:
(0008) /****************************************************************************/
(0009) #define sclk_set (PORTF|=(1<<0))
(0010) #define sclk_clr (PORTF&=~(1<<0))
(0011) #define din_set  (PORTF|=(1<<1))
(0012) #define din_clr  (PORTF&=~(1<<1))
(0013) #define dout     (PINF&(1<<2) )
(0014) #define drdy     (PINF&(1<<3) )
(0015) /****************************************************************************/
(0016) //功能: AD7705各功能模块函数
(0017) //输入: 无
(0018) //输出: 函数名
(0019) //备注:
(0020) /****************************************************************************/
(0021) void init_adc7705(void);
(0022) void write_adc7705(unsigned char cmd_data);
(0023) unsigned int read_adc7705(unsigned char channel);
(0024) /****************************************************************************/
(0025) //函数名:    init_adc7705(void)
(0026) //功能:      初始化ADC7705
(0027) //输入:      无
(0028) //输出:      无
(0029) //备注:
(0030) /****************************************************************************/
(0031) void init_adc7705(void)
(0032) {
(0033)   unsigned char i;
(0034)   sclk_set;
    00A9 91800062  LDS	R24,0x62
    00AB 6081      ORI	R24,1
    00AC 93800062  STS	0x62,R24
(0035)   din_set;
    00AE 91800062  LDS	R24,0x62
    00B0 6082      ORI	R24,2
    00B1 93800062  STS	0x62,R24
(0036)   for(i=0;i<40;i++)
    00B3 2744      CLR	R20
    00B4 C00B      RJMP	0x00C0
(0037)     {sclk_clr;sclk_set;}   //防止接口迷失,通信寄存器返回到等待状态
    00B5 91800062  LDS	R24,0x62
    00B7 7F8E      ANDI	R24,0xFE
    00B8 93800062  STS	0x62,R24
    00BA 91800062  LDS	R24,0x62
    00BC 6081      ORI	R24,1
    00BD 93800062  STS	0x62,R24
    00BF 9543      INC	R20
    00C0 3248      CPI	R20,0x28
    00C1 F398      BCS	0x00B5
(0038) 	write_adc7705(0x20);   //通道1,下一个写时钟寄存器
    00C2 E200      LDI	R16,0x20
    00C3 D00C      RCALL	_write_adc7705
(0039) 	write_adc7705(0x06);   //写时钟寄存器设置更新速率为250HZ	
    00C4 E006      LDI	R16,6
    00C5 D00A      RCALL	_write_adc7705
(0040) 	write_adc7705(0x10);   //通道1,下一个写设置寄存器
    00C6 E100      LDI	R16,0x10
    00C7 D008      RCALL	_write_adc7705
(0041) 	write_adc7705(0x44);   //写设置寄存器,设置成单极性、无缓冲、增益为1、滤波器工作、自校准
    00C8 E404      LDI	R16,0x44
    00C9 D006      RCALL	_write_adc7705
(0042) 	delay_nms(100);
    00CA E604      LDI	R16,0x64
    00CB E010      LDI	R17,0
    00CC DFCB      RCALL	_delay_nms
    00CD 940E0549  CALL	pop_gset1
    00CF 9508      RET
_write_adc7705:
  cmd                  --> R20
  i                    --> R22
  token                --> R10
  cmd_data             --> R22
    00D0 940E0542  CALL	push_gset3
    00D2 2F60      MOV	R22,R16
(0043) }
(0044) /****************************************************************************/
(0045) //函数名:    write_adc7705(unsigned char cmd)
(0046) //功能:      写控制字到ADC7705寄存器中
(0047) //输入:      cmd
(0048) //输出:      无
(0049) //备注:
(0050) /****************************************************************************/
(0051) void write_adc7705(unsigned char cmd_data)
(0052) {
(0053)   unsigned char cmd,i,token;
(0054)   token=0x80;cmd=cmd_data;
    00D3 E880      LDI	R24,0x80
    00D4 2EA8      MOV	R10,R24
    00D5 2F46      MOV	R20,R22
(0055)   sclk_set;
    00D6 91800062  LDS	R24,0x62
    00D8 6081      ORI	R24,1
    00D9 93800062  STS	0x62,R24
(0056)   for(i=0;i<8;i++)
    00DB 2766      CLR	R22
    00DC C023      RJMP	0x0100
(0057)     {  
(0058) 	  sclk_clr;
    00DD 91800062  LDS	R24,0x62
    00DF 7F8E      ANDI	R24,0xFE
    00E0 93800062  STS	0x62,R24
(0059) 	  delay_nus(2);
    00E2 E002      LDI	R16,2
    00E3 E010      LDI	R17,0
    00E4 DF9A      RCALL	_delay_nus
(0060) 	  if(cmd&token) din_set;
    00E5 2E24      MOV	R2,R20
    00E6 202A      AND	R2,R10
    00E7 F031      BEQ	0x00EE
    00E8 91800062  LDS	R24,0x62
    00EA 6082      ORI	R24,2
    00EB 93800062  STS	0x62,R24
    00ED C005      RJMP	0x00F3
(0061) 	  else din_clr;
    00EE 91800062  LDS	R24,0x62
    00F0 7F8D      ANDI	R24,0xFD
    00F1 93800062  STS	0x62,R24
(0062) 	  delay_nus(2);
    00F3 E002      LDI	R16,2
    00F4 E010      LDI	R17,0
    00F5 DF89      RCALL	_delay_nus
(0063) 	  sclk_set;
    00F6 91800062  LDS	R24,0x62
    00F8 6081      ORI	R24,1
    00F9 93800062  STS	0x62,R24
(0064) 	  delay_nus(5);
    00FB E005      LDI	R16,5
    00FC E010      LDI	R17,0
    00FD DF81      RCALL	_delay_nus
(0065) 	  token=token>>1;
    00FE 94A6      LSR	R10
    00FF 9563      INC	R22
    0100 3068      CPI	R22,0x8
    0101 F2D8      BCS	0x00DD
(0066) 	}
(0067)   sclk_set;din_set;
    0102 91800062  LDS	R24,0x62
    0104 6081      ORI	R24,1
    0105 93800062  STS	0x62,R24
    0107 91800062  LDS	R24,0x62
    0109 6082      ORI	R24,2
    010A 93800062  STS	0x62,R24
    010C 940E0538  CALL	pop_gset3
    010E 9508      RET
_read_adc7705:
  token                --> Y+1
  i                    --> R20
  ad16bit              --> R22
  channel              --> R20
    010F 940E0544  CALL	push_gset2
    0111 2F40      MOV	R20,R16
(0068) }  	  
(0069) /****************************************************************************/
(0070) //函数名:    read_adc7705(void)
(0071) //功能:      写控制字到ADC7705寄存器中
(0072) //输入:      channel
(0073) //输出:      无
(0074) //备注:
(0075) /****************************************************************************/	  
(0076) unsigned int read_adc7705(unsigned char channel)
(0077) {
(0078)   unsigned int ad16bit,token;
(0079)   unsigned char i;
(0080)   write_adc7705(0x38|channel);
    0112 2F04      MOV	R16,R20
    0113 6308      ORI	R16,0x38
    0114 DFBB      RCALL	_write_adc7705
(0081)   while(drdy){;}             //等待数据准备好
    0115 9903      SBIC	0x00,3
    0116 CFFE      RJMP	0x0115
(0082)   sclk_set;
    0117 91800062  LDS	R24,0x62
    0119 6081      ORI	R24,1
    011A 93800062  STS	0x62,R24
(0083)   ad16bit=0x00;
    011C 2766      CLR	R22
    011D 2777      CLR	R23
(0084)   for(i=0;i<16;i++)
    011E 2744      CLR	R20
    011F C019      RJMP	0x0139
(0085)   { ad16bit=ad16bit<<1;
    0120 0F66      LSL	R22
    0121 1F77      ROL	R23
(0086)     sclk_clr;
    0122 91800062  LDS	R24,0x62
    0124 7F8E      ANDI	R24,0xFE
    0125 93800062  STS	0x62,R24
(0087) 	delay_nus(2);
    0127 E002      LDI	R16,2
    0128 E010      LDI	R17,0
    0129 DF55      RCALL	_delay_nus
(0088)     if(dout) ad16bit=ad16bit|0x01;   //读取数据位
    012A 9B02      SBIS	0x00,2
    012B C001      RJMP	0x012D
    012C 6061      ORI	R22,1
(0089) 	delay_nus(2);
    012D E002      LDI	R16,2
    012E E010      LDI	R17,0
    012F DF4F      RCALL	_delay_nus
(0090)     sclk_set;
    0130 91800062  LDS	R24,0x62
    0132 6081      ORI	R24,1
    0133 93800062  STS	0x62,R24
(0091) 	delay_nus(5);
    0135 E005      LDI	R16,5
    0136 E010      LDI	R17,0
    0137 DF47      RCALL	_delay_nus
    0138 9543      INC	R20
    0139 3140      CPI	R20,0x10
    013A F328      BCS	0x0120
(0092)   }
(0093)   sclk_set;din_set;
    013B 91800062  LDS	R24,0x62
    013D 6081      ORI	R24,1
    013E 93800062  STS	0x62,R24
    0140 91800062  LDS	R24,0x62
    0142 6082      ORI	R24,2
    0143 93800062  STS	0x62,R24
(0094)   return(ad16bit);
    0145 018B      MOVW	R16,R22
    0146 940E0535  CALL	pop_gset2
    0148 9508      RET
_ad7705:
  adc16                --> R20
  count                --> R22
  temp                 --> R14
  j                    --> R10
  value_buf            --> Y+0
  i                    --> R12
  chan                 --> R22
    0149 940E053E  CALL	push_gset5
    014B 2F60      MOV	R22,R16
    014C 972E      SBIW	R28,0xE
(0095) }  
(0096) /****************************************************************************/
(0097) //函数名:    ad7705()
(0098) //功能:      实现模数转换
(0099) //输入:      chan(通道)
(0100) //输出:      adc16(经ADC转换后的16位2进制数)
(0101) //备注:
(0102) /****************************************************************************/
(0103) unsigned int ad7705(unsigned char chan)
(0104) { 
(0105)   unsigned int adc16=0;
    014D 2744      CLR	R20
    014E 2755      CLR	R21
(0106)   unsigned int value_buf[N],temp;
(0107)   unsigned char count,i,j;
(0108)   for(count=0;count<N;count++)
    014F 2766      CLR	R22
    0150 C00D      RJMP	0x015E
(0109)   {
(0110)     init_adc7705();
    0151 DF55      RCALL	_init_adc7705
(0111) 	adc16=read_adc7705(0);
    0152 2700      CLR	R16
    0153 DFBB      RCALL	_read_adc7705
    0154 01A8      MOVW	R20,R16
(0112)     value_buf[count]=adc16;
    0155 E082      LDI	R24,2
    0156 9F86      MUL	R24,R22
    0157 01F0      MOVW	R30,R0
    0158 01CE      MOVW	R24,R28
    0159 0FE8      ADD	R30,R24
    015A 1FF9      ADC	R31,R25
    015B 8351      STD	Z+1,R21
    015C 8340      STD	Z+0,R20
    015D 9563      INC	R22
    015E 3067      CPI	R22,7
    015F F388      BCS	0x0151
(0113)   }
(0114) /***********************冒泡排序找出中值*************************************/
(0115)   for (j=0;j<N-1;j++)
    0160 24AA      CLR	R10
    0161 C03B      RJMP	0x019D
(0116)   {
(0117)     for (i=0;i<N-j;i++)
    0162 24CC      CLR	R12
    0163 C033      RJMP	0x0197
(0118)     {
(0119)       if ( value_buf[i]>value_buf[i+1] )
    0164 E082      LDI	R24,2
    0165 9D8C      MUL	R24,R12

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -