下文將介紹 AND (&) Bitwise 邏輯并闡明博文《直接端口的操作案例》中介紹的概念。在該示例中,通過多個按鈕和電位計控制器來操作由步進電機驅(qū)動的攝像頭滑塊。所選的微控制器在許多端口上都分布了有限的 I/O,這是通過將 I/O 匯編成單一數(shù)字值來實現(xiàn)的。
概覽
在軟件中評估開關(guān)輸入時,常常從有用的 if/then 語句開始。這對于獨立輸入可能很有用,但對于多個交互式輸入來說則不然。用 if/then 語句涵蓋所有的按鈕組合,可能會產(chǎn)生數(shù)百行代碼和每周期中大量的執(zhí)行任務(wù)。實施 Bitwise 邏輯可以最大限度地減少代碼,提高周期速度。
項目參數(shù)
攝像頭滑塊項目涉及五個瞬時接觸 SPST 開關(guān),這些開關(guān)用于在滑塊驅(qū)動電機的工作過程中選擇方向和速度。將輸入轉(zhuǎn)換為 SPEED/ENABLE/DIRECTION 輸出。開關(guān)按壓操作與多開關(guān)按壓識別功能同時在軟件中鎖定。

AND Bitwise 運算符
攝像頭滑塊的主要位運算符是 AND。該運算器使用 C 語言編程中的安培 (&) 符號,使用圖 1 中的真值表。

圖 1:AND Biwise 運算符的真值表及示例。(圖片來源:Don Johanneck)
I/O 組合
為了確立一個能代表所有開關(guān)的單值,把位移至所需的位置,進行相加并使用 AND 運算符進行比較(見圖 2)。另一個代表極限傳感器當前狀態(tài)的值與開關(guān)按壓值進行比較,以便在達到極限時取消輸出。

圖 2:攝像頭滑塊開關(guān)的配置,位的編譯以及 AND 運算符的使用。(圖片來源:Don Johanneck)
在這種情況下,如果按下任何一個按鈕或按鈕組合,則 buttonValues 不等于零,并在軟件中通過 limitValue 和查找表進行操作,以確定輸出,這與前面提到的直接端口操作博文中描述的方法完全相同。
編程
該程序使用由經(jīng)過處理的輸入值索引而成的輸出值表。程序員可以通過改變表數(shù)值來確定按任何組合的按鈕所產(chǎn)生的動作,這樣就不需要改變程序結(jié)構(gòu),否則結(jié)構(gòu)更改可能是令人望而生畏的。在該示例中,圖 3 中的表值代表了單個、多個和對立的按鈕動作,不需要單獨 IF 語句(圖 4)。

圖 3:由輸入值索引而成的唯一輸出值表。

圖 4:主代碼;讀取數(shù)值和確定輸出。
電機控制是通過一個用來確定步進頻率的定時器中斷服務(wù)例程以及一種“跳躍”方法實現(xiàn)的,這種方法通過僅在 stepGo 變量等于或大于 stepFreq 變量時設(shè)置電機控制板上的 STEP 引腳來簡化速度控制(圖 5)。較低的電位器值使該例程跳過了更多的 STEP。

圖 5:電機控制的中斷服務(wù)例程。
結(jié)論:
使用諸如 AND (&) 這樣的位運算符可以簡化代碼,并大大減少解析數(shù)字輸入所需的 IF 語句的數(shù)量。輸出表的建立簡單而靈活。使用更多的輸出位可以快速擴展輸出表,提供更多的輸出選擇。每一個增加的輸出位都需要在主代碼中增加一個(或幾個)處理程序。一旦輸出表建立,該表就會在每個周期內(nèi)只使用一次,而由主代碼完成繁重的工作。中斷服務(wù)例程在后臺穩(wěn)定地運行,更新電機控制器的 STEP 引腳,但在主代碼切換電機控制器的使能 (ENN) 引腳之前,不會發(fā)生運動。
-
控制器
+關(guān)注
關(guān)注
114文章
17577瀏覽量
189548 -
定時器
+關(guān)注
關(guān)注
23文章
3350瀏覽量
121430 -
邏輯運算
+關(guān)注
關(guān)注
0文章
58瀏覽量
10198
發(fā)布評論請先 登錄
長晶科技邏輯芯片產(chǎn)品矩陣介紹
第4章 C語言基礎(chǔ)以及流水燈的實現(xiàn)(4.3 4.4)
《ESP32S3 Arduino開發(fā)指南》第三章 C/C++語言基礎(chǔ)
基于LockAI視覺識別模塊:C++圖像的基本運算
全套C語言培訓資料—PPT課件
CMOS邏輯IC是如何構(gòu)成的

用Bitwise邏輯運算符進行設(shè)計
評論