📄 motor2.lst
字号:
__text_start:
__start:
0011 E5CF LDI R28,0x5F
0012 E0D2 LDI R29,2
0013 BFCD OUT 0x3D,R28
0014 BFDE OUT 0x3E,R29
0015 51C0 SUBI R28,0x10
0016 40D0 SBCI R29,0
0017 EA0A LDI R16,0xAA
0018 8308 STD Y+0,R16
0019 2400 CLR R0
001A E6E0 LDI R30,0x60
001B E0F0 LDI R31,0
001C E010 LDI R17,0
001D 36E0 CPI R30,0x60
001E 07F1 CPC R31,R17
001F F011 BEQ 0x0022
0020 9201 ST R0,Z+
0021 CFFB RJMP 0x001D
0022 8300 STD Z+0,R16
0023 E2E2 LDI R30,0x22
0024 E0F0 LDI R31,0
0025 E6A0 LDI R26,0x60
0026 E0B0 LDI R27,0
0027 E010 LDI R17,0
0028 32E2 CPI R30,0x22
0029 07F1 CPC R31,R17
002A F021 BEQ 0x002F
002B 95C8 LPM
002C 9631 ADIW R30,1
002D 920D ST R0,X+
002E CFF9 RJMP 0x0028
002F D13B RCALL _main
_exit:
0030 CFFF RJMP _exit
FILE: H:\motor2\motor2.c
(0001) #include<stdio.h>
(0002) #include<iom8515v.h>
(0003) #include<macros.h>
(0004) // AVR ATmega8515L
(0005) // (实验板板针注释)
(0006) // ______ ______
(0007) // | O \_/ |
(0008) // 数字开关1---PB0--0 VCC 5V电源(+极)
(0009) // 数字开关2---PB1--0 1--PA0---L-298
(0010) // 数字开关3---PB2--0 1--PA1---L-298
(0011) // 数字开关4---PB3--0 1--PA2---R-298
(0012) // ---PB4--1 1--PA3---R-298
(0013) // ---PB5--1 1--PA4---舵机(收集杆)
(0014) // ---PB6--1 1--PA5---舵机(提升装置)
(0015) // ---PB7--1 1--PA6---
(0016) // RESET 1--PA7---
(0017) // 收集包裹---PD0--1 ICP
(0018) // 收集包裹---PD1--1 ALE
(0019) // 电磁铁 ---PD2--1 1--OCIB---ENABLE L(PWM)
(0020) // 收集包裹使能 ---PD3--1 0--PC7---传感器8,后计数传感器
(0021) //收集装置传感器 ---PD4--0 0--PC6---传感器7,后右传感器
(0022) // ENABLE R(PWM)---PD5--1 0--PC5---传感器6,后中传感器
(0023) // ---PD6--0 0--PC4---传感器5 后左传感器
(0024) // ---PD7--0 0--PC3---传感器4,前计数传感器
(0025) // xtal2 0--PC2---传感器3,前右传感器
(0026) // xtal1 0--PC1---传感器2,前中传感器
(0027) // (-极)地线 GND 0--PC0---传感器1,前左传感器
(0028) // |_______________|
(0029) //****************************************************************************
(0030) //输出端口位操作(置1为高电平,清0为低电平)
(0031) #define set_bit(x,y) (x|=(1<<y))
(0032) //将x端口的第y位设置成1
(0033) #define clr_bit(x,y) (x&=~(1<<y))
(0034) //将x端口的第y位设置成0
(0035) //****************************************************************************
(0036) //输入端口位操作(1为闭合,0为断开)
(0037) #define get_bit(x,y) ((x&(1<<y)) ? 1 : 0)
(0038) //得到x端口第y位的数据
(0039)
(0040) #define speedrp 100
(0041) //motor_R减慢成原来的speedrp%
(0042) #define speedlp 100
(0043) //motor_L减慢成原来的speedlp%
(0044) //****************************************************************************
(0045) //TL TM TR前左中右传感器 TC 前计数传感器BL BM BR 后左中右传感器 BC 后计数传感器
(0046) //SJ 收集装置传感器
(0047) #define TL get_bit(PINC,4)
(0048) #define TM get_bit(PINC,3)
(0049) #define TR get_bit(PINC,2)
(0050) #define TC get_bit(PINC,0)
(0051) #define BL get_bit(PINC,5)
(0052) #define BM get_bit(PINC,6)
(0053) #define BR get_bit(PINC,7)
(0054) #define BC get_bit(PINC,1)
(0055) #define SJ get_bit(PIND,4)
(0056) //D1 D2 D3 D4三个数字开关
(0057) #define D1 get_bit(PINB,0)
(0058) #define D2 get_bit(PINB,1)
(0059) #define D3 get_bit(PINB,2)
(0060) #define D4 get_bit(PINB,3)
(0061) //白线宽度
(0062) #define WD 30
(0063) //白线污损度0~1000
(0064) #define DT 35
(0065) //端口初始化函数
(0066) void InitPorts()
(0067) {
(0068) DDRA = 0xFF;PORTA = 0x0F;//PA0~PA5控制驱动芯片
_InitPorts:
0031 EF8F LDI R24,0xFF
0032 BB8A OUT 0x1A,R24
0033 E08F LDI R24,0xF
0034 BB8B OUT 0x1B,R24
(0069) // 1111 1111 0000 1111
(0070) DDRB = 0xFF;PORTB = 0xFF;//0,1,2,3数字开关
0035 EF8F LDI R24,0xFF
0036 BB87 OUT 0x17,R24
0037 BB88 OUT 0x18,R24
(0071) // 1111 0000 1111 1111
(0072) DDRC = 0x00;PORTC = 0xFF;//PC口输入,接传感器
0038 2422 CLR R2
0039 BA24 OUT 0x14,R2
003A BB85 OUT 0x15,R24
(0073) // 0000 0000 1111 1111
(0074) DDRD = 0x2F;PORTD = 0x38;//
003B E28F LDI R24,0x2F
003C BB81 OUT 0x11,R24
003D E388 LDI R24,0x38
003E BB82 OUT 0x12,R24
(0075) // 0010 1111 0011 1000
(0076) DDRE = 0x04;PORTE = 0x04;//2口PWM输出
003F E084 LDI R24,4
0040 B986 OUT 0x06,R24
0041 B987 OUT 0x07,R24
0042 9508 RET
(0077) }
(0078) //****************************************************************************
(0079) //微秒级延时程序
(0080) void delay_us(unsigned int time){do { time--; } while (time>1);}
_delay_us:
time --> R16
0043 5001 SUBI R16,1
0044 4010 SBCI R17,0
0045 E081 LDI R24,1
0046 E090 LDI R25,0
0047 1780 CP R24,R16
0048 0791 CPC R25,R17
0049 F3C8 BCS 0x0043
004A 9508 RET
_delay_ms:
time --> R20
004B D184 RCALL push_gset1
004C 01A8 MOVW R20,R16
(0081) //毫秒级延时程序
(0082) void delay_ms(unsigned int time){while(time!=0) { delay_us(1000); time--;}}
004D C005 RJMP 0x0053
004E EE08 LDI R16,0xE8
004F E013 LDI R17,3
0050 DFF2 RCALL _delay_us
0051 5041 SUBI R20,1
0052 4050 SBCI R21,0
0053 3040 CPI R20,0
0054 0745 CPC R20,R21
0055 F7C1 BNE 0x004E
0056 D17C RCALL pop_gset1
0057 9508 RET
_delay_s:
time --> R20
0058 D177 RCALL push_gset1
0059 01A8 MOVW R20,R16
(0083) //秒级延时程序
(0084) void delay_s(unsigned int time){while(time!=0) { delay_ms(1000); time--;}}
005A C005 RJMP 0x0060
005B EE08 LDI R16,0xE8
005C E013 LDI R17,3
005D DFED RCALL _delay_ms
005E 5041 SUBI R20,1
005F 4050 SBCI R21,0
0060 3040 CPI R20,0
0061 0745 CPC R20,R21
0062 F7C1 BNE 0x005B
0063 D16F RCALL pop_gset1
0064 9508 RET
(0085) //****************************************************************************
(0086) //PWM初始化
(0087) void pwm_init(void)
(0088) {
(0089) TCCR1A=0x00;
_pwm_init:
0065 2422 CLR R2
0066 BC2F OUT 0x2F,R2
(0090) TCCR1B=0x00;
0067 BC2E OUT 0x2E,R2
(0091) TCCR1B|=(0<<WGM13)|(1<<WGM12);
0068 B58E IN R24,0x2E
0069 6088 ORI R24,0x8
006A BD8E OUT 0x2E,R24
(0092) TCCR1A|=(0<<WGM11)|(1<<WGM10);//选择成8位快速PWM模式
006B B58F IN R24,0x2F
006C 6081 ORI R24,1
006D BD8F OUT 0x2F,R24
(0093) TCCR1A|=(1<<COM1A1)|(0<<COM1A0);//比较比配清零
006E B58F IN R24,0x2F
006F 6880 ORI R24,0x80
0070 BD8F OUT 0x2F,R24
(0094) TCCR1A|=(1<<COM1B1)|(0<<COM1B0);
0071 B58F IN R24,0x2F
0072 6280 ORI R24,0x20
0073 BD8F OUT 0x2F,R24
(0095) TCCR1B|=(1<<CS12)|(0<<CS11)|(0<<CS10);//clk/256分频
0074 B58E IN R24,0x2E
0075 6084 ORI R24,4
0076 BD8E OUT 0x2E,R24
(0096) TCNT1=0;//清计数器T0
0077 2433 CLR R3
0078 BC3D OUT 0x2D,R3
0079 BC2C OUT 0x2C,R2
(0097) OCR1A=0;
007A BC3B OUT 0x2B,R3
007B BC2A OUT 0x2A,R2
(0098) OCR1B=0;//OCR1A的初值
007C BC39 OUT 0x29,R3
007D BC28 OUT 0x28,R2
007E 9508 RET
_motor_R:
speed --> R20
007F D150 RCALL push_gset1
0080 01A8 MOVW R20,R16
(0099) }
(0100) //驱动电机控制函数
(0101) //右电机驱动函数
(0102) void motor_R(int speed)
(0103) {
(0104) if(speed<0)
0081 3040 CPI R20,0
0082 E0E0 LDI R30,0
0083 075E CPC R21,R30
0084 F4BC BGE 0x009C
(0105) {
(0106) set_bit(PORTA,3);
0085 9ADB SBI 0x1B,3
(0107) clr_bit(PORTA,2);
0086 98DA CBI 0x1B,2
(0108) OCR1A=(-1)*speed*255/100*speedrp/100;
0087 EF0F LDI R16,0xFF
0088 EF1F LDI R17,0xFF
0089 019A MOVW R18,R20
008A D12D RCALL empy16s
008B 0198 MOVW R18,R16
008C EF0F LDI R16,0xFF
008D E010 LDI R17,0
008E D129 RCALL empy16s
008F E624 LDI R18,0x64
0090 E030 LDI R19,0
0091 D0F1 RCALL div16s
0092 0198 MOVW R18,R16
0093 E604 LDI R16,0x64
0094 E010 LDI R17,0
0095 D122 RCALL empy16s
0096 E624 LDI R18,0x64
0097 E030 LDI R19,0
0098 D0EA RCALL div16s
0099 BD1B OUT 0x2B,R17
009A BD0A OUT 0x2A,R16
(0109) }
009B C028 RJMP 0x00C4
(0110) else if(speed==0)
009C 3040 CPI R20,0
009D 0745 CPC R20,R21
009E F499 BNE 0x00B2
(0111) {
(0112) clr_bit(PORTA,2);
009F 98DA CBI 0x1B,2
(0113) clr_bit(PORTA,3);
00A0 98DB CBI 0x1B,3
(0114) OCR1A=speed*255/100*speedrp/100;
00A1 EF0F LDI R16,0xFF
00A2 E010 LDI R17,0
00A3 019A MOVW R18,R20
00A4 D113 RCALL empy16s
00A5 E624 LDI R18,0x64
00A6 E030 LDI R19,0
00A7 D0DB RCALL div16s
00A8 0198 MOVW R18,R16
00A9 E604 LDI R16,0x64
00AA E010 LDI R17,0
00AB D10C RCALL empy16s
00AC E624 LDI R18,0x64
00AD E030 LDI R19,0
00AE D0D4 RCALL div16s
00AF BD1B OUT 0x2B,R17
00B0 BD0A OUT 0x2A,R16
(0115) }
00B1 C012 RJMP 0x00C4
(0116) else
(0117) {
(0118) set_bit(PORTA,2);
00B2 9ADA SBI 0x1B,2
(0119) clr_bit(PORTA,3);
00B3 98DB CBI 0x1B,3
(0120) OCR1A=speed*255/100*speedrp/100;
00B4 EF0F LDI R16,0xFF
00B5 E010 LDI R17,0
00B6 019A MOVW R18,R20
00B7 D100 RCALL empy16s
00B8 E624 LDI R18,0x64
00B9 E030 LDI R19,0
00BA D0C8 RCALL div16s
00BB 0198 MOVW R18,R16
00BC E604 LDI R16,0x64
00BD E010 LDI R17,0
00BE D0F9 RCALL empy16s
00BF E624 LDI R18,0x64
00C0 E030 LDI R19,0
00C1 D0C1 RCALL div16s
00C2 BD1B OUT 0x2B,R17
00C3 BD0A OUT 0x2A,R16
(0121) }
00C4 D10E RCALL pop_gset1
00C5 9508 RET
_motor_L:
speed --> R20
00C6 D109 RCALL push_gset1
00C7 01A8 MOVW R20,R16
(0122) }
(0123) //左电机驱动函数
(0124) void motor_L(int speed)
(0125) {
(0126) if(speed<0)
00C8 3040 CPI R20,0
00C9 E0E0 LDI R30,0
00CA 075E CPC R21,R30
00CB F4BC BGE 0x00E3
(0127) {
(0128) set_bit(PORTA,1);
00CC 9AD9 SBI 0x1B,1
(0129) clr_bit(PORTA,0);
00CD 98D8 CBI 0x1B,0
(0130) OCR1B=(-1)*speed*255/100*speedlp/100;
00CE EF0F LDI R16,0xFF
00CF EF1F LDI R17,0xFF
00D0 019A MOVW R18,R20
00D1 D0E6 RCALL empy16s
00D2 0198 MOVW R18,R16
00D3 EF0F LDI R16,0xFF
00D4 E010 LDI R17,0
00D5 D0E2 RCALL empy16s
00D6 E624 LDI R18,0x64
00D7 E030 LDI R19,0
00D8 D0AA RCALL div16s
00D9 0198 MOVW R18,R16
00DA E604 LDI R16,0x64
00DB E010 LDI R17,0
00DC D0DB RCALL empy16s
00DD E624 LDI R18,0x64
00DE E030 LDI R19,0
00DF D0A3 RCALL div16s
00E0 BD19 OUT 0x29,R17
00E1 BD08 OUT 0x28,R16
(0131) }
00E2 C028 RJMP 0x010B
(0132) else if(speed==0)
00E3 3040 CPI R20,0
00E4 0745 CPC R20,R21
00E5 F499 BNE 0x00F9
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -