?? robbot.s
字號:
.dbline 294
; if(online==0x01) //只有1號燈亮
cpi R20,1
brne L111
.dbline 295
; Revise(InLine1()); //線上走偏
rcall _InLine1
rcall _Revise
L111:
.dbline 296
; if(online==0x02) //只有2號燈亮
cpi R20,2
brne L113
.dbline 297
; Revise(InLine2()); //線上走偏
rcall _InLine2
rcall _Revise
L113:
.dbline 298
; if (online==0x00) //1,2都不亮
tst R20
brne L115
.dbline 299
rcall _OutLine
rcall _Revise
L115:
.dbline 299
L109:
.dbline 299
L103:
.dbline -2
.dbline 300
; Revise(OutLine());}}//線外走偏
; }
L98:
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r y 10 c
.dbsym r online 20 c
.dbsym r l78 22 c
.dbend
.dbfunc e stop _stop fV
.even
_stop::
.dbline -1
.dbline 304
;
; //***************************停止函數********************************//
; void stop()
; {PORTD=PORTD|0xCF;
.dbline 304
in R24,0x12
ori R24,207
out 0x12,R24
.dbline -2
.dbline 305
; }
L117:
.dbline 0 ; func end
ret
.dbend
.dbfunc e action _action fc
; i -> R20
; light -> R20
; direction -> R22
.even
_action::
rcall push_gset2
mov R22,R16
.dbline -1
.dbline 309
;
; //***************************轉向函數********************************//
; char action(char direction) // =1為右轉,==0為左轉,=2為停止
; {char light;
.dbline 310
; char i=0;
clr R20
.dbline 311
; if(direction==2)
cpi R22,2
brne L119
.dbline 312
; {desireV = 0x00; //將設定速度置為0
.dbline 312
clr R2
clr R3
sts _desireV+1,R3
sts _desireV,R2
.dbline 313
; SetOutputComReg1A(0x03FF);
ldi R16,1023
ldi R17,3
rcall _SetOutputComReg1A
.dbline 314
; SetOutputComReg1B(0x03FF);}
ldi R16,1023
ldi R17,3
rcall _SetOutputComReg1B
.dbline 314
rjmp L120
L119:
.dbline 316
; else
; {if (direction==1)
.dbline 316
cpi R22,1
brne L121
.dbline 317
; {PORTB = 0x08; //右轉
.dbline 317
ldi R24,8
out 0x18,R24
L123:
.dbline 318
; do{
.dbline 319
; light = PINA^0xFF;
ldi R24,255
ldi R25,0
in R20,0x19
clr R21
eor R20,R24
eor R21,R25
.dbline 320
; if ((light&0x44)!=0x00) //當檢測到3號燈亮轉向完成
mov R24,R20
andi R24,68
breq L126
.dbline 321
rjmp L125
L126:
.dbline 321
L124:
.dbline 321
rjmp L123
L125:
.dbline 321
; break;}while(1);}
L121:
.dbline 322
; if (direction==0)
tst R22
brne L128
.dbline 323
; {PORTB = 0x04; //左轉
.dbline 323
ldi R24,4
out 0x18,R24
.dbline 324
; DELAY(6);
ldi R16,6
ldi R17,0
rcall _DELAY
L130:
.dbline 325
; do{
.dbline 326
; light = PINA^0xFF;
ldi R24,255
ldi R25,0
in R20,0x19
clr R21
eor R20,R24
eor R21,R25
.dbline 327
; if ((light&0x88)!=0x00) //4號燈亮轉向完成
mov R24,R20
andi R24,136
breq L133
.dbline 328
rjmp L132
L133:
.dbline 328
L131:
.dbline 328
rjmp L130
L132:
.dbline 328
; break;}while(1);}
L128:
.dbline 329
; DELAY(2); //轉向退出延時,防止錯誤讀值
ldi R16,2
ldi R17,0
rcall _DELAY
.dbline 330
; return(1);}
ldi R16,1
rjmp L118
L120:
.dbline 331
; return(0);
clr R16
.dbline -2
L118:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r light 20 c
.dbsym r direction 22 c
.dbend
.dbfunc e Forward _Forward fV
; flagj -> R14
; postionflag -> R20
; middle2 -> R22
; flagi -> R10
; middle1 -> R12
; fob -> y+14
; direction -> y+12
; step -> y+10
.even
_Forward::
rcall push_arg4
rcall push_gset5
.dbline -1
.dbline 336
; }
;
; //*******************************前進函數****************************//
; void Forward(char step,char direction,char fob)
; {char flagi=0; //單邊過線標志,整即過線后清0
.dbline 336
clr R10
.dbline 338
; char flagj; //過線輔助判斷標志
; char middle1=0x00; //過線檢測狀態寄存器
clr R12
.dbline 339
; char middle2=0x00; //前次過線檢測狀態寄存器
clr R22
.dbline 340
; char postionflag=0; //位置標志
clr R20
.dbline 341
; desireV = MaxSpeed;
ldi R24,64
ldi R25,0
sts _desireV+1,R25
sts _desireV,R24
.dbline 342
; if (fob==1) //1為后退
ldd R24,y+14
cpi R24,1
brne L136
.dbline 343
; PORTB=0x00;
clr R2
out 0x18,R2
L136:
.dbline 344
; if (fob==0) //0為前進
ldd R0,y+14
tst R0
brne L138
.dbline 345
; PORTB=0x0C;
ldi R24,12
out 0x18,R24
L138:
L140:
.dbline 346
; do{
.dbline 347
; flagj = 0;
clr R14
.dbline 348
; middle1 = PINB^0xFF; //讀取PB口,并取反
ldi R24,255
ldi R25,0
in R12,0x16
clr R13
eor R12,R24
eor R13,R25
.dbline 349
; middle1 = middle1&0xC0; //提取PB6,PB7
mov R24,R12
andi R24,192
mov R12,R24
.dbline 350
; middle1 = middle1>>6;
lsr R12
lsr R12
lsr R12
lsr R12
lsr R12
lsr R12
.dbline 351
; if((middle1==0x03)&&(middle2!=0x03)) //兩邊同時亮且前一次不是同時亮則為過線
mov R24,R12
cpi R24,3
brne L143
cpi R22,3
breq L143
.dbline 352
; {postionflag++; //位置標志加1
.dbline 352
inc R20
.dbline 353
; if(postionflag==(step-1))
ldd R24,y+10
subi R24,1
cp R20,R24
brne L145
.dbline 354
; desireV=MidSpeed; //將設定速度降低,便于轉彎
ldi R24,24
sts _desireV+1,R25
sts _desireV,R24
L145:
.dbline 355
; if(postionflag==step)
ldd R0,y+10
cp R20,R0
brne L147
.dbline 356
.dbline 356
ldd R16,y+12
rcall _action
cpi R16,1
brne L149
.dbline 356
rjmp L135
L149:
.dbline 356
; {if(action(direction)==1) break;}
L147:
.dbline 357
; DELAY(30); //延時確保不重復檢測
ldi R16,30
ldi R17,0
rcall _DELAY
.dbline 358
; flagi = 0;}
clr R10
.dbline 358
L143:
.dbline 359
; if(flagi!=0) //兩邊未同時過線
tst R10
brne X7
rjmp L151
X7:
.dbline 360
; {if(flagi==1) //左邊先到
.dbline 360
mov R24,R10
cpi R24,1
brne L153
.dbline 361
; {if((middle1==0x02)&&((middle2&0x02)==0x00)) //檢測右邊上升沿
.dbline 361
mov R24,R12
cpi R24,2
brne L155
sbrc R22,1
rjmp L155
.dbline 362
; {postionflag++;
.dbline 362
inc R20
.dbline 363
; if(postionflag==(step-1))
ldd R24,y+10
subi R24,1
cp R20,R24
brne L157
.dbline 364
; desireV=MidSpeed;
ldi R24,24
ldi R25,0
sts _desireV+1,R25
sts _desireV,R24
L157:
.dbline 365
; if(postionflag==step)
ldd R0,y+10
cp R20,R0
brne L159
.dbline 366
.dbline 366
ldd R16,y+12
rcall _action
cpi R16,1
brne L161
.dbline 366
rjmp L135
L161:
.dbline 366
; {if(action(direction)==1) break;}
L159:
.dbline 367
; DELAY(30);
ldi R16,30
ldi R17,0
rcall _DELAY
.dbline 368
; flagi = 0;
clr R10
.dbline 369
clr R14
inc R14
.dbline 369
L155:
.dbline 369
; flagj = 1;}}
L153:
.dbline 370
; if(flagi==2) //右邊先到
mov R24,R10
cpi R24,2
brne L163
.dbline 371
; {if((middle1==0x01)&&((middle2&0x01)==0x00)) //檢測左邊上升沿
.dbline 371
mov R24,R12
cpi R24,1
brne L165
sbrc R22,0
rjmp L165
.dbline 372
; {postionflag++;
.dbline 372
inc R20
.dbline 373
; if(postionflag==(step-1)) desireV=MidSpeed;
ldd R24,y+10
subi R24,1
cp R20,R24
brne L167
.dbline 373
ldi R24,24
ldi R25,0
sts _desireV+1,R25
sts _desireV,R24
L167:
.dbline 374
; if(postionflag==step)
ldd R0,y+10
cp R20,R0
brne L169
.dbline 375
; {if(action(direction)==1)
.dbline 375
ldd R16,y+12
rcall _action
cpi R16,1
brne L171
.dbline 376
rjmp L135
L171:
.dbline 376
; break;}
L169:
.dbline 377
; DELAY(30);
ldi R16,30
ldi R17,0
rcall _DELAY
.dbline 378
; flagi = 0;
clr R10
.dbline 379
clr R14
inc R14
.dbline 379
L165:
.dbline 379
L163:
.dbline 379
; flagj = 1;}}}
L151:
.dbline 380
; if(flagj==0)
tst R14
brne L173
.dbline 381
; {if((middle1==0x01)&&((middle2&0x01)==0x00)) //左邊到線,右邊未到線
.dbline 381
mov R24,R12
cpi R24,1
brne L175
sbrc R22,0
rjmp L175
.dbline 382
; flagi=1;
clr R10
inc R10
L175:
.dbline 383
; if((middle1==0x02)&&((middle2&0x02)==0x00)) //右邊到線,左邊未到線
mov R24,R12
cpi R24,2
brne L177
sbrc R22,1
rjmp L177
.dbline 384
ldi R24,2
mov R10,R24
L177:
.dbline 384
L173:
.dbline 384
L141:
.dbline 384
; flagi=2;}}while(1);
rjmp L140
X6:
.dbline 385
; return;
.dbline -2
L135:
rcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r flagj 14 c
.dbsym r postionflag 20 c
.dbsym r middle2 22 c
.dbsym r flagi 10 c
.dbsym r middle1 12 c
.dbsym l fob 14 c
.dbsym l direction 12 c
.dbsym l step 10 c
.dbend
.dbfunc e main _main fV
; movedirection -> R20
; movesteps -> R22
.even
_main::
sbiw R28,2
.dbline -1
.dbline 390
; }
;
; //***************************主函數**********************************//
; void main()
; {char movesteps; //傳遞前進或后退步數
.dbline 392
; char movedirection; //運動方向
; DDRA=0x00; //PA口輸入
clr R2
out 0x1a,R2
.dbline 393
; DDRB=0xFF; //PB口輸出
ldi R24,255
out 0x17,R24
.dbline 394
; DDRC=0xFF; //PC口輸出
out 0x14,R24
.dbline 395
; DDRD=0xFF; //PD口輸出
out 0x11,R24
.dbline 396
; PORTA=0xFF;
out 0x1b,R24
.dbline 397
; PORTB=0x08; //PB2=0,PB3=1//
ldi R24,8
out 0x18,R24
.dbline 398
; PORTC=0xFF;
ldi R24,255
out 0x15,R24
.dbline 399
; PORTD=0x88;
ldi R24,136
out 0x12,R24
.dbline 400
; SetOutputComReg1A(0x03FF);
ldi R16,1023
ldi R17,3
rcall _SetOutputComReg1A
.dbline 401
; SetOutputComReg1B(0x03FF);
ldi R16,1023
ldi R17,3
rcall _SetOutputComReg1B
.dbline 402
; Timer1Init( 0x82,0xF3,0x01);
ldi R24,1
ldi R25,0
std y+1,R25
std y+0,R24
ldi R18,243
ldi R19,0
ldi R16,130
ldi R17,0
rcall _Timer1Init
.dbline 403
; TCNT0=0x00;
clr R2
out 0x32,R2
.dbline 404
; TCCR0=0x07; //T0上升沿驅動
ldi R24,7
out 0x33,R24
.dbline 405
; ASSR=0x08; //外部TOSC1觸發
ldi R24,8
out 0x22,R24
.dbline 406
; TCCR2=0x01;
ldi R24,1
out 0x25,R24
.dbline 407
; SEI();
sei
L180:
.dbline 408
; do{
.dbline 409
; if ((Task[time]&0x01)==1)
ldi R24,<_Task
ldi R25,>_Task
lds R30,_time
clr R31
add R30,R24
adc R31,R25
ldd R24,z+0
andi R24,1
cpi R24,1
breq X8
rjmp L183
X8:
.dbline 410
; {if((Task[time]&0x02)==0x02) //判斷指定運動方向,1為前進
.dbline 410
ldi R24,<_Task
ldi R25,>_Task
lds R30,_time
clr R31
add R30,R24
adc R31,R25
ldd R24,z+0
andi R24,2
cpi R24,2
brne L185
.dbline 411
; {movesteps=(Task[time]&0xF0)>>4; //取高四位,運動格數
.dbline 411
ldi R24,<_Task
ldi R25,>_Task
lds R30,_time
clr R31
add R30,R24
adc R31,R25
ldd R22,z+0
andi R22,240
swap R22
andi R22,#0x0F
.dbline 412
; movedirection=(Task[time]&0x0C)>>2; //提取低四位中的高兩位,轉向
lds R30,_time
clr R31
add R30,R24
adc R31,R25
ldd R20,z+0
andi R20,12
lsr R20
lsr R20
.dbline 413
; Forward(movesteps,movedirection,0);}
clr R2
std y+0,R2
mov R18,R20
mov R16,R22
rcall _Forward
.dbline 413
L185:
.dbline 414
; if((Task[time]&0x02)==0x00) //判斷指定運動方向,0為后退
ldi R24,<_Task
ldi R25,>_Task
lds R30,_time
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
sbrc R2,1
rjmp L187
.dbline 415
; {movesteps=(Task[time]&0xF0)>>4; //取高四位,運動格數
.dbline 415
lds R30,_time
clr R31
add R30,R24
adc R31,R25
ldd R22,z+0
andi R22,240
swap R22
andi R22,#0x0F
.dbline 416
; movedirection=(Task[time]&0x0C)>>2; //提取低四位中的高兩位,轉向
lds R30,_time
clr R31
add R30,R24
adc R31,R25
ldd R20,z+0
andi R20,12
lsr R20
lsr R20
.dbline 417
ldi R24,1
std y+0,R24
mov R18,R20
mov R16,R22
rcall _Forward
.dbline 417
L187:
.dbline 417
; Forward( movesteps,movedirection,1 );} }
L183:
.dbline 418
; time++;
lds R24,_time
subi R24,255 ; addi 1
sts _time,R24
.dbline 419
cpi R24,6
brne L189
.dbline 419
rjmp L182
L189:
.dbline 419
L181:
.dbline 419
rjmp L180
L182:
.dbline -2
.dbline 420
; if(time==Size) break;}while(1);
; }
L179:
adiw R28,2
.dbline 0 ; func end
ret
.dbsym r movedirection 20 c
.dbsym r movesteps 22 c
.dbend
.area vector(rom, abs)
.org 10
rjmp _TIM1_OVF
.area text(rom, con, rel)
.dbfile H:\第八章源程序\Robbot.c
.dbfunc e TIM1_OVF _TIM1_OVF fV
; light -> <dead>
.even
_TIM1_OVF::
rcall push_lset
.dbline -1
.dbline 425
;
; //***************************中斷服務程序****************************//
; #pragma interrupt_handler TIM1_OVF:6
; void TIM1_OVF(void) //計時器時間到,進入中斷
; {char light;
.dbline 426
; CLI();
cli
.dbline 427
; a++;
lds R24,_a
subi R24,255 ; addi 1
sts _a,R24
.dbline 428
; c++;
lds R24,_c
subi R24,255 ; addi 1
sts _c,R24
.dbline 429
; if(a==40) //速度采樣時間到
lds R24,_a
cpi R24,40
brne L192
.dbline 430
; {a=0;
.dbline 430
clr R2
sts _a,R2
.dbline 431
; PIDA();
rcall _PIDA
.dbline 432
; PIDB();}
rcall _PIDB
.dbline 432
L192:
.dbline 433
; if(c=100) //尋線采樣時間到
ldi R24,100
sts _c,R24
tst R24
breq L194
.dbline 434
; {c=0;
.dbline 434
clr R2
sts _c,R2
.dbline 435
; SearchLine();}
rcall _SearchLine
.dbline 435
L194:
.dbline 436
; SEI();
sei
.dbline -2
.dbline 437
; }
L191:
rcall pop_lset
.dbline 0 ; func end
reti
.dbsym l light 1 c
.dbend
.area bss(ram, con, rel)
.dbfile H:\第八章源程序\Robbot.c
_EkB::
.blkb 4
.dbsym e EkB _EkB D
_EkA::
.blkb 4
.dbsym e EkA _EkA D
_forlight::
.blkb 1
.dbsym e forlight _forlight c
.area lit(rom, con, rel)
L32:
.word 0xcccd,0xbdcc
L31:
.word 0x51ec,0x3db8
L27:
.word 0x0,0x4140
L26:
.word 0xc000,0x447f
L25:
.word 0x0,0x0
L24:
.word 0x0,0xbf00
L23:
.word 0x0,0x3f00
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -