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

📄 main.lst

📁 这是一个对直流电机控制的小程序。基于单片机开发。
💻 LST
字号:
__start:
__text_start:
    002A E5CF      LDI	R28,0x5F
    002B E0D8      LDI	R29,0x8
    002C BFCD      OUT	0x3D,R28
    002D BFDE      OUT	0x3E,R29
    002E 51C0      SUBI	R28,0x10
    002F 40D0      SBCI	R29,0
    0030 EA0A      LDI	R16,0xAA
    0031 8308      STD	Y+0,R16
    0032 2400      CLR	R0
    0033 E6E0      LDI	R30,0x60
    0034 E0F0      LDI	R31,0
    0035 E010      LDI	R17,0
    0036 36E0      CPI	R30,0x60
    0037 07F1      CPC	R31,R17
    0038 F011      BEQ	0x003B
    0039 9201      ST	R0,Z+
    003A CFFB      RJMP	0x0036
    003B 8300      STD	Z+0,R16
    003C E5E4      LDI	R30,0x54
    003D E0F0      LDI	R31,0
    003E E6A0      LDI	R26,0x60
    003F E0B0      LDI	R27,0
    0040 E010      LDI	R17,0
    0041 35E4      CPI	R30,0x54
    0042 07F1      CPC	R31,R17
    0043 F021      BEQ	0x0048
    0044 95C8      LPM
    0045 9631      ADIW	R30,1
    0046 920D      ST	R0,X+
    0047 CFF9      RJMP	0x0041
    0048 940E00C6  CALL	_main
_exit:
    004A CFFF      RJMP	_exit
FILE: D:\桌面\avr程序设计\电机控制\motor.c
(0001) /****************************************************************
(0002) ** 文件名:motor.c   电机驱动函数
(0003) ****************************************************************/
(0004) #include "config.h"
(0005) 
(0006) /******************************************************************************/
(0007) //正转,速度
(0008) void for_ward(uint8 speed)
(0009) {
(0010)  	 if(speed!=0)
_for_ward:
  speed                --> R16
    004B 2300      TST	R16
    004C F021      BEQ	0x0051
(0011)  	  {
(0012)   	   OCR2 = speed;
    004D BD03      OUT	0x23,R16
(0013)   	   while(ASSR&(1<<TCR2UB)==1) ; //启动TC2 pwm 输出,异步操作需要等待 OCR2写入完毕
    004E B422      IN	R2,0x22
    004F FC20      SBRC	R2,0
    0050 CFFD      RJMP	0x004E
(0014)   	  }
(0015)  	 TC2_EN;   //pwm_start
    0051 B789      IN	R24,0x39
    0052 6C80      ORI	R24,0xC0
    0053 BF89      OUT	0x39,R24
(0016)  	 moto_en1;
    0054 9A94      SBI	0x12,4
(0017)  	 moto_uen2;
    0055 9895      CBI	0x12,5
    0056 9508      RET
(0018) }
(0019) /******************************************************************************/
(0020) //反转,速度
(0021) void back_ward(uint8 speed)
(0022) {
(0023)  	 if(speed!=0)
_back_ward:
  speed                --> R16
    0057 2300      TST	R16
    0058 F021      BEQ	0x005D
(0024)   	{
(0025)        OCR2 = speed;
    0059 BD03      OUT	0x23,R16
(0026)   	   while(ASSR&(1<<TCR2UB)==1) ;// 启动TC2 pwm 输出,异步操作需要等待OCR2写入完毕
    005A B422      IN	R2,0x22
    005B FC20      SBRC	R2,0
    005C CFFD      RJMP	0x005A
(0027)     }
(0028)    TC2_EN;   //pwm start
    005D B789      IN	R24,0x39
    005E 6C80      ORI	R24,0xC0
    005F BF89      OUT	0x39,R24
(0029)    moto_uen1;
    0060 9894      CBI	0x12,4
(0030)    moto_en2;
    0061 9A95      SBI	0x12,5
    0062 9508      RET
(0031) }
(0032) /******************************************************************************/
(0033) //停止
(0034) void motor_stop(void)
(0035) {
(0036)  moto_en1;   //同时置一停止
_motor_stop:
    0063 9A94      SBI	0x12,4
(0037)  moto_en2;
    0064 9A95      SBI	0x12,5
(0038)  TC2_DIS;    //pwm stop
    0065 B789      IN	R24,0x39
    0066 778F      ANDI	R24,0x7F
    0067 BF89      OUT	0x39,R24
    0068 9508      RET
(0039) }
(0040) /******************************************************************************/
(0041) 
(0042) //加速
(0043) void speed_add(uint8 add)
(0044) {
(0045)  if(OCR2 + add < 240) //防止出现极大情况时候跳跃到很小。
_speed_add:
  add                  --> R16
    0069 B583      IN	R24,0x23
    006A 0F80      ADD	R24,R16
    006B 3F80      CPI	R24,0xF0
    006C F418      BCC	0x0070
(0046)  {
(0047)    OCR2 = OCR2 + add;
    006D B423      IN	R2,0x23
    006E 0E20      ADD	R2,R16
    006F BC23      OUT	0x23,R2
(0048)  }
    0070 9508      RET
(0049) }
(0050) /******************************************************************************/
(0051) 
(0052) //加速
(0053) void speed_subtract(uint8 subtract)
(0054) {
(0055)  if(OCR2 - subtract > 10) //防止到很小之后跳跃到很大。
_speed_subtract:
  subtract             --> R16
    0071 B423      IN	R2,0x23
    0072 1A20      SUB	R2,R16
    0073 E08A      LDI	R24,0xA
    0074 1582      CP	R24,R2
    0075 F418      BCC	0x0079
(0056)  {
(0057)   OCR2 = OCR2 - subtract;
    0076 B423      IN	R2,0x23
    0077 1A20      SUB	R2,R16
    0078 BC23      OUT	0x23,R2
(0058)  }
    0079 9508      RET
FILE: D:\桌面\avr程序设计\电机控制\device_init.c
(0001) //ICC-AVR application builder : 2006-11-1 0:27:10
(0002) // Target : M32
(0003) // Crystal: 7.3728Mhz
(0004) //文件名:device_init.c 各种参数初始化
(0005) #include "config.h"
(0006) 
(0007) void port_init(void)
(0008) {
(0009)  PORTA = 0x00;
_port_init:
    007A 2422      CLR	R2
    007B BA2B      OUT	0x1B,R2
(0010)  DDRA  = 0x00; 
    007C BA2A      OUT	0x1A,R2
(0011)  PORTB = 0x00;
    007D BA28      OUT	0x18,R2
(0012)  DDRB  = 0x00; 
    007E BA27      OUT	0x17,R2
(0013)  PORTC = 0x00; 
    007F BA25      OUT	0x15,R2
(0014)  DDRC  = 0x00;
    0080 BA24      OUT	0x14,R2
(0015)  PORTD = 0x00;
    0081 BA22      OUT	0x12,R2
(0016)  DDRD  = 0x80; // D7 PWM   //参考芯片手册
    0082 E880      LDI	R24,0x80
    0083 BB81      OUT	0x11,R24
    0084 9508      RET
(0017) }
(0018) 
(0019) /**************************采用timer2 产生波形***********************/
(0020) // PWM频率 = 系统时钟频率/(分频系数*2*计数器上限值)) 
(0021) void timer2_init(void)
(0022) {
(0023)  TCCR2 = 0x00;  //stop
_timer2_init:
    0085 2422      CLR	R2
    0086 BC25      OUT	0x25,R2
(0024)  TCNT2= 0x01;  //set count
    0087 E081      LDI	R24,1
    0088 BD84      OUT	0x24,R24
(0025)  OCR2 = 0x66;  //set compare
    0089 E686      LDI	R24,0x66
    008A BD83      OUT	0x23,R24
(0026)  TCCR2 = (1<<WGM20)|(1<<WGM21)|(1<<COM21)|0x06; //  start timer 快速pwm模式,匹配清零,溢出置位 256分频
    008B E68E      LDI	R24,0x6E
    008C BD85      OUT	0x25,R24
    008D 9508      RET
(0027) //占空比=高比低为:(OCR2-0X01)/(0XFF-OCR2)    OX01++++++(OCR2)__________OXFF (+表示输出高,_表示输出低)
(0028) //即OCR2越大,输出越大
(0029) }
(0030) 
(0031) //call this routine to initialize all peripherals
(0032) void init_devices(void)
(0033) {
(0034)  //stop errant interrupts until set up
(0035)  CLI(); //disable all interrupts
_init_devices:
    008E 94F8      BCLR	7
(0036)  port_init();
    008F DFEA      RCALL	_port_init
(0037)  timer2_init();
    0090 DFF4      RCALL	_timer2_init
(0038)  TIMSK = 0x00; //timer interrupt sources
    0091 2422      CLR	R2
    0092 BE29      OUT	0x39,R2
(0039)  SEI(); //re-enable interrupts
    0093 9478      BSET	7
    0094 9508      RET
_Delay100us:
  i                    --> R20
  x                    --> R16
    0095 940E010F  CALL	push_gset1
FILE: D:\桌面\avr程序设计\电机控制\delay.c
(0001) // 文件名 delay.c 延时
(0002) 
(0003) #include "config.h"
(0004) /***************************************************************************
(0005) 延时 M32 7.3728M 粗略计算
(0006) */
(0007) void Delay100us(uint8 x)
(0008) {
(0009) 	uint8 i;          //4clock                   
(0010) 	for(i=147;x!=0;x--)	
    0097 E943      LDI	R20,0x93
    0098 C006      RJMP	0x009F
(0011) 	while(--i);      //5 * i clock
    0099 2F84      MOV	R24,R20
    009A 5081      SUBI	R24,1
    009B 2F48      MOV	R20,R24
    009C 2388      TST	R24
    009D F7D9      BNE	0x0099
    009E 950A      DEC	R16
    009F 2300      TST	R16
    00A0 F7C1      BNE	0x0099
    00A1 940E0112  CALL	pop_gset1
    00A3 9508      RET
_Delay1ms:
  n                    --> R20
    00A4 940E010F  CALL	push_gset1
    00A6 01A8      MOVW	R20,R16
(0012) }
(0013) void Delay1ms(uint16 n)
(0014) {        
(0015) 	for (;n!=0;n--){
    00A7 C004      RJMP	0x00AC
(0016) 		Delay100us(10);
    00A8 E00A      LDI	R16,0xA
    00A9 DFEB      RCALL	_Delay100us
    00AA 5041      SUBI	R20,1
    00AB 4050      SBCI	R21,0
    00AC 3040      CPI	R20,0
    00AD 0745      CPC	R20,R21
    00AE F7C9      BNE	0x00A8
    00AF 940E0112  CALL	pop_gset1
    00B1 9508      RET
_Delay1s:
  m                    --> R20
    00B2 940E010F  CALL	push_gset1
    00B4 01A8      MOVW	R20,R16
(0017) 	}
(0018) }
(0019) void Delay1s(uint16 m)         //  m <= 6 ,when m==7, it is 1. 
(0020) {
(0021) 	m=m*40;                
    00B5 E208      LDI	R16,0x28
    00B6 E010      LDI	R17,0
    00B7 019A      MOVW	R18,R20
    00B8 940E00F7  CALL	empy16s
    00BA 01A8      MOVW	R20,R16
(0022) 	for (;m!=0;m--){
    00BB C004      RJMP	0x00C0
(0023) 		Delay100us(250);
    00BC EF0A      LDI	R16,0xFA
    00BD DFD7      RCALL	_Delay100us
    00BE 5041      SUBI	R20,1
    00BF 4050      SBCI	R21,0
    00C0 3040      CPI	R20,0
    00C1 0745      CPC	R20,R21
    00C2 F7C9      BNE	0x00BC
    00C3 940E0112  CALL	pop_gset1
    00C5 9508      RET
FILE: D:\桌面\avr程序设计\电机控制\main.c
(0001) //文件名 main.c 工程主文件
(0002) 
(0003) #include "config.h"
(0004) 
(0005) 
(0006) void main(void)
(0007) {
(0008) 
(0009) /******************************************************************************/
(0010) //初始工作
(0011) /******************************************************************************/
(0012)   init_devices();
_main:
    00C6 940E008E  CALL	_init_devices
    00C8 C022      RJMP	0x00EB
(0013)   
(0014)   while(1)
(0015)   {
(0016)    for_ward(0);	 			//默认速度运转 正
    00C9 2700      CLR	R16
    00CA 940E004B  CALL	_for_ward
(0017)    Delay1s(5); 				//延时5s
    00CC E005      LDI	R16,5
    00CD E010      LDI	R17,0
    00CE 940E00B2  CALL	_Delay1s
(0018)    motor_stop(); 			//停止
    00D0 940E0063  CALL	_motor_stop
(0019)    Delay1s(5); 				//延时5s
    00D2 E005      LDI	R16,5
    00D3 E010      LDI	R17,0
    00D4 940E00B2  CALL	_Delay1s
(0020)    back_ward(0);			//默认速度运转 反
    00D6 2700      CLR	R16
    00D7 940E0057  CALL	_back_ward
(0021)    Delay1s(5); 				//延时5s
    00D9 E005      LDI	R16,5
    00DA E010      LDI	R17,0
    00DB 940E00B2  CALL	_Delay1s
(0022)    speed_add(20);			//加速
    00DD E104      LDI	R16,0x14
    00DE 940E0069  CALL	_speed_add
(0023)    Delay1s(5); 				//延时5s
    00E0 E005      LDI	R16,5
    00E1 E010      LDI	R17,0
    00E2 940E00B2  CALL	_Delay1s
(0024)    speed_subtract(20);		//减速
    00E4 E104      LDI	R16,0x14
    00E5 940E0071  CALL	_speed_subtract
(0025)    Delay1s(5); 				//延时5s
    00E7 E005      LDI	R16,5
    00E8 E010      LDI	R17,0
    00E9 940E00B2  CALL	_Delay1s
    00EB CFDD      RJMP	0x00C9
    00EC 9508      RET
(0026)   }
(0027)     
(0028) }
(0029) 
(0030) /******************************************************************************/
(0031) // T2 控制PWM输出
(0032) // timer2_comp_isr不需要用,但是必须允许中断,在中断时有信号输出变化
(0033) /******************************************************************************/
(0034) 
(0035) #pragma interrupt_handler timer2_comp_isr:5
(0036) void timer2_comp_isr(void)
(0037) {
_timer2_comp_isr:
    00ED 9518      RETI
_timer2_ovf_isr:
    00EE 938A      ST	R24,-Y
    00EF B78F      IN	R24,0x3F
    00F0 938A      ST	R24,-Y
(0038)    //compare occured TCNT0=OCR0
(0039) }
(0040) #pragma interrupt_handler timer2_ovf_isr:6
(0041) void timer2_ovf_isr(void)
(0042) {
(0043)  TCNT2 = 0x01;//reload counter value
FILE: <library>
    00F1 E081      LDI	R24,1
    00F2 BD84      OUT	0x24,R24
    00F3 9189      LD	R24,Y+
    00F4 BF8F      OUT	0x3F,R24
    00F5 9189      LD	R24,Y+
    00F6 9518      RETI
empy16s:
    00F7 920A      ST	R0,-Y
    00F8 921A      ST	R1,-Y
    00F9 938A      ST	R24,-Y
    00FA 939A      ST	R25,-Y
    00FB 9F02      MUL	R16,R18
    00FC 01C0      MOVW	R24,R0
    00FD 9F12      MUL	R17,R18
    00FE 0D90      ADD	R25,R0
    00FF 9F03      MUL	R16,R19
    0100 0D90      ADD	R25,R0
    0101 018C      MOVW	R16,R24
    0102 9199      LD	R25,Y+
    0103 9189      LD	R24,Y+
    0104 9019      LD	R1,Y+
    0105 9009      LD	R0,Y+
    0106 9508      RET
push_gset5:
    0107 92FA      ST	R15,-Y
    0108 92EA      ST	R14,-Y
push_gset4:
    0109 92DA      ST	R13,-Y
    010A 92CA      ST	R12,-Y
push_gset3:
    010B 92BA      ST	R11,-Y
    010C 92AA      ST	R10,-Y
push_gset2:
    010D 937A      ST	R23,-Y
    010E 936A      ST	R22,-Y
push_gset1:
    010F 935A      ST	R21,-Y
    0110 934A      ST	R20,-Y
    0111 9508      RET
pop_gset1:
    0112 E0E1      LDI	R30,1
pop:
    0113 9149      LD	R20,Y+
    0114 9159      LD	R21,Y+
    0115 FDE0      SBRC	R30,0
    0116 9508      RET
    0117 9169      LD	R22,Y+
    0118 9179      LD	R23,Y+
    0119 FDE1      SBRC	R30,1
    011A 9508      RET
    011B 90A9      LD	R10,Y+
    011C 90B9      LD	R11,Y+
    011D FDE2      SBRC	R30,2
    011E 9508      RET
    011F 90C9      LD	R12,Y+
    0120 90D9      LD	R13,Y+
    0121 FDE3      SBRC	R30,3
    0122 9508      RET
    0123 90E9      LD	R14,Y+
    0124 90F9      LD	R15,Y+
    0125 9508      RET

⌨️ 快捷键说明

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