PSoC Express 和石頭、剪刀、布
翁小平 資深主任應(yīng)用工程師 賽普拉斯半導(dǎo)體
關(guān)鍵詞:PSoC, PSoC Express,狀態(tài)機,無代碼應(yīng)用開發(fā)
摘要: 本文通過用可視化無代碼PSoC開發(fā)工具PSoC Express 對一個簡單游戲石頭、剪刀、布的開發(fā)來介紹如何使用PSoC Express的優(yōu)先編碼器傳遞函數(shù)和狀態(tài)機傳遞函數(shù)。
Key word: PSoC, PSoC Express,Status machine,Codeless Application Development
Abstract: The paper introduced how do use prior encode transfer function and status machine function of PSoC Express with a simple game, Rock ,Paper, Scissors,that was developed by visualize,code-free development tool PSoC Express.
PSoC Express是可視化無代碼的PSoC開發(fā)工具,而石頭、剪刀、布是我們孩童時代玩的游戲,二者風(fēng)馬牛不相及。然而我們的一位令人尊敬的美國同事卻用PSoC Express輕松地開發(fā)了石頭、剪刀、布的游戲,用三個輕觸按鍵加一顆低端的PSoC芯片和一個LCD顯示屏就可以實現(xiàn)人機石頭、剪刀、布的游戲,重溫童年的樂趣。
PSoC(可編程片上系統(tǒng))是Cypress半導(dǎo)體生產(chǎn)的包含有8位微處理器核和數(shù)字與模擬混合信號陣列的可編程片上系統(tǒng)。其應(yīng)用領(lǐng)域與8位的MCU相同。區(qū)別于8位的MCU, PSoC的數(shù)字周邊資源(如定時器、PWM、UART等等)和模擬周邊資源(放大器、比較器、濾波器等等)以數(shù)字模塊和模擬模塊的方式給出。不同型號的PSoC芯片的差異主要在于其擁有的數(shù)字模塊和模擬模塊的數(shù)量的不同。用戶可以根據(jù)自己的需要來定義這些模塊。所有這些預(yù)定義的模塊被稱之為用戶模塊。PSoC Designer也為用戶提供這些用戶模塊的API函數(shù)供用戶編程時調(diào)用。在PSoC Express出現(xiàn)以前,開發(fā)PSoC的應(yīng)用項目與MCU的應(yīng)用開發(fā)相似,使用PSoC Designer集成開發(fā)環(huán)境根據(jù)項目的需要調(diào)用和配置資源(用戶模塊),編寫代碼(C或匯編),編譯,調(diào)試….
現(xiàn)在由于PSoC Express可以在更高的抽象概念水平上運行,且無需匯編或C的軟件開發(fā),因此設(shè)計人員只需要數(shù)小時或數(shù)天時間即可完成對PSoC器件的新設(shè)計開發(fā)、仿真及編程,而不再耗時數(shù)周乃至數(shù)月。由于其采用無縫多重處理器架構(gòu)、具有設(shè)計可視化功能,包含豐富的驅(qū)動程序庫和多種傳輸函數(shù)的評估器以及軟仿真功能,因此系統(tǒng)開發(fā)工程師采用PSoC Express工具能夠更快地完成設(shè)計工作,并實現(xiàn)更高的可靠性。對于石頭、剪刀、布的游戲,由于它的輸入輸出非常簡單,設(shè)計的主要工作在于邏輯的判斷和狀態(tài)的轉(zhuǎn)換,所以用PSoC Express來開發(fā)這一類的項目是非??旖莺秃线m的。
一.PSoC Express的開發(fā)過程
使用PSoC Express的開發(fā)過程主要有四個步驟。它們是:選擇輸入和輸出,定義輸出的行為,仿真、驗證和生成系統(tǒng)文件及十六進制文件編程。
1. 選擇輸入和輸出
運行PSoC Express,選擇 Design選項夾,根據(jù)設(shè)計的需要選擇相應(yīng)的輸入、輸出和接口驅(qū)動器。如果有的話,根據(jù)要求設(shè)定驅(qū)動器的參數(shù)。
2. 定義輸出的行為
根據(jù)不同的輸入變化,來定義系統(tǒng)的輸出行為。系統(tǒng)的輸入輸出的關(guān)系相對比較簡單的直接使用輸出驅(qū)動器的傳輸函數(shù)來定義輸入和輸出的相應(yīng)關(guān)系。通過鼠標右鍵點擊輸出驅(qū)動器選擇傳輸函數(shù), 輸出驅(qū)動器提供三種傳輸函數(shù):優(yōu)先編碼器、狀態(tài)編碼器和表格對應(yīng)器。通過使用這三種傳輸函數(shù)建立起輸入和輸出的關(guān)系。輸入輸出的關(guān)系相對比較復(fù)雜的則需要使用評估器(Valuator),評估器包含6個傳輸函數(shù),它們除了輸出驅(qū)動器里提到的三種以外,還有環(huán)狀延時(LoopDelay)、狀態(tài)機和閾值(SetPointRegin)三種傳輸函數(shù)。選擇更合適的傳輸函數(shù)來產(chǎn)生中間結(jié)果作為輸出驅(qū)動器的輸入或其他評估器的輸入。
3. 仿真和驗證
仿真為軟仿真。它主要通過交互式的方式,移動或單擊輸入器件旁的圖形或小窗口來改變輸入的值或狀態(tài),輸出驅(qū)動器和評估器的狀態(tài)或數(shù)值顯示圖形塊中的參數(shù)值隨即發(fā)生相應(yīng)的變化,通過觀察這個變化,用戶可以評估和驗證他的設(shè)計是否實現(xiàn)他所要的結(jié)果。
4. 生成系統(tǒng)文件及使用編程器下載十六進制編程文件到PSoC芯片。至此,可以在實驗板上驗證設(shè)計功能是否達到了設(shè)計的要求。
{{分頁}}
二.優(yōu)先編碼器傳遞函數(shù)和狀態(tài)機傳遞函數(shù)
1. 優(yōu)先編碼器傳遞函數(shù)
優(yōu)先編碼器傳遞函數(shù)是最常用的傳遞函數(shù)。它是基于表達式的實施一系列IF(…)Then(…)Else IF(…) Then(…)…的操作進而得到一個可以用作輸出的值。括號里的表達式類似C語言里的表達式。C里面的大多數(shù)算術(shù)運算符(+, -, *, /, %)和邏輯運算符(&, ||, ==, !=, <=, >=, !, <, >,^) 及位操作運算符(>>, <<, &, |, ~)在這里都是有效的。表達式里的變量來自輸入驅(qū)動器的輸出或其他評估器(Valuator)的輸出,優(yōu)先編碼器傳遞函數(shù)的輸出可以作為其他評估器(Valuator)的輸入和輸出驅(qū)動器的輸入,如果這個優(yōu)先編碼器傳遞函數(shù)是屬于輸出驅(qū)動器的,那么它的輸出也就是該輸出驅(qū)動器的輸出。對于實施一系列
IF(…)Then(…)
Else IF(…) Then(…)
…
的操作,從上到下,只要一遇到IF(…)里面的表達式為真,下面的語句將不再執(zhí)行。由此可知,只有一個IF(…)Then(…)語句真正被執(zhí)行。越是前面的語句優(yōu)先級越高,第一個IF(…)Then(…)優(yōu)先級最高。
2.狀態(tài)機傳遞函數(shù)
通常一個系統(tǒng)中會有多個狀態(tài),當(dāng)滿足一定的條件或被某個事件觸發(fā)時會從一個狀態(tài)轉(zhuǎn)變到另一個狀態(tài)。在PSoC Express中,狀態(tài)機傳遞函數(shù)正是實施這一功能。僅有評估器才包含狀態(tài)機傳遞函數(shù)。而輸出驅(qū)動器是不包含狀態(tài)機傳遞函數(shù)的。
為了實施這一功能,用鼠標右鍵點擊評估器圖標,選擇狀態(tài)機傳遞函數(shù)。首先要為所有可能的狀態(tài)定義狀態(tài)名,然后點擊任意一個狀態(tài)可以設(shè)置觸發(fā)條件并選擇該觸發(fā)條件之前和之后的狀態(tài)。這里也需要給每一個觸發(fā)條件命名不同的名字。一般地,觸發(fā)條件用表達式來表示。表達式里的變量是輸入驅(qū)動器的輸出或其他評估器(Valuator)的輸出,也可以是輸出驅(qū)動器的輸出。每設(shè)置一個觸發(fā)條件,就有一根帶尖頭的藍線將兩個轉(zhuǎn)換之前和之后的狀態(tài)連接起來。所有的觸發(fā)條件都設(shè)置好了以后,我們在屏幕上可以看到所熟悉的狀態(tài)轉(zhuǎn)換圖。狀態(tài)機傳遞函數(shù)的輸出就是某一個用狀態(tài)名表示的狀態(tài)。在所有的狀態(tài)中必須定義一個狀態(tài)為初始狀態(tài),它以綠色表示。
三.石頭、剪刀、布
石頭、剪刀、布游戲包括三個輸入驅(qū)動器、四個輸出驅(qū)動器和四個評估器。三個輸入驅(qū)動器就是三個輕觸按扭,分別代表石頭、剪刀、布用于用戶作竟猜選擇。四個輸出驅(qū)動器都是LCD,它們分別是一個16X2字符點陣LCD的四個部分,用于顯示每次竟猜的輸贏和狀態(tài)以及玩家的分數(shù)。四個評估器中的兩個用于產(chǎn)生隨機數(shù)1或2或3,分別代表石頭、布、剪刀參與和用戶的竟猜。一個評估器用于測試三個輕觸按扭是否處于空閑等待狀態(tài),以便LCD的顯示從顯示竟猜的結(jié)果狀態(tài)返回到竟猜前的等待狀態(tài)。另一個評估器實施各種狀態(tài)的轉(zhuǎn)換,以便在不同的時刻給出一個正確的狀態(tài)。如圖所示。下面給予更詳細的介紹。
輸入驅(qū)動器 Rock(石頭)、Paper(布)和Scissor(剪刀)三個輕觸按扭分別有四個可能的輸出狀態(tài):上升沿、下降沿和ON、OFF,提供給評估器AllOff和m使用。Roll評估器和Pick評估器使用優(yōu)先編碼器傳遞函數(shù)產(chǎn)生隨機數(shù)1或2或3。Roll的傳遞函數(shù)如下:
if(m_state==m_state__WaitForYouToPlay)&&(Roll==0) then Roll = 1
else if(m_state==m_state__WaitForYouToPlay)&&(Roll<128) then Roll = Roll*2
else if(m_state==m_state__WaitForYouToPlay) then Roll = ((Roll-128)*2^0x71
{{分頁}}
Pick的傳遞函數(shù)僅有一條語句:
If(1) then Pick = (Roll%3)+1
AllOff也使用優(yōu)先編碼器傳遞函數(shù)測試三個輕觸按鈕是否處于空閑等待狀態(tài):
if(Rock==Rock__On) then AllOff = 0
else if(Paper==Paper__On) then AllOff = 0
else if(Scissors==Scissors__On) then AllOff = 0
else if(1) then AllOff = 1
m評估器用狀態(tài)機傳遞函數(shù)實施9個狀態(tài)的轉(zhuǎn)換如圖。Start為初始狀態(tài)用綠顏色表示。如果任意一個按扭被按,觸發(fā)條件Go:
(Rock==Rock__Rising_Edge)||(Paper==Paper__Rising_Edge)||(Scissors==Scissors__Rising_Edge)
就被觸發(fā),狀態(tài)便從初始狀態(tài)進入等待狀態(tài) WaitForYouToPlay,等待用戶竟猜。一旦再有按鍵被按,就進入三個選擇狀態(tài)之一。如Rock鍵被按,便觸發(fā)條件RockPressed:
Rock==Rock__Rising_Edge
進入 YouSelectedRock狀態(tài)。接下來馬上實施三個判斷:Pick是等于1(Rock)還是2(Paper)或3(Scissors)?由于Pick評估器的輸出必然是這三個值之一,所以必然有一個條件滿足,如果Pick是等于2(Paper),便觸發(fā)rp進入IWin狀態(tài);如果Pick是等于1(Rock)便觸發(fā)rr進入Draw狀態(tài),表示平局;如果Pick是等于3(Scissors)便觸發(fā)rs進入YouWin狀態(tài),表示用戶贏。無論是Iwin或Draw或YouWin狀態(tài),都無條件地進入到Converge狀態(tài),因為這三個狀態(tài)轉(zhuǎn)換到Converge的觸發(fā)條件rrr、ddd、sss都是1。實際上Converge狀態(tài)用于在按鍵還沒有被釋放時保持LCD顯示竟猜結(jié)果的狀態(tài)。當(dāng)按鍵被釋放以后,Converge狀態(tài)便返回到等待狀態(tài) WaitForYouToPlay,因為它的觸發(fā)條件是:
AllOff == 1
對于普遍使用的16X2字符點陣LCD模塊S01602,針對它的不同顯示方式PSoC Express有多個LCD的輸出驅(qū)動器。這里用這個LCD的四個四分之一(第一排左邊,第一排右邊,第二排左邊,第二排右邊)以字符和數(shù)字的方式來顯示不同的內(nèi)容。它們都是用優(yōu)先編碼器傳遞函數(shù)來實現(xiàn)狀態(tài)和結(jié)果顯示。第一個LCD驅(qū)動器LCDMyPick在第一排左邊顯示PSoC竟猜選擇的項目(Rock或Paper或Scissor),在開始狀態(tài)顯示Any Key,在等待狀態(tài)顯示Please。它的傳遞函數(shù):
if(m_state==m_state__Start) then LCDMyPick=LCDMyPick__Label_4
else if(m_state==m_state__WaitForYouToPlay) then LCDMyPick=LCDMyPick__Label_5
else if(m_state==m_state__YouSelectedRock) then LCDMyPick = Pick
else if(m_state==m_state__YouSelectedPaper) then LCDMyPick =Pick
else if(m_state==m_state__YouSelectedScissor) then LCDMyPick = Pick
Label_4是Any Key, Label_5 是Please在驅(qū)動器的參數(shù)中設(shè)定。第二個LCD驅(qū)動器LCDResult在第一排右邊顯示PSoC竟猜結(jié)果。它的傳遞函數(shù):
if(m_state==m_state__Start) then LCDResult = LDCResults__Label_1
else if(m_state==m_state__WaitForYouToPlay) then LCDResult = LDCResults__Label_5
else if(m_state==m_state__Iwin) then LCDResult = LDCResults__Label_3
else if(m_state==m_state__YouWin) then LCDResult = LDCResults__Label_2
else if(m_state==m_state__Draw) then LCDResult = LDCResults__Label_4
Label_1、 Label_2、 Label_3、 Label_4 和Label_5分別是To Play、You Win、My Win、Draw 和Chose在驅(qū)動器的參數(shù)中設(shè)定。第三和第四個LCD驅(qū)動器MyScore、YourScore使用LCD的第二排左邊和第二排右邊顯示我贏的分數(shù)和你贏的分數(shù)。如YourScore的傳遞函數(shù):
if(m_state==m_state__Start) then YourScore = 0
else if(m_state==m_state__YouWin) then YourScore = YourScore+1
五.結(jié)束語
在 PSoC Expess的開發(fā)環(huán)境下用三個輸入驅(qū)動器、四個輸出驅(qū)動器和四個評估器實現(xiàn)石頭、剪刀、布的游戲,其中四個輸出驅(qū)動器和四個評估器中的三個使用了優(yōu)先編碼器傳遞函數(shù),而僅一個評估器使用了狀態(tài)機傳遞函數(shù)。狀態(tài)機傳遞函數(shù)的狀態(tài)轉(zhuǎn)換的觸發(fā)條件也是類似優(yōu)先編碼器傳遞函數(shù)的if(…)then(…)語句。由此可以看到,使用無代碼的圖形化的PSoC芯片的集成開發(fā)環(huán)境PSoC Expess開發(fā)項目簡單而易行,快捷而有趣。
參考文獻:可編程系統(tǒng)在片(PSoC)芯片的設(shè)計構(gòu)架 翁小平 《世界電子元器件》2006.1
PSoC Express 開創(chuàng)嵌入式芯片編程新時代 翁小平 EDN China 2007.5
聯(lián)系方式:賽普拉斯半導(dǎo)體國際有限公司上海辦事處 翁小平
上海張江半導(dǎo)體工業(yè)園張東路1387號50號樓
Tel:021-64482233-127,13002188281 Email:wengxp@citiz.net Zip:200030
評論