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

📄 bjqd.lst

📁 一个正在应用的步进电机控制程序,包括电机的调速,正反,细分,通讯控制
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    00AA E5CF      LDI	R28,0x5F
    00AB E0D4      LDI	R29,4
    00AC BFCD      OUT	0x3D,R28
    00AD BFDE      OUT	0x3E,R29
    00AE 52C8      SUBI	R28,0x28
    00AF 40D0      SBCI	R29,0
    00B0 EA0A      LDI	R16,0xAA
    00B1 8308      STD	Y+0,R16
    00B2 2400      CLR	R0
    00B3 E6E0      LDI	R30,0x60
    00B4 E0F0      LDI	R31,0
    00B5 E010      LDI	R17,0
    00B6 3FE6      CPI	R30,0xF6
    00B7 07F1      CPC	R31,R17
    00B8 F011      BEQ	0x00BB
    00B9 9201      ST	R0,Z+
    00BA CFFB      RJMP	0x00B6
    00BB 8300      STD	Z+0,R16
    00BC E5E4      LDI	R30,0x54
    00BD E0F1      LDI	R31,1
    00BE E6A0      LDI	R26,0x60
    00BF E0B0      LDI	R27,0
    00C0 E011      LDI	R17,1
    00C1 35E4      CPI	R30,0x54
    00C2 07F1      CPC	R31,R17
    00C3 F021      BEQ	0x00C8
    00C4 95C8      LPM
    00C5 9631      ADIW	R30,1
    00C6 920D      ST	R0,X+
    00C7 CFF9      RJMP	0x00C1
    00C8 940E04AD  CALL	_main
_exit:
    00CA CFFF      RJMP	_exit
_EEPROMReadWord:
  eeprom_data          --> Y+2
  ptr                  --> R20
  word                 --> R10
  addr                 --> R22
    00CB 940E0A27  CALL	push_gset3
    00CD 0159      MOVW	R10,R18
    00CE 01B8      MOVW	R22,R16
    00CF 9724      SBIW	R28,4
