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

📄 motor_ce.lst

📁 AVR单片机的电机测速程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    003F E5CF      LDI	R28,0x5F
    0040 E0D4      LDI	R29,4
    0041 BFCD      OUT	0x3D,R28
    0042 BFDE      OUT	0x3E,R29
    0043 51C0      SUBI	R28,0x10
    0044 40D0      SBCI	R29,0
    0045 EA0A      LDI	R16,0xAA
    0046 8308      STD	Y+0,R16
    0047 2400      CLR	R0
    0048 E8EA      LDI	R30,0x8A
    0049 E0F0      LDI	R31,0
    004A E010      LDI	R17,0
    004B 38EA      CPI	R30,0x8A
    004C 07F1      CPC	R31,R17
    004D F011      BEQ	0x0050
    004E 9201      ST	R0,Z+
    004F CFFB      RJMP	0x004B
    0050 8300      STD	Z+0,R16
    0051 E5E4      LDI	R30,0x54
    0052 E0F0      LDI	R31,0
    0053 E6A0      LDI	R26,0x60
    0054 E0B0      LDI	R27,0
    0055 E010      LDI	R17,0
    0056 37EE      CPI	R30,0x7E
    0057 07F1      CPC	R31,R17
    0058 F021      BEQ	0x005D
    0059 95C8      LPM
    005A 9631      ADIW	R30,1
    005B 920D      ST	R0,X+
    005C CFF9      RJMP	0x0056
    005D 940E0103  CALL	_main
_exit:
    005F CFFF      RJMP	_exit
FILE: C:\DOCUME~1\www\桌面\motor_ce\delay.c
(0001) //-----------------------------------------
(0002) void delay_1ms(void)
(0003) {
(0004) unsigned int i;
(0005) for(i=0;i<1412;i++)
_delay_1ms:
  i                    --> R16
    0060 2700      CLR	R16
    0061 2711      CLR	R17
    0062 C002      RJMP	0x0065
    0063 5F0F      SUBI	R16,0xFF
    0064 4F1F      SBCI	R17,0xFF
    0065 3804      CPI	R16,0x84
    0066 E0E5      LDI	R30,5
    0067 071E      CPC	R17,R30
    0068 F3D0      BCS	0x0063
    0069 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    006A 940E0197  CALL	push_gset2
    006C 01B8      MOVW	R22,R16
(0006) {
(0007) }
(0008) }
(0009) void delay_nms(unsigned int n)
(0010) {
(0011) unsigned int i;
(0012) for(i=0;i<n;i++)
    006D 2744      CLR	R20
    006E 2755      CLR	R21
    006F C003      RJMP	0x0073
(0013) {
(0014) delay_1ms();
    0070 DFEF      RCALL	_delay_1ms
    0071 5F4F      SUBI	R20,0xFF
    0072 4F5F      SBCI	R21,0xFF
    0073 1746      CP	R20,R22
    0074 0757      CPC	R21,R23
    0075 F3D0      BCS	0x0070
    0076 940E017D  CALL	pop_gset2
    0078 9508      RET
FILE: C:\DOCUME~1\www\桌面\motor_ce\ICP.C
(0001) #include "includes.h"
(0002) //---------------------------------------------------
(0003) unsigned int  Cnt_Old=0;
(0004) unsigned int  Cnt_New=0;
(0005) 
(0006) 
(0007) unsigned int Motor_Period=0;
(0008) unsigned int Cnt_Delta=0;
(0009) unsigned char Motor_Period_Hbyte=0;
(0010) unsigned char Motor_Period_Lbyte=0;
(0011) unsigned char Icr1L_Value=0;
(0012) unsigned char Icr1H_Value=0;
(0013) unsigned char Flag=0;
(0014) //--------------------------------------------------
(0015) //Timer1初始化和ICP中断处理函数
(0016) void Timer1_Init(void)
(0017) {
(0018) TCCR1B=0x00;             //停止计数器
_Timer1_Init:
    0079 2422      CLR	R2
    007A BC2E      OUT	0x2E,R2
(0019) TCCR1B=0b11000010;       //时钟为系统时钟8分频,为1us
    007B EC82      LDI	R24,0xC2
    007C BD8E      OUT	0x2E,R24
(0020) TIMSK|=0b00100000;       //使能ICP中断
    007D B789      IN	R24,0x39
    007E 6280      ORI	R24,0x20
    007F BF89      OUT	0x39,R24
    0080 9508      RET
_Timer1_Capt_Isr:
    0081 940E019B  CALL	push_lset
(0021) }
(0022) /*******************************************/
(0023) #pragma interrupt_handler Timer1_Capt_Isr:6
(0024) void Timer1_Capt_Isr(void)
(0025) {
(0026) CLI();
    0083 94F8      BCLR	7
(0027) Icr1L_Value=ICR1L;
    0084 B426      IN	R2,0x26
    0085 9220006A  STS	0x6A,R2
(0028) Icr1H_Value=ICR1H;
    0087 B427      IN	R2,0x27
    0088 9220006B  STS	0x6B,R2
(0029) Cnt_New=Icr1L_Value+(256*Icr1H_Value);//获得现在计数值
    008A 2D22      MOV	R18,R2
    008B 2733      CLR	R19
    008C E000      LDI	R16,0
    008D E011      LDI	R17,1
    008E 940E016D  CALL	empy16s
    0090 9020006A  LDS	R2,0x6A
    0092 2433      CLR	R3
    0093 0E20      ADD	R2,R16
    0094 1E31      ADC	R3,R17
    0095 92300063  STS	0x63,R3
    0097 92200062  STS	0x62,R2
(0030) if(Cnt_New>=Cnt_Old)       //判断新老计数值关系 
    0099 90200060  LDS	R2,0x60
    009B 90300061  LDS	R3,0x61
    009D 90400062  LDS	R4,0x62
    009F 90500063  LDS	R5,0x63
    00A1 1442      CP	R4,R2
    00A2 0453      CPC	R5,R3
    00A3 F038      BCS	0x00AB
(0031)  {                        //新值大于老值
(0032)  Cnt_Delta=Cnt_New-Cnt_Old;
    00A4 1842      SUB	R4,R2
    00A5 0853      SBC	R5,R3
    00A6 92500067  STS	0x67,R5
    00A8 92400066  STS	0x66,R4
(0033)  }
    00AA C012      RJMP	0x00BD
(0034) else                      //新值小于老值
(0035)  {
(0036)  Cnt_Delta=0xffff-Cnt_Old+Cnt_New;
    00AB 90200060  LDS	R2,0x60
    00AD 90300061  LDS	R3,0x61
    00AF EF8F      LDI	R24,0xFF
    00B0 EF9F      LDI	R25,0xFF
    00B1 1982      SUB	R24,R2
    00B2 0993      SBC	R25,R3
    00B3 90200062  LDS	R2,0x62
    00B5 90300063  LDS	R3,0x63
    00B7 0D82      ADD	R24,R2
    00B8 1D93      ADC	R25,R3
    00B9 93900067  STS	0x67,R25
    00BB 93800066  STS	0x66,R24
(0037)  }
(0038) Cnt_Old=Cnt_New;
    00BD 90200062  LDS	R2,0x62
    00BF 90300063  LDS	R3,0x63
    00C1 92300061  STS	0x61,R3
    00C3 92200060  STS	0x60,R2
(0039) Motor_Period=Cnt_Delta*T0_CLK;//计算周期值
    00C5 91200066  LDS	R18,0x66
    00C7 91300067  LDS	R19,0x67
    00C9 E001      LDI	R16,1
    00CA E010      LDI	R17,0
    00CB 940E016D  CALL	empy16s
    00CD 93100065  STS	0x65,R17
    00CF 93000064  STS	0x64,R16
(0040) Motor_Period_Hbyte=((unsigned char)((Motor_Period& 0xff00)>>8));//计算周期高字节
    00D1 01C8      MOVW	R24,R16
    00D2 7080      ANDI	R24,0
    00D3 2F89      MOV	R24,R25
    00D4 2799      CLR	R25
    00D5 93800068  STS	0x68,R24
(0041) Motor_Period_Lbyte=((unsigned char)(Motor_Period&0x00ff));//计算周期低字节
    00D7 01C8      MOVW	R24,R16
    00D8 7090      ANDI	R25,0
    00D9 93800069  STS	0x69,R24
(0042) if(Motor_Period_Lbyte=0xff)//避免与帧头重复
    00DB EF8F      LDI	R24,0xFF
    00DC 93800069  STS	0x69,R24
    00DE 2388      TST	R24
    00DF F019      BEQ	0x00E3
(0043)  {
(0044)  Motor_Period_Lbyte=0xfe;
    00E0 EF8E      LDI	R24,0xFE
    00E1 93800069  STS	0x69,R24
(0045)  }
(0046) Flag++;
    00E3 9180006C  LDS	R24,0x6C
    00E5 5F8F      SUBI	R24,0xFF
    00E6 9380006C  STS	0x6C,R24
(0047) if(Flag%100==0)
    00E8 E614      LDI	R17,0x64
    00E9 2F08      MOV	R16,R24
    00EA 940E0155  CALL	mod8u
    00EC 2300      TST	R16
    00ED F459      BNE	0x00F9
(0048)  {
(0049)  Usart_Tx(0xff);//上传帧头
    00EE EF0F      LDI	R16,0xFF
    00EF 940E010D  CALL	_Usart_Tx
(0050)  Usart_Tx(Motor_Period_Hbyte);//上传周期高字节
    00F1 91000068  LDS	R16,0x68
    00F3 940E010D  CALL	_Usart_Tx
(0051)  Usart_Tx(Motor_Period_Lbyte);//上传周期低字节
    00F5 91000069  LDS	R16,0x69
    00F7 940E010D  CALL	_Usart_Tx
(0052)  }
(0053) SEI();
    00F9 9478      BSET	7
    00FA 940E01B2  CALL	pop_lset
    00FC 9518      RETI
FILE: C:\DOCUME~1\www\桌面\motor_ce\motor_ce.c
(0001) /***************************************************** 
(0002) Project :           电机测速
(0003) Chip type:           ATmega16L 
(0004) Clock frequency:     8.000000 MHz
(0005) Date:                2006-6-20 
(0006) Author:              CYKINGS OF WMFTYS                                                         
(0007) Comments:            通过ICP管脚测出电机转速,每测试100个上传
(0008) *****************************************************/
(0009) #include "includes.h"
(0010) /****************************************************/
(0011) //设备初始化,串口:38400,1,8,1
(0012) //           定时器1:ICP 中断使能,CLK:1us
(0013) void Devices_Init(void)
(0014) {
(0015) CLI();
_Devices_Init:
    00FD 94F8      BCLR	7
(0016) Usart_Init();
    00FE 940E0129  CALL	_Usart_Init
(0017) Timer1_Init();
    0100 940E0079  CALL	_Timer1_Init
    0102 9508      RET
(0018) 
(0019) } 
(0020) /**************************************************/
(0021) void main(void)
(0022) {
(0023) OSCCAL=0xb2;
_main:
    0103 EB82      LDI	R24,0xB2
    0104 BF81      OUT	0x31,R24
(0024) Devices_Init();
    0105 DFF7      RCALL	_Devices_Init
(0025) Usart_Str_Tx("Welcome to Motor Volume Test");
    0106 E60D      LDI	R16,0x6D
    0107 E010      LDI	R17,0
    0108 940E0115  CALL	_Usart_Str_Tx

⌨️ 快捷键说明

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