📄 echo.lst
字号:
__start:
__text_start:
0054 E5CF LDI R28,0x5F
0055 E0D4 LDI R29,4
0056 BFCD OUT 0x3D,R28
0057 BFDE OUT 0x3E,R29
0058 51C0 SUBI R28,0x10
0059 40D0 SBCI R29,0
005A EA0A LDI R16,0xAA
005B 8308 STD Y+0,R16
005C 2400 CLR R0
005D EBE3 LDI R30,0xB3
005E E0F0 LDI R31,0
005F E010 LDI R17,0
0060 3BEE CPI R30,0xBE
0061 07F1 CPC R31,R17
0062 F011 BEQ 0x0065
0063 9201 ST R0,Z+
0064 CFFB RJMP 0x0060
0065 8300 STD Z+0,R16
0066 E5E4 LDI R30,0x54
0067 E0F0 LDI R31,0
0068 E6A0 LDI R26,0x60
0069 E0B0 LDI R27,0
006A E010 LDI R17,0
006B 3AE7 CPI R30,0xA7
006C 07F1 CPC R31,R17
006D F021 BEQ 0x0072
006E 95C8 LPM
006F 9631 ADIW R30,1
0070 920D ST R0,X+
0071 CFF9 RJMP 0x006B
0072 D311 RCALL _main
_exit:
0073 CFFF RJMP _exit
FILE: D:\NEW\ECHO\timer1.c
(0001) #define TIMER1_C
(0002) #include "includes.h"
(0003) //TIMER1 initialisation - prescale:64
(0004) // WGM: 0) Normal, TOP=0xFFFF
(0005) // desired value: 200000uSec
(0006) // actual value: 200000.000uSec (0.0%)
(0007) unsigned char cap[4]={0,};
(0008) void timer1_init(void)
(0009) {
(0010) TCCR1B = 0x00; //stop
_timer1_init:
0074 2422 CLR R2
0075 BC2E OUT 0x2E,R2
0076 940E049D CALL 0x49D
(0011) TCNT1H = 0xCF; //setup 200 000 uSec
(0012) TCNT1L = 0x2C;
(0013) OCR1AH = 0x30;
0078 E380 LDI R24,0x30
0079 BD8B OUT 0x2B,R24
(0014) OCR1AL = 0xD4;
007A ED84 LDI R24,0xD4
007B BD8A OUT 0x2A,R24
(0015) OCR1BH = 0x30;
007C E380 LDI R24,0x30
007D BD89 OUT 0x29,R24
(0016) OCR1BL = 0xD4;
007E ED84 LDI R24,0xD4
007F BD88 OUT 0x28,R24
(0017) ICR1H = 0x30;
0080 E380 LDI R24,0x30
0081 BD87 OUT 0x27,R24
(0018) ICR1L = 0xD4;
0082 ED84 LDI R24,0xD4
0083 BD86 OUT 0x26,R24
(0019) TCCR1A = 0x00;
0084 BC2F OUT 0x2F,R2
(0020) //TCCR1B = 0xC3; //start Timer
(0021) }
0085 9508 RET
_timer1_capt_isr:
0086 D3AF RCALL push_lset
0087 9722 SBIW R28,2
(0022)
(0023) #pragma interrupt_handler timer1_capt_isr:6
(0024) void timer1_capt_isr(void)
(0025) {
(0026) //timer 1 input capture event, read (int)value in ICR1 using;
(0027) capt_timer1=ICR1L; //Read low byte first (important)
0088 B426 IN R2,0x26
0089 2433 CLR R3
008A 940E04C6 CALL 0x4C6
(0028) capt_timer1|=(int)ICR1H << 8; //Read high byte and shift into top byte
008C B427 IN R2,0x27
008D 2433 CLR R3
008E 2C32 MOV R3,R2
008F 2422 CLR R2
0090 904000B3 LDS R4,_capt_timer1
0092 905000B4 LDS R5,_capt_timer1+1
0094 2842 OR R4,R2
0095 2853 OR R5,R3
0096 925000B4 STS _capt_timer1+1,R5
0098 924000B3 STS _capt_timer1,R4
(0029) timer1_stop();//stop timer1
009A D090 RCALL _timer1_stop
(0030) TIMSK = 0x00; //disable capt interupt
009B 2422 CLR R2
009C BE29 OUT 0x39,R2
009D 940E049D CALL 0x49D
(0031) TCNT1H = 0xCF /*INVALID SETTING*/; //reload counter high value
(0032) TCNT1L = 0x2C /*INVALID SETTING*/; //reload counter low value
(0033)
(0034) capt_timer1=capt_timer1-0xcf2c;//DATA SIGNIAL PROCESSING
009F 918000B3 LDS R24,_capt_timer1
00A1 919000B4 LDS R25,_capt_timer1+1
00A3 528C SUBI R24,0x2C
00A4 4C9F SBCI R25,0xCF
00A5 939000B4 STS _capt_timer1+1,R25
00A7 938000B3 STS _capt_timer1,R24
(0035) capt_timer1=(capt_timer1/625)*speed/100/2;//DATA SIGNIAL PROCESSING
00A9 E721 LDI R18,0x71
00AA E032 LDI R19,2
00AB 018C MOVW R16,R24
00AC D33E RCALL div16u
00AD 912000B9 LDS R18,_speed
00AF 913000BA LDS R19,_speed+1
00B1 D353 RCALL empy16s
00B2 E624 LDI R18,0x64
00B3 E030 LDI R19,0
00B4 D336 RCALL div16u
00B5 0118 MOVW R2,R16
00B6 9436 LSR R3
00B7 9427 ROR R2
00B8 940E04C6 CALL 0x4C6
(0036) cap[3]='0'+capt_timer1/1000;
00BA EE28 LDI R18,0xE8
00BB E033 LDI R19,3
00BC 0181 MOVW R16,R2
00BD D32D RCALL div16u
00BE 01C8 MOVW R24,R16
00BF 96C0 ADIW R24,0x30
00C0 93800063 STS 0x63,R24
(0037) capt_timer1%=1000;
00C2 EE28 LDI R18,0xE8
00C3 E033 LDI R19,3
00C4 940E04A7 CALL 0x4A7
00C6 D322 RCALL mod16u
00C7 940E04A2 CALL 0x4A2
(0038) cap[2]='0'+capt_timer1/100;
00C9 E624 LDI R18,0x64
00CA E030 LDI R19,0
00CB D31F RCALL div16u
00CC 01C8 MOVW R24,R16
00CD 96C0 ADIW R24,0x30
00CE 93800062 STS 0x62,R24
(0039) capt_timer1%=100;
00D0 E624 LDI R18,0x64
00D1 E030 LDI R19,0
00D2 940E04A7 CALL 0x4A7
00D4 D314 RCALL mod16u
00D5 940E04A2 CALL 0x4A2
(0040) cap[1]='0'+capt_timer1/10;
00D7 E02A LDI R18,0xA
00D8 E030 LDI R19,0
00D9 D311 RCALL div16u
00DA 01C8 MOVW R24,R16
00DB 96C0 ADIW R24,0x30
00DC 93800061 STS 0x61,R24
(0041) capt_timer1%=10;
00DE E02A LDI R18,0xA
00DF E030 LDI R19,0
00E0 940E04A7 CALL 0x4A7
00E2 D306 RCALL mod16u
00E3 940E04A2 CALL 0x4A2
(0042) cap[0]='0'+capt_timer1;
00E5 01C8 MOVW R24,R16
00E6 96C0 ADIW R24,0x30
00E7 93800060 STS 0x60,R24
(0043) LCD_DisplayString(2,1,"LENTH= ");
00E9 E78A LDI R24,0x7A
00EA 940E0498 CALL 0x498
00EC E002 LDI R16,2
00ED D198 RCALL _LCD_DisplayString
(0044) LCD_Cursor (2,8);
00EE E028 LDI R18,0x8
00EF E002 LDI R16,2
00F0 D1A4 RCALL _LCD_Cursor
(0045) LCD_DisplayCharacter (cap[3]);
00F1 91000063 LDS R16,0x63
00F3 D17B RCALL _LCD_DisplayCharacter
(0046) LCD_Cursor (2,9);
00F4 E029 LDI R18,0x9
00F5 E002 LDI R16,2
00F6 D19E RCALL _LCD_Cursor
(0047) LCD_DisplayCharacter (cap[2]);
00F7 91000062 LDS R16,0x62
00F9 D175 RCALL _LCD_DisplayCharacter
(0048) LCD_Cursor (2,10);
00FA E02A LDI R18,0xA
00FB E002 LDI R16,2
00FC D198 RCALL _LCD_Cursor
(0049) LCD_DisplayCharacter (cap[1]);
00FD 91000061 LDS R16,0x61
00FF D16F RCALL _LCD_DisplayCharacter
(0050) LCD_Cursor (2,11);
0100 E02B LDI R18,0xB
0101 E002 LDI R16,2
0102 D192 RCALL _LCD_Cursor
(0051) LCD_DisplayCharacter ('.');
0103 E20E LDI R16,0x2E
0104 D16A RCALL _LCD_DisplayCharacter
(0052) LCD_Cursor (2,12);
0105 E02C LDI R18,0xC
0106 E002 LDI R16,2
0107 D18D RCALL _LCD_Cursor
(0053) LCD_DisplayCharacter (cap[0]);
0108 91000060 LDS R16,0x60
010A D164 RCALL _LCD_DisplayCharacter
(0054) LCD_DisplayString(2,13,"m ");
010B E783 LDI R24,0x73
010C E090 LDI R25,0
010D 8399 STD Y+1,R25
010E 8388 STD Y+0,R24
010F E02D LDI R18,0xD
0110 E002 LDI R16,2
0111 D174 RCALL _LCD_DisplayString
(0055) }
0112 9622 ADIW R28,2
0113 D339 RCALL pop_lset
0114 9518 RETI
_timer1_ovf_isr:
0115 D320 RCALL push_lset
0116 9722 SBIW R28,2
(0056)
(0057) #pragma interrupt_handler timer1_ovf_isr:9
(0058) void timer1_ovf_isr(void)
(0059) {
(0060) //TIMER1 has overflowed
(0061) timer1_stop();
0117 D013 RCALL _timer1_stop
(0062) TIMSK = 0x00; //disable ovf interupt
0118 2422 CLR R2
0119 BE29 OUT 0x39,R2
011A 940E049D CALL 0x49D
(0063) TCNT1H = 0xCF /*INVALID SETTING*/; //reload counter high value
(0064) TCNT1L = 0x2C /*INVALID SETTING*/; //reload counter low value
(0065) LCD_DisplayString(2,1,"OUT OF RANGE !");//(ROW(1-2),COLUMN(1-16),STRING)
011C E684 LDI R24,0x64
011D 940E0498 CALL 0x498
011F E002 LDI R16,2
0120 D165 RCALL _LCD_DisplayString
(0066) }
0121 9622 ADIW R28,2
0122 D32A RCALL pop_lset
0123 9518 RETI
(0067)
(0068) void timer1_start(void)
(0069) {TCCR1B = 0x00;//STOP TIMER1
_timer1_start:
0124 2422 CLR R2
0125 BC2E OUT 0x2E,R2
0126 940E049D CALL 0x49D
(0070) TCNT1H = 0xCF;//200 000 us
(0071) TCNT1L = 0x2C ;
(0072) TCCR1B = 0xC3;
0128 EC83 LDI R24,0xC3
0129 BD8E OUT 0x2E,R24
(0073) }
012A 9508 RET
(0074) void timer1_stop(void)
(0075) {
(0076) TCCR1B=0x00;//STOP TIMER1
_timer1_stop:
012B 2422 CLR R2
012C BC2E OUT 0x2E,R2
(0077) }
012D 9508 RET
FILE: D:\NEW\ECHO\delay.c
(0001) #define DELAY_C
(0002) #include "includes.h"
(0003) #define XTAL 4 //晶振频率,单位MHz
(0004) void ds_delay(unsigned char n)//speciel delay for ds18b20
(0005) { //7.3752MHz n=254>>> t=99us
(0006) for( ;n!=0;n--);
_ds_delay:
n --> R16
012E C001 RJMP 0x0130
012F 950A DEC R16
0130 2300 TST R16
0131 F7E9 BNE 0x012F
(0007) }
0132 9508 RET
(0008)
(0009) void delay_1us(void) //1us延时函数
(0010) {
(0011) asm("nop");
_delay_1us:
0133 0000 NOP
(0012) }
0134 9508 RET
_delay_nus:
i --> R20
n --> R22
0135 D2FA RCALL push_gset2
0136 01B8 MOVW R22,R16
(0013)
(0014) void delay_nus(unsigned int n) //N us延时函数
(0015) {
(0016) unsigned int i=0;
0137 2744 CLR R20
0138 2755 CLR R21
(0017) for (i=0;i<n;i++)
0139 C003 RJMP 0x013D
(0018) delay_1us();
013A DFF8 RCALL _delay_1us
013B 5F4F SUBI R20,0xFF
013C 4F5F SBCI R21,0xFF
013D 1746 CP R20,R22
013E 0757 CPC R21,R23
013F F3D0 BCS 0x013A
(0019) }
0140 D2D4 RCALL pop_gset2
0141 9508 RET
(0020)
(0021) void delay_1ms(void) //1ms延时函数
(0022) {
(0023) unsigned int i;
(0024) for (i=0;i<(unsigned int)(XTAL*143-2);i++);
_delay_1ms:
i --> R16
0142 2700 CLR R16
0143 2711 CLR R17
0144 C002 RJMP 0x0147
0145 5F0F SUBI R16,0xFF
0146 4F1F SBCI R17,0xFF
0147 330A CPI R16,0x3A
0148 E0E2 LDI R30,2
0149 071E CPC R17,R30
014A F3D0 BCS 0x0145
(0025) }
014B 9508 RET
_delay_nms:
i --> R20
n --> R22
014C D2E3 RCALL push_gset2
014D 01B8 MOVW R22,R16
(0026)
(0027) void delay_nms(unsigned int n) //N ms延时函数
(0028) {
(0029) unsigned int i=0;
014E 2744 CLR R20
014F 2755 CLR R21
(0030) for (i=0;i<n;i++)
0150 C003 RJMP 0x0154
(0031) {
(0032) delay_1ms();
0151 DFF0 RCALL _delay_1ms
0152 5F4F SUBI R20,0xFF
0153 4F5F SBCI R21,0xFF
0154 1746 CP R20,R22
0155 0757 CPC R21,R23
0156 F3D0 BCS 0x0151
(0033) }
(0034) }
0157 D2BD RCALL pop_gset2
0158 9508 RET
_resetDS18B20:
errTime --> R20
0159 D2BF RCALL push_gset1
FILE: D:\NEW\ECHO\ds18b20.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "ds18b20.h"
(0004) #include "delay.h"
(0005)
(0006)
(0007) unsigned char temp_buf[4];
(0008) /**********************************************************************
(0009) functionName: unsigned char resetDS18B20(void)
(0010) description :DS18B20初始化
(0011) **********************************************************************/
(0012) unsigned char resetDS18B20(void)
(0013) {
(0014) unsigned char errTime=0;
015A 2744 CLR R20
(0015) RLS_DS18B20; //释放总线
015B 98A1 CBI 0x14,1
(0016) _NOP();
015C 0000 NOP
(0017) HLD_DS18B20; //Maga16控制总线
015D 9AA1 SBI 0x14,1
(0018) CLR_DS18B20; //强制拉低
015E 98A9 CBI 0x15,1
(0019) ds_delay(254); //209.42us
015F EF0E LDI R16,0xFE
0160 DFCD RCALL _ds_delay
(0020) ds_delay(254);
0161 EF0E LDI R16,0xFE
0162 DFCB RCALL _ds_delay
(0021) ds_delay(254);
0163 EF0E LDI R16,0xFE
0164 DFC9 RCALL _ds_delay
(0022) //以上延时大于480us
(0023) RLS_DS18B20; //释放总线,总线自动上拉
0165 98A1 CBI 0x14,1
(0024) _NOP();
0166 0000 NOP
0167 C008 RJMP 0x0170
(0025) while(STU_DS18B20)
(0026) {
(0027) ds_delay(10);//5-15us
0168 E00A LDI R16,0xA
0169 DFC4 RCALL _ds_delay
(0028) errTime++;
016A 9543 INC R20
(0029) if(errTime>4)
016B E084 LDI R24,4
016C 1784 CP R24,R20
016D F410 BCC 0x0170
(0030) return(0x00); //如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
016E 2700 CLR R16
016F C00F RJMP 0x017F
0170 9999 SBIC 0x13,1
0171 CFF6 RJMP 0x0168
(0031) }
(0032) errTime=0;
0172 2744 CLR R20
0173 C008 RJMP 0x017C
(0033) while(!(STU_DS18B20))
(0034) {
(0035) ds_delay(10);//5.15us
0174 E00A LDI R16,0xA
0175 DFB8 RCALL _ds_delay
(0036) errTime++;
0176 9543 INC R20
(0037) if(errTime>20)
0177 E184 LDI R24,0x14
0178 1784 CP R24,R20
0179 F410 BCC 0x017C
(0038) return(0x00); //如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
017A 2700 CLR R16
017B C003 RJMP 0x017F
017C 9B99 SBIS 0x13,1
017D CFF6 RJMP 0x0174
(0039) }
(0040) return(0xff);
017E EF0F LDI R16,0xFF
017F D29C RCALL pop_gset1
0180 9508 RET
_readByteDS18B20:
retVal --> R20
i --> R22
0181 D2AE RCALL push_gset2
(0041) }
(0042)
(0043) /**********************************************************************
(0044) functionName: unsigned char readByteDS18B20(void)
(0045) description :读DS18B20一个字节
(0046) **********************************************************************/
(0047) unsigned char readByteDS18B20(void)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -