新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > PSoC Express 和石头、剪刀、布

PSoC Express 和石头、剪刀、布

——
作者:翁小平时间:2007-12-04来源:电子产品世界收藏

翁小平    资深主任应用工程师       赛普拉斯半导体

关键词: ,状态机,无代码应用开发
摘要: 本文通过用可视化无代码开发工具PSoC 对一个简单游戏的开发来介绍如何使用PSoC 的优先编码器传递函数和状态机传递函数。
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开发工具,而是我们孩童时代玩的游戏,二者风马牛不相及。然而我们的一位令人尊敬的美国同事却用PSoC Express轻松地开发了的游戏,用三个轻触按键加一颗低端的PSoC芯片和一个LCD显示屏就可以实现人机石头、剪刀、布的游戏,重温童年的乐趣。
  PSoC(可编程片上系统)是Cypress半导体生产的包含有8位微处理器核和数字与模拟混合信号阵列的可编程片上系统。其应用领域与8位的MCU相同。区别于8位的MCU, PSoC的数字周边资源(如定时器、PWM、UART等等)和模拟周边资源(放大器、比较器、滤波器等等)以数字模块和模拟模块的方式给出。不同型号的PSoC芯片的差异主要在于其拥有的数字模块和模拟模块的数量的不同。用户可以根据自己的需要来定义这些模块。所有这些预定义的模块被称之为用户模块。PSoC Designer也为用户提供这些用户模块的API函数供用户编程时调用。在PSoC Express出现以前,开发PSoC的应用项目与MCU的应用开发相似,使用PSoC Designer集成开发环境根据项目的需要调用和配置资源(用户模块),编写代码(C或汇编),编译,调试….
  现在由于PSoC Express可以在更高的抽象概念水平上运行,且无需汇编或C的软件开发,因此设计人员只需要数小时或数天时间即可完成对PSoC器件的新设计开发、仿真及编程,而不再耗时数周乃至数月。由于其采用无缝多重处理器架构、具有设计可视化功能,包含丰富的驱动程序库和多种传输函数的评估器以及软仿真功能,因此系统开发工程师采用PSoC Express工具能够更快地完成设计工作,并实现更高的可靠性。对于石头、剪刀、布的游戏,由于它的输入输出非常简单,设计的主要工作在于逻辑的判断和状态的转换,所以用PSoC Express来开发这一类的项目是非常快捷和合适的。

一.PSoC Express的开发过程
  使用PSoC Express的开发过程主要有四个步骤。它们是:选择输入和输出,定义输出的行为,仿真、验证和生成系统文件及十六进制文件编程。
1. 选择输入和输出
  运行PSoC Express,选择 Design选项夹,根据设计的需要选择相应的输入、输出和接口驱动器。如果有的话,根据要求设定驱动器的参数。
2. 定义输出的行为
  根据不同的输入变化,来定义系统的输出行为。系统的输入输出的关系相对比较简单的直接使用输出驱动器的传输函数来定义输入和输出的相应关系。通过鼠标右键点击输出驱动器选择传输函数, 输出驱动器提供三种传输函数:优先编码器、状态编码器和表格对应器。通过使用这三种传输函数建立起输入和输出的关系。输入输出的关系相对比较复杂的则需要使用评估器(Valuator),评估器包含6个传输函数,它们除了输出驱动器里提到的三种以外,还有环状延时(LoopDelay)、状态机和阈值(SetPointRegin)三种传输函数。选择更合适的传输函数来产生中间结果作为输出驱动器的输入或其他评估器的输入。
3. 仿真和验证
  仿真为软仿真。它主要通过交互式的方式,移动或单击输入器件旁的图形或小窗口来改变输入的值或状态,输出驱动器和评估器的状态或数值显示图形块中的参数值随即发生相应的变化,通过观察这个变化,用户可以评估和验证他的设计是否实现他所要的结果。
4. 生成系统文件及使用编程器下载十六进制编程文件到PSoC芯片。至此,可以在实验板上验证设计功能是否达到了设计的要求。

{{分页}}

二.优先编码器传递函数和状态机传递函数
1.  优先编码器传递函数
  优先编码器传递函数是最常用的传递函数。它是基于表达式的实施一系列IF(…)Then(…)Else IF(…) Then(…)…的操作进而得到一个可以用作输出的值。括号里的表达式类似C语言里的表达式。C里面的大多数算术运算符(+, -, *, /, %)和逻辑运算符(&, ||, ==, !=, <=, >=, !, <, >,^)  及位操作运算符(>>, <<, &, |, ~)在这里都是有效的。表达式里的变量来自输入驱动器的输出或其他评估器(Valuator)的输出,优先编码器传递函数的输出可以作为其他评估器(Valuator)的输入和输出驱动器的输入,如果这个优先编码器传递函数是属于输出驱动器的,那么它的输出也就是该输出驱动器的输出。对于实施一系列
IF(…)Then(…)
Else IF(…) Then(…)

的操作,从上到下,只要一遇到IF(…)里面的表达式为真,下面的语句将不再执行。由此可知,只有一个IF(…)Then(…)语句真正被执行。越是前面的语句优先级越高,第一个IF(…)Then(…)优先级最高。
 
2.状态机传递函数
  通常一个系统中会有多个状态,当满足一定的条件或被某个事件触发时会从一个状态转变到另一个状态。在PSoC Express中,状态机传递函数正是实施这一功能。仅有评估器才包含状态机传递函数。而输出驱动器是不包含状态机传递函数的。
  为了实施这一功能,用鼠标右键点击评估器图标,选择状态机传递函数。首先要为所有可能的状态定义状态名,然后点击任意一个状态可以设置触发条件并选择该触发条件之前和之后的状态。这里也需要给每一个触发条件命名不同的名字。一般地,触发条件用表达式来表示。表达式里的变量是输入驱动器的输出或其他评估器(Valuator)的输出,也可以是输出驱动器的输出。每设置一个触发条件,就有一根带尖头的蓝线将两个转换之前和之后的状态连接起来。所有的触发条件都设置好了以后,我们在屏幕上可以看到所熟悉的状态转换图。状态机传递函数的输出就是某一个用状态名表示的状态。在所有的状态中必须定义一个状态为初始状态,它以绿色表示。
 
三.石头、剪刀、布
  石头、剪刀、布游戏包括三个输入驱动器、四个输出驱动器和四个评估器。三个输入驱动器就是三个轻触按扭,分别代表石头、剪刀、布用于用户作竟猜选择。四个输出驱动器都是LCD,它们分别是一个16X2字符点阵LCD的四个部分,用于显示每次竟猜的输赢和状态以及玩家的分数。四个评估器中的两个用于产生随机数1或2或3,分别代表石头、布、剪刀参与和用户的竟猜。一个评估器用于测试三个轻触按扭是否处于空闲等待状态,以便LCD的显示从显示竟猜的结果状态返回到竟猜前的等待状态。另一个评估器实施各种状态的转换,以便在不同的时刻给出一个正确的状态。如图所示。下面给予更详细的介绍。
 
  输入驱动器 Rock(石头)、Paper(布)和Scissor(剪刀)三个轻触按扭分别有四个可能的输出状态:上升沿、下降沿和ON、OFF,提供给评估器AllOff和m使用。Roll评估器和Pick评估器使用优先编码器传递函数产生随机数1或2或3。Roll的传递函数如下:
  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的传递函数仅有一条语句:
  If(1)  then Pick = (Roll%3)+1
AllOff也使用优先编码器传递函数测试三个轻触按钮是否处于空闲等待状态:
  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评估器用状态机传递函数实施9个状态的转换如图。Start为初始状态用绿颜色表示。如果任意一个按扭被按,触发条件Go:
(Rock==Rock__Rising_Edge)||(Paper==Paper__Rising_Edge)||(Scissors==Scissors__Rising_Edge)
就被触发,状态便从初始状态进入等待状态 WaitForYouToPlay,等待用户竟猜。一旦再有按键被按,就进入三个选择状态之一。如Rock键被按,便触发条件RockPressed:
  Rock==Rock__Rising_Edge
  进入 YouSelectedRock状态。接下来马上实施三个判断:Pick是等于1(Rock)还是2(Paper)或3(Scissors)?由于Pick评估器的输出必然是这三个值之一,所以必然有一个条件满足,如果Pick是等于2(Paper),便触发rp进入IWin状态;如果Pick是等于1(Rock)便触发rr进入Draw状态,表示平局;如果Pick是等于3(Scissors)便触发rs进入YouWin状态,表示用户赢。无论是Iwin或Draw或YouWin状态,都无条件地进入到Converge状态,因为这三个状态转换到Converge的触发条件rrr、ddd、sss都是1。实际上Converge状态用于在按键还没有被释放时保持LCD显示竟猜结果的状态。当按键被释放以后,Converge状态便返回到等待状态 WaitForYouToPlay,因为它的触发条件是:
  AllOff == 1
  对于普遍使用的16X2字符点阵LCD模块S01602,针对它的不同显示方式PSoC Express有多个LCD的输出驱动器。这里用这个LCD的四个四分之一(第一排左边,第一排右边,第二排左边,第二排右边)以字符和数字的方式来显示不同的内容。它们都是用优先编码器传递函数来实现状态和结果显示。第一个LCD驱动器LCDMyPick在第一排左边显示PSoC竟猜选择的项目(Rock或Paper或Scissor),在开始状态显示Any Key,在等待状态显示Please。它的传递函数:
  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在驱动器的参数中设定。第二个LCD驱动器LCDResult在第一排右边显示PSoC竟猜结果。它的传递函数:
  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在驱动器的参数中设定。第三和第四个LCD驱动器MyScore、YourScore使用LCD的第二排左边和第二排右边显示我赢的分数和你赢的分数。如YourScore的传递函数:
  if(m_state==m_state__Start)  then YourScore = 0
else if(m_state==m_state__YouWin)  then YourScore = YourScore+1

五.结束语
  在 PSoC Expess的开发环境下用三个输入驱动器、四个输出驱动器和四个评估器实现石头、剪刀、布的游戏,其中四个输出驱动器和四个评估器中的三个使用了优先编码器传递函数,而仅一个评估器使用了状态机传递函数。状态机传递函数的状态转换的触发条件也是类似优先编码器传递函数的if(…)then(…)语句。由此可以看到,使用无代码的图形化的PSoC芯片的集成开发环境PSoC Expess开发项目简单而易行,快捷而有趣。

参考文献:可编程系统在片(PSoC)芯片的设计构架  翁小平 《世界电子元器件》2006.1
  PSoC Express 开创嵌入式芯片编程新时代 翁小平 EDN China 2007.5


联系方式:赛普拉斯半导体国际有限公司上海办事处  翁小平
         上海张江半导体工业园张东路1387号50号楼
Tel:021-64482233-127,13002188281 Email:wengxp@citiz.net  Zip:200030



关键词: PSoC Express 石头 剪刀

评论


相关推荐

技术专区

关闭