📄 motor_ce.lst
字号:
__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 + -