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

📄 8.lst

📁 mega8 对电机控制。采用mega8对电机控制。然后再用mega16 来控制mega8
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0156)         pp->vl_PreU = pp->s_Kp * error + pp->s_Ki * pp->si_PreIntegral + pp->s_Kd*d_error;	//位置PID算法
    02BD 01F5      MOVW	R30,R10
    02BE 8824      LDD	R2,Z+20
    02BF 8835      LDD	R3,Z+21
    02C0 8846      LDD	R4,Z+22
    02C1 8857      LDD	R5,Z+23
    02C2 01F5      MOVW	R30,R10
    02C3 A060      LDD	R6,Z+32
    02C4 A071      LDD	R7,Z+33
    02C5 2488      CLR	R8
    02C6 FC77      SBRC	R7,7
    02C7 9480      COM	R8
    02C8 2499      CLR	R9
    02C9 FC87      SBRC	R8,7
    02CA 9490      COM	R9
    02CB 925A      ST	R5,-Y
    02CC 924A      ST	R4,-Y
    02CD 923A      ST	R3,-Y
    02CE 922A      ST	R2,-Y
    02CF 0183      MOVW	R16,R6
    02D0 0194      MOVW	R18,R8
    02D1 D449      RCALL	empy32s
    02D2 0118      MOVW	R2,R16
    02D3 0129      MOVW	R4,R18
    02D4 01FE      MOVW	R30,R28
    02D5 8060      LDD	R6,Z+0
    02D6 8071      LDD	R7,Z+1
    02D7 8082      LDD	R8,Z+2
    02D8 8093      LDD	R9,Z+3
    02D9 01F5      MOVW	R30,R10
    02DA 8D46      LDD	R20,Z+30
    02DB 8D57      LDD	R21,Z+31
    02DC 2766      CLR	R22
    02DD FD57      SBRC	R21,7
    02DE 9560      COM	R22
    02DF 2777      CLR	R23
    02E0 FD67      SBRC	R22,7
    02E1 9570      COM	R23
    02E2 929A      ST	R9,-Y
    02E3 928A      ST	R8,-Y
    02E4 927A      ST	R7,-Y
    02E5 926A      ST	R6,-Y
    02E6 018A      MOVW	R16,R20
    02E7 019B      MOVW	R18,R22
    02E8 D432      RCALL	empy32s
    02E9 0138      MOVW	R6,R16
    02EA 0149      MOVW	R8,R18
    02EB 0C62      ADD	R6,R2
    02EC 1C73      ADC	R7,R3
    02ED 1C84      ADC	R8,R4
    02EE 1C95      ADC	R9,R5
    02EF 01FE      MOVW	R30,R28
    02F0 8024      LDD	R2,Z+4
    02F1 8035      LDD	R3,Z+5
    02F2 8046      LDD	R4,Z+6
    02F3 8057      LDD	R5,Z+7
    02F4 01F5      MOVW	R30,R10
    02F5 A142      LDD	R20,Z+34
    02F6 A153      LDD	R21,Z+35
    02F7 2766      CLR	R22
    02F8 FD57      SBRC	R21,7
    02F9 9560      COM	R22
    02FA 2777      CLR	R23
    02FB FD67      SBRC	R22,7
    02FC 9570      COM	R23
    02FD 925A      ST	R5,-Y
    02FE 924A      ST	R4,-Y
    02FF 923A      ST	R3,-Y
    0300 922A      ST	R2,-Y
    0301 018A      MOVW	R16,R20
    0302 019B      MOVW	R18,R22
    0303 D417      RCALL	empy32s
    0304 0E60      ADD	R6,R16
    0305 1E71      ADC	R7,R17
    0306 1E82      ADC	R8,R18
    0307 1E93      ADC	R9,R19
    0308 01F5      MOVW	R30,R10
    0309 A660      STD	Z+40,R6
    030A A671      STD	Z+41,R7
    030B A682      STD	Z+42,R8
    030C A693      STD	Z+43,R9
(0157)         
(0158)         if( pp->vl_PreU >= SS_MAX ) 		//防止调节溢出
    030D E040      LDI	R20,0
    030E E450      LDI	R21,0x40
    030F E066      LDI	R22,6
    0310 E070      LDI	R23,0
    0311 01F5      MOVW	R30,R10
    0312 A420      LDD	R2,Z+40
    0313 A431      LDD	R3,Z+41
    0314 A442      LDD	R4,Z+42
    0315 A453      LDD	R5,Z+43
    0316 1624      CP	R2,R20
    0317 0635      CPC	R3,R21
    0318 0646      CPC	R4,R22
    0319 0657      CPC	R5,R23
    031A F054      BLT	0x0325
(0159)         	pp->vl_PreU = SS_MAX;
    031B E040      LDI	R20,0
    031C E450      LDI	R21,0x40
    031D E066      LDI	R22,6
    031E E070      LDI	R23,0
    031F 01F5      MOVW	R30,R10
    0320 A740      STD	Z+40,R20
    0321 A751      STD	Z+41,R21
    0322 A762      STD	Z+42,R22
    0323 A773      STD	Z+43,R23
    0324 C017      RJMP	0x033C
(0160)         else if( pp->vl_PreU <= SS_MIN ) 
    0325 E040      LDI	R20,0
    0326 EC50      LDI	R21,0xC0
    0327 EF69      LDI	R22,0xF9
    0328 EF7F      LDI	R23,0xFF
    0329 01F5      MOVW	R30,R10
    032A A420      LDD	R2,Z+40
    032B A431      LDD	R3,Z+41
    032C A442      LDD	R4,Z+42
    032D A453      LDD	R5,Z+43
    032E 1542      CP	R20,R2
    032F 0553      CPC	R21,R3
    0330 0564      CPC	R22,R4
    0331 0575      CPC	R23,R5
    0332 F04C      BLT	0x033C
(0161)         	pp->vl_PreU = SS_MIN;	     			
    0333 E040      LDI	R20,0
    0334 EC50      LDI	R21,0xC0
    0335 EF69      LDI	R22,0xF9
    0336 EF7F      LDI	R23,0xFF
    0337 01F5      MOVW	R30,R10
    0338 A740      STD	Z+40,R20
    0339 A751      STD	Z+41,R21
    033A A762      STD	Z+42,R22
    033B A773      STD	Z+43,R23
(0162)     }       				
(0163) 	
(0164)     return (  pp->vl_PreU  >> 10 );		// 返回预调节占空比
    033C E08A      LDI	R24,0xA
    033D E090      LDI	R25,0
    033E 01F5      MOVW	R30,R10
    033F A420      LDD	R2,Z+40
    0340 A431      LDD	R3,Z+41
    0341 A442      LDD	R4,Z+42
    0342 A453      LDD	R5,Z+43
    0343 938A      ST	R24,-Y
    0344 0181      MOVW	R16,R2
    0345 0192      MOVW	R18,R4
    0346 D3C8      RCALL	asr32
    0347 962C      ADIW	R28,0xC
    0348 D400      RCALL	pop_gset3
    0349 9508      RET
FILE: E:\李斐机器人\xunxianjiadongzuo\8\Slave_SPI.c
(0001) /*		Mega8  Slave_SPI.c	*/
(0002) unsigned char  rev_buf[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};	   //接收数据缓存数组
(0003) unsigned char  send_buf[10] = {1, 2, 3, 4, 5, 6, 7, 9, 0, 0};	   //反馈回主机数据缓存数组
(0004) 
(0005) //SPI initialisation
(0006) // clock rate: 62500hz
(0007) void spi_init(void)
(0008) {	
(0009) 	 PORTB |= 0X3C;		//SPI初始化
_spi_init:
    034A B388      IN	R24,0x18
    034B 638C      ORI	R24,0x3C
    034C BB88      OUT	0x18,R24
(0010) 	 DDRB &= 0xC3;		//MOSI,SCK,SS为输入,
    034D B387      IN	R24,0x17
    034E 7C83      ANDI	R24,0xC3
    034F BB87      OUT	0x17,R24
(0011) 	 DDRB |= (1 << 4);	//MISO 输出
    0350 9ABC      SBI	0x17,4
(0012) 	
(0013) 	/* 使能SPI 主机模式,设置时钟速率为fck/128 */
(0014) 	SPCR = ((1<<SPIE) | (1<<SPE) |(1<<SPR1) | (1<<SPR0));
    0351 EC83      LDI	R24,0xC3
    0352 B98D      OUT	0x0D,R24
(0015) 	SPSR = 0x00; //setup SPI
    0353 2422      CLR	R2
    0354 B82E      OUT	0x0E,R2
(0016) }
    0355 9508      RET
_spi_stc_isr:
  temp_int             --> R10
  temp_long            --> Y+0
  temp_char            --> R12
    0356 D43B      RCALL	push_lset
    0357 D412      RCALL	push_gset4
    0358 9724      SBIW	R28,4
(0017) 
(0018) /* ******************************************************************
(0019) /**********************************************************************/
(0020) #define CMD_START 0X40   		  //发送数据之前先发送起动命令字	
(0021) 
(0022) #define RISEGO 0x88
(0023) #define RISEBACK 0x89
(0024) #define PUSH2GO 0x8A
(0025) #define PUSH2BACK 0x8B
(0026) #define PUSH1GO 0x87
(0027) 
(0028) #define PID_RESET 0XA4		//复位指令(0数据指令)
(0029) #define FREE_STOP 0X81		//自由停机指令(0数据指令)
(0030) #define SPEED_SET 0X80		//速度设定(双数据指令)
(0031) #define DISTANCE_SET 0X90	//位置设定(四数据指令)
(0032) /**********************************************************************/
(0033) 
(0034) /**********************************************************************/
(0035) //被传输数据前加的命令字
(0036) 
(0037) /**********************************************************************/
(0038) #pragma interrupt_handler spi_stc_isr:11
(0039) void spi_stc_isr(void)
(0040) {
(0041) 	static unsigned char i = 0;
(0042) 	static unsigned char start_trans_flag = 0;	//接收开始标志
(0043) 	static unsigned char com_flag = 0;	//命令类型标志,
(0044) 	static unsigned char data_long = 0;	//数据传送长度
(0045) 		
(0046) 	unsigned char temp_char = 0x00; //传送数据
    0359 24CC      CLR	R12
(0047) 	signed int temp_int = 0x00;
    035A 24AA      CLR	R10
    035B 24BB      CLR	R11
(0048) 	signed long temp_long = 0x00;	
    035C E040      LDI	R20,0
    035D E050      LDI	R21,0
    035E E060      LDI	R22,0
    035F E070      LDI	R23,0
    0360 01FE      MOVW	R30,R28
    0361 8340      STD	Z+0,R20
    0362 8351      STD	Z+1,R21
    0363 8362      STD	Z+2,R22
    0364 8373      STD	Z+3,R23
(0049) 	
(0050) 	temp_char = SPDR;
(0051) 	
(0052) 	if (start_trans_flag == 0)		//
    0365 B0CF      IN	R12,0x0F
    0366 9020007C  LDS	R2,0x7C
    0368 2022      TST	R2
    0369 F4F1      BNE	0x0388
(0053) 	{	/*主机向从机传送的第一个字节数据为启动字节数据,包含三部分信息,1:启动命令字0x40。2:命令类型信息,第四位为1时,表从机向主机传送数据,否则为主机向从机传送数据。3:被传送,数据流长度信息,为低四位所表之数值.*/
(0054) 		if ((temp_char & 0xE0) == CMD_START)	//判断是否启动传送 1111 0000
    036A 2D8C      MOV	R24,R12
    036B 7E80      ANDI	R24,0xE0
    036C 3480      CPI	R24,0x40
    036D F009      BEQ	0x036F
    036E C168      RJMP	0x04D7
(0055) 		{
(0056) 			data_long = (temp_char & 0x0f);	//0000 1111
(0057) 			com_flag = (temp_char & 0x10);	//0x00->主机向从机传送,0x10->从机向主机传送
(0058) 			start_trans_flag = 1;//从机开始送(标志位)
(0059) 			
(0060) 			if (com_flag)	//将需返回给主机的第一个字节放入SPDR,等待主机接收
    036F 2D8C      MOV	R24,R12
    0370 708F      ANDI	R24,0xF
    0371 9380007E  STS	0x7E,R24
    0373 2D8C      MOV	R24,R12
    0374 7180      ANDI	R24,0x10
    0375 9380007D  STS	0x7D,R24
    0377 E081      LDI	R24,1
    0378 9380007C  STS	0x7C,R24
    037A 9020007D  LDS	R2,0x7D
    037C 2022      TST	R2
    037D F409      BNE	0x037F
    037E C158      RJMP	0x04D7
(0061) 			{	
(0062) 				SPDR = send_buf[0]; 
    037F 90200071  LDS	R2,0x71
    0381 B82F      OUT	0x0F,R2
(0063) 				i = i+1;	//传送数据指针指向下一数据
    0382 9180007B  LDS	R24,0x7B
    0384 5F8F      SUBI	R24,0xFF
    0385 9380007B  STS	0x7B,R24
(0064) 			}
(0065) 		}
(0066) 	}
    0387 C14F      RJMP	0x04D7
(0067) 	else 
(0068) 	{
(0069) 		if (com_flag == 0x00)	//从机接收数据
    0388 9020007D  LDS	R2,0x7D
    038A 2022      TST	R2
    038B F009      BEQ	0x038D
    038C C12E      RJMP	0x04BB
(0070) 		{
(0071) 			rev_buf[i] = temp_char;
    038D E687      LDI	R24,0x67
    038E E090      LDI	R25,0
    038F 91E0007B  LDS	R30,0x7B
    0391 27FF      CLR	R31
    0392 0FE8      ADD	R30,R24
    0393 1FF9      ADC	R31,R25
    0394 82C0      STD	Z+0,R12
(0072) 			
(0073) 			i++;
(0074) 			
(0075) 			if (i >= data_long)
    0395 9180007B  LDS	R24,0x7B
    0397 5F8F      SUBI	R24,0xFF
    0398 9380007B  STS	0x7B,R24
    039A 9020007E  LDS	R2,0x7E
    039C 1582      CP	R24,R2
    039D F408      BCC	0x039F
    039E C138      RJMP	0x04D7
(0076) 			{
(0077) 				i = 0;
(0078) 				start_trans_flag = 0;
(0079) 				data_long = 0;
(0080) 				com_flag = 0x00;
(0081) 				
(0082) 				switch (rev_buf[0])//首位设为标志位
    039F 2422      CLR	R2
    03A0 9220007B  STS	0x7B,R2
    03A2 9220007C  STS	0x7C,R2
    03A4 9220007E  STS	0x7E,R2
    03A6 9220007D  STS	0x7D,R2
    03A8 90C00067  LDS	R12,0x67
    03AA 24DD      CLR	R13
    03AB 01C6      MOVW	R24,R12
    03AC 3980      CPI	R24,0x90
    03AD E0E0      LDI	R30,0
    03AE 079E      CPC	R25,R30
    03AF F409      BNE	0x03B1
    03B0 C084      RJMP	0x0435
    03B1 E980      LDI	R24,0x90
    03B2 158C      CP	R24,R12
    03B3 059D      CPC	R25,R13
    03B4 F10C      BLT	0x03D6
    03B5 01C6      MOVW	R24,R12
    03B6 3880      CPI	R24,0x80
    03B7 E0E0      LDI	R30,0
    03B8 079E      CPC	R25,R30
    03B9 F409      BNE	0x03BB
    03BA C066      RJMP	0x0421
    03BB 3881      CPI	R24,0x81
    03BC E0E0      LDI	R30,0
    03BD 079E      CPC	R25,R30
    03BE F409      BNE	0x03C0
    03BF C05A      RJMP	0x041A
    03C0 3887      CPI	R24,0x87
    03C1 E0E0      LDI	R30,0
    03C2 079E      CPC	R25,R30
    03C3 F409      BNE	0x03C5
    03C4 C040      RJMP	0x0405
    03C5 3888      CPI	R24,0x88
    03C6 E0E0      LDI	R30,0
    03C7 079E      CPC	R25,R30
    03C8 F0A1      BEQ	0x03DD
    03C9 3889      CPI	R24,0x89
    03CA E0E0      LDI	R30,0
    03CB 079E      CPC	R25,R30
    03CC F0D1      BEQ	0x03E7
    03CD 388A      CPI	R24,0x8A
    03CE E0E0      LDI	R30,0
    03CF 079E      CPC	R25,R30
    03D0 F101      BEQ	0x03F1
    03D1 388B      CPI	R24,0x8B
    03D2 E0E0      LDI	R30,0
    03D3 079E      CPC	R25,R30
    03D4 F131      BEQ	0x03FB
    03D5 C101      RJMP	0x04D7
    03D6 01C6      MOVW	R24,R12
    03D7 3A84      CPI	R24,0xA4
    03D8 E0E0      LDI	R30,0
    03D9 079E      CPC	R25,R30
    03DA F409      BNE	0x03DC
    03DB C033      RJMP	0x040F
    03DC C0FA      RJMP	0x04D7
(0083) 				{
(0084) 				 	case RISEGO :
(0085) 						 	   	{				   
(0086) 									 risemotor('g');
    03DD E607      LDI	R16,0x67
    03DE E010      LDI	R17,0
    03DF D0FB      RCALL	_risemotor
(0087)   									 delay_ms(2300);
    03E0 EF0C      LDI	R16,0xFC
    03E1 E018      LDI	R17,0x8
    03E2 D185      RCALL	_delay_ms
(0088)   									 risemotor('s');
    03E3 E703      LDI	R16,0x73
    03E4 E010      LDI	R17,0
    03E5 D0F5      RCALL	_risemotor
(0089)   									 
(0090) 									 
(0091)   									/* pushmotor1('g');   //推块电机上
(0092)   									 delay_ms(1500);
(0093)   									 pushmotor1('s');*/
(0094) 									 		 
(0095) 												   
(0096) 								}break;
    03E6 C0F0      RJMP	0x04D7
(0097) 					case RISEBACK:
(0098) 						 		  {
(0099) 								     risemotor('b'); 
    03E7 E602      LDI	R16,0x62
    03E8 E010      LDI	R17,0

⌨️ 快捷键说明

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