FILE: C:\BJQD\eeprom_l.c
(0001) #include <eeprom.h>
(0002) #include "main.h"
(0003) 
(0004) extern struct cal cal0;
(0005) 
(0006) /*
(0007) eeprom操作模块
(0008) */
(0009) 
(0010) /*
(0011) 从eeprom中读整型变量的值
(0012) */
(0013) 
(0014) #include <eeprom.h>
(0015) /*
(0016) 从eeprom中读整型变量的值
(0017) */
(0018) void EEPROMReadWord(unsigned int addr,unsigned int *word)
(0019) {  
(0020)     unsigned char eeprom_data[2];
(0021) 	unsigned char *ptr = (unsigned char *)word;
    00D0 01A5      MOVW	R20,R10
(0022) 	EEPROMReadBytes(addr,eeprom_data,2);
    00D1 E082      LDI	R24,2
    00D2 E090      LDI	R25,0
    00D3 8399      STD	Y+1,R25
    00D4 8388      STD	Y+0,R24
    00D5 019E      MOVW	R18,R28
    00D6 5F2E      SUBI	R18,0xFE
    00D7 4F3F      SBCI	R19,0xFF
    00D8 018B      MOVW	R16,R22
    00D9 940E0A89  CALL	_EEPROMReadBytes
(0023) 	*ptr = eeprom_data[0];
    00DB 802A      LDD	R2,Y+2
    00DC 01FA      MOVW	R30,R20
    00DD 8220      STD	Z+0,R2
(0024) 	ptr++;
    00DE 5F4F      SUBI	R20,0xFF
    00DF 4F5F      SBCI	R21,0xFF
(0025) 	*ptr = eeprom_data[1];
    00E0 802B      LDD	R2,Y+3
    00E1 01FA      MOVW	R30,R20
    00E2 8220      STD	Z+0,R2
    00E3 9624      ADIW	R28,4
    00E4 940E0A1A  CALL	pop_gset3
    00E6 9508      RET
_EEPROMWriteWord:
  eeprom_data          --> Y+2
  ptr                  --> R22
  word                 --> R10
  addr                 --> R20
    00E7 940E0A27  CALL	push_gset3
    00E9 0159      MOVW	R10,R18
    00EA 01A8      MOVW	R20,R16
    00EB 9724      SBIW	R28,4
(0026) }
(0027) 
(0028) /*
(0029) 向eeprom中写整型变量的值
(0030) */
(0031) void EEPROMWriteWord(unsigned int addr,unsigned int *word)
(0032) {  
(0033)     unsigned char eeprom_data[2];
(0034) 	unsigned char *ptr = (unsigned char *)word;	
    00EC 01B5      MOVW	R22,R10
(0035) 	eeprom_data[0] = *ptr;
    00ED 01FB      MOVW	R30,R22
    00EE 8020      LDD	R2,Z+0
    00EF 822A      STD	Y+2,R2
(0036) 	ptr++;
    00F0 5F6F      SUBI	R22,0xFF
    00F1 4F7F      SBCI	R23,0xFF
(0037) 	eeprom_data[1] = *ptr;
    00F2 01FB      MOVW	R30,R22
    00F3 8020      LDD	R2,Z+0
    00F4 822B      STD	Y+3,R2
(0038) 	EEPROMWriteBytes(addr,eeprom_data,2);
    00F5 E082      LDI	R24,2
    00F6 E090      LDI	R25,0
    00F7 8399      STD	Y+1,R25
    00F8 8388      STD	Y+0,R24
    00F9 019E      MOVW	R18,R28
    00FA 5F2E      SUBI	R18,0xFE
    00FB 4F3F      SBCI	R19,0xFF
    00FC 018A      MOVW	R16,R20
    00FD 940E0AAD  CALL	_EEPROMWriteBytes
    00FF 9624      ADIW	R28,4
    0100 940E0A1A  CALL	pop_gset3
    0102 9508      RET
_time1_int:
  j                    --> R16
  i                    --> R18
    0103 922A      ST	R2,-Y
    0104 923A      ST	R3,-Y
    0105 930A      ST	R16,-Y
    0106 932A      ST	R18,-Y
    0107 938A      ST	R24,-Y
    0108 939A      ST	R25,-Y
    0109 93EA      ST	R30,-Y
    010A 93FA      ST	R31,-Y
    010B B62F      IN	R2,0x3F
    010C 922A      ST	R2,-Y
FILE: C:\BJQD\main.c
(0001) /*ICC-AVR application builder : 2004-3-11 12:02:11
(0002) // Target : M16
(0003) // Crystal: 8.0000Mhz
(0004) 主程序
(0005) ******************************************************************************/
(0006) #include <iom16v.h>
(0007) #include <macros.h>
(0008) #include <eeprom.h>
(0009) #include <stdlib.h>
(0010) #include <math.h>
(0011) #include "main.h"
(0012) #include "eeprom_l.h"
(0013) #include "delay.h"
(0014) #include "comm.h"
(0015) #include "key.h"
(0016) 
(0017) //eeprom 中的数据表
(0018) #pragma data:eeprom
(0019) /*
(0020) {0x0000(2),speed_romaddr(2),state_romaddr(1),pump_tab_romaddr(1),
(0021) state_other_romaddr(1)}
(0022) */
(0023) unsigned int space_eeprom=0000;
(0024) unsigned int speed_eeprom=100;
(0025) unsigned char state_eeprom=0;
(0026) unsigned char pump_tab_eeprom=1;
(0027) unsigned char state_other_eeprom=0;
(0028)     							
(0029) #pragma data:code
(0030) const unsigned char tabsin[]={
(0031) 0,6,13,19,25,31,37,44,50,56,62,68,74,80,86,92,
(0032) 98,103,109,115,120,126,131,136,142,147,152,157,162,167,171,176,
(0033) 180,185,189,193,197,201,205,208,212,215,219,222,225,228,231,233,
(0034) 236,238,240,242,244,246,247,249,250,251,252,253,254,254,255,255,
(0035) 255,255,255,254,254,253,252,251,250,249,247,246,244,242,240,238,
(0036) 236,233,231,228,225,222,219,215,212,208,205,201,197,193,189,185,
(0037) 180,176,171,167,162,157,152,147,142,136,131,126,120,115,109,103,
(0038) 98,92,86,80,74,68,62,56,50,44,37,31,25,19,13,6,
(0039) };
(0040) const unsigned char tabcos[]={  
(0041) 255,255,255,254,254,253,252,251,250,249,247,246,244,242,240,238,
(0042) 236,233,231,228,225,222,219,215,212,208,205,201,197,193,189,185,
(0043) 180,176,171,167,162,157,152,147,142,136,131,126,120,115,109,103,
(0044) 98,92,86,80,74,68,62,56,50,44,37,31,25,19,13,6,
(0045) 0,6,13,19,25,31,37,44,50,56,62,68,74,80,86,92,
(0046) 98,103,109,115,120,126,131,136,142,147,152,157,162,167,171,176,
(0047) 180,185,189,193,197,201,205,208,212,215,219,222,225,228,231,233,
(0048) 236,238,240,242,244,246,247,249,250,251,252,253,254,254,255,255, 
(0049) };
(0050) 
(0051) #pragma data:data
(0052) 
(0053) //全局变量
(0054) unsigned int        speed;	  		  //16位速度寄存器
(0055) unsigned int   		out_ctr;		  //16位AD转换值寄存器
(0056) unsigned int        pull_number;       //闸门时间的脉冲数
(0057) unsigned int  	    time_da;		  //16位D/A时间寄存器
(0058) unsigned int        time_da0;
(0059) unsigned char       key;	 		  //按键值
(0060) unsigned char 		da_counter;		  //8位计数器:纪录正在读取的细分表位置
(0061) unsigned char 		micros_nu;		  //8位寄存器:纪录细分数如4,8,16,32,64,128,256
(0062) unsigned char  		micros_nu0;       //最终纪录细分数
(0063) unsigned char       key_state;        //1:禁止      0:允许
(0064) //key_state.0       run/stop
(0065) //key_state.1 		cw/ccw
(0066) //key_state.2 		max
(0067) //key_state.3 		enter
(0068) //key_state.4		
(0069) unsigned char       key_counter;      //键盘加减计数器
(0070) unsigned long       disp_time_counter0;
(0071) unsigned long       disp_time_counter1;
(0072) unsigned char 		add_dec_nu;
(0073) unsigned char       ac_bd_state;
(0074) unsigned char 		state;  		  //软件位状态寄存器
(0075) //state.0 正反转状态位					  			1正转    0反转 						  			
(0076) //state.1 全速标志   								1全速    0正常
(0077) //state.2 
(0078) //state.3 启停                                      1启      0停
(0079) //state.4 
(0080) //state.5 
(0081) //state.6 
(0082) //state.7 
(0083) unsigned char state_other;//软件位状态寄存器
(0084) //state.2 显示方式									1流量    0转速
(0085) //state.4 脚踏开关标志位  							1脉冲    0电平
(0086) //state.5 外控方式        							1关      0开
(0087) unsigned char       state0;		        //软件位状态寄存器0
(0088) //state0.0 校正体积改变标志							1改变    0无改变	  
(0089) //state0.1 电机abcd相工作状态位		   				1为ab相  0为cd相 
(0090) //state0.2 测试模式使能位  				  			1使能    0禁止
(0091) //state0.3 在旋转编码开关控制函数里是否为第一次旋转 1第一次,0连续
(0092) //state0.4 定时分配标志								1分配    0停止
(0093) //state0.5 接收消息有效标志
(0094) //state0.6 显示            							1转速    0流量
(0095) //state0.7 初始化启停                               1启      0停   
(0096) extern unsigned char state2;    
(0097) //state2.0 disable_data    1:输入数据无效  			0:有效;
(0098) //state2.1 remote		   1:遥控输入有效  			0:本地输入有效
(0099) //state2.2 				   1:外控关		            0:外控开
(0100) //state2.3    		 	   1:键盘+10       	 		0:键盘+1  
(0101) //state2.4				   1:允许输入数据			0:禁止输入数据 
(0102) //state2.5				   1:允许					0:停机
(0103) //state2.6 				   1:无外控模块             0:有外控模块
(0104) //state2.7 p99			   1:P99指令使能   	 		0:禁止
(0105) extern unsigned char state1;
(0106) //state1.7                 1:电流					0:电压
(0107) unsigned char in_out_state;
(0108) unsigned char in_out_number;
(0109) unsigned char wrong;
(0110) /*
(0111) 0正常
(0112) 1数值下溢出
(0113) 2数值上溢出
(0114) 3
(0115) */
(0116) unsigned char counter;
(0117) unsigned int speed_pull;
(0118) extern unsigned char pump_tab;
(0119) 
(0120) //定义中断向量
(0121) #pragma interrupt_handler time1_int:iv_TIMER1_COMPA
(0122) #pragma interrupt_handler time2_int:iv_TIMER2_COMP
(0123) #pragma interrupt_handler pull_int:iv_INT0
(0124) 
(0125) 
(0126) /******************************************************
(0127) D/A出细分波形中断函数(定时器1比较匹配中断)
(0128) ******************************************************/
(0129) void time1_int(void)
(0130) {
(0131) unsigned char i;
(0132) unsigned char j;
(0133) if (micros_nu==micros_nu0)
    010D 90200075  LDS	R2,micros_nu0
    010F 90300076  LDS	R3,micros_nu
    0111 1432      CP	R3,R2
    0112 F449      BNE	0x011C
(0134)    {time_da0=time_da;}
    0113 9020007B  LDS	R2,time_da
    0115 9030007C  LDS	R3,time_da+1
    0117 9230007A  STS	time_da0+1,R3
    0119 92200079  STS	time_da0,R2
    011B C010      RJMP	0x012C
(0135) else 
(0136)    {if (da_counter==128)
    011C 91800077  LDS	R24,da_counter
    011E 3880      CPI	R24,0x80
    011F F461      BNE	0x012C
(0137)        {
(0138) 	   micros_nu0=micros_nu;
    0120 90200076  LDS	R2,micros_nu
    0122 92200075  STS	micros_nu0,R2
(0139) 	   time_da0=time_da;
    0124 9020007B  LDS	R2,time_da
    0126 9030007C  LDS	R3,time_da+1
    0128 9230007A  STS	time_da0+1,R3
    012A 92200079  STS	time_da0,R2
(0140) 	   }
(0141)    }
(0142) OCR1A=time_da0;
    012C 90200079  LDS	R2,time_da0
    012E 9030007A  LDS	R3,time_da0+1
    0130 BC3B      OUT	0x2B,R3
    0131 BC2A      OUT	0x2A,R2
(0143) if (da_counter>=128)
    0132 91800077  LDS	R24,da_counter
    0134 3880      CPI	R24,0x80
    0135 F018      BCS	0x0139
(0144)    {da_counter=0;} 
    0136 2422      CLR	R2
    0137 92200077  STS	da_counter,R2
(0145) i=tabsin[da_counter];
    0139 E584      LDI	R24,0x54
    013A E090      LDI	R25,0
    013B 91E00077  LDS	R30,da_counter
    013D 27FF      CLR	R31
    013E 0FE8      ADD	R30,R24
    013F 1FF9      ADC	R31,R25
    0140 9124      LPM	R18,0(Z)
(0146) j=tabcos[da_counter];
    0141 ED84      LDI	R24,0xD4
    0142 E090      LDI	R25,0
    0143 91E00077  LDS	R30,da_counter
    0145 27FF      CLR	R31
    0146 0FE8      ADD	R30,R24
    0147 1FF9      ADC	R31,R25
    0148 9104      LPM	R16,0(Z)
(0147) PORTD&=~(1<<DA_CS);
    0149 9896      CBI	0x12,6
(0148) PORTD&=~(1<<DA_AB);
    014A 9897      CBI	0x12,7
(0149) DATA_OUT=i;                     //送正弦值
    014B BB28      OUT	0x18,R18
(0150) asm("nop");
    014C 0000      NOP
(0151) PORTA&=~(1<<DA_WR);
    014D 98D9      CBI	0x1B,1
(0152) PORTA|=(1<<DA_WR);
    014E 9AD9      SBI	0x1B,1
(0153) PORTD|=(1<<DA_AB);
    014F 9A97      SBI	0x12,7
(0154) DATA_OUT=j;                     //送正弦值
    0150 BB08      OUT	0x18,R16
(0155) asm("nop");
    0151 0000      NOP
(0156) PORTA&=~(1<<DA_WR);
    0152 98D9      CBI	0x1B,1
(0157) PORTA|=(1<<DA_WR);
    0153 9AD9      SBI	0x1B,1
(0158) PORTD|=(1<<DA_CS);
    0154 9A96      SBI	0x12,6
(0159) if ((state|0b11111110)==0b11111110)           //判断正反转
    0155 91800068  LDS	R24,state
    0157 6F8E      ORI	R24,0xFE
    0158 3F8E      CPI	R24,0xFE
    0159 F531      BNE	0x0180
(0160)   {											  //正转
(0161)   if (ac_bd_state==0)         //ac相处理
    015A 90200069  LDS	R2,ac_bd_state
    015C 2022      TST	R2
    015D F489      BNE	0x016F
(0162)     {
(0163) 	if (da_counter==0)
    015E 90200077  LDS	R2,da_counter
    0160 2022      TST	R2
    0161 F431      BNE	0x0168
(0164) 	   {
(0165) 	   PORTC&=~(1<<DA_SIN);
    0162 98AF      CBI	0x15,7
(0166) 	   PORTC&=~(1<<DA_COS);
    0163 98AE      CBI	0x15,6
(0167) 	   ac_bd_state=1;
    0164 E081      LDI	R24,1
    0165 93800069  STS	ac_bd_state,R24
(0168) 	   }
    0167 C03D      RJMP	0x01A5
(0169) 	else 
(0170) 	   {
(0171) 	   if (da_counter==64)
    0168 91800077  LDS	R24,da_counter
    016A 3480      CPI	R24,0x40
    016B F5C9      BNE	0x01A5
(0172) 	   	  {
(0173) 		  PORTC&=~(1<<DA_SIN);
    016C 98AF      CBI	0x15,7
(0174) 	      PORTC|=(1<<DA_COS);
    016D 9AAE      SBI	0x15,6
(0175) 		  }
(0176) 	   }	
(0177) 	}
    016E C036      RJMP	0x01A5
(0178)   else 			   		  			 //bd相处理
(0179)     {
(0180) 	if (da_counter==0)
    016F 90200077  LDS	R2,da_counter
    0171 2022      TST	R2
    0172 F431      BNE	0x0179
(0181) 	   {
(0182) 	   PORTC|=(1<<DA_SIN);
    0173 9AAF      SBI	0x15,7
(0183) 	   PORTC|=(1<<DA_COS);
    0174 9AAE      SBI	0x15,6
(0184) 	   ac_bd_state=0;
    0175 2422      CLR	R2
    0176 92200069  STS	ac_bd_state,R2
(0185) 	   }
    0178 C02C      RJMP	0x01A5
(0186) 	else 
(0187) 	   {

⌨️ 快捷键说明

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