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

📄 echo.lst

📁 用的avr icc 开发的atmega16的超声波测距仪模型。
💻 LST
📖 第 1 页 / 共 4 页
字号:
__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 + -