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

📄 motor2.lst

📁 电机驱动
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -