📄 main.s
字号:
.dbline 196
clr R2
out 0x2e,R2
.dbline 197
out 0x2d,R2
.dbline 198
out 0x2c,R2
.dbline 199
out 0x2b,R2
.dbline 200
out 0x2a,R2
.dbline 201
out 0x29,R2
.dbline 202
; OCR1BL = 0x00 /*INVALID SETTING*/;
out 0x28,R2
.dbline 205
; //OCR1CH = $OCR1CH$;
; //OCR1CL = $OCR1CL$;
; ICR1H = 0x00 /*INVALID SETTING*/;
out 0x27,R2
.dbline 206
; ICR1L = 0x00 /*INVALID SETTING*/;
out 0x26,R2
.dbline 207
; TCCR1A = 0x00;
out 0x2f,R2
.dbline 208
; TCCR1B = 0x02; //start Timer
ldi R24,2
out 0x2e,R24
.dbline -2
L146:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 32
jmp _timer1_ovf_isr
.area text(rom, con, rel)
.dbfile D:\gmj_1\main.c
.dbfunc e timer1_ovf_isr _timer1_ovf_isr fV
; avg_speed -> R12,R13
; time1_jsq -> R10,R11
; i -> R12
.even
_timer1_ovf_isr::
st -y,R0
st -y,R1
st -y,R2
st -y,R3
st -y,R4
st -y,R5
st -y,R6
st -y,R7
st -y,R8
st -y,R9
st -y,R16
st -y,R17
st -y,R18
st -y,R19
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R0,0x3f
st -y,R0
xcall push_gset5
sbiw R28,4
.dbline -1
.dbline 213
; }
;
; #pragma interrupt_handler timer1_ovf_isr:9
; void timer1_ovf_isr(void) //步进电机控制
; {
.dbline 217
; unsigned char i; //循环变量
; unsigned int time1_jsq; //time1的时间值
; unsigned int avg_speed; //平均速度
; if (M_state==0) //停止状态
lds R2,_M_state
tst R2
brne L148
.dbline 218
; {
.dbline 219
; return;
xjmp L147
L148:
.dbline 222
; }
; //TIMER1 has overflowed
; TCNT1 = tmp_t1; //计数器赋初值
lds R2,_tmp_t1
lds R3,_tmp_t1+1
out 0x2d,R3
out 0x2c,R2
.dbline 223
; PORTC |=0b10000000; //给出步进电机驱动脉冲
sbi 0x15,7
.dbline 224
clr R12
xjmp L153
L150:
.dbline 224
L151:
.dbline 224
inc R12
L153:
.dbline 224
; for (i=0;i<5;i++);
mov R24,R12
cpi R24,5
brlo L150
.dbline 225
; PORTC &=0b01111111;
in R24,0x15
andi R24,127
out 0x15,R24
.dbline 226
; step_num++; //计步加一
lds R24,_step_num
lds R25,_step_num+1
adiw R24,1
sts _step_num+1,R25
sts _step_num,R24
.dbline 227
; time1_jsq=65535-tmp_t1+1;;
lds R2,_tmp_t1
lds R3,_tmp_t1+1
ldi R24,65535
ldi R25,255
sub R24,R2
sbc R25,R3
adiw R24,1
movw R10,R24
.dbline 227
.dbline 228
; switch (M_state)
lds R14,_M_state
clr R15
movw R24,R14
cpi R24,1
ldi R30,0
cpc R25,R30
breq L157
cpi R24,2
ldi R30,0
cpc R25,R30
brne X20
xjmp L160
X20:
cpi R24,3
ldi R30,0
cpc R25,R30
brne X21
xjmp L169
X21:
cpi R24,4
ldi R30,0
cpc R25,R30
brne X22
xjmp L169
X22:
cpi R24,5
ldi R30,0
cpc R25,R30
brne X23
xjmp L181
X23:
cpi R24,6
ldi R30,0
cpc R25,R30
brne X24
xjmp L185
X24:
cpi R24,7
ldi R30,0
cpc R25,R30
brne X25
xjmp L190
X25:
cpi R24,8
ldi R30,0
cpc R25,R30
brne X26
xjmp L191
X26:
xjmp L154
X17:
.dbline 229
; {
L157:
.dbline 231
; case 1: //启动状态
; {
.dbline 232
; qidong_num++;
lds R24,_qidong_num
subi R24,255 ; addi 1
sts _qidong_num,R24
.dbline 233
; tmp_t1=64536;
ldi R24,64536
ldi R25,252
sts _tmp_t1+1,R25
sts _tmp_t1,R24
.dbline 234
; if (qidong_num>160)
ldi R24,160
lds R2,_qidong_num
cp R24,R2
brlo X27
xjmp L155
X27:
.dbline 235
; {
.dbline 236
; M_state=3; //结束启动状态,转入加速状态
ldi R24,3
sts _M_state,R24
.dbline 237
; }
.dbline 238
; } break;
.dbline 238
xjmp L155
L160:
.dbline 240
; case 2: //减速至停转
; {
.dbline 241
; if (time1_jsq<1000) time1_jsq++;
movw R24,R10
cpi R24,232
ldi R30,3
cpc R25,R30
brsh L161
.dbline 241
adiw R24,1
movw R10,R24
L161:
.dbline 242
; tmp_t1=65535-time1_jsq+1;
ldi R24,65535
ldi R25,255
sub R24,R10
sbc R25,R11
adiw R24,1
sts _tmp_t1+1,R25
sts _tmp_t1,R24
.dbline 243
; if (dec_speed_bz==1)
lds R24,_dec_speed_bz
cpi R24,1
brne L163
.dbline 244
; {
.dbline 245
; dec_speed_bz=0;
clr R2
sts _dec_speed_bz,R2
.dbline 246
ldi R24,3000
ldi R25,11
lds R2,_step_num
lds R3,_step_num+1
cp R24,R2
cpc R25,R3
brsh L165
.dbline 246
ldi R24,8000
ldi R25,31
sub R24,R2
sbc R25,R3
sts _dec_speed_num+1,R25
sts _dec_speed_num,R24
xjmp L166
L165:
.dbline 246
; if (step_num>(M_ZHUANBI*3/4)) dec_speed_num=2*M_ZHUANBI-step_num; else dec_speed_num=M_ZHUANBI-step_num;
lds R2,_step_num
lds R3,_step_num+1
ldi R24,4000
ldi R25,15
sub R24,R2
sbc R25,R3
sts _dec_speed_num+1,R25
sts _dec_speed_num,R24
L166:
.dbline 247
; }
L163:
.dbline 248
; dec_speed_num--;
lds R24,_dec_speed_num
lds R25,_dec_speed_num+1
sbiw R24,1
sts _dec_speed_num+1,R25
sts _dec_speed_num,R24
.dbline 249
; if (dec_speed_num==0) M_state=0;
cpi R24,0
cpc R24,R25
breq X28
xjmp L155
X28:
X18:
.dbline 249
clr R2
sts _M_state,R2
.dbline 250
; } break;
.dbline 250
xjmp L155
L169:
.dbline 253
; case 3: //加速至随动
; case 4: //减速至随动
; {
.dbline 254
; avg_speed=(unsigned int)((juli/(1000-step_num))/P_speed+0.5);
lds R2,_step_num
lds R3,_step_num+1
ldi R24,1000
ldi R25,3
sub R24,R2
sbc R25,R3
movw R2,R24
lds R6,_juli+2
lds R7,_juli+2+1
lds R4,_juli
lds R5,_juli+1
st -y,R7
st -y,R6
st -y,R5
st -y,R4
ldi R16,<L172
ldi R17,>L172
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R16,R2
lsr R17
ror R16
xcall int2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall empy32fs
movw R16,R2
andi R16,1
andi R17,0
xcall int2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall add32fs
xcall div32fs
lds R4,_P_speed+2
lds R5,_P_speed+2+1
lds R2,_P_speed
lds R3,_P_speed+1
st -y,R5
st -y,R4
st -y,R3
st -y,R2
xcall div32fs
ldi R16,<L173
ldi R17,>L173
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall add32f
movw R30,R28
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
st -y,R5
st -y,R4
st -y,R3
st -y,R2
ldi R16,<L174
ldi R17,>L174
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall cmp32f
brlt L170
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
st -y,R5
st -y,R4
st -y,R3
st -y,R2
ldi R16,<L174
ldi R17,>L174
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall sub32f
xcall fp2int
movw R24,R16
subi R24,0 ; offset = 32768
sbci R25,128
movw R14,R24
xjmp L171
L170:
movw R30,R28
ldd R16,z+0
ldd R17,z+1
ldd R18,z+2
ldd R19,z+3
xcall fp2int
movw R14,R16
L171:
movw R12,R14
.dbline 256
;
; if (avg_speed>time1_jsq) time1_jsq++;
cp R10,R14
cpc R11,R15
brsh L175
.dbline 256
movw R24,R10
adiw R24,1
movw R10,R24
L175:
.dbline 257
; if (avg_speed<time1_jsq) time1_jsq--;
cp R12,R10
cpc R13,R11
brsh L177
.dbline 257
movw R24,R10
sbiw R24,1
movw R10,R24
L177:
.dbline 258
; tmp_t1=65535-time1_jsq+1;
ldi R24,65535
ldi R25,255
sub R24,R10
sbc R25,R11
adiw R24,1
sts _tmp_t1+1,R25
sts _tmp_t1,R24
.dbline 259
; if (step_num==999) M_state=5;
lds R24,_step_num
lds R25,_step_num+1
cpi R24,231
ldi R30,3
cpc R25,R30
breq X29
xjmp L155
X29:
.dbline 259
ldi R24,5
sts _M_state,R24
.dbline 260
; } break;
.dbline 260
xjmp L155
L181:
.dbline 262
; case 5: //随动
; {
.dbline 263
; time1_jsq=(unsigned int)(DW_juli/P_speed);
lds R4,_DW_juli+2
lds R5,_DW_juli+2+1
lds R2,_DW_juli
lds R3,_DW_juli+1
st -y,R5
st -y,R4
st -y,R3
st -y,R2
lds R4,_P_speed+2
lds R5,_P_speed+2+1
lds R2,_P_speed
lds R3,_P_speed+1
st -y,R5
st -y,R4
st -y,R3
st -y,R2
xcall div32f
movw R30,R28
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
st -y,R5
st -y,R4
st -y,R3
st -y,R2
ldi R16,<L184
ldi R17,>L184
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall cmp32f
brlt L182
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
st -y,R5
st -y,R4
st -y,R3
st -y,R2
ldi R16,<L184
ldi R17,>L184
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall sub32f
xcall fp2int
movw R24,R16
subi R24,0 ; offset = 32768
sbci R25,128
movw R12,R24
xjmp L183
L182:
movw R30,R28
ldd R16,z+0
ldd R17,z+1
ldd R18,z+2
ldd R19,z+3
xcall fp2int
movw R12,R16
L183:
movw R10,R12
.dbline 264
; tmp_t1=65535-time1_jsq+1;
ldi R24,65535
ldi R25,255
sub R24,R12
sbc R25,R13
adiw R24,1
sts _tmp_t1+1,R25
sts _tmp_t1,R24
.dbline 265
; } break;
.dbline 265
xjmp L155
L185:
.dbline 267
; case 6: //加速至碎刀
; {
.dbline 268
; if (time1_jsq>111) time1_jsq--;
ldi R24,111
ldi R25,0
cp R24,R10
cpc R25,R11
brsh L186
.dbline 268
movw R24,R10
sbiw R24,1
movw R10,R24
L186:
.dbline 269
; tmp_t1=65535-time1_jsq+1;
ldi R24,65535
ldi R25,255
sub R24,R10
sbc R25,R11
adiw R24,1
sts _tmp_t1+1,R25
sts _tmp_t1,R24
.dbline 270
; if (time1_jsq==111) M_state=7;
movw R24,R10
cpi R24,111
ldi R30,0
cpc R25,R30
brne L155
.dbline 270
ldi R24,7
sts _M_state,R24
.dbline 271
; } break;
.dbline 271
xjmp L155
L190:
.dbline 273
; case 7: //碎刀
; {
.dbline 274
; time1_jsq=111;
ldi R24,111
ldi R25,0
movw R10,R24
.dbline 275
; tmp_t1=65425;
ldi R24,65425
ldi R25,255
sts _tmp_t1+1,R25
sts _tmp_t1,R24
.dbline 276
; } break;
.dbline 276
xjmp L155
L191:
.dbline 278
; case 8: //转动至平行
; {
.dbline 279
; if (step_num==0) M_state=0;
lds R2,_step_num
lds R3,_step_num+1
tst R2
brne L192
tst R3
brne L192
X19:
.dbline 279
clr R2
sts _M_state,R2
L192:
.dbline 280
; tmp_t1=64536;
ldi R24,64536
ldi R25,252
sts _tmp_t1+1,R25
sts _tmp_t1,R24
.dbline 281
; time1_jsq=1000;
ldi R24,1000
ldi R25,3
movw R10,R24
.dbline 282
; } break;
.dbline 282
L154:
L155:
.dbline 284
; }
; juli=juli-P_speed*time1_jsq;
lds R4,_juli+2
lds R5,_juli+2+1
lds R2,_juli
lds R3,_juli+1
st -y,R5
st -y,R4
st -y,R3
st -y,R2
lds R4,_P_speed+2
lds R5,_P_speed+2+1
lds R2,_P_speed
lds R3,_P_speed+1
st -y,R5
st -y,R4
st -y,R3
st -y,R2
ldi R16,<L172
ldi R17,>L172
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R16,R10
lsr R17
ror R16
xcall int2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall empy32fs
movw R16,R10
andi R16,1
andi R17,0
xcall int2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall add32fs
xcall empy32fs
xcall sub32f
sts _juli+1,R17
sts _juli,R16
sts _juli+2+1,R19
sts _juli+2,R18
.dbline -2
L147:
adiw R28,4
xcall pop_gset5
ld R0,y+
out 0x3f,R0
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R19,y+
ld R18,y+
ld R17,y+
ld R16,y+
ld R9,y+
ld R8,y+
ld R7,y+
ld R6,y+
ld R5,y+
ld R4,y+
ld R3,y+
ld R2,y+
ld R1,y+
ld R0,y+
.dbline 0 ; func end
reti
.dbsym r avg_speed 12 i
.dbsym r time1_jsq 10 i
.dbsym r i 12 c
.dbend
.dbfunc e timer2_init _timer2_init fV
.even
_timer2_init::
.dbline -1
.dbline 292
; }
;
; //TIMER2 initialize - prescale:128
; // WGM: Normal
; // desired value: 500Hz
; // actual value: 500.000Hz (0.0%)
; void timer2_init(void)
; {
.dbline 293
; TCCR2 = 0x00; //stop
clr R2
out 0x25,R2
.dbline 294
; ASSR = 0x00; //set async mode
out 0x22,R2
.dbline 295
; TCNT2 = 0x06; //setup
ldi R24,6
out 0x24,R24
.dbline 296
; OCR2 = 0xFA;
ldi R24,250
out 0x23,R24
.dbline 297
; TCCR2 = 0x05; //start
ldi R24,5
out 0x25,R24
.dbline -2
L194:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 16
jmp _timer2_ovf_isr
.area text(rom, con, rel)
.dbfile D:\gmj_1\main.c
.dbfunc e timer2_ovf_isr _timer2_ovf_isr fV
; adc0 -> R10,R11
.even
_timer2_ovf_isr::
xcall push_lset
xcall push_gset3
.dbline -1
.dbline 302
; }
;
; #pragma interrupt_handler timer2_ovf_isr:5
; void timer2_ovf_isr(void)
; {
.dbline 304
; unsigned int adc0;
; TCNT2 = 0x06; //reload counter value
ldi R24,6
out 0x24,R24
.dbline 305
; adc0=read_adc(); //取测速发电机的电压值
xcall _read_adc
movw R10,R16
.dbline 306
; P_speed=adc0*dw_speed; //求皮带速度
ldi R16,<L172
ldi R17,>L172
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R16,R10
lsr R17
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -