📄 8.lst
字号:
(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 + -