当前位置:文档之家› PIC24系列单片机原理与开发 第13章 PIC24系列单片机的开发与调试

PIC24系列单片机原理与开发 第13章 PIC24系列单片机的开发与调试

第13章PIC24系列单片机的开发与调试

13.1.概述

对于嵌入式应用系统或装置的软件开发和硬件调试,设计者都希望有集源程序编辑、编译或汇编和调试为一体开发环境和调试工具。开发环境和调试工具的操作如能得心应手,则可提高效率,起到事半功倍的作用。目前广泛应用的开发环境是Microchip 公司的软件MPLAB IDE(MPLAB Integrated Development Environment ),也称之为 MPLAB 集成开发环境。MPLAB IDE 集成了项目管理器、源程序编辑器,8/16位单片机的汇编器和链接器以及SIM 软件模拟调试器等功能模块。对于16位的PIC24和dsPIC 系列单片机,Microchip 公司专门提供16位开发工具包:MPLAB C30,其安装时自动与MPLAB IDE 无缝集成。MPLAB C30包括16位的C 编译器、汇编器、链接器和软件模拟调试等功能模块,支持硬件仿真器和调试器对目标系统进行源程序级调试,支持编程器对芯片Flash 进行编程写入、读取等操作。MPLAB ICD 2或MPLAB ICD 3为低成本的在线调试工具,也是国内大多数用户使用的硬件调试器,可实现目标系统的在线调试。由MPLAB IDE 构成开发PIC24系列单片机的方案如图13-1所示,实际常用为MPLAB IDE + MPLAB C30 + MPLAB ICD 2/3。

13.2.MPLAB 集成开发环境

MPLAB IDE 是Microchip 公司基于Windows?的集成开发环境(IDE)软件包,它是一款免费软件,可在Microchip 公司的网站(https://www.doczj.com/doc/3a11992522.html,)下载获得。MPLAB IDE 有多种版本,本章使用的是最近发布的MPLAB IDE v8.63。

MPLAB IDE 是包括PIC24系列在内的各种PIC?和dsPIC?系列单片机应用项目的软硬件开发平台。用户在此平台进行应用软件的编辑、编译、链接、软件模拟调试和仿真器/调试器的实时运行调试、编程代码的烧写,同时还具有库函数维护和生成芯片各外设初始化代码的可视化编程(visual device initializer ,VDI)等一些实用功能。

MPLAB IDE 是一个功能强大的软件,其内部集成有项目管理器,程序文本编辑器,MPASM/MPLAB ASM30汇编器,MPLINK/MPLAB LINK30链接器,MPLAB SIM 软件模拟调试器,MPLAB VDI 可视化外设初始化等基本部件,同时支持多种开发工具,如MPLAB REAL ICE 在线仿真器,ICD 2和ICD 3在线调试器, PICkit 2和PICkit 3调试与编程器等。MPLAB IDE 还支持HI-TECH、IAR、CCS、microEngineering Labs 和 Byte Craft 等第三方的语言工具包。对于PIC24系列单片机的嵌入式应用进行开发,MPLAB IDE 的基本功能如下:

MPLAB IDE 集成开发环境源文件调试项目管理器模拟调试器仿真器/调试器

芯片烧写器第三方工具MPLAB C30

C 编译器

汇编器

链接器

MPLAB SIM MPLAB ICD 2/3调试器MPLAB REAL ICE 仿真器MPLAB PM3编程器HI-TECH,IAR,CCS C 编译器CMX,ThreadX,A VIX 操作系统

图 13-1 MPLAB IDE 集成开发环境的构成

PICkit 3编程与调试器MPLAB

ASM30

LINK30

●易于使用的项目管理器,提供 IDE和语言工具之间的集成和通信。

●功能全面的程序文本编辑器,可用不同的颜色区分代码。

●汇编/链接功能。使用MPLAB ASM30汇编器和MPLAB LINK30链接器,可以单独使

用汇编某个文件,也可以与链接器配合使用,将项目内的各源文件、库进行汇编,

产生目标文件;链接器负责将编译后的代码分配到目标单片机的存储区中。

●具有反汇编功能,可在反汇编窗口显示C程序的汇编代码。

●源程序在线调试功能。可使用在线仿真器或在线调试器实现应用对象的在线运行调

试,可以在源程序中设置断点,单步、全速运行调试,在 watch窗口中可显示PIC24

的各寄存器值和用户所定义的变量/单元的内容,并有多种显示格式。

●软件模拟调试功能。MPLAB SIM是使用计算机来模拟PIC24和 dsPIC器件的指令执

行和某些外设功能。MPLAB SIM适用于所有 PIC24和 dsPIC器件的软件模拟调

试。

●比较完善和详细的在线帮助功能(MPLAB IDE,MPLAB编辑器,汇编器链接器,MPLAB

ICD2/3调试器,MPLAB SIM软件模拟器等)。

对于用C语言编程开发16位的PIC24和dsPIC30/33系列单片机,MPLAB IDE使用MPLAB C30编译器,两者安装后自动无缝集成。初学者可在Microchip公司的网站下载免费的MPLAB C30学生版。

13.3.MPLAB C30语言工具包

MPLAB C30(以下简称 C30)是Microchip公司提供的用C语言开发16位单片机(PIC24和dsPIC30/33系列)的语言工具包。C30符合 ANSI C标准,含有16位单片机的标准库函数,如标准数学库函数,芯片外设库函数,dsPIC库函数等,并支持多种内嵌(Build in )函数。

C30支持 C语言与汇编语言混合编程。用户可以在C程序模块(即扩展名为.C的文件)内嵌入行汇编,也可以用汇编语言编写单独汇编模块(扩展名为.S的文件),在工程项目中允许C程序模块和汇编模块混合。C30的编译器和汇编器将它们转换成地址可定位的目标文件(扩展名为.o的文件),LINK30链接器根据芯片的链接描述文件(扩展名为.gld)对各目标文件进行地址分配,最后生成可写入单片机运行的Inter HEX格式文件(扩展名为.hex)。在MPLAB IDE下,通过 MPLAB ICD调试器将HEX格式文件写入目标单片机进行在线调试,或者使用 MPLAB SIM软件模拟器对用户代码进行调试,如图13-2所示。

13.4.MPLAB SIM 软件模拟调试器

MPLAB SIM 软件模拟调试器是MPLAB IDE 自带的一个功能模块。软件模拟调试器是利用计算机来模拟单片机的指令执行和模拟单片机的有关外设模块工作,它不需要任何硬件配合,可对汇编和C 程序进行模拟调试。MPLAB SIM 可以设置任意个断点,可实现单步(Step Into )、单步连续(Animate)、单步跨过(Step Over),单步跨出(Step Out),全速(Run )/断点等多种运行方式,并可以用光标设置程序计数器 PC 的值(Set PC at Cursor )和控制程序运行到光标指定的位置(Run To Cursor )

MPLAB SIM 具有所谓的跑表(StopWatch )功能。该功能的特色之处是可以随时精确统计和显示一条语句/指令、一个函数/子程序或一段程序的执行时间,这给延时程序和一些对时间开销有要求的分析运算模块的编制和调试带来很大的方便。

MPLAB SIM 还可提供输入端口的模拟激励信号和文件激励方式的来模拟单片机相关外设的输入/输出功能,以便在无硬件的情况下也可对相关部分进行调试。不过从笔者看来这一功能使用不多,因为有其局限性。

有关 MPLAB SIM 的具体操作和调试程序将在“13.8使用MPLAB SIM 软件模拟器调试程序”节结合实例给予说明。

13.5.MPLAB ICD 在线调试器

MPLAB ICD 2和 ICD 3是Microchip 公司提供的低成本串行在线调试器/编程器,如图13-3所示。从使用角度看,ICD 3与 ICD 2完全兼容,但ICD 3的代码下载速度(编程速度)比ICD 2快很多,操作性能上也有所改进。使用ICD 2/3调试器时要占用目标单片机的少量资源:PGD1(RB0)和PGC1(RB1)引脚或者PGD2(RB7)和PGC2(RB6)引脚作为ICD 2/3与目标单片机的通信线,其监控代码使用RAM 区 800h 开始的50h 个单元。

ICD 2/3调试器通过USB 电缆与计算机相连,由USB 供电,无需外加电源。安装ICD 2和ICD3的USB 驱动程序默认路径分别为:C:\Program Files\Microchip\MPLAB IDE\ICD2\Drivers\icd2w2k.inf,icd2w2k.sys ,C:\Program Files\Microchip\MPLAB IDE\ICD3\Drivers\ICD3Bulk.inf,NcGen.sys,RealICEBulk.sys。

ICD 2/3调试器与目标单片机相连的是6芯的RJ11插座,各芯的定义如图13-4

所示:

图13-3 MPLAB IC3串行在线调试器

ICD 2/3提供两条仿真电缆,一条为电缆两端均是水晶插头;另一条是接目标机的电缆端为XH-6P (2.54mm 间距)的电路板接插头,实际中使用这种较多,因为目标板布XH-6P 座比较方便,占用的空间也较小。ICD 3与目标板的连接如图13-5。若用户的PGC1/RB1和PGD1/RB0不能用作调试通信线,也可换成PGC2/RB6和PGD2/RB7引脚。注意,在芯片配置字_CONFIG1中需设置相应的项:ICS_PGx1(使用PGC1和PGD1)或ICS_PGx2(使用PGC2和PGD2)。

MPLAB ICD 3虽然可以设置成对目标板供电(通过USB 的电源),提供小于100mA 的电流,但一般不建议这样做。实际中用户目标板大多由自己的电源电路供电。对于ICD 2,用户目标板需自己供电。

包括PIC24系列在内的16位单片机,其内部均有设计有调试模块,当ICD 2/3与之相连时可启动芯片内的调试模块(或称为监控程序)。在进行在线调试时,ICD 2/3调试器可以视为计算机与用户目标系统之间的“桥梁”。当用户代码下载到目标机后,监控程序获得芯片的运行控制权。计算机通过ICD 2/3将调试控制命令传送给目标单片机中的监控程序。监控程序接收计算机发出的调试命令,设置断点,运行用户程序,在断点处监控程序重新获得控制权,将芯片的各寄存器、RAM 单元的运行状态通过ICD 2/3传送给计算机,更新MPLAB IDE 的调试观察窗口。

MPLAB ICD 2/3的主要功能如下:

图 13-4 MPLAB ICD 3调试器的连接电缆接

ICD 3端

的水晶插头-不用(白色)

2-PGC(黑色)

3-PDG(红色)

4-GND(绿色)

5-V DD (橙色)

6-Vpp/MCLR(兰色)

用户目标板

13-5 ICD 3与目标板的连接

(1)使用目标单片机调试应用程序;

(2)支持汇编和C 程序的源代码调试;

(3)可单步连续(Animate)、单步(Step Into )、单步跨过(Step Over)和全速(Run )/断点

运行,用光标设置程序计数器 PC 的值(Set PC at Cursor )和控制程序运行到光标

指定的位置(Run To Cursor )。

(4)可作为编程器使用。

对于原来习惯使用仿真开发器的设计人员来说,MPLAB ICD 2/3也有一些不尽人意之处。例如可设断点数受限制,对于PIC24FJ128系列,最多只能设置4个硬件断点(ICD 3可以在程序存储器中设置软件断点(software breakpoint ),且断点数无限制);若遇到函数或子程序调用处的断点将停在该函数或子程序内的第一条语句或指令处(ICD 3使用软件断点时无此问题);函数单步的执行时间有时过长,还有可能出现不灵现象;当程序代码比较长时,下载时间显得有点长,但ICD 3有很大的改进。尽管如此,作为一种廉价的调试开发工具,MPLAB ICD 2/3还是具有很好的性价比,也完全可以实现目标机的实时运行调试。

使用 ICD 2/3进行调试时应注意的事项:

(1)目标单片机的振荡器必须工作正常,否则ICD 2/3无法进入调试状态。

(2)目标单片机的芯片配置字_CONFIG1不能置为代码保护(GWRP_ON)方式,应设置为

GWRP_OFF 。例如(不保护代码,允许写Flash,允许调试,禁Clip ON,ICD 用

PGC1/PGD1):

_CONFIG1( JTAGEN_OFF & GCP_OFF & GWR P_OFF & BKBUG_ON & COE_OFF & ICS_PGx1 &FWDTEN_OFF & FWPSA_PR32 & WDTPS_PS64)

(3)用户在设计目标板时,虽然PIC24系列单片机本身有上电复位功能,但其复位引脚

MCLR ________

应接有一个对地的10u 左右电解电容,以提高运行可靠性。当与ICD 2/3相

连时,该电容应断开,否则会影响 ICD 2/3的工作。

(4)PGC1/PGD1(或PGC2/PGD2)引脚不要接上拉电阻、电容元件,与调试器之间不要

串接二极管。

有关 MPLAB ICD 2/3的联机调试操作将在下面结合实例给予说明。13.6.创建项目

开发一个单片机应用程序,可能要涉及到多个文件,如C 源程序、汇编源程序、头文件、库文件、链接描述文件和所用的语言工具等。为了便于管理和操作这些文件,MPLAB IDE 提供项目管理器,因此用户在开发应用程序时首先应建立该应用程序的项目(Project )。

项目是用来管理文件,因此最好是在使用项目向导之前,先建立好源程序框架、并将芯片的头文件和链接描述文件复制到源程序的目录中。这个步骤不是必须的,芯片的头文件和链接描述文件也可以位于其它目录中,这只是笔者的建议而已。与项目相关并且要进行编辑修改的所有文件放在同一目录的好处是方便编辑和查看,修改后不会与其它项目发生冲突。

MPLAB IDE 可以菜单栏的命令Project →New 来创建一个项目,但最简单实用的方法是使用 MPLAB 项目向导。

13.6.1创建文件

在使用 MPLAB 项目向导之前,用户可先建立一个项目目录\文件目录,目录名不能有中文字符。例如项目目录为Exmp13_1,文件目录为source ,设路径为D:\PIC24\Test\Exmp13_1\source 。

假设使用PIC24FJ64GA006单片机。将该芯片的头文件“p24FJ64GA006.h”和链接描述文件“p24FJ64GA006.gld ”复制到 source 目录中。芯片的头文件的默认安装路径为C:Program Files\Microchip\MPLAB C30\support\h ,链接描述文件的默认安装路径为C: Program Files\Microchip\MPLAB C30\support\gld 。

在默认安装的C: Program Files\Microchip\MPLAB C30\src\peripheral_24F\src\pmc 路径下有很多个PIC24F 的外设例程目录,如 adc 、i2c 、timer 、uart ,…等等。用户在编程时可参

考相关例程(函数)。

在…\peripheral_24F\include 目录中为各外设模块的头文件,如adc.h 、i2c.h 、ports.h 、timer.h 、uart.h …等等。用户可使用这些头文件中定义的字符串参数来设置相应外设模块的特殊功能寄存器(SFR),以便于阅读。

C 程序和汇编的源程序例程也可在…\MPLAB C30\examples 目录中找到,也可到Microchip 公司下载。用户可直接使用这些例程,或则将它们作为源程序模板进行编辑。当然也可以在 MPLAB IDE 下选择File →New 来创建新文件,编辑后选择File →Save As ,然后选定好“保存类型”和键入文件名,将文件保存在项目的文件目录中。

13.6.2启动向导

安装好集成开发环境 MPLAB IDE (v8.63)和语言工具 MPLAB C30后,双击桌面上的MPLAB IDE 图标,启动MPLAB IDE 运行。在MPLAB IDE 的菜单栏中选择 Project →Project Wiz ard ,启动项目向导,出现如图 13-6所示的 Welcome!(欢迎)界面,单击“下一步(N)”按钮继续。

13.6.3选择芯片

接着出现选择芯片型号的界面,如图13-7所示。在Device 窗口的下拉表中选择所用的芯片型号,这里选择的是 PIC24FJ64GA006芯片。单击“下一步(N)”按钮进入语言工具选择。

图13-6

项目创建向导

图13-7选择芯片型号

13.6.4选择语言工具

在 Active Toolsuite 窗口的下拉表中选择 C30语言工具 Microchip C30 Toolsuite 。然后点击“下一步(N)”按钮继续。

注意,需安装了 MPLAB C30语言工具,否则此项不可选。若只用汇编来编程,可在下拉表中选择 Microchip ASM30 Toolsuite 。单击“下一步(N)”按钮继续。

13.6.5建立项目的目录和项目名

在 Create New Projet File 窗口键入保存项目的路径和项目名称,如图13-9所示。也可以点击“Browse ”(浏览)按钮来定位到已创建目录,然后键入项目名,点击保存;或者直接定位到已有项目名,覆盖原来的项目。本例的项目目录为Exmp13_1,项目名也取为

Exmp13_1,当然项目名可以是其它名称,但不要用中文字符,否则可能出错。如图13-9所示,单击“下一步(N)

”按钮继续。

图 13-8选择 C30语言工具

13-9

建立项目的目录和文件名

13.6.6将文件加入到项目

在图 13-10所示的左窗口中,拖动滑条找到文件所在的目录…\Exmp13_1\source ,并打开此目录。将光标落在目录中的文件上,双击鼠标左键,或单击选定文件再点击“Add>>”键,将文件添加到右窗口。这里设source 目录中有4个文件,它们分别是汇编语言的源文件AsmExmp.s ,C 语言的T_Ad.c ,芯片的头文件p24FJ64GA006.h 和链接描述文件

p24FJ64GA006.gld 。如图13-10所示。如果在目录中暂时没有建立文件,也可以让右窗口空着,跳过这一步,待项目建立后再添加文件。

单击“下一步(N)”按钮,进入创建项目的最后一步。

13.6.7创建项目完成出现图13-11所示的项目内容摘要界面,它列出了所建项目芯片型号、语言工具、项目名称和路径。如果用户需要修改,可点击“上一步(B)”按钮。若一切就绪,点击“完成”按钮,项目创建完毕,MPLAB IDE 回到主界面,在这里可以进行程序的编辑、编译和调试,如图13-12所示。

图 13-10

将文件加入到项目

图 13-11项目内容摘要

项目创建后MPLAB IDE生成两个文件,一个是扩展名为.mcp的项目文件

(Exmp13_1.mcp),另一个是扩展名为.mcw的工作区(workspace)文件(Exmp13_1.mcw)。项目和工作区是MPLAB IDE的两个主要部分。项目包含了编译应用程序所需的文件(源程序,头文件和链接描述文件等),还包含这些文件与编译工具及编译选项之间的对应关系。工作区包含了所选定的器件型号、调试工具和/编程器、打开的窗口和窗口的位置、用户在文件中设置的书签和断点以及IDE的配置等的信息。

当MPLAB IDE未运行时,用户可以直接点击项目文件或工作区文件来启动MPLAB IDE,并同时打开项目。当然也可以先启动MPLAB IDE运行,然后在MPLAB IDE的菜单栏中选择Project→Open来打开项目。

图13-12 MPLAB IDE工作界面

在图13-12所示的MPLAB IDE工作界面中,左边为项目窗口。若项目窗口是关闭的,可以在MPLAB IDE的菜单栏中选择View→Project命令打开项目窗口。虽然编辑、编译和调试程序并不要求打开项目窗口,但使用项目窗口来操作文件比较方便。将光标移到任一目录上,单击鼠标右键,选择弹出菜单的Add Files项,可方便地将文件加入到项目中;将光标移到所选文件名上,选择鼠标右键的弹出菜单的Remove项,将所选文件从项目中删除,如图13-13所示。只要双击项目窗口中的文件便可打开该文件,这远比用菜单栏的File→Open命令来得方便。

使用菜单栏中的Configure→Select Device命令将弹出一个对话框,可以修改所选的芯片型号,对话框中同时还以信号灯的形式列出各硬件开发工具对该芯片的支持情况,绿色信号灯表示完全支持所选的芯片型号,红色信号灯表示不支持。

13.7.编译项目

建立好项目,完成源程序的编辑,接下来是编译项目。对于大多数情况,用户可以直接使用项目编译的默认设置。如果要作修改,用户可以在菜单栏选择命令Project → Build Option → Project ,在弹出的卡片对话中对输出文件目录,include 文件、库文件和链接描述文件的搜索路径、语言工具(MAPLAB C30,ASM30,LINK30等)的参数设置等进行修改,以适合特定的项目编译。

可以通过以下方式编译项目:

(1)菜单栏选择Project →Build All ,或者Project →Make

(2)右击项目窗口中的项目名称,在弹出菜单中选择Project →Build All

(3)在工具栏中点击Build All 图标 ,或者点击 Make 图标。

项目编译(编译、汇编和链接)时,MPLAB IDE 在打开的Output 对话框中显示有关编译信息,如图13-14

所示。

图13-13使用项目窗口在目录处弹右键

在文件处弹右键

图13-14编译成功时的OutPut 窗口

如果项目编译失败,在Output 对话框中报告相关错误信息,双击该错误信息就可将光标定位到源程序中错误所在的行。改正错误后重新编译项目。

编译成功后,将生成可重定位的源程序目标文件 *.o,与项目同名的调试文件*.cof、存储器分配的映射文件 *.map 及Intel hex格式的编程文件(*.hex)。它们可用于调试源代码,并在 Watch 窗口中以符号的形式(变量名)查看和修改变量值。*.hex 文件可用编程器或ICD 2/3直接写入芯片运行。

13.8.使用MPLAB SIM 软件模拟器调试程序

嵌入式应用系统软件设计的主要工作之一是调试程序代码。在应用目标的硬件电路还未完成之前,可以使用MPLAB SIM 软件模拟器来调试代码。MPLAB SIM 可以模拟调试芯片的大部分外设,但由于模拟的是外设功能寄存器(SFR ),而不是芯片的引脚状态,从实时仿真运行角度看有一定的局限性,因此更适合调试那些不依赖于外设的程序,如延时、计算等程序。本节将通过例程来说明如何使用MPLAB SIM 调试程序。

1.MPLAB SIM 的设置与操作

(1)选择MPLAB SIM

打开项目后,选择Debugger →Select Tool →MPLAB SIM 选项,将MPLAB SIM 作

为项目的调试工具。

(2)

设置系统时钟频率

选择Debugger →Setting ,弹出的卡片对话框,在Osc/Trace 选项卡中将“Processor

Frequency ”项设置成芯片的系统时钟频率(32MHz ),“Units ”项设为MHz ,如

图13-15所示。其余选项卡可用默认设置。(3)Watch 窗口添加观察对象

选择View →Watch ,打开Watch 窗口来观察特殊功能寄存器和变量,如图13-16

所示。有四种方法添加观察对象:

●窗口左上侧的SFR 输入框中用下拉表选择或者输入要监视寄存器名,然后单

击“Add SFR ”按钮将其添加到窗口的列表中。窗口右上侧的Symbol 输入框中用

下拉表选择或者输入要监视的变量名,然后单击“Add Symbol ”按钮将其添加到

窗口的列表中。

●在Watch 窗口中点击鼠标右键,在弹出的菜单中选择“Add …”项,然后在

弹出的 Add Watch

对话框中选择或输入寄存器、变量名。

图13-15系统时钟频率设置

●选中源程序中的寄存器或变量名,按住Ctrl 键,将所选的对象拖到Watch 窗

口中。

●在Watch 窗口的Symbol Name 列中直接输入寄存器或变量名。

在Watch 窗口的底部有若干个观察页选择按钮,如图中的 Watch1~Watch4。可

以在各观察页内添加所需的变量/寄存器,点击页选择按钮便可切换,非常方便。

用户可以添加、删除、重命名观察页。方法是在Watch 窗口内单击右键,在弹出

菜单中选择Add Watch Tab 添加观察页,选择Remove Watch Tab 删去当前所选

观察页,选择Remove Watch Tab 删去当前所选观察页,选择Rename Watch Tab

对当前所选观察页改名。观察页可以用中文命名,例如可以将“Watch4”改成“采

样数据”。

(4)程序运行控制方式

可以使用Debugger 下拉菜单中的Run (全速运行)、Animate (单步连续)、Halt

(暂停运行)、Step Into (单步)、Step Over (单步跨过)、Reset (复位)等命令

来控制程序的运行,选择Breakpoints 命令设置、删除或禁止、启用断点。但更为

方便是用图13-17所示的 MPLAB IDE 调试工具栏来控制程序的运行。

断点的设置一般也不采用菜单方式,常用的方法是将光标移到所需设置断点的语

句行,双击鼠标左键设置断点,在语句行前将出现断点标志符,如图13-18

所示。若该行已设置断点,则双击鼠标左键将删除该断点。也可以使用鼠标右键

的弹出菜单来设置断点(Set Breakpoint)、删除断点(Remove Breakpoint)、禁止断

点(Disable Breakpoint)和使能断点(Enable Breakpoint )。

断点的作用是程序全速运行或单步连续运行时,当程序执行到断点处,或者说碰

到断点时,程序指针指向断点处并暂停运行。这时可在Watch 窗口观察或修改寄

存器和变量的值,检查程序运行结果是否正确。设置断点是调试程序常用的手段。全速运行行13-17调试工具栏

13-16MPLAB IDE 的Watch 窗口

注1:需使能了鼠标双击设置/删除断点功能(Edit→properties →’C’File Type ,将

Double Click Toggles Breakpoint 复选框勾上)才可以进行相应的断点操作。

注2:MPLAB SIM 一种软件模拟技术,其全速运行并非芯片的实际运行速度,而

与计算机的模拟速度有关。例如一个实际延时1s 的程序,SIM 的执行时间并非确

定的1s 。

注3:Step Ove r (单步跨过)是将一个函数或子程序作为一步来执行。

(5)光标控制程序运行

程序指针PC 管理着程序的执行顺序。若要改变PC 值,可将光标移到所要执行的

语句行,单击鼠标右键,在弹出菜单中选择Set PC at Cursor 项,则程序指针PC

便设置成当前光标所在的语句行。

若将光标移到某语句行,在鼠标右键的弹出菜单中选择Run to Cursor 项,则程序

从当前PC 位置全速运行到该行。利用光标控制程序运行适合有时需要执行一段代

码,观察代码的执行情况的场合。

(6)

跑表功能

利用MPLAB SIM 的跑表(StopWatch )功能可以精确地统计和显示运行程序所花

的指令周期数和时间。在菜单栏选择Debugger → StopWatch 项便可打开跑表窗

口,如图 13-19所示。

当前跑表值为上次清零后到程序停下来时总共所花的指令周期数和运行时间;累

计值为程序复位到程序停下来时总共所花的指令周期数和运行时间。清零按钮只

能使跑表值清零;点击同步按钮使跑表值与累计值同步。图13-18源程序中的断点标记

图13-19

跑表显示窗口同步按钮

(7)外设的模拟激励功能

任何一个单片机系统总是要和输入、输出信号打交道,但MPLAB SIM是一种用

计算机软件来模拟单片机指令的执行,它与实际的硬件电路无关。在这样的环境

下,对于单片机的输出,虽然得不到实际的引脚信号,但可以从其输出寄存器中

获得输出状态。为解决单片机的外部输入信号的模拟调试问题,MPLAB SIM提

供了一种信号激励注入方法,使得在运行单片机程序时可提供引脚或相关外设寄

存器的信号激励,也就是说用信号激励注入法MPLAB SIM也可以模拟外设的输

入信号。

使用信号激励注入法需在主菜单选择Debugger→Stimulus→New Workbook(或

Open Workbook)建立/打开激励信号窗口,并在整个激励调试过程中保持该窗口的

打开或最小化,如图13-20所示。外部输入信号有两种激励注入方式:引脚电平

激励和文件数据激励。图中设置的是异步选项卡(Asynch)的引脚电平激励,通过

Pin/SFR列的下拉条选择引脚(如RD0)。在Action列的下拉条选择激励逻辑:Set

High(置“1”)、Set Low(清“0”)、Toggle(取反)、Pulse High(高电平脉冲)和Pulse

Low(低电平脉冲)。每设置好一行,该行的Fire按钮由空白符变成”>”触发符。

在程序运行时,只要点击相应行的“>”触发按钮,则将产生所设置的动作逻辑。

例如点击图13-20中第一行的“>”按钮,使得RD0的状态为”1”,点击INT0行

的“>”按钮,将在INT0上产生320个指令周期的高电平脉冲。

需注意的是,这里产生的并非引脚动作逻辑,而是修改相应寄存器的位值,例如

RD0是指PORD寄存器的RD0位,不是RD0引脚。

当完成所需的激励项设置后,点击“Save”按钮,所设置的激励以*.sbs文件保存,

供下次打开使用。

异步方式同步方式

寄存器注入

图13-20异步激励信号窗口

施加激励信号的另外一种方式为同步方式。顾名思义,同步激励是指程序在运行

过程中,若符合预先设置的某种条件,如运行时间、PC值,某种事件的响应等,

则将预先设置的值送相应寄存器,以模拟施加外设的信号。图13-21是选择寄存

器注入(Register Injextion)选项卡,用同步方式来模拟A/D通道的文件数据激励窗

口。窗口中,Reg/Var列框的下拉条中选择A/D模块结果寄存器ADC1BUF0,Data

Filename框中载入已编辑好得激励文件”SimAD.txt”。然后点击“Apply”按钮,

并点击“Save”按钮以*.sbs工作簿文件保存。

激励文件为文本格式文件,空格或回车换行作为各数据的分隔符,例如作为A/D

转换结果的8个数据:0x101 0x201 0x102 0x202 0x103 0x203 0x104 0x204。假若程

序中启用扫描模拟输入通道AN2和AN3,则在第一次A/D 产生中断请求时,

ADC1BUF0←x101,ADC1BUF1←0x201;第二次A/D 产生中断请求时,

ADC1BUF0←x102,ADC1BUF1←0x202;以此类推。当注入最后一个数据后,

根据Wrap (绕回)项的“Yes ”设置,下一次又从文件的第一个数据开始,周而

复始。

2.项目Exmp13_1的源程序

例13-1本例的源程序有两个,C 语言的T_AD.c 和汇编语言的AsmExmp.s 。在汇编程序中为一个延时子程序和Timer1的中断服务程序(ISR )。本例引入汇编程序是想说明MPLAB C30支持 C 模块和汇编混合编程,以及C 和汇编之间的引用关系。

程序实现的功能为两路模拟信号的等间隔采样:

●A/D 的模拟通道使用 AN2和AN3;

●采用“自动采样→硬件延时N*T AD →自动启动转换”和扫描方式;

●用Timer1作采样间隔定时器。设信号周期为10ms ,一个周期采16点,由此得定

时时间为10ms/16=625us ;

●启用 Timer1中断和A/D 模块的中断;

●每0.5秒(用软件延时)进行一轮(一个周期)采样,采集cSampNo (16)个点。通

道AN2的转换数据存在Udata[cSampNo]数组,AN3的转换数据存在Idata[cSampNo]数组。

●设系统时钟32MHz (指令时钟=16MHz )。使用MPLAB SIM 调试可以不要芯片

配置字_CONFIG1( )和_CONFIG2( )。

程序的执行过程为:对AD 模块和定时器Timer1初始化后,在标号Loop 处置允许采样标志 bEnSamp 为“1”,然后进入0.5秒的for 循环。在允许采样标志bEnSamp 为“1”的条件下, Timer1每次中断都启动A/D 按所设置的方式进行采样和转换。一旦A/D 转换完AN2和AN3,A/D 模块产生中断,在其ISR 中停止自动采样,同时读取转换的数据。当采集了cSampNo 个数据时,允许采样标志bEnSamp 清“0”,使得Timer1的中断不再启动A/D 转换,同时还置采集完成标志bSampOv 为”1”,指示已采集到一个周期的数据,可供CalFun()函数作处理。当0.5秒的for 循环结束后,转标号Loop 处重复上述过程。

图13-21文件(寄存器注入)

激励窗口

T_AD.c的程序代码和注释如下:

#include "p24FJ64GA006.h"

#define cSampNo16

int Udata[cSampNo],Idata[cSampNo],adPtr=0,T0_5S=800;

struct { unsigned b0_5s:1;//0.5秒标志,本例未用

unsigned bEnSamp: 1; //允许采样标志位

unsigned bSampOv: 1; //采集cSampNo个点完成标志位

} Flag;

void Delayus(unsigned int x); //汇编中的延时子程序

void CalFun(void); //计算函数,本例中暂时为一空函数

int main()

{ unsigned char i;

AD1PCFG=0xFFF3; //使用模拟通道AN2,AN3

AD1CSSL=0x000C; //扫描AN2,AN3

AD1CON1=0x00E0;//整数格式,,采样N*Tad后启动转换,

AD1CON2=0x0404 ;//SMPI=1,每2次转换中断1次

AD1CON3=0x0504; //N=5,Tad = 2.5*Tcy

SRbits.IPL = 3; //置CPU优先级为3

IPC3bits.AD1IP=5; //置A/D的优先级为5

IEC0bits.AD1IE = 1;//允许A/D中断

TMR1= 0; PR1=1250-1; //置Timer1的周期寄存器为1250-1(625us)

T1CON=0x8010;//启动TON=1,TCS位=0,TGA TE位=0,指令时钟8分频IPC0bits.T1IP = 5;//置Timer1的中断优先级为5

IEC0bits.T1IE = 1;//允许Timer1中断

AD1CON1bits.ADON=1; //使能A/D模块

loop:Flag.bEnSamp=1

for(i=0,;i<50;i++)

{ Delayus(10000); //延时10ms

if(Flag.bSampOv)

{ Flag.bSampOv=0; CalFun();} //计算

}

goto loop;

}

//========= ADC1中断服务程序==========

void __attribute__((__interrupt__,no_auto_psv)) _ADC1Interrupt(void)

{ AD1CON1bits.ASAM=0; //停止自动采样

if(Flag.bEnSamp)

{ Udata[adPtr]=ADC1BUF0; //读取AN2的转换值

Idata[adPtr]=ADC1BUF1;//读取AN3的转换值

if(++adPtr>=cSampNo)//数组下标加1,并判是否采集cSampNo个点{ Flag.bEnSamp=0;Flag.bSampOv=1; adPtr=0;}//采集cSampNo个点}

IFS0bits.AD1IF=0; //清中断标志

}

void CalFun(void) //计算,暂时为一空函数

{;}

************汇编文件AsmExmp.s代码***************

;使用C的变量要前导下划线: _C的变量名

.include "p24FJ64GA006.inc"

.text

.global __T1Interrupt ;声明Timer 1的ISR入口为global

.global _Delayus ;声明Delayus为global

.equ b0_5S,0

.equ bEnSamp, 1

.equ bSampOv, 2

_Delayus: ;延时子程序,供C调用.输入参数在W0中,单位为us。

Delayus1: REPEA T #11 ;1T,下面的nop执行12次

nop ;1T(指令周期,1/16us)

SUB #1,W0 ;1T

BRA NZ,Delayus1 ;2T

RETURN

;======== Timer1中断(625us)===========

__T1Interrupt: ;要前导2个下横线

PUSH W0

BTSC _Flag,#bEn Samp ;若Flag单元的bEnSamp位为0,则跳过

BSET AD1CON1,#ASAM ;启动采样

DEC _T0_5S

BRA NZ,T1p_1

BSET _Flag,#b0_5S ;定时0.5秒到,标志b0_5S置1(未用)

MOV #800,W0

MOV.WREG,_T0_5S

T1p_1: BCLR IFS0, #T1IF ;清T1的中断标志位

POP W0

RETFIE ;中断返回

.end

说明:

(1)C程序可以引用汇编中的子程序,如例中的延时子程序Delayus。汇编模块中供C

模块引用的子程序应使用伪指令“.global”声明为全局的,且其子程序名前至少有

一个下横线。在C模块中用寄存器W0~W7来传递参数和返回值,本例Delayus

只有一个16位的参数,使用的是W0寄存器。其余情况请参见MPLAB_C30C编译

器用户指南(DS51284F_CN)。

(2)汇编模块中可以引用C模块中的变量和函数,引用时需在其符号名前加一个下横

线。

(3)汇编模块中不能识别C模块中位结构的成员变量。汇编中若要使用C中位结构的

成员变量名,需用伪指令再定义。要注意两者的定义必须一致,如本例中位结构

Flag中的3个位变量。

3.调试运行

编译无误后,就可以用MPLAB SIM来调试程序。因本例开启了外设A/D模块,故在调试前还需按图13-21“文件(寄存器注入)激励窗口”设置好A/D转换数据的文件,并点击“Apply”按钮;点击“Save”按钮,以*.sbs工作簿文件保存,供下次打开使用。我们这里仍假设A/D转换数据文件为SimAD.txt,如图13-22所示。

(1)在main()的第一条语句处和for

语句处各设置一个断点。点击复位图标后,

在位于MPLAB IDE 窗口最下面的状态栏中显示 pc :0。点击Run(全速运行)

快捷图标后,程序从复位入口处(PC=0)运行到断点处停下来,如图13-23

所示。在Stopwatch 窗中可以看到运行这一段C 的启动代码花了15.4375us/247

个指令周期。

(2)点击Stopwatch 窗中的“Zero ”按钮,跑表值清零,然后再单击Run ,程序从

断点处继续执行,直到碰到for 语句处的断点才停下来。这时跑表值显示的为

该段程序的执行时间/指令周期数,累计值显示的为从复位至运行到当前指令处

所花的时间/指令周期数。

(3)测试延时函数Delayus( )的执行时间。清零跑表值,点击Step Over (单步跨过,

或称函数单步)图标,可以看到for 语句的执行为0.5625us/9个指令周期。

这时程序指针指着Delayus(10000 )处,清零跑表值,再点击Step Over 图标,可

测得Delayus(10000 )的执行时间为10.05625ms ,如图13-24所示。由此可见,

在程序设计中,若要知道某段程序或函数的执行时间,在MPLAB SIM 下测试

尤为方便。

图13-24测试程序代码执行时间语句的执行时间Delayus(10000)的执行时间

图13-23

设置断点和观察C 启动代码的执行时间

(4)测试定时器Timer1的定时中断功能。双击for 语句处的断点将其删除,在汇编

文件的Timer1中断服务程序入口处设置断点,然后单击Run 图标。若Timer1

模块的配置无误,则Timer1寄存器TMR1中的计数值等于周期寄存器PR1时产

生中断,使得程序在断点处停下来,如图13-25所示。从图中的Watch 窗口可

见,此时TMR1的计数值为0x04E1,与PR1的设置值相同。此说明程序对Timer1

的初始化是可行的,但定时时间是否正确还需进一部测试。点击跑表窗的清零

按钮,然后单击Run 图标继续执行程序。当Timer1再次周期匹配时,程序又

在断点处停下来。这时Stopwatch 窗口显示的跑表值为624.9375us,这也就是

Timer1的定时时间(625us),由此可见Timer1的工作正常。

(5)测试A/D 转换功能。点击工具栏中的断点操作快捷图标,弹出图13-26所示的

断点设置窗口。点击“Remove

All ”按钮,删除所有断点,然

后点击“OK ”按钮,使断点删

除操作生效。为了测试A/D 模

块的编程和转换功能,在A/D

模块中断服务程序的入口处设

置一个断点。复位PC 后,点击

Run 图标,程序全速运行。按

照程序的编程逻辑,在Timer1

的ISR 中由指令“BSET

AD1CON1,#ASAM ”启动A/D

采样。根据所设工作方式,A/D

模块将自动完成AN2和AN3

的采样与转换,然后产生中断。

因此,若程序工作正常,必将

在断点处停下来,如图13-27

所示。清零跑表值,再次点击

Run ,当程序在断点处停下时,我们可以在Stopwatch 窗看到

跑表值为Timer1的定时周期;同时在Watch 窗口观察到Timer1的计数值为12

图13-25测试Timer1

的定时中断功能

图13-26断点设置窗口

(TMR1=0x000C),即从启动A/D采样到A/D完成2个通道的采样与转换所花的时间约为6us,或者说每通道的转换速率约为333kbps。通过单步执行,在Watch窗口还可以看到SimAD.txt文件所定义的模拟数据(参见“图13-22 A/D 转换数据文件”)被依次送A/D转换结果寄存器ADC1BUF0和ADC1BUF1,通过它们赋值给Udata[]和Idata[]数组,程序的执行过程一目了然。经过多次A/D中断后(可取消断点执行一段时间,然后点击Halt图标使程序暂停执行),数组Udata[]和Idata[]的赋值情况见图13-28。由此可见,在用户硬件系统还没有制作好之前,可以借助于MPLAB SIM进行软件模拟调试。虽然这种模拟调试与在实际硬件系统上运行程序尚有区别,但仍可解决软件调试中的很多问题,也不失为一种有效的辅助调试手段。

图13-27测试A/D转换功能

图13-28文件注入的A/D转换数据

相关主题
文本预览
相关文档 最新文档