PIC单片机的在线调试说明

电子说

1.2w人已加入

描述

在线调试器(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调试工具中的主要功能键
       责任编辑:wv

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分