历史上的今天
返回首页

历史上的今天

今天是:2024年12月04日(星期三)

正在发生

2019年12月04日 | PIC单片机源程序的模拟仿真设计

2019-12-04 来源:eefocus

我们在编辑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的编译器所支持的变量类型书写程序的格式进行,这些格式如图附表所示。

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

以上所述的内容,均可在以下的程序实例中得到说明。有关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的部分程序。

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

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

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

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

按钮各命令的特性:

(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(停止),即可使程序快速运行到主函数处,停止运行,如下图所示。

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

其操作方法如下:在操作右图时,同时用鼠标点击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后,再进行上述仿真调试,就很理想了。

推荐阅读

史海拾趣

酷宅(Coolkit)公司的发展小趣事

酷宅科技在智能家居市场的发展中,选择了电子电工和照明类市场作为切入点。这个市场具有巨大的智能化需求,但生产厂家众多,垄断程度低,利润率也相对较低。酷宅凭借其在物联网技术方面的优势,迅速满足了这一市场的迫切需求,并获得了巨大的出货量。随着市场的不断扩大,酷宅科技又进一步进入小家电市场,瞄准了加湿器、香薰机等长尾品类,继续扩大其市场份额。

Akros[台湾超硕股份有限公司]公司的发展小趣事

面对日益激烈的市场竞争,Akros公司积极寻求市场拓展的机会。公司开始参加国际电子展会,与全球各地的客户建立联系。通过展示其独特的技术优势和高质量的产品,Akros逐渐赢得了国际市场的认可。同时,公司还加强了与全球供应链的合作,实现了原材料的全球化采购,降低了生产成本,提高了产品的竞争力。

Hirose公司的发展小趣事

面对日益激烈的市场竞争,Akros公司积极寻求市场拓展的机会。公司开始参加国际电子展会,与全球各地的客户建立联系。通过展示其独特的技术优势和高质量的产品,Akros逐渐赢得了国际市场的认可。同时,公司还加强了与全球供应链的合作,实现了原材料的全球化采购,降低了生产成本,提高了产品的竞争力。

EnerSys公司的发展小趣事

为了进一步拓展市场并加强合作伙伴关系,EnerSys积极寻求与行业领先企业的合作。例如,EnerSys与Verkor携手打造美国锂电超级工厂,这一合作项目将有助于提高EnerSys在美国市场的竞争力,并加速全球清洁能源的转型。通过与合作伙伴的紧密合作,EnerSys在电子行业中的影响力逐渐增强。

ANYSOLAR LTD.公司的发展小趣事

近年来,随着全球能源结构的调整和光伏产业的快速发展,市场竞争日益激烈。ANYSOLAR也面临着来自同行的竞争压力和成本上升的挑战。为了应对这些变革和危机,ANYSOLAR积极调整战略,优化生产流程,降低成本。

同时,公司还加大了对新兴市场的开拓力度,通过参加国际展会、建立海外销售渠道等方式,拓展新的业务增长点。这些措施有效缓解了公司的经营压力,为公司的持续发展注入了新的活力。

联捷(Elinker)公司的发展小趣事

近年来,随着人工智能和物联网技术的快速发展,电子行业迎来了转型升级的机遇。联捷(Elinker)紧跟时代潮流,积极推进智能制造和数字化转型。公司引进了先进的自动化生产线和智能化设备,提高了生产效率和产品质量。同时,公司还加大了对人工智能和物联网技术的研发力度,推出了一系列具有创新性的智能电子产品。

问答坊 | AI 解惑

嵌入式数字多媒体终端硬件平台的设计与实现

随着信息时代的到来,信息技术尤其是计算机多媒体技术与网络技术飞速发展,语音教室在各种学 校都已有了广泛的应用。现存的语音教学系统一般都是采用模拟电路,可靠性低,抗干扰性弱,易发生 串音,从而在传输过程中会失真、衰减,且易受干扰, ...…

查看全部问答>

MX25L3205 PDF文档

特点: * Serial Peripheral Interface (SPI) compatible -- Mode 0 and Mode 3 * 33,554,432 x 1 bit structure * 64 Equal Sectors with 64K byte each - Any sector can be erased *  Single Power Supply Operation - 2.7 t ...…

查看全部问答>

protel 中焊盘通孔类型如何设置?

protel 中焊盘通孔类型如何设置? 要把通孔圆形的改为矩形的,怎么办?…

查看全部问答>

给新入职的坛友一定建议

多主动,多奉献。多积累,多沉淀。不要看眼前得失,要看长远!…

查看全部问答>

vxworks硬件应用平台

基于VxWorks的军用仿真系统 软件使用VxWorks平台 硬件使用研华CPCI平台 功能概述: ●实时模拟火箭发射与操作 ●控制站采用VxWorks系统,操作站采用Windows ●使用1553B通讯 ●AI/AO/DI/DO与通讯接口 解决方案:&nbs ...…

查看全部问答>

32位无符号除法器

在Verilog HDL语言中虽然有除的运算指令,但是除运算符中的除数必须是2的幂,因此无法实现除数为任意整数的除法,很大程度上限制了它的使用领域。并且多数综合工具对于除运算指令不能综合出令人满意的结果,有些甚至不能给予综合。对于这种情 ...…

查看全部问答>

如何把F2812片内FLASH的程序搬移到RAM里

在RAM里运行速度明显的快于flash运行速度。想把如何把F2812片内FLASH的程序搬移到RAM里,谁有相关的流程和例程?万分感谢!…

查看全部问答>

求助LOAD.out文件出错

板子是自己做的 仿真器没问题 好着呢  硬件设计也没问题 因为前几块板子都没问题 新做的一个板子 连接没问题 但烧写LOAD .OUT 文件是提示 DAta Verification failed at address 0x6460 Please verufy ttarget memory and memory map ...…

查看全部问答>

如何对多个IO口同时赋值?

请问,对于不同的IO,比如GPIOA1,A2,A3 ,B1,B2,B3,C1,C2 可不可以用结构体对这非连续的八个IO口写到一组里面,然后向对这一组IO口的值同时赋值?或者对这一组IO口的值同时读取值?多谢!…

查看全部问答>

stm8 实现录音功能

如题,我想做一个stm8 实现录音功能 的小玩意,主芯片是STM8S系列,音频文件存放在SD卡中。我想知道怎样将音频通过stm8存储在SD卡,然后播放出来…

查看全部问答>