打印
[MCU]

PIC单片机源程序的模拟仿真设计

[复制链接]
536|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
太太乐|  楼主 | 2020-9-3 13:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

        我们在编辑PIC单片机的C语言时,常常应用对源程序的模拟仿真技术,因为对程序的模拟仿真可代替部分单片机的硬件制作与调试,即使在深入学习PIC单片机C语言程序时,模拟仿真技术,也是不可缺少的。这里以程序实例演示其操作方法。

        对源程序的模拟仿真可以完成下列功能:直接观察C程序从主程序main()开始运行的全过程;为了清楚观察程序中各变量和寄存器的变化情况,可采用单步运行(stePINto)命令和单步越过(stepover)命令进行模拟运行调试,使观察变量更方便;设置断点再选择Run(快速)命令,程序运行到断点处会停下来,以便观察变量功能;此外,还能定量观察程序中的变化值,如直接观察程序的延时量等多种功能。当然在进行程序模拟仿真时,对源程序还有些技巧性的处理,以下将分别叙述。

        1.PICC与PICC18的C编译简介

        要用C语言开发PIC单片机和模拟仿真调试程序,必须有相应的编译器,PICC与PICC18的C编译器是优化的PIC单片机C编译器,它由澳大利亚HI-TECH公司研制的,该编译器是目前性能优异的PIC系列单片机C编译器软件,也完全符合美国ANSIC标准。PICC是用于PIC16系列产品:PICC18可用于PIC18系列产品;这两个编译器均可运行在微芯公司MPLABIDE集成开发的环境下工作。

        由于该C编译器是运行在MP/ABIDE集成开发环境下的,所以要求用户熟悉MPLABIDE集成开发环境下的使用方法。

        (1)PICC与PICC18编译器的主要特性。该编译器是在MPLAIDE集成开发环境下,对源代码程序的调试,可在源程序上设置断点,而当源程序运行到断点处会自动停止下来,、以便操作者观察变量值和修改变量值;在集成开发环境下进行程序的单步,连续运行操作,也便于操作者观察程序中的各个变量值;支持硬件仿真,即MPLABICE(ln-CircuitEmulator)、支持软件仿真,即MPLABSIM(Simulator)和一些在线调试器,如MPLABICD(ln-CircuitDebugger)ICD2调试器。此外,在单个项目中允许汇编语言和C语言的混含编程。

        (2)PICC与PICC18编译器支持的变量类型。在编辑PIC单片机C程序时,定要按照PICC与PICC18的编译器所支持的变量类型书写程序的格式进行,这些格式如图附表所示。

       

        以上所述的内容,均可在以下的程序实例中得到说明。有关MPLABIDE和PICC与PICC18的软件,均可在网站上下载获取,再安装在自己的电脑中,注意:电脑桌面应是XP系统的。

        2.源程序的软件仿真调试前的准备

        对PIC单片机的软件仿真调试时,应首先在MPLABIDE集成开发环境下(笔者用的是MPLABIDEv7.40版)编辑其源程序,并命名XX.C。

        然后通过创建项目(project)再经PICC编译器(在MPLABIDE环境下)对程序编译,最后生成了目标码.hex后,才可对源程序进行仿真调试。

        将上述在C编译成功的C程序PIC1.c直接调到MPLABIDE的桌面上(若笔者要引用PICl.e作模拟仿真调试,仍应在MPLABIDE环境下,经pice编译器对PICl.e编译生成.hex,才能进行仿真调试),如下图所示(部分界面),在图4的界面上标记有MPLABIDEV7.40和PICl.c的部分程序。

       

        用鼠标点击界面上的Debugger(调试),在其下拉菜单SelectTool引导下的命令MPLABSIM(软件模拟调试),用鼠标点击之,生成上图的界面(部分),在其界面顶端有7个按钮(调试快捷图标),为了说明问题,单独取下,如下图所示。

       
       

        按钮各命令的特性:

        (1)Run:用鼠标点击Run按钮,可直接运行程序,直到遇到断点(以下将介绍)或单击Halt(停机)按钮为止。多数情况下不使用Run方式进行程序调试,因为这种运行方式很难观察到程序运行中的状态。只是在程序中设置有断点时,方可派上用场。

        (2)Halt:用鼠标点击该Halt按钮,可使单片机处于停机状态。如其他各按钮一旦工作,程序运行,只需点击Halt按钮,程序即刻停止运行。

        (3)Animate:用鼠标点击该按钮,可使仿真程序慢步运行,在运行时不停地刷新寄存器的值,利用watch窗口即可观察到寄存器的改变值(定量察看)。

        (4)Step Into:用鼠标点击该按钮,仅执行一条代码指令,然后停机,再点击该按钮,又执行一条代码指令。

        (5)Step over:用鼠标点击该按钮,可把调用的子程序全部执行完成,然后在下一条指令操作码处暂停。当被调用的程序是一个延时程序时,特别有用,这与单步执行完全等效。

        (6)Step out:用鼠标点击该按钮时,就直接跳出程序。

        (7)Reset:用鼠标点击该按钮,程序运行复位。

        上述各个仿真按钮功能,在实际对程序仿真调试时,往往是配合使用而不是单一的使用.这将在以下仿真调试时清楚地看到。

        3.源程序的软件仿真操作

        (1)定性观察源程序PICl.e的运行过程:将已编译成功的PICl.e源程序图5放在电脑桌面上放大获得完整界面之后,用鼠标点击按钮Animate(慢速),然后快速又用鼠标点击图6的按钮Halt(停止),即可使程序快速运行到主函数处,停止运行,如下图所示。

       

        从界面上可看到主程序main()的下方左边,有一程序运行的黄色箭头并指向程序体中的赋值语句TRISB=0x00;代表C程序的运行总是从主程序开始的。接着用鼠标点击图6的按钮Step Into(单步),每点击_次程序运行的黄色箭头就顺序向下运行一次,直到首次运行到主调显示函数display(x);你可不再点击而停下来,如下图所示。

       

        程序首次运行到主调显示函数display(x);的原因是在main()函数体内的赋值语句x=0;此时若用鼠标再点击按钮Step Into(单步),则程序就转到被调函数处,将主调函数的实参0,经值传递到被调函数Voiddisplay(unsigned int x)的形参,然后由被调函数执行其显示的功能,此时数码管LED显示为00。其显示界面如下图所示。

       

        若要使程序再运行,就要将鼠标不断点击按钮Step Into、直到运行到赋值语句urut_bit=X%l0;处,就不再点击为止,如下图所示。

       

        要使程序再运行,换用按钮Step over(单步越过),此时程序即可顺序运行下去,如下图所示。

       

        由于程序运行到while(d>0)中,而D=97,若再用鼠标点击按钮Stepover,也很难跳出循环,为此要让程序跳出while(d>0)循环,可用鼠标点击按钮Stepout(单步跳出),此时程序跳出循环到while(l)循环语句中的x++;处即黄色箭头所指位置(不是第一次的display(x)处,如下图所示。

       

        此时程序执行X++的0+1=1,若再用鼠标点击按钮Step Into(单步),程序运行到下一步的if语句,即判断X达到100否(数码管LED显示最大为99),如下图所示。

       

        若X++<100,又用鼠标点击按钮Step Into(单步),则程序立刻返回到调用显示函数处display(x);如下图所示。

        此时仍然注意程序运行的黄色箭头指示。

       

        上述的源程序软件仿真操作,均利用下图的各按钮进行的,实际操作时也可利用MPLAB IDE的Debugger(调试)下拉菜单,同样有下图按钮对应的命令从Run-Reset,只不过使用起来很不方便吧!

       

        (2)定量观察源程序中变量值的变化:这里的定量观察是指两种定量:1)变量,如PICl.c中的数码管LED的个位,十位的变量显示的增薰值变化;2)程序运行时每条命令代码所清耗的时间或程序段的清耗时间。

       

        其操作方法如下:在操作右图时,同时用鼠标点击MPLAB IDE中的Debugger,在其下拉菜单中,点击Setting,即可出现——Simulator SetTIng新界面,该界面用于用户对PIC单片机时钟频率的设置,将界面中的20(MHz)改为实际工作频率(笔者是4MHz),然后用鼠标点击确定,界面消失。再用鼠标点击Debugger,在其下拉菜单中,点击命令Stopwatch,即出现Stopwatch界面,将该界面放在MPLAB IDE的桌面上,又用鼠标点击MPLAB IDE中的View,在其下拉菜单中,点击LOCals命令,则又出现Locals的新界面。这样右图的界面中同时又出现了上面两种界面(包括程序菜单三种界面),如下图所示。

        此时仍按右图的方法进行仿真操作,此时可在Stopwatch界面中观察到程序运行一次的时间值(用鼠标每次点Zero观察)或程序的累计值(不管Zero);同时在Locals界面上观察数码管LED的个位或十位的累计值。

        实际操作时,往往需对程序作技术处理,否则操作耗时太长。如将PICl.c中的d值从97改为3和将if(x==100)改为if(12),然后再进行编译生成目标码.hex后,再进行上述仿真调试,就很理想了。

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

25

帖子

0

粉丝