📄 motor2.s
字号:
.module motor2.c
.area text(rom, con, rel)
.dbfile H:\motor2\motor2.c
.dbfunc e InitPorts _InitPorts fV
.even
_InitPorts::
.dbline -1
.dbline 67
; #include<stdio.h>
; #include<iom8515v.h>
; #include<macros.h>
; // AVR ATmega8515L
; // (实验板板针注释)
; // ______ ______
; // | O \_/ |
; // 数字开关1---PB0--0 VCC 5V电源(+极)
; // 数字开关2---PB1--0 1--PA0---L-298
; // 数字开关3---PB2--0 1--PA1---L-298
; // 数字开关4---PB3--0 1--PA2---R-298
; // ---PB4--1 1--PA3---R-298
; // ---PB5--1 1--PA4---舵机(收集杆)
; // ---PB6--1 1--PA5---舵机(提升装置)
; // ---PB7--1 1--PA6---
; // RESET 1--PA7---
; // 收集包裹---PD0--1 ICP
; // 收集包裹---PD1--1 ALE
; // 电磁铁 ---PD2--1 1--OCIB---ENABLE L(PWM)
; // 收集包裹使能 ---PD3--1 0--PC7---传感器8,后计数传感器
; //收集装置传感器 ---PD4--0 0--PC6---传感器7,后右传感器
; // ENABLE R(PWM)---PD5--1 0--PC5---传感器6,后中传感器
; // ---PD6--0 0--PC4---传感器5 后左传感器
; // ---PD7--0 0--PC3---传感器4,前计数传感器
; // xtal2 0--PC2---传感器3,前右传感器
; // xtal1 0--PC1---传感器2,前中传感器
; // (-极)地线 GND 0--PC0---传感器1,前左传感器
; // |_______________|
; //****************************************************************************
; //输出端口位操作(置1为高电平,清0为低电平)
; #define set_bit(x,y) (x|=(1<<y))
; //将x端口的第y位设置成1
; #define clr_bit(x,y) (x&=~(1<<y))
; //将x端口的第y位设置成0
; //****************************************************************************
; //输入端口位操作(1为闭合,0为断开)
; #define get_bit(x,y) ((x&(1<<y)) ? 1 : 0)
; //得到x端口第y位的数据
;
; #define speedrp 100
; //motor_R减慢成原来的speedrp%
; #define speedlp 100
; //motor_L减慢成原来的speedlp%
; //****************************************************************************
; //TL TM TR前左中右传感器 TC 前计数传感器BL BM BR 后左中右传感器 BC 后计数传感器
; //SJ 收集装置传感器
; #define TL get_bit(PINC,4)
; #define TM get_bit(PINC,3)
; #define TR get_bit(PINC,2)
; #define TC get_bit(PINC,0)
; #define BL get_bit(PINC,5)
; #define BM get_bit(PINC,6)
; #define BR get_bit(PINC,7)
; #define BC get_bit(PINC,1)
; #define SJ get_bit(PIND,4)
; //D1 D2 D3 D4三个数字开关
; #define D1 get_bit(PINB,0)
; #define D2 get_bit(PINB,1)
; #define D3 get_bit(PINB,2)
; #define D4 get_bit(PINB,3)
; //白线宽度
; #define WD 30
; //白线污损度0~1000
; #define DT 35
; //端口初始化函数
; void InitPorts()
; {
.dbline 68
; DDRA = 0xFF;PORTA = 0x0F;//PA0~PA5控制驱动芯片
ldi R24,255
out 0x1a,R24
.dbline 68
ldi R24,15
out 0x1b,R24
.dbline 70
; // 1111 1111 0000 1111
; DDRB = 0xFF;PORTB = 0xFF;//0,1,2,3数字开关
ldi R24,255
out 0x17,R24
.dbline 70
out 0x18,R24
.dbline 72
; // 1111 0000 1111 1111
; DDRC = 0x00;PORTC = 0xFF;//PC口输入,接传感器
clr R2
out 0x14,R2
.dbline 72
out 0x15,R24
.dbline 74
; // 0000 0000 1111 1111
; DDRD = 0x2F;PORTD = 0x38;//
ldi R24,47
out 0x11,R24
.dbline 74
ldi R24,56
out 0x12,R24
.dbline 76
; // 0010 1111 0011 1000
; DDRE = 0x04;PORTE = 0x04;//2口PWM输出
ldi R24,4
out 0x6,R24
.dbline 76
out 0x7,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e delay_us _delay_us fV
; time -> R16,R17
.even
_delay_us::
.dbline -1
.dbline 80
L3:
.dbline 80
.dbline 80
subi R16,1
sbci R17,0
.dbline 80
L4:
.dbline 80
; }
; //****************************************************************************
; //微秒级延时程序
; void delay_us(unsigned int time){do { time--; } while (time>1);}
ldi R24,1
ldi R25,0
cp R24,R16
cpc R25,R17
brlo L3
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbsym r time 16 i
.dbend
.dbfunc e delay_ms _delay_ms fV
; time -> R20,R21
.even
_delay_ms::
rcall push_gset1
movw R20,R16
.dbline -1
.dbline 82
rjmp L8
L7:
.dbline 82
.dbline 82
ldi R16,1000
ldi R17,3
rcall _delay_us
.dbline 82
subi R20,1
sbci R21,0
.dbline 82
L8:
.dbline 82
; //毫秒级延时程序
; void delay_ms(unsigned int time){while(time!=0) { delay_us(1000); time--;}}
cpi R20,0
cpc R20,R21
brne L7
X0:
.dbline -2
L6:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r time 20 i
.dbend
.dbfunc e delay_s _delay_s fV
; time -> R20,R21
.even
_delay_s::
rcall push_gset1
movw R20,R16
.dbline -1
.dbline 84
rjmp L12
L11:
.dbline 84
.dbline 84
ldi R16,1000
ldi R17,3
rcall _delay_ms
.dbline 84
subi R20,1
sbci R21,0
.dbline 84
L12:
.dbline 84
; //秒级延时程序
; void delay_s(unsigned int time){while(time!=0) { delay_ms(1000); time--;}}
cpi R20,0
cpc R20,R21
brne L11
X1:
.dbline -2
L10:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r time 20 i
.dbend
.dbfunc e pwm_init _pwm_init fV
.even
_pwm_init::
.dbline -1
.dbline 88
; //****************************************************************************
; //PWM初始化
; void pwm_init(void)
; {
.dbline 89
; TCCR1A=0x00;
clr R2
out 0x2f,R2
.dbline 90
; TCCR1B=0x00;
out 0x2e,R2
.dbline 91
; TCCR1B|=(0<<WGM13)|(1<<WGM12);
in R24,0x2e
ori R24,8
out 0x2e,R24
.dbline 92
; TCCR1A|=(0<<WGM11)|(1<<WGM10);//选择成8位快速PWM模式
in R24,0x2f
ori R24,1
out 0x2f,R24
.dbline 93
; TCCR1A|=(1<<COM1A1)|(0<<COM1A0);//比较比配清零
in R24,0x2f
ori R24,128
out 0x2f,R24
.dbline 94
; TCCR1A|=(1<<COM1B1)|(0<<COM1B0);
in R24,0x2f
ori R24,32
out 0x2f,R24
.dbline 95
; TCCR1B|=(1<<CS12)|(0<<CS11)|(0<<CS10);//clk/256分频
in R24,0x2e
ori R24,4
out 0x2e,R24
.dbline 96
; TCNT1=0;//清计数器T0
clr R3
out 0x2d,R3
out 0x2c,R2
.dbline 97
; OCR1A=0;
out 0x2b,R3
out 0x2a,R2
.dbline 98
; OCR1B=0;//OCR1A的初值
out 0x29,R3
out 0x28,R2
.dbline -2
L14:
.dbline 0 ; func end
ret
.dbend
.dbfunc e motor_R _motor_R fV
; speed -> R20,R21
.even
_motor_R::
rcall push_gset1
movw R20,R16
.dbline -1
.dbline 103
; }
; //驱动电机控制函数
; //右电机驱动函数
; void motor_R(int speed)
; {
.dbline 104
; if(speed<0)
cpi R20,0
ldi R30,0
cpc R21,R30
brge L16
.dbline 105
; {
.dbline 106
; set_bit(PORTA,3);
sbi 0x1b,3
.dbline 107
; clr_bit(PORTA,2);
cbi 0x1b,2
.dbline 108
; OCR1A=(-1)*speed*255/100*speedrp/100;
ldi R16,-1
ldi R17,-1
movw R18,R20
rcall empy16s
movw R18,R16
ldi R16,255
ldi R17,0
rcall empy16s
ldi R18,100
ldi R19,0
rcall div16s
movw R18,R16
ldi R16,100
ldi R17,0
rcall empy16s
ldi R18,100
ldi R19,0
rcall div16s
out 0x2b,R17
out 0x2a,R16
.dbline 109
; }
rjmp L17
L16:
.dbline 110
; else if(speed==0)
cpi R20,0
cpc R20,R21
brne L18
X2:
.dbline 111
; {
.dbline 112
; clr_bit(PORTA,2);
cbi 0x1b,2
.dbline 113
; clr_bit(PORTA,3);
cbi 0x1b,3
.dbline 114
; OCR1A=speed*255/100*speedrp/100;
ldi R16,255
ldi R17,0
movw R18,R20
rcall empy16s
ldi R18,100
ldi R19,0
rcall div16s
movw R18,R16
ldi R16,100
ldi R17,0
rcall empy16s
ldi R18,100
ldi R19,0
rcall div16s
out 0x2b,R17
out 0x2a,R16
.dbline 115
; }
rjmp L19
L18:
.dbline 117
; else
; {
.dbline 118
; set_bit(PORTA,2);
sbi 0x1b,2
.dbline 119
; clr_bit(PORTA,3);
cbi 0x1b,3
.dbline 120
; OCR1A=speed*255/100*speedrp/100;
ldi R16,255
ldi R17,0
movw R18,R20
rcall empy16s
ldi R18,100
ldi R19,0
rcall div16s
movw R18,R16
ldi R16,100
ldi R17,0
rcall empy16s
ldi R18,100
ldi R19,0
rcall div16s
out 0x2b,R17
out 0x2a,R16
.dbline 121
; }
L19:
L17:
.dbline -2
L15:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r speed 20 I
.dbend
.dbfunc e motor_L _motor_L fV
; speed -> R20,R21
.even
_motor_L::
rcall push_gset1
movw R20,R16
.dbline -1
.dbline 125
; }
; //左电机驱动函数
; void motor_L(int speed)
; {
.dbline 126
; if(speed<0)
cpi R20,0
ldi R30,0
cpc R21,R30
brge L21
.dbline 127
; {
.dbline 128
; set_bit(PORTA,1);
sbi 0x1b,1
.dbline 129
; clr_bit(PORTA,0);
cbi 0x1b,0
.dbline 130
; OCR1B=(-1)*speed*255/100*speedlp/100;
ldi R16,-1
ldi R17,-1
movw R18,R20
rcall empy16s
movw R18,R16
ldi R16,255
ldi R17,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -