<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 物聯(lián)網與傳感器 > PIC單片機軟件開發(fā)技巧

          PIC單片機軟件開發(fā)技巧

          ——
          作者:中國礦業(yè)大學 胡伊蘭 程 紅;中國科學院自動化研究所 岳紅強 時間:2007-11-20 來源:單片機及嵌入式系統(tǒng)應用 收藏

            筆者的項目是有關機器人控制的實現(xiàn)。控制部分采用PICl6F7X系列單片機,運用匯編語言編程,運行速度較快,能夠達到系統(tǒng)的要求。在這里使用的大多是數字信號的控制,電機的控制只有開和合兩種狀態(tài)。在動作的過程中需要兩只手臂、身體、頭部、腳部等的協(xié)調動作。整個控制系統(tǒng)比較復雜,因而在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表示在手臂的高舉手位置。上面程序描寫左手臂上升到舉手位置和右手臂上升到鼓掌位置并停止的過程。先判斷左手到達否,到達則左手停止,接著看右手是否到達舉手位,到達則停止,否則循環(huán)上述的檢測,直到左手到達鼓掌位,右手到達舉手位。

              注意,這里的3,4表示的就是鼓掌位,舉手位。經過循環(huán)檢測可以讓手臂停在各位上,然而機械動作是有慣性的,機械停止位可能在該位的上一點或下一點,這就影響下面動作的進行,可能在若干動作后機械動作出現(xiàn)失常,也就是程序沒法正常的運行。在此情況下,需要修改程序的編寫方式,采用標志位來控制動作的進行。如果采用控制標志位,一定要在動作子函數中對標志位置零。程序如下:
              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
              繼續(xù)下面的程序

              actionstopflag表示動作標志位參數,給動作標志位賦值,動作停止函數中將清零標志位的值。上述程序和前面所述程序的功能一樣,實現(xiàn)兩支手臂的動作。上面程序描寫左手是否到達鼓掌位,到達停止,右手是否到達舉手位,到達停止??磩幼鳂酥疚皇欠駷榱?,不是,不斷地循環(huán)檢測;是,執(zhí)行下面的程序。

          2 GOTO,cALL指令的不同使用

              在PIC的匯編程序中,CALL與GOT0指冷使用的場合不同。一般情況下,在于程序與主程序之間大多用CALL指令;而狀態(tài)轉換模塊之間大多用GOTO指令,即由此狀態(tài)進入另一種狀態(tài)不需返回。由于的堆棧有限,在程序中,不能無止境地使用GOTO語句,這樣會使堆棧溢出,程序無法正常運行。各個小程序內部循環(huán)占用堆棧的級數不多,使用GOTO指令是可行的,但在大的程序中用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表示兩種狀態(tài),uhrasonicdetectl表示一個輸入超聲檢測信號。上面程序描寫調用automatistmstate1狀態(tài),執(zhí)行完后進行下面的檢測ultrasonicdetect],沒有觸發(fā)就一直循環(huán)檢測,觸發(fā)就進入autornatismstate2狀態(tài),執(zhí)行完也不再回到下面的程序。

          3 狀態(tài)標志位Z、C的不同使用情況

              在進行判斷標志位時,Z(零標志)、C(借位標志)是不同的。Z為l時,表示上面的結果為0,Z為0時,則結果不為0。C為l時,借位,C為0時,沒有借位。在使用定時器的時候,一般使用C標志位,這是由于當完成某一動作去檢查定時器時,時間可能沒到,或是正好,或是已經超過時間,只要到了或超過時間,都要按照要求關閉定時器,如下面程序所述。如果用Z標志位,等于0時可能沒有檢測到,無法判斷停止的狀態(tài),而用z可以很好地控制時間定時。進行一般的計算時大多用Z,如前面的動作標志位中就是如此使用的。
              list D=16c76
              call opentimerO
          L4  movlw d’30’
              subwf t0_v2,W
              btfss status,c
              goto L4
              cau closetimer0

              程序檢測時間是否到達1.5s,沒有則循環(huán)等待,到了或檢測時間過了就關閉定時器,執(zhí)行下面的程序。

              總之,在的編程中采用合適的方法,可以使整個程序運行穩(wěn)定,而且程序空間的使用也將有所減小,避免了調試中的Bug。這是筆者在實際中的一點體會,還有許多不足或沒有考慮到的問題,希望在和大家的探討中不斷學習的精髓。

           

          光電開關相關文章:光電開關原理


          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();