?? ad7705.lst
字號:
__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 + -