女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內不再提示

使用狀態機設計方法重新設計嵌入式系統

電子設計 ? 來源:eeweb ? 作者:Gartlan ? 2021-04-20 16:14 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

狀態機

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

#define Button_PORT PORTA

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

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毫秒產生一個中斷,然后評估狀態機。狀態機圖將此時間表示為TICK事件(TICK_E)的發生。

有以下四種狀態:

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

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

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

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

pIYBAGB-jLSAT1mYAAWndcDmQgE221.png

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

該狀態機繪制在www.draw.io上,并根據Miro Samek的書《C / C ++中的實用UML狀態圖:嵌入式系統的事件驅動編程》中的內容使用表示法來表示狀態。

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

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

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

實施

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

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

typedef枚舉{Waiting,Detected,WaitForRelease,Update}狀態;
 
無效Find_Button_Press(void)
{
 靜態狀態Button_State =正在等待;
 靜態無符號字符Button_Count = 0;
 靜態Button_Type Temp_Press; 
 
 開關(按鈕狀態){
 案例(等待):
 如果(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;
 }
 }
}

應用代碼和測試

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

/ ***************************************************** ***
 包括圖書館
****************************************************** *** /
#include 
#include 
#include“ Buttons_Debounce.h” 
 
Button_Type Button_Press; //創建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毫秒調用一次
 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; //清除所有按鈕事件
 }
 }
}

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

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

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

    關注

    48

    文章

    7952

    瀏覽量

    155023
  • 嵌入式系統
    +關注

    關注

    41

    文章

    3683

    瀏覽量

    131385
  • 計數器
    +關注

    關注

    32

    文章

    2291

    瀏覽量

    96405
  • 狀態機
    +關注

    關注

    2

    文章

    493

    瀏覽量

    28237
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    嵌入式狀態機的幾種大牛才懂的操作

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

    嵌入式軟件開發中常用的狀態機編程實現

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

    嵌入式系統中串口通信幀的同步方法

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

    基于狀態機嵌入式系統開發

    給大家分享下,基于狀態機嵌入式系統開發,慢慢看吧
    發表于 12-22 19:44

    嵌入式系統的描述與設計

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

    高速環境下FPGA或CPLD中的狀態機設

        本文給出了采用這些技術的高速環境狀態機設計的規范及分析方法和優化方法,并給出了相應的示例。       為了使FPGA或CPLD中的
    發表于 04-15 11:27 ?750次閱讀
    高速環境下FPGA或CPLD中的<b class='flag-5'>狀態機設</b>計

    狀態機嵌入式系統中的應用

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

    嵌入式軟件中狀態機的抽象與實現

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

    有限狀態機嵌入式系統中的實現及應用

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

    有限狀態機嵌入式軟件中的應用

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

    基于有限狀態機嵌入式系統串口通信幀同步方法設計

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

    嵌入式狀態機的設置

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

    嵌入式狀態機的編程優點分析

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

    嵌入式狀態機的設計與實現

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

    LSM6DSOX嵌入式有限狀態機的使用和配置

    電子發燒友網站提供《LSM6DSOX嵌入式有限狀態機的使用和配置.pdf》資料免費下載
    發表于 07-31 10:55 ?4次下載
    LSM6DSOX<b class='flag-5'>嵌入式</b>有限<b class='flag-5'>狀態機</b>的使用和配置