PIC单片机的在线调试说明

在线调试器(icd)是一种非常强大且有效的工具,可以在硬件级别对基于微控制器的系统进行实时调试,它允许您在目标微控制器运行,停止和单步执行程序被嵌入到实际电路中。暂停后,可以实时检查和修改程序变量,特殊功能寄存器(sfr),ram和eeprom的位置,从而帮助设计人员一起调试固件和硬件。在本文中,我将描述pic单片机中的在线调试技术,并通过使用pic16f887单片机的测试项目演示调试过程。尽管大多数icd的操作是相似的,但在这里我将结合使用mikroicd器件的mikroelektronika的picflash以及用于pic编译器的mikroc pro进行说明。
icd在调试pic编程中
理论
icd是硬件连接在pc和目标微控制器之间的设备,可以快速,轻松地调试实时应用程序。 icd由pc上运行的调试应用程序工具控制。调试工具允许设计人员通过将断点插入到程序0r中来单步执行程序,从而减慢微控制器的运行速度。在执行了一条指令或一组指令之后,可以检查程序变量和内部寄存器的值,并在需要时进行修改。这有助于快速识别源代码中的错误和错误,从而加快项目的开发过程。
picmicro中的icd
在pic单片机中,可通过与在线串行编程(icsp)相同的引脚(即icspdat(或pgd),icspclk(或pgc),v pp)来实现在线调试。 sub》/mclr(编程模式电压),v dd (电源电压)和v ss (地)。这使制造商可以将iscp编程和在线调试功能集成到单个设备中。在调试过程中,icd设备会向目标微控制器的程序存储器中添加额外的代码块(以及用户应用程序),该代码块与调试应用程序进行交互。并通过同一条编程电缆将变量值,内部寄存器值和其他详细信息发送到pc。
例如,microchip的mplab icd2和icd3既是选定pic mcu和dspic dsc的编程器又是实时调试器。 icd的功能由pc上运行的mplab集成开发环境(ide)应用软件控制。在调试期间,可通过mplab ide界面以交互方式访问目标微控制器的所有可用功能。这些功能使您能够以单步模式运行程序,将断点插入程序,检查寄存器和变量,并根据需要修改它们。
尽管icd是一种非常有价值的调试工具,但它并不是不惜一切代价。 icd的两个主要缺点是:1)它使用目标微控制器的一些内存,并且2)它占用目标微控制器的一些i/o引脚以与pc通信。因此,在调试时,目标微控制器的pgd,pgc和mclr引脚不能用于任何其他目的。
带有mikroicd的picflash
带有mikroicd的picflash是用于pic12,pic16和pic18系列微控制器的编程器和在线调试器。它由mikroelektronika制造,并受其所有pic编译器(mikroc,mikrobasic和mikropascal)支持。设备通过usb接口与pc通信,该接口还为icd提供必要的电源。它通过pgc,pgd,v pp /mclr和电源引脚连接到目标pic微控制器。当该器件用作独立编程器时,在将hex文件加载到目标pic微控制器之后,释放前三个引脚。但是,如果将其用于在线调试,则这三个引脚用于与pc进行通信,因此不能用于任何其他目的。
带有mikroicd的picflash :程序员+在线调试器
使用mikroicd安装picflash的软件
您可以找到详细信息有关此信息,请参见mikroicd手册。设置该器件的最简单方法是首先下载pic编译器。请注意,此设备无法与任何其他方的编译器一起使用,因此您需要使用mikroelektronika编译器之一才能使其正常工作。以下步骤介绍了用于mikroc pro for pic编译器的带有mikroicd的picflash的软件安装和设置。
首先,从here下载适用于pic编译器的mikroc pro并将其安装在pc上。/span》
安装完成后,它将询问您是否要安装mikroprog suite for pic。同意,然后安装。
下一步,它将询问您是否要安装驱动程序formikroprogprogrammer。说是,然后选择适合您的操作系统的驱动程序文件,然后安装它。您完成了!
使用带有mikroicd的picflash进行调试
第一步使用mikroicd正在用所选的编译器编写应用程序,例如mikroc pro for pic。编译器的ide提供了调试功能,例如逐步运行程序,使用断点暂停程序执行,检查内部寄存器的状态,跟踪程序中变量的值等。请阅读mikroicd手册以获取更多详细信息。我将在我们的测试项目中说明调试过程,该项目使用pic16f887微控制器和lm34dz传感器测量环境温度并将其显示在lcd上。该项目的电路图如下所示,这是不言自明的。每次读取温度时,它的工作方式都是如此。按下开关,微控制器从lm34dz读取温度样本并将其显示在lcd上。您可以看到,在默认情况下,开关输出为高,按下开关时输出为低。我正在为此实验设置使用mikroelektronika的pic ready 1板。它是用于28和40引脚pic微控制器的快速原型板。该开发板配有pic16f887微控制器,预装了串行引导加载程序,但实际上不适用于我们的情况。但是,该开发板也确实包含带有mikroicd的picflash连接器。 pic ready 1板上的用户手册描述了有关板上连接的更多信息。
用于调试pic16f887单片机系统的电路图
实验设置:带有mikroicd的pic-ready1板和picflash
所以让我再次简要描述整个场景,以便更清楚地了解我们正在尝试在这里做。我们有一个pic16f887微控制器电路,该电路可以读取lm34dz传感器的模拟输出,将其转换为温度(°f),并在lcd上显示。该微控制器通过icsp引脚连接到mikroicd(pic编程器+ icd)。 mikroicd也通过usb端口连接到pc。 mikroicd调试工具已嵌入pic编译器的mikroc pro中,因此可以从那里进行操作。我们将使用调试工具对加载到微控制器中的程序进行单步调试,并观察变量值。同时,随着每条指令的执行,其效果也可以在真实的硬件电路中观察到。
mikroicd调试过程
首先,使用以下源代码创建一个新项目,以读取lm34dz输出并在lcd屏幕上显示测得的温度。如果您是首次使用mikroc编译器,请阅读在mikroc pro for pic中创建第一个项目,以了解如何在mikroc pro for pic中创建新项目。编译之前,请转到“编辑项目”窗口,然后将生成类型选择为icd debug。该选项将使mikroicd将调试代码与用户应用程序一起加载到微控制器中。
/*
* project name:
testing mikroicd debugging tool with pic16f887
* copyright:
(c) rajendra bhatt
* test configuration:
mcu: pic16f887
oscillator: hs, 10.0000 mhz
*/
// lcd module connections
sbit lcd_rs at rc3_bit;
sbit lcd_en at rc2_bit;
sbit lcd_d4 at rc4_bit;
sbit lcd_d5 at rc5_bit;
sbit lcd_d6 at rc6_bit;
sbit lcd_d7 at rc7_bit;
sbit lcd_rs_direction at trisc3_bit;
sbit lcd_en_direction at trisc2_bit;
sbit lcd_d4_direction at trisc4_bit;
sbit lcd_d5_direction at trisc5_bit;
sbit lcd_d6_direction at trisc6_bit;
sbit lcd_d7_direction at trisc7_bit;
// end lcd module connections
char txt[] = “temp = f”;
char *temp = “000.0”;
sbit pressswitch at rc0_bit;
unsigned int adc_value;
void main() {
ansel = 0x01; // configure ra0 as analog input
anselh = 0x00;
trisa = 0xff;
c1on_bit = 0; // disable comparators
c2on_bit = 0;
trisc = 0x01; // rc0 is input
trisd = 0x00;
trisb = 0xff;
txt[11] = 223; // ascii value for degree symbol
lcd_init(); // initialize lcd
lcd_cmd(_lcd_clear); // clear display
lcd_cmd(_lcd_cursor_off); // cursor off
lcd_out(1,1,txt); // write text in first row
do {
if (!pressswitch) { // detect logical 0
delay_ms(300);
adc_value = adc_read(0);
adc_value = adc_value*4.88; // convert to temperature in f
temp[0] = adc_value/1000 + 48;
temp[1] = (adc_value/100)%10 + 48;
temp[2] = (adc_value/10)%10 + 48;
temp[4] = adc_value%10 + 48;
lcd_out(1,7,temp);
}
} while(1); // endless loop
}
下载mikroc项目文件
为构建类型选择icd调试可进行在线调试
您保存此方案,然后单击 build + program (或按f4键)来编译编程并将其加载到目标微控制器中。 mikroicd必须连接到pc的usb端口以及目标微控制器。它会自动启动 pic的mikroprog suite ,这是pc上将hex文件传输到micrcontroller中所需的应用程序软件。现在已经加载了应用程序和调试代码,是时候使用调试功能了,看看它如何工作。
要开始调试,请从菜单中选择 start debugger 选项。 运行下拉菜单或使用功能键[f9]。现在,您可以通过按[f8]键逐行执行程序。在执行过程中,默认情况下将以蓝色突出显示下一步执行的程序行(请参见下图)。
要执行的下一条指令将以蓝色突出显示
可以在监视窗口上监视程序的实时执行。您可以选择要监视的任何寄存器和变量,并将它们添加到监视窗口。转到查看-》调试windows-》监视窗口选项以获取“监视”窗口。从变量列表中选择要观察的变量,然后通过单击显示的+号将它们添加到窗口中。在下图中,我正在调试期间监视四个变量。它们是 adc_value,pressswitch,adresh 和 adresl 。 adc_value 是用户定义的整数变量,用于存储10位a/d结果。 pressswitch 是输入端口rc0,因为轻触开关处于打开状态,所以它为高。 adresh 和 adresl 是8位内部寄存器,用于存储10位a/d转换结果。最低有效8位存储在 adresl 中,其余2个最高有效位存储在 adresh 中。
将寄存器和变量添加到监视窗口
正如我之前提到的,在在线调试中,只要执行一条指令,在实际的硬件电路中也会观察到其效果。例如,当执行 lcd_init()例程时,lcd屏幕上会出现一个闪烁的光标。这表明您 lcd_init()例程和您的lcd硬件接口都正常工作。
当lcd_init例程处于运行状态时,会出现一个闪烁的光标。执行
按住[f8]键,直到执行 lcd_out(1,1,txt),您将看到显示的“ txt”字符串在液晶显示屏上。继续按下[f8]功能键,单步执行将继续直到达到 if(!pressswitch)条件。默认情况下,读取温度开关处于打开状态,而 pressswitch 为“ 1”,因此不满足 if条件。因此,如果再次按下[f8]键,执行将跳至 while(1)语句。它将继续在 if 和 while 语句之间来回移动,直到您按下电路板上的read temp开关。
等待直到按下read temp键
当 if(!pressswitch)指令以蓝色突出显示时,按 read temp 切换并点击[f8],执行将进入if语句内。按[f8]键将再次执行单步执行。当执行 adc_read(0)时, adc_value , adresh 和 adresl 的值也会改变。 监视窗口。
在if语句中的执行从按下“读取温度”按钮(pressswitch = 0)开始执行
监视窗口中的adc_value显示adc结果
接下来,显示 adc_value 和 temp lcd_out(1、7,temp)时,将更新em》变量并在lcd上以°f为单位显示温度。
运行到光标 [f4]和 breakpoint 功能,以加快调试过程。使用[f4]功能键,可以让程序执行直到到达光标位置。类似地,使用断点允许将故意停止放置在所需的程序行上。下表显示了mikroicd中各种调试功能键的摘要。此外,在调试过程中,您还可以从监视窗口修改程序变量的值。 用户手册中描述了mikroicd调试工具的更高级功能。
mikroicd调试工具中的主要功能键


矩阵式键盘使用方法
英特尔为2018年韩国平昌冬奥会提供5G网络支持
凭借小小卡贴,华强北手机批发商一夜可净赚数百万
声光报警器接线图解大全
如何解决EMC设计中的串扰问题?
PIC单片机的在线调试说明
台湾经济部门投审会批准2项重大投资案
美国开始测试内置模拟人脑芯片的计算机
医疗废物智能管理系统
是德科技在IxNetwork以太网测试解决方案中添加新综合测试套件
电线电缆烟密度测试仪
纽曼T02开关电源适配器LA-300电路原理图
dds图片,PS怎样打开DDS图片
基于STM32单片机的摇头风扇设计
锤子数码科技再曝被限制高消费?
解析步进系统的运行精度问题
华为今年2月推笔记本电脑 PK苹果还是联手微软?
PCB技术.技巧、经验、文摘集锦
35kv高压真空断路器的日常维护
TikTok申请临时禁制令以阻止政府禁令生效