📄 m128_test.lst
字号:
050B C00B RJMP 0x0517
(0178) else if(y == 2)
050C 2D8A MOV R24,R10
050D 3082 CPI R24,2
050E F419 BNE 0x0512
(0179) address = 0x90 + x;
050F 2F46 MOV R20,R22
0510 5740 SUBI R20,0x70
0511 C005 RJMP 0x0517
(0180) else if(y == 3)
0512 2D8A MOV R24,R10
0513 3083 CPI R24,3
0514 F411 BNE 0x0517
(0181) address = 0xd0 + x;
0515 2F46 MOV R20,R22
0516 5340 SUBI R20,0x30
(0182)
(0183) send_buffer[0] = address;
0517 9340022B STS R20,_send_buffer
(0184)
(0185) char_len = 1;
0519 E081 LDI R24,1
051A 93800100 STS R24,0x100
(0186) serial_send(1);
051C E001 LDI R16,1
051D DF8E RCALL _serial_send
(0187) return ;
051E 940E0FD0 CALL pop_gset3
0520 9508 RET
(0188) }
(0189)
(0190) void init_lcd ()
(0191) {
(0192) send_buffer[0] = 0x01;
_init_lcd:
0521 E081 LDI R24,1
0522 9380022B STS R24,_send_buffer
(0193) char_len = 1;
0524 93800100 STS R24,0x100
(0194) serial_send(1);
0526 E001 LDI R16,1
(0195) return ;
0527 CF84 RJMP _serial_send
(0196) }
(0197)
(0198) void shift_r()
(0199) {
(0200) send_buffer[0] = 0x1c ;
_shift_r:
0528 E18C LDI R24,0x1C
0529 9380022B STS R24,_send_buffer
(0201) char_len = 1;
052B E081 LDI R24,1
052C 93800100 STS R24,0x100
(0202) serial_send(1);
052E E001 LDI R16,1
(0203) return ;
052F CF7C RJMP _serial_send
(0204) }
(0205)
(0206) void shift_l()
(0207) {
(0208) send_buffer[0] = 0x18;
_shift_l:
0530 E188 LDI R24,0x18
0531 9380022B STS R24,_send_buffer
(0209) char_len = 1;
0533 E081 LDI R24,1
0534 93800100 STS R24,0x100
(0210) serial_send(1);
0536 E001 LDI R16,1
(0211) return ;
0537 CF74 RJMP _serial_send
_printf_char:
s --> R20
0538 940E0FA6 CALL push_gset1
053A 2F40 MOV R20,R16
(0212) }
(0213) void printf_char(char s){
(0214)
(0215) send_buffer[0] = s;
053B 9340022B STS R20,_send_buffer
(0216) char_len = 1;
053D E081 LDI R24,1
053E 93800100 STS R24,0x100
(0217) serial_send(0);
0540 2700 CLR R16
0541 DF6A RCALL _serial_send
(0218) return ;
0542 940E0FA9 CALL pop_gset1
0544 9508 RET
_printf_hex:
temp --> R20
s --> R22
0545 940E0FBD CALL push_gset2
0547 2F60 MOV R22,R16
(0219)
(0220) }
(0221)
(0222)
(0223) void printf_hex(unsigned char s){
(0224) unsigned int temp = 0;
0548 2744 CLR R20
0549 2755 CLR R21
(0225)
(0226) temp = hextochar(s);
054A 2F06 MOV R16,R22
054B 2711 CLR R17
054C 940E017C CALL _hextochar
054E 01A8 MOVW R20,R16
(0227) send_buffer[1] = temp;
054F 9340022C STS R20,_send_buffer+1
(0228) temp = temp >> 8;
0551 2F45 MOV R20,R21
0552 2755 CLR R21
(0229) send_buffer[0] = temp;
0553 9340022B STS R20,_send_buffer
(0230) char_len = 2;
0555 E082 LDI R24,2
0556 93800100 STS R24,0x100
(0231) serial_send(0);
0558 2700 CLR R16
0559 DF52 RCALL _serial_send
(0232) return;
055A 940E0FCD CALL pop_gset2
055C 9508 RET
_printf_int:
c --> R20
055D 940E0FA6 CALL push_gset1
055F 01A8 MOVW R20,R16
(0233) }
(0234)
(0235)
(0236) void printf_int(int c )
(0237) {
(0238) char_len = bcd_char( c, send_buffer);
0560 E22B LDI R18,0x2B
0561 E032 LDI R19,2
0562 018A MOVW R16,R20
0563 940E01A9 CALL _bcd_char
0565 93000100 STS R16,0x100
(0239) serial_send(0);
0567 2700 CLR R16
0568 DF43 RCALL _serial_send
(0240) return;
0569 940E0FA9 CALL pop_gset1
056B 9508 RET
_printf_str:
i --> R20
s --> R22
056C 940E0FBD CALL push_gset2
056E 01B8 MOVW R22,R16
(0241) }
(0242)
(0243)
(0244) void printf_str(char *s ){
(0245) unsigned char i=0;
056F 2744 CLR R20
0570 C00C RJMP 0x057D
(0246)
(0247) while( *s ){
(0248)
(0249) send_buffer[i] = *s ;
0571 E28B LDI R24,0x2B
0572 E092 LDI R25,2
0573 2FE4 MOV R30,R20
0574 27FF CLR R31
0575 0FE8 ADD R30,R24
0576 1FF9 ADC R31,R25
0577 01DB MOVW R26,R22
0578 902C LD R2,0(X)
0579 8220 STD R2,0+Z
(0250) i ++;
057A 9543 INC R20
(0251) s++;
057B 5F6F SUBI R22,0xFF
057C 4F7F SBCI R23,0xFF
057D 01FB MOVW R30,R22
057E 8020 LDD R2,0+Z
057F 2022 TST R2
0580 F781 BNE 0x0571
(0252) }
(0253) char_len = i;
0581 93400100 STS R20,0x100
(0254) serial_send( 0 );
0583 2700 CLR R16
0584 DF27 RCALL _serial_send
(0255)
(0256) return;
0585 940E0FCD CALL pop_gset2
0587 9508 RET
_outp:
p --> R20
data --> R18
add --> R16
0588 940E0FA6 CALL push_gset1
(0257) }
(0258) /////////////////////////////////////////////////////////////////////////////////
(0259)
(0260) /////////////////////////////////////////////////////////////////////////////
(0261) ////// 104bus io 操作
(0262) //////////////////////////////////////////////////////////////////////////////
(0263) void outp(unsigned int add,unsigned char data)
(0264) {
(0265) unsigned char *p;
(0266) p = (unsigned char *) (add+0x2000);
058A 01A8 MOVW R20,R16
058B 5040 SUBI R20,0
058C 4E50 SBCI R21,0xE0
(0267)
(0268) *p=data;
058D 01FA MOVW R30,R20
058E 8320 STD R18,0+Z
(0269)
(0270) }
058F 940E0FA9 CALL pop_gset1
0591 9508 RET
_inp:
p --> R20
add --> R16
0592 940E0FA6 CALL push_gset1
(0271)
(0272)
(0273) unsigned char inp(unsigned int add)
(0274) {
(0275)
(0276) unsigned char *p;
(0277) p = (unsigned char *) (add+0x2000);
0594 01A8 MOVW R20,R16
0595 5040 SUBI R20,0
0596 4E50 SBCI R21,0xE0
(0278) return *p;
0597 01FA MOVW R30,R20
0598 8100 LDD R16,0+Z
0599 940E0FA9 CALL pop_gset1
059B 9508 RET
(0279)
(0280) }
(0281)
(0282) ////////////////////////////////////////////////////////////////////////////////
(0283) //////////////////////////////////////////////////////////////////////
(0284) //
(0285) // gyro_sample
(0286) //
(0287) // 参数 无
(0288) //
(0289) // 说明 陀螺仪采样函数,首先运行500次,求得零漂平均值,然后处理
(0290) // 陀螺仪数据,最终用算出的角度更新全局变量rob_angle
(0291) //
(0292) // 返回值 无
(0293) //
(0294) // 创建人 张辉
(0295) //
(0296) //////////////////////////////////////////////////////////////////////
(0297)
(0298) void init_gyro(){
(0299) outp(GYRO_BASE+4,0x00); /*陀螺仪标志位置0*/
_init_gyro:
059C 2722 CLR R18
059D E904 LDI R16,0x94
059E E012 LDI R17,2
(0300)
(0301) }
059F CFE8 RJMP _outp
_gyro_sample:
angle --> Y+6
cmplt --> R10
low_byte --> R10
mid_byte --> R12
high_byte --> Y+2
05A0 940E0FC5 CALL push_gset4
05A2 972A SBIW R28,0xA
(0302) int gyro_sample()
(0303) {
(0304) int cmplt;
(0305) long angle;
(0306) unsigned long high_byte;
(0307) unsigned int mid_byte,low_byte;
(0308) high_byte = 0;
05A3 E040 LDI R20,0
05A4 E050 LDI R21,0
05A5 E060 LDI R22,0
05A6 E070 LDI R23,0
05A7 01FE MOVW R30,R28
05A8 8342 STD R20,2+Z
05A9 8353 STD R21,3+Z
05AA 8364 STD R22,4+Z
05AB 8375 STD R23,5+Z
(0309) cmplt=inp(GYRO_BASE+0);
05AC E900 LDI R16,0x90
05AD E012 LDI R17,2
05AE DFE3 RCALL _inp
05AF 2EA0 MOV R10,R16
05B0 24BB CLR R11
(0310)
(0311) if((cmplt&0x01)==0x01)
05B1 01C5 MOVW R24,R10
05B2 7081 ANDI R24,1
05B3 7090 ANDI R25,0
05B4 3081 CPI R24,1
05B5 E0E0 LDI R30,0
05B6 079E CPC R25,R30
05B7 F419 BNE 0x05BB
(0312) {
(0313) return 0;
05B8 2700 CLR R16
05B9 2711 CLR R17
05BA C089 RJMP 0x0644
(0314) }
(0315) outp(GYRO_BASE+4,0x01);
05BB E021 LDI R18,1
05BC E904 LDI R16,0x94
05BD E012 LDI R17,2
05BE DFC9 RCALL _outp
(0316) high_byte=inp(GYRO_BASE+1);
05BF E901 LDI R16,0x91
05C0 E012 LDI R17,2
05C1 DFD0 RCALL _inp
05C2 2E20 MOV R2,R16
05C3 2433 CLR R3
05C4 2444 CLR R4
05C5 2455 CLR R5
05C6 01FE MOVW R30,R28
05C7 8222 STD R2,2+Z
05C8 8233 STD R3,3+Z
05C9 8244 STD R4,4+Z
05CA 8255 STD R5,5+Z
(0317) printf("%d ",high_byte);
05CB 8248 STD R4,0+Y
05CC 8259 STD R5,1+Y
05CD 2D22 MOV R18,R2
05CE 2D33 MOV R19,R3
05CF EC0C LDI R16,0xCC
05D0 E011 LDI R17,1
05D1 940E113B CALL _printf
(0318) mid_byte=inp(GYRO_BASE+2);
05D3 E902 LDI R16,0x92
05D4 E012 LDI R17,2
05D5 DFBC RCALL _inp
05D6 2EC0 MOV R12,R16
05D7 24DD CLR R13
(0319) printf("%d ",mid_byte);
05D8 0196 MOVW R18,R12
05D9 EC0C LDI R16,0xCC
05DA E011 LDI R17,1
05DB 940E113B CALL _printf
(0320) low_byte=inp(GYRO_BASE+3);
05DD E903 LDI R16,0x93
05DE E012 LDI R17,2
05DF DFB2 RCALL _inp
05E0 2EA0 MOV R10,R16
05E1 24BB CLR R11
(0321) printf("%d ",low_byte);
05E2 0195 MOVW R18,R10
05E3 EC0C LDI R16,0xCC
05E4 E011 LDI R17,1
05E5 940E113B CALL _printf
(0322) outp(GYRO_BASE+4,0x00);
05E7 2722 CLR R18
05E8 E904 LDI R16,0x94
05E9 E012 LDI R17,2
05EA DF9D RCALL _outp
(0323) if(high_byte>=0x80)
05EB E840 LDI R20,0x80
05EC E050 LDI R21,0
05ED E060 LDI R22,0
05EE E070 LDI R23,0
05EF 01FE MOVW R30,R28
05F0 8022 LDD R2,2+Z
05F1 8033 LDD R3,3+Z
05F2 8044 LDD R4,4+Z
05F3 8055 LDD R5,5+Z
05F4 1624 CP R2,R20
05F5 0635 CPC R3,R21
05F6 0646 CPC R4,R22
05F7 0657 CPC R5,R23
05F8 F060 BCS 0x0605
(0324) high_byte |= 0xffffff00;
05F9 E040 LDI R20,0
05FA EF5F LDI R21,0xFF
05FB EF6F LDI R22,0xFF
05FC EF7F LDI R23,0xFF
05FD 2A24 OR R2,R20
05FE 2A35 OR R3,R21
05FF 2A46 OR R4,R22
0600 2A57 OR R5,R23
0601 8222 STD R2,2+Z
0602 8233 STD R3,3+Z
0603 8244 STD R4,4+Z
0604 8255 STD R5,5+Z
(0325) angle=(long)(((high_byte)<<16)+((mid_byte&0x00ff)<<8)+(low_byte&0x00ff));
0605 01C6 MOVW R24,R12
0606 7090 ANDI R25,0
0607 2F98 MOV R25,R24
0608 2788 CLR R24
0609 011C MOVW R2,R24
060A 2444 CLR R4
060B 2455 CLR R5
060C 01FE MOVW R30,R28
060D 8062 LDD R6,2+Z
060E 8073 LDD R7,3+Z
060F 8084 LDD R8,4+Z
0610 8095 LDD R9,5+Z
0611 2C86 MOV R8,R6
0612 2C97 MOV R9,R7
0613 2466 CLR R6
0614 2477 CLR R7
0615 0C62 ADD R6,R2
0616 1C73 ADC R7,R3
0617 1C84 ADC R8,R4
0618 1C95 ADC R9,R5
0619 01C5 MOVW R24,R10
061A 7090 ANDI R25,0
061B 011C MOVW R2,R24
061C 2444 CLR R4
061D 2455 CLR R5
061E 0C62 ADD R6,R2
061F 1C73 ADC R7,R3
0620 1C84 ADC R8,R4
0621 1C95 ADC R9,R5
0622 8266 STD R6,6+Z
0623 8277 STD R7,7+Z
0624 8680 STD R8,8+Z
0625 8691 STD R9,9+Z
(0326) rob_angle=angle/2742.9797399;
0626 8106 LDD R16,6+Z
0627 8117 LDD R17,7+Z
0628 8520 LDD R18,8+Z
0629 8531 LDD R19,9+Z
062A 940E0E9D CALL long2fp
062C 933A ST R19,-Y
062D 932A ST R18,-Y
062E 931A ST R17,-Y
062F 930A ST R16,-Y
0630 E80E LDI R16,0x8E
0631 E010 LDI R17,0
0632 940E118B CALL lpm32
0634 933A ST R19,-Y
0635 932A ST R18,-Y
0636 931A ST R17,-Y
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -