色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

使用狀態(tài)機設計方法重新設計嵌入式系統(tǒng)

電子設計 ? 來源:eeweb ? 作者:Gartlan ? 2021-04-20 16:14 ? 次閱讀

我是嵌入式系統(tǒng)的講師。我繼承了一段運行良好的代碼,但是由于缺少設計圖,并且花了很多條件語句和標志,使我花了一些時間來理解。

該代碼的目的是檢測連接到微控制器端口的幾個按鈕之一何時被激活并記錄事實。這些按鈕為高電平有效,這意味著按下按鈕時會在相應的引腳上產(chǎn)生高電壓。開關彈跳的問題也已在固件中解決,因此同一引腳必須在預定的時間內(nèi)保持高電平,然后才能被接受為有效引腳。

該代碼每10毫秒調(diào)用一次,如果同一引腳為高電平,則計數(shù)器遞增。當計數(shù)器達到預定義的值(在這種情況下為10)時,按鈕按下被認為是有效的。因此,在這種情況下,在認為有效之前,引腳電壓必須穩(wěn)定在100mS的高電平。

為了更好地說明設計,并作為學生的狀態(tài)機設計的另一個示例,我著手使用狀態(tài)機設計方法重新設計系統(tǒng)。

狀態(tài)機

狀態(tài)機圖如下圖1所示。所述Button_PORT是定義為任何端口的按鈕都連接到宏。這允許將按鈕輕松移動到另一個端口。

#define Button_PORT PORTA

聲明了一個聯(lián)合,該聯(lián)合將允許將按鈕作為一個整體或單獨進行訪問。

typedef union {
 unsigned char Full;
 結構{
 無符號字符B0:1;
 未簽名的字符B1:1;
 未簽名的字符B2:1;
 未簽名的字符B3:1;
 未簽名的字符B4:1;
 未簽名的字符B5:1;
 未簽名的字符B6:1;
 未簽名的字符B7:1;
 };
} Button_Type;

使用此類型定義了兩個變量Button_PressTemp_Press。Button_Press在反跳后保留按鈕的最終值,而Temp_Press在反跳過程中保留按鈕的中間值。

在應用程序代碼中,設置了一個計時器,每10毫秒產(chǎn)生一個中斷,然后評估狀態(tài)機。狀態(tài)機圖將此時間表示為TICK事件(TICK_E)的發(fā)生。

有以下四種狀態(tài):

等待中:等待端口上的任何按鈕被激活。

檢測到:按鈕已激活,因此進入此狀態(tài),并使用Temp_Press記錄按鈕的端口值。每10毫秒,將再次檢查按鈕端口,并且-在其值仍然相同的情況下-計數(shù)器將遞增。用狀態(tài)機的話來說,該變量稱為“擴展狀態(tài)變量”。

WaitForRelease:如果計數(shù)器達到預定義的最小值'MIN_BUTTON_COUNT',則Temp_press現(xiàn)在被視為有效,并且進入WaitForRelease狀態(tài)以等待按鈕釋放,直到變量Button_Press保留了最終的按鈕值。

更新:按鈕已釋放,因此最終值Button_Press已用去抖動的臨時值'Temp_Press'更新。

pIYBAGB-jLSAT1mYAAWndcDmQgE221.png

圖1.按鈕反跳狀態(tài)機(來源:Thomas Gartlan)

該狀態(tài)機繪制在www.draw.io上,并根據(jù)Miro Samek的書《C / C ++中的實用UML狀態(tài)圖:嵌入式系統(tǒng)的事件驅(qū)動編程》中的內(nèi)容使用表示法來表示狀態(tài)。

從教學的角度來看,此狀態(tài)機是狀態(tài),事件,警戒條件,Do操作,OnEntry操作和擴展狀態(tài)變量的一個很好的示例。

正如我們前面提到的,有四個狀態(tài)。唯一的事件是10mS TICK_E。從“等待”到“檢測到”的過渡中,TICK_E上有一個保護狀態(tài),[Button_PORT> 0],在這種情況下,這意味著某些按鈕已被激活。“已檢測”狀態(tài)下的“ OnEntry”操作會重置計數(shù)器,而“已檢測”狀態(tài)下的“執(zhí)行”操作會在計數(shù)器中遞增。計數(shù)器本身是擴展狀態(tài)變量。

與原始的以條件標記為中心的代碼相反,此狀態(tài)機圖提供了非常清晰的設計視圖,因此為學生提供了一個很好的示例。

實施

該設計是使用MPLABX IDE和XC8編譯器實現(xiàn)的。目標器件是Microchip的8位PIC18F4520微控制器。該設計以易于重復使用的方式實現(xiàn)。如前所述,端口是使用宏定義的,因此可以輕松地對其進行更改。而且,該代碼打包在一個庫中并發(fā)布到GitHub,這使得它可以輕松地維護和在任何項目中使用。

庫頭文件包含按鈕結構和端口信息。庫C文件包含狀態(tài)機功能。代碼中使用的名稱與狀態(tài)機圖相匹配,從而更易于理解和調(diào)試設計。函數(shù)指針并不是真正需要的,也沒有使用,因為它們會使學生在此階段對設計的理解更加復雜。狀態(tài)機功能的代碼如下所示。

typedef枚舉{Waiting,Detected,WaitForRelease,Update}狀態(tài);
 
無效Find_Button_Press(void)
{
 靜態(tài)狀態(tài)Button_State =正在等待;
 靜態(tài)無符號字符Button_Count = 0;
 靜態(tài)Button_Type Temp_Press; 
 
 開關(按鈕狀態(tài)){
 案例(等待):
 如果(Button_PORT) 
 {
 Button_State =已檢測到; 
 Button_Count = 0; 
 Temp_Press.Full =按鈕_端口; 
 }
 休息;
 案例(檢測):
 如果(Temp_Press.Full == Button_PORT)
 {
 ++ Button_Count; 
 如果(Button_Count> MIN_BUTTON_COUNT)
 {
 Button_State = WaitForRelease; 
 }
 }
 別的
 {
 Button_State =等待中; 
 }
 休息;
 案例(WaitForRelease):
 如果(!Button_PORT)
 {
 Button_State =更新; 
 }
 休息;
 案例(更新):
 {
 Button_Press = Temp_Press; 
 Button_State =等待中; 
 Button_Count = 0; 
 Temp_Press.Full = 0; 
 }
 休息;
 默認:
 {
 Button_State =等待中;
 Button_Count = 0;
 Temp_Press.Full = 0;
 Button_Press.Full = 0;
 }
 }
}

應用代碼和測試

開發(fā)了一個簡單的應用程序來說明和測試該設計。該應用程序測試代碼的一部分如下所示。包含頭文件,并定義了Button_Press變量。對頭文件的唯一修改是定義用于按鈕的端口。

/ ***************************************************** ***
 包括圖書館
****************************************************** *** /
#include 
#include 
#include“ Buttons_Debounce.h” 
 
Button_Type Button_Press; //創(chuàng)建Button變量
 
/ ****************************************************
 功能原型
****************************************************** /
void Initial(void);
void delay_s(unsigned char secs);
 
/ *****************************************************
 鐘
****************************************************** /
#define _XTAL_FREQ 19660800
 
unsigned char count_test = 0;
void __interrupt myIsr(void)
{
 //定時器每10毫秒溢出一次
 if(INTCONbits.TMR0IE && INTCONbits.TMR0IF){ 
 Find_Button_Press(); //每10毫秒調(diào)用一次
 WriteTimer0(40960);
 INTCONbits.TMR0IF = 0; //清除此中斷條件
 
 }
}
 
void main(無效)
{
 Button_Press.Full = 0x00;
 最初的();
 而(1)
 {
 if(Got_Button_E)//如果已按下某個按鈕
 {
 if(Button_Press.B0)//如果其按鈕為0
 PORTCbits.RC0 =?PORTCbits.RC0;
 
 if(Button_Press.B1)//如果其按鈕為0
 PORTCbits.RC1 =?PORTCbits.RC1; 
 
 if(Button_Press.B2)//如果其按鈕為0
 PORTCbits.RC2 =?PORTCbits.RC2; 
 
 if(Button_Press.B3)//如果其按鈕為0
 PORTCbits.RC3 =?PORTCbits.RC3; 
 
 Button_Press.Full = 0x00; //清除所有按鈕事件
 }
 }
}

將創(chuàng)建一個定時器中斷,每10毫秒發(fā)生一次,并調(diào)用狀態(tài)機功能。在此應用中,按鈕連接到PORTB,而LED連接到PORTC。如果按下任何按鈕,則相應的LED會切換而不會出現(xiàn)任何延遲或彈跳問題。處理按鈕值后,將清除整個變量。

總體而言,該項目被認為是在設計階段如何使用狀態(tài)機方法,從而導致更清晰,更不易出錯的實現(xiàn)的一個很好的例子。

編輯:hfy
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 微控制器
    +關注

    關注

    48

    文章

    7565

    瀏覽量

    151577
  • 嵌入式系統(tǒng)

    關注

    41

    文章

    3596

    瀏覽量

    129550
  • 計數(shù)器
    +關注

    關注

    32

    文章

    2256

    瀏覽量

    94686
  • 狀態(tài)機
    +關注

    關注

    2

    文章

    492

    瀏覽量

    27561
收藏 人收藏

    評論

    相關推薦

    嵌入式狀態(tài)機的幾種大牛才懂的操作

    狀態(tài)機嵌入式軟件中隨處可見,可能你會說狀態(tài)機有什么難的,不就是 switch 嗎? switch僅僅是最基礎的一個點,關于狀態(tài)機的更多操作,或許你都沒有見過,下面分享幾種實現(xiàn)
    發(fā)表于 11-17 10:41 ?1492次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>狀態(tài)機</b>的幾種大牛才懂的操作

    嵌入式軟件開發(fā)中常用的狀態(tài)機編程實現(xiàn)

    嵌入式軟件開發(fā)中,狀態(tài)機編程是一個十分重要的編程思想,它也是嵌入式開發(fā)中一個常用的編程框架。掌握了狀態(tài)機編程思想,可以更加邏輯清晰的實現(xiàn)復雜的業(yè)務邏輯功能。
    發(fā)表于 09-06 10:25 ?2071次閱讀

    嵌入式系統(tǒng)中串口通信幀的同步方法

    比較、基于FIFO隊列和基于狀態(tài)機的3種幀同步方法通過測試、分析和比較得出,基于有限狀態(tài)機方法嵌入式
    發(fā)表于 10-09 19:17

    基于狀態(tài)機嵌入式系統(tǒng)開發(fā)

    給大家分享下,基于狀態(tài)機嵌入式系統(tǒng)開發(fā),慢慢看吧
    發(fā)表于 12-22 19:44

    嵌入式系統(tǒng)的描述與設計

    嵌入式系統(tǒng)的描述與設計》是2007年機械工業(yè)出版社出版的圖書,作者是蓋斯基。本書介紹嵌入式系統(tǒng)領域的基本概念以及實際的描述和設計方法,包括
    發(fā)表于 10-27 09:39

    高速環(huán)境下FPGA或CPLD中的狀態(tài)機設

        本文給出了采用這些技術的高速環(huán)境狀態(tài)機設計的規(guī)范及分析方法和優(yōu)化方法,并給出了相應的示例。       為了使FPGA或CPLD中的
    發(fā)表于 04-15 11:27 ?685次閱讀
    高速環(huán)境下FPGA或CPLD中的<b class='flag-5'>狀態(tài)機設</b>計

    狀態(tài)機嵌入式系統(tǒng)中的應用

    為了便于研究和描述狀態(tài)機嵌入式前后臺軟件系統(tǒng)中的應用,本文將以移動2G光纖直放站近端機的監(jiān)控軟件案例來闡述和說明。
    發(fā)表于 05-23 10:48 ?2165次閱讀
    <b class='flag-5'>狀態(tài)機</b>在<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>中的應用

    嵌入式軟件中狀態(tài)機的抽象與實現(xiàn)

    文中提出了 在嵌入式軟件中把狀態(tài)機作為一個獨立模塊從控制模塊中抽象出來的思想 , 描述了 抽象出來的狀態(tài)機模塊 。 并介紹了 如何將這種狀態(tài)機抽象模塊應用到實際項目中 。
    發(fā)表于 03-22 15:47 ?1次下載

    有限狀態(tài)機嵌入式系統(tǒng)中的實現(xiàn)及應用

    如何使嵌入式軟件代碼更加可靠 增強程序的可維護性 一直以來都是嵌入式程序員追 求的目標。論述了有限狀態(tài)機的原理和其實現(xiàn)方法;采用狀態(tài)機
    發(fā)表于 03-22 15:40 ?1次下載

    有限狀態(tài)機嵌入式軟件中的應用

    有限狀態(tài)機嵌入式軟件中的應用,感興趣的小伙伴們可以看看。
    發(fā)表于 07-26 10:43 ?27次下載

    基于有限狀態(tài)機嵌入式系統(tǒng)串口通信幀同步方法設計

    同類型或其他類型的中斷,從而造成主程序得不到執(zhí)行或后續(xù)中斷數(shù)據(jù)丟失。所以,嵌入式系統(tǒng)中的串口通信雖然看似簡單,但其中仍有許多問題值得研究,例如串口通信過程中的幀同步問題。本文針對該問題給出了逐次比較、基于FIFO隊列和基于狀態(tài)機
    發(fā)表于 04-10 08:48 ?2691次閱讀
    基于有限<b class='flag-5'>狀態(tài)機</b>的<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>串口通信幀同步<b class='flag-5'>方法</b>設計

    嵌入式狀態(tài)機的設置

    狀態(tài)機嵌入式軟件中隨處可見,可能你會說狀態(tài)機有什么難的,不就是 switch 嗎?
    的頭像 發(fā)表于 11-02 09:04 ?1100次閱讀

    嵌入式狀態(tài)機的編程優(yōu)點分析

    嵌入式狀態(tài)機編程是真的好用,寫出來的程序結構非常清晰!所以平時用的也比較多。
    的頭像 發(fā)表于 02-25 16:21 ?847次閱讀

    嵌入式狀態(tài)機的設計與實現(xiàn)

    嵌入式狀態(tài)機是一種常用的軟件設計模式,它能夠提高代碼的可讀性和可維護性。狀態(tài)機是一個抽象的概念,它描述了一個系統(tǒng)或者組件的不同狀態(tài)以及在不同
    的頭像 發(fā)表于 04-14 11:55 ?1803次閱讀

    LSM6DSOX嵌入式有限狀態(tài)機的使用和配置

    電子發(fā)燒友網(wǎng)站提供《LSM6DSOX嵌入式有限狀態(tài)機的使用和配置.pdf》資料免費下載
    發(fā)表于 07-31 10:55 ?4次下載
    LSM6DSOX<b class='flag-5'>嵌入式</b>有限<b class='flag-5'>狀態(tài)機</b>的使用和配置
    主站蜘蛛池模板: 亚洲午夜精品久久久久久抢| 嫩草亚洲国产精品| 伊人久在线观看视频| 青柠视频在线观看高清HD| 湖南电台在线收听| 办公室里做好紧好爽H| 伊人影院2019| 我半夜摸妺妺的奶C了她软件| 麻豆国产精品久久人妻| 国产人人为我我为人人澡| xxnxx美女| 69久久国产精品热88人妻| 亚洲成人免费观看| 日韩一级精品久久久久| 美女动态图真人后进式| 花蝴蝶高清在线视频免费观看| 大乳牛奶女在线观看| 99国产精品免费视频| 一受多攻高h| 亚欧乱亚欧乱色视频| 日韩av片无码一区二区不卡电影| 久久无码AV亚洲精品色午夜| 国内久久久久影院精品| 囯产精品一品二区三区| jiz中国zz| 99免费在线观看| 777琪琪午夜理论电影网| 伊人青青草原| 在线AV国产传媒18精品免费| 亚洲视频中文字幕| 亚洲免费黄色片| 小柔的性放荡羞辱日记| 四虎精品久久久久影院| 色 花 堂 永久 网站| 日韩 国产 中文 无码| 青柠视频在线观看高清HD| 欧美亚洲综合另类无码| 青草久久久| 日韩欧美一区二区三区在线| 日韩精品 电影一区 亚洲高清| 人人妻免费线|