筆者的項目是有關機器人控制的實現。控制部分採用PICl6F7X系列單片機,運用彙編語言編程,運行速度較快,能夠達到系統的要求。在這裡使用的大多是數字信號的控制,電機的控制只有開和合兩種狀態。在動作的過程中需要兩隻手臂、身體、頭部、腳部等的協調動作。整個控制系統比較複雜,因而在PIC程序編寫和空間分配方面需要注意一些問題。 1 動作標誌位的使用 在整個控制中,組合的動作很多,當所有動作定位都通過光電開關控制時,在程序編寫上就有一些問題。如要求左手上升到鼓掌位、右手上升到舉手位(手初始位置在最下的放下位),光電開關0有效(即為0時是擋住),到達正確位置。用簡單的理解可以寫成下面的程序: list P=16c73 call lefthandup call righthandup LO call readinsignal bdss csl_v,1efthandligbts call lefthandstop btfsc csl_v,righthandlight4 goto L0 call righthandstop L1 call readinsignal btfsc csl_v,lefthandlight3 goto L1 call lefthandstop : lefthandlight表示光電開關,由此判斷是否到相應的位置。1表示在手臂最下面的位置;2表示在手臂的握手位置;3表示在手臂的鼓掌位置;4表示在手臂的高舉手位置。上面程序描寫左手臂上升到舉手位置和右手臂上升到鼓掌位置並停止的過程。先判斷左手到達否,到達則左手停止,接著看右手是否到達舉手位,到達則停止,否則循環上述的檢測,直到左手到達鼓掌位,右手到達舉手位。 注意,這裡的3,4表示的就是鼓掌位,舉手位。經過循環檢測可以讓手臂停在各位上,然而機械動作是有慣性的,機械停止位可能在該位的上一點或下一點,這就影響下面動作的進行,可能在若干動作后機械動作出現失常,也就是程序沒法正常的運行。在此情況下,需要修改程序的編寫方式,採用標誌位來控制動作的進行。如果採用控制標誌位,一定要在動作子函數中對標誌位置零。程序如下: list p=16c73 : actlonstopflag equ Ox6e ;位定義 lefthandfla8 cqu 0x0 ;0表示停止左手動作 rightbandflag equ Oxl ;O表示停止右手動作 : movlw Ox03 movWf actionstopflag call lefthanduo call righthandup L2 call readinsignal btfss csl_v,lefthandhght3 call lefthatldotop btfss csl_v,righthandlight4 call righthandstop movlw Ox00 subwf actionstopflag,w btfss status,z goto L2 繼續下面的程序 actionstopflag表示動作標誌位參數,給動作標誌位賦值,動作停止函數中將清零標誌位的值。上述程序和前面所述程序的功能一樣,實現兩支手臂的動作。上面程序描寫左手是否到達鼓掌位,到達停止,右手是否到達舉手位,到達停止。看動作標誌位是否為零,不是,不斷地循環檢測;是,執行下面的程序。 2 GOTO,cALL指令的不同使用 list D=16c76 start:ca11 setcpu call automatlsn、statel L3 call readinsignal btfsc cs2_v,ultrasonicdetectl goto L3 goto autonatlsmstate2 : automatlsmstate2: return auatomatismstatel、automatismstate2表示兩種狀態,uhrasonicdetectl表示一個輸入超聲檢測信號。上面程序描寫調用automatistmstate1狀態,執行完後進行下面的檢測ultrasonicdetect],沒有觸發就一直循環檢測,觸發就進入autornatismstate2狀態,執行完也不再回到下面的程序。 3 狀態標誌位Z、C的不同使用情況 在進行判斷標誌位時,Z(零標誌)、C(借位標誌)是不同的。Z為l時,表示上面的結果為0,Z為0時,則結果不為0。C為l時,借位,C為0時,沒有借位。在使用定時器的時候,一般使用C標誌位,這是由於當完成某一動作去檢查定時器時,時間可能沒到,或是正好,或是已經超過時間,只要到了或超過時間,都要按照要求關閉定時器,如下面程序所述。如果用Z標誌位,等於0時可能沒有檢測到,無法判斷停止的狀態,而用z可以很好地控制時間定時。進行一般的計算時大多用Z,如前面的動作標誌位中就是如此使用的。 list D=16c76 call opentimerO L4 movlw d』30』 subwf t0_v2,W btfss status,c goto L4 cau closetimer0 |