📄 main.lst
字号:
__start:
__text_start:
003A E5CF LDI R28,0x5F
003B E0D8 LDI R29,0x8
003C BFCD OUT 0x3D,R28
003D BFDE OUT 0x3E,R29
003E 51C0 SUBI R28,0x10
003F 40D0 SBCI R29,0
0040 EA0A LDI R16,0xAA
0041 8308 STD Y+0,R16
0042 2400 CLR R0
0043 E6E0 LDI R30,0x60
0044 E0F0 LDI R31,0
0045 E010 LDI R17,0
0046 36E1 CPI R30,0x61
0047 07F1 CPC R31,R17
0048 F011 BEQ 0x004B
0049 9201 ST R0,Z+
004A CFFB RJMP 0x0046
004B 8300 STD Z+0,R16
004C E7E4 LDI R30,0x74
004D E0F0 LDI R31,0
004E E6A0 LDI R26,0x60
004F E0B0 LDI R27,0
0050 E010 LDI R17,0
0051 37E4 CPI R30,0x74
0052 07F1 CPC R31,R17
0053 F021 BEQ 0x0058
0054 95C8 LPM
0055 9631 ADIW R30,1
0056 920D ST R0,X+
0057 CFF9 RJMP 0x0051
0058 940E0186 CALL _main
_exit:
005A CFFF RJMP _exit
FILE: D:\桌面\avr程序设计\循迹小车\motor.c
(0001) /****************************************************************
(0002) ** 文件名:motor.c 电机驱动函数
(0003) ****************************************************************/
(0004) #include "config.h"
(0005)
(0006) /************************左电机动作*****************************/
(0007) //左电机前进
(0008) void motor_left_forward(uint8 speed)
(0009) {
(0010) motol_uen1;
_motor_left_forward:
speed --> R16
005B 98C4 CBI 0x18,4
(0011) motol_en2;
005C 9AC5 SBI 0x18,5
(0012) if(speed!=0) //加入调速指令
005D 2300 TST R16
005E F009 BEQ 0x0060
(0013) {
(0014) OCR0=speed;
005F BF0C OUT 0x3C,R16
(0015) }
(0016) T0_EN;
0060 B789 IN R24,0x39
0061 6083 ORI R24,3
0062 BF89 OUT 0x39,R24
0063 9508 RET
(0017) }
(0018) //左电机后退
(0019) void motor_left_backward(uint8 speed)
(0020) {
(0021) motol_en1;
_motor_left_backward:
speed --> R16
0064 9AC4 SBI 0x18,4
(0022) motol_uen2;
0065 98C5 CBI 0x18,5
(0023) if(speed!=0) //加入调速指令
0066 2300 TST R16
0067 F009 BEQ 0x0069
(0024) {
(0025) OCR0=speed;
0068 BF0C OUT 0x3C,R16
(0026) }
(0027) T0_EN;
0069 B789 IN R24,0x39
006A 6083 ORI R24,3
006B BF89 OUT 0x39,R24
006C 9508 RET
(0028) }
(0029) //左电机速度设定
(0030) void motor_left_speed_set(uint8 speed)
(0031) {
(0032) if(speed!=0)
_motor_left_speed_set:
speed --> R16
006D 2300 TST R16
006E F009 BEQ 0x0070
(0033) {
(0034) OCR0=speed;
006F BF0C OUT 0x3C,R16
(0035) }
0070 9508 RET
(0036) }
(0037) //左电机滑行
(0038) void motor_left_stop(void)
(0039) {
(0040) motol_uen1;
_motor_left_stop:
0071 98C4 CBI 0x18,4
(0041) motol_uen2;
0072 98C5 CBI 0x18,5
(0042) T0_UEN;
0073 B789 IN R24,0x39
0074 7F8D ANDI R24,0xFD
0075 BF89 OUT 0x39,R24
0076 9508 RET
(0043) }
(0044) //左电机急停
(0045) void motor_left_quick_stop(void)
(0046) {
(0047) motol_en1;
_motor_left_quick_stop:
0077 9AC4 SBI 0x18,4
(0048) motol_en2;
0078 9AC5 SBI 0x18,5
(0049) T0_UEN;
0079 B789 IN R24,0x39
007A 7F8D ANDI R24,0xFD
007B BF89 OUT 0x39,R24
007C 9508 RET
(0050) }
(0051)
(0052) /*************************右电机动作*****************************/
(0053) //右电机前进
(0054) void motor_right_forward(uint8 speed)
(0055) {
(0056) motor_en1;
_motor_right_forward:
speed --> R16
007D 9AC1 SBI 0x18,1
(0057) motor_uen2;
007E 98C2 CBI 0x18,2
(0058) if(speed!=0) //加入调速指令
007F 2300 TST R16
0080 F021 BEQ 0x0085
(0059) {
(0060) OCR2=speed;
0081 BD03 OUT 0x23,R16
(0061) while(ASSR&(1<<TCR2UB)==1) ; //异步操作需要等待 OCR2写入完毕
0082 B422 IN R2,0x22
0083 FC20 SBRC R2,0
0084 CFFD RJMP 0x0082
(0062) }
(0063) T2_EN;
0085 B789 IN R24,0x39
0086 6C80 ORI R24,0xC0
0087 BF89 OUT 0x39,R24
0088 9508 RET
(0064) }
(0065) //右电机后退
(0066) void motor_right_backward(uint8 speed)
(0067) {
(0068) motor_uen1;
_motor_right_backward:
speed --> R16
0089 98C1 CBI 0x18,1
(0069) motor_en2;
008A 9AC2 SBI 0x18,2
(0070) if(speed!=0) //加入调速指令
008B 2300 TST R16
008C F021 BEQ 0x0091
(0071) {
(0072) OCR2=speed;
008D BD03 OUT 0x23,R16
(0073) while(ASSR&(1<<TCR2UB)==1) ; //异步操作需要等待 OCR2写入完毕
008E B422 IN R2,0x22
008F FC20 SBRC R2,0
0090 CFFD RJMP 0x008E
(0074) }
(0075) T2_EN;
0091 B789 IN R24,0x39
0092 6C80 ORI R24,0xC0
0093 BF89 OUT 0x39,R24
0094 9508 RET
(0076) }
(0077) //右电机速度设定
(0078) void motor_right_speed_set(uint8 speed)
(0079) {
(0080) if(speed!=0)
_motor_right_speed_set:
speed --> R16
0095 2300 TST R16
0096 F021 BEQ 0x009B
(0081) {
(0082) OCR0=speed;
0097 BF0C OUT 0x3C,R16
(0083) while(ASSR&(1<<TCR2UB)==1) ; //异步操作需要等待 OCR2写入完毕
0098 B422 IN R2,0x22
0099 FC20 SBRC R2,0
009A CFFD RJMP 0x0098
(0084) }
009B 9508 RET
(0085) }
(0086) //右电机滑行
(0087) void motor_right_stop(void)
(0088) {
(0089) motor_uen1;
_motor_right_stop:
009C 98C1 CBI 0x18,1
(0090) motor_uen2;
009D 98C2 CBI 0x18,2
(0091) T2_UEN;
009E B789 IN R24,0x39
009F 778F ANDI R24,0x7F
00A0 BF89 OUT 0x39,R24
00A1 9508 RET
(0092) }
(0093)
(0094) //右电机急停
(0095) void motor_right_quick_stop(void)
(0096) {
(0097) motor_en1;
_motor_right_quick_stop:
00A2 9AC1 SBI 0x18,1
(0098) motor_en2;
00A3 9AC2 SBI 0x18,2
(0099) T2_UEN;
00A4 B789 IN R24,0x39
00A5 778F ANDI R24,0x7F
00A6 BF89 OUT 0x39,R24
00A7 9508 RET
(0100) }
(0101)
(0102) /**********************小车动作*****************************/
(0103)
(0104) void straight(void) //直行
(0105) {
(0106) motor_left_forward(0xfe);
_straight:
00A8 EF0E LDI R16,0xFE
00A9 DFB1 RCALL _motor_left_forward
(0107) motor_right_forward(0xfe);
00AA EF0E LDI R16,0xFE
00AB DFD1 RCALL _motor_right_forward
00AC 9508 RET
(0108) }
(0109)
(0110) void turn_left(void) //左转
(0111) {
(0112) motor_left_forward(0xfe);
_turn_left:
00AD EF0E LDI R16,0xFE
00AE DFAC RCALL _motor_left_forward
(0113) motor_right_forward(0x50);
00AF E500 LDI R16,0x50
00B0 DFCC RCALL _motor_right_forward
00B1 9508 RET
(0114) }
(0115)
(0116) void turn_right(void) //右转
(0117) {
(0118) motor_left_forward(0x50);
_turn_right:
00B2 E500 LDI R16,0x50
00B3 DFA7 RCALL _motor_left_forward
(0119) motor_right_forward(0xfe);
00B4 EF0E LDI R16,0xFE
00B5 DFC7 RCALL _motor_right_forward
00B6 9508 RET
(0120) }
(0121)
(0122) void straight_back(void) //直回
(0123) {
(0124) motor_left_backward(0xfe);
_straight_back:
00B7 EF0E LDI R16,0xFE
00B8 DFAB RCALL _motor_left_backward
(0125) motor_right_backward(0xfe);
00B9 EF0E LDI R16,0xFE
00BA DFCE RCALL _motor_right_backward
00BB 9508 RET
(0126) }
(0127)
(0128) void stop(void) //急停
(0129) {
(0130) motor_left_quick_stop();
_stop:
00BC DFBA RCALL _motor_left_quick_stop
(0131) motor_right_quick_stop();
00BD DFE4 RCALL _motor_right_quick_stop
00BE 9508 RET
(0132) }
(0133)
(0134) void mic_turn_right(void) //向右微调
(0135) {
(0136) motor_left_forward(0xa0);
_mic_turn_right:
00BF EA00 LDI R16,0xA0
00C0 DF9A RCALL _motor_left_forward
(0137) motor_right_forward(0xfe);
00C1 EF0E LDI R16,0xFE
00C2 DFBA RCALL _motor_right_forward
00C3 9508 RET
(0138) }
(0139)
(0140) void mic_turn_left(void) //向左微调
(0141) {
(0142) motor_left_forward(0xFE);
_mic_turn_left:
00C4 EF0E LDI R16,0xFE
00C5 DF95 RCALL _motor_left_forward
(0143) motor_right_forward(0xa0);
00C6 EA00 LDI R16,0xA0
00C7 DFB5 RCALL _motor_right_forward
00C8 9508 RET
_flag_test:
temp --> R20
00C9 940E01D3 CALL push_gset1
(0144) }
(0145)
(0146) void flag_test(void) //测试小车状态
(0147) {
(0148) uint8 temp;
(0149) temp = PINA&0x0f; //PINA的低四位
00CB B349 IN R20,0x19
00CC 704F ANDI R20,0xF
(0150) switch(temp)
00CD 2755 CLR R21
00CE 3040 CPI R20,0
00CF E0E0 LDI R30,0
00D0 075E CPC R21,R30
00D1 F154 BLT 0x00FC
00D2 E08F LDI R24,0xF
00D3 E090 LDI R25,0
00D4 1784 CP R24,R20
00D5 0795 CPC R25,R21
00D6 F12C BLT 0x00FC
00D7 E002 LDI R16,2
00D8 E010 LDI R17,0
00D9 019A MOVW R18,R20
00DA 940E01BB CALL empy16s
00DC 01F8 MOVW R30,R16
00DD E584 LDI R24,0x54
00DE E090 LDI R25,0
00DF 0FE8 ADD R30,R24
00E0 1FF9 ADC R31,R25
00E1 9005 LPM R0,Z+
00E2 9014 LPM R1,0(Z)
00E3 01F0 MOVW R30,R0
00E4 9409 IJMP
(0151) {
(0152) case 0x0f:
(0153) flag = 0; //未偏
00E5 2422 CLR R2
00E6 92200060 STS flag,R2
(0154) break;
00E8 C013 RJMP 0x00FC
(0155) case 0x01:
(0156) case 0x06:
(0157) case 0x07:
(0158) case 0x08:
(0159) case 0x0a:
(0160) case 0x0e:
(0161) flag = 1; //左偏
00E9 E081 LDI R24,1
00EA 93800060 STS flag,R24
(0162) break;
00EC C00F RJMP 0x00FC
(0163) case 0x02:
(0164) case 0x04:
(0165) case 0x05:
(0166) case 0x09:
(0167) case 0x0b:
(0168) case 0x0d:
(0169) flag = 2; //右偏
00ED E082 LDI R24,2
00EE 93800060 STS flag,R24
(0170) break;
00F0 C00B RJMP 0x00FC
(0171) case 0x0c:
(0172) flag = 3; //前两出线
00F1 E083 LDI R24,3
00F2 93800060 STS flag,R24
(0173) break;
00F4 C007 RJMP 0x00FC
(0174) case 0x03:
(0175) flag = 4; //后两出线
00F5 E084 LDI R24,4
00F6 93800060 STS flag,R24
(0176) break;
00F8 C003 RJMP 0x00FC
(0177) case 0x00:
(0178) flag = 5; //脱轨
00F9 E085 LDI R24,5
00FA 93800060 STS flag,R24
(0179) break;
(0180) default:
(0181) break;
00FC 940E01D6 CALL pop_gset1
00FE 9508 RET
_timer0_ovf_isr:
00FF 938A ST R24,-Y
0100 B78F IN R24,0x3F
0101 938A ST R24,-Y
FILE: D:\桌面\avr程序设计\循迹小车\interupts.c
(0001) /*******************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -