问题标签 [mplab]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
10313 浏览

c - LCD 库 - MPLAB X

我正在尝试理解 Pic16F887 上的这个 LCD 示例; http://www.mikroe.com/chapters/view/17/chapter-4-examples/#c4v12

但编译器不断向我显示错误:

源代码 (lcdp16.c)

谁能向我解释发生了什么?我应该创建一个自定义 LCD 库,以便编译器可以识别类似Lcd_Init()或什么的方法吗?(Windows 7 / XC8 / MPLAB X)

0 投票
1 回答
1491 浏览

c - 使用 C30 和 MPLAB X 的 switch 语句的奇怪行为

我正在用 C30 和 MPLAB X 试验一个奇怪的问题,我有这段代码:

当 mode 等于 'L' 字符时,开关不会按应有的方式进入“case 'L'”,而是进入 if 语句。但是当我以这种方式更改我的代码时:

它完美地输入了 switch 语句。其他情况的定义如下:

我正在使用 C30 编译器 v3.31 和 MPLAB X v1.41。希望您能够帮助我。

谢谢


编辑:

好的,根据答案和评论,我以这种方式更改了我的代码:

如果在 switch 语句之前我写:

switch 语句工作得很好,但是当我从 UART 得到一个“L”时,函数 ReadUART1() 返回和 unsigned int:

它根据我的调试器返回“L”,它对应于 unsigned int 中的数字 76,switch 语句不起作用,但模式仍然是“L”。即使我将模式更改为 unsigned int 以与功能相同,它也不起作用。我想我将不得不使用 if() 语句。

0 投票
1 回答
188 浏览

embedded - PIC24 读或写存储器访问断点

我的环境...

  • PIC24
  • MpLab (V.8.80)
  • ICD 3

我有一个我想观察的字节,以查看哪些例程正在读取,哪些例程正在实际写入,以及何时发生

我只能设置断点

  • 当字节被写入时,或
  • 当它被阅读

有谁知道我可以在任一访问上设置断点的方法?即,我想看看写了什么,读了什么,以什么顺序,通过哪个指令,在哪个例程中。

我只有一个 PICkit 3 和这个 ICD-3。这是一个双处理器系统,其中两个芯片通过一些连接(最终通过外设引脚选择)到各自的 UART 的电线进行通信

我从来没有使用过、接触过,甚至没有见过真正的冰。那会让我这样做吗?即,任何总线内存访问。

这就是 MpLab 让我现在用 ICD-3 做的事情 在此处输入图像描述

0 投票
1 回答
364 浏览

c - C18:编译器会“知道”函数调用永远不会返回吗?

我正在使用 C18 在 PIC18 上构建 16 状态 FSM。我正在考虑将每个状态作为自己的函数,它会跳转到其他状态并被其他状态跳转。我很想在每个状态的末尾写一个“state##();”的分支案例来确定程序应该去哪里,但我认为这会很快死掉,因为编译器可能会期望这个回归,而不是永远的分支;我的微控制器上的堆栈会很快填满并最终溢出。

C18 是否足够聪明,知道我的函数调用永远不会返回并相应地用 GOTO/JMP 而不是 CALL/BRANCH 替换指令?我知道 GOTO 存在于 C 中(出于可读性原因,通常强烈建议不要这样做),但我想不出比这里更合适的理由来使用它。我知道我可以强制它使用 _asm _endasm 块转到,但如果没有必要,我会为自己省去麻烦。在 C 语言中说去一个函数并且永远不会回来的最好方法是什么?

自然,感谢所有帮助

0 投票
2 回答
4498 浏览

c - 使用外部结构时 XC8 中的冲突声明

我有一个结构变量,在 .c 文件中定义:

为了使它在其他文件中可用,我有一个 .h 文件:

这适用于 Microchip C18 编译器。XC8 编译器给出错误:

0 投票
1 回答
8103 浏览

c - MpLab 链接错误:无法分配节(C30 编译器)

我将这两段代码放在一起(最初在This Question Here中描述)。

我现在刚刚从 MpLab (Microchip MPLAB C30) 遇到了这个错误

最奇怪的是,我在编译器手册(Microchip 出版物 DS51284F)中查找了该消息,甚至该消息的子字符串,但一无所获。

我什至查找了allocate一词,只找到了三四次,从未出现错误消息。

在将这两段代码放在一起之前,我在 0x8000 处定义了一个段,用于将数据从Thing-X移动到Thing-Y的“大块”内存

我将在 0x8000 定义的数据区域缩小到 1 个单独的字节,但我仍然收到此错误。

我没有在 Microchip 的编译器手册 DS51284F 中看到此消息。以前有没有人解决过这个问题?

链接器有不同的手册吗?

有没有办法让我获得一个内存映射来查看我的内存区域在哪里?

0 投票
1 回答
2938 浏览

accelerometer - 多个寄存器/设备的 i2c

我刚刚使用 i2c 从 PIC 微控制器 (dsPIC33) 成功读取 ADXL345 加速度计。到目前为止,我所做的只是正确读取设备 ID,它是一个字节。

以前使用过 ADXL345 的任何人都知道,要从 X、Y 或 Z 轴中的任何一个轴读取数据,会分为两个字节,例如“DATAX0”和“DATAX1”。数据表还特别指出“为确保数据一致性,建议使用多字节读取来从 ADXL345 检索数据”,因此需要将每个轴的两个字节收集在一起。

我的问题是,对于 i2c,当每个轴的两个字节由两个不同的寄存器表示时,我该怎么做?

i2c 进程

上图显示了 i2c 传输所需的过程。要从加速度计中读取数据,我们正在查看底部的两个图表,我上面粘贴的数据表引用表明我使用了底部图表(多字节),但正如我所说,这两个字节有两个不同的寄存器值(DATAX0 和 DATAX1 分别为 0x32 和 0x33)。

如何一次抓取一个轴的数据?我看到这样做的唯一方法是用一个寄存器地址读取单字节,然后用第二个寄存器地址再次读取,然后将两者连接在一起以获得一个轴数据。

这个问题也适用于从同一 i2c 总线上的各种不同设备收集数据,这些设备也会有不同的寄存器。

干杯!

0 投票
2 回答
1750 浏览

c - 如何处理像这些寄存器这样的结构中的所有字段?

如果您对微控制器进行了编程,您可能熟悉操作给定寄存器的选择位,或将一个字节写入整个事物。例如,在使用 C 的 PIC 上,我可以将整个字节写入 PORTA 以设置所有位,或者我可以简单地寻址 PORTAbits.RA# 以设置单个位。我试图模仿这些结构/联合的定义方式,这样我就可以对程序中的变量做同样的事情。具体来说,当微控制器打开时,我希望能够重置我自己定义的寄存器,例如

相对

等等

显然前者更加优雅,节省了大量的行空间。微控制器的头文件是这样的:

...对于每个寄存器,并且具有多个字节的寄存器使用结构的联合作为其寄存器位。由于我的初始化/声明位于主源文件而不是标题中,因此我已将 extern 删除并靠近我的:

...但是在编译时,InReg 和 InRegbits 被定义为内存中的两个独立位置,这意味着我无法写入 InReg 来更改 InRegbits。如何更改它以使其正常工作?我要复制的那个是不是因为它是一个特殊的微控制器寄存器才起作用?

谢谢你的帮助

0 投票
4 回答
9770 浏览

embedded - 在当前 PC 0x0 处未找到源代码行

我在使用 MPLAB X IDE 时遇到问题。我有一个带有主要部分的 main.c。

当我尝试调试时,我不能。它说没有找到源代码行。我已经编译了软件并在 MPLAB IDE 中调试没有问题。我觉得 MPLAB X 中有一个设置或其他一些我缺少的基本设置。

虽然我不确定它是否有用,但为了提供信息,我使用 PICKit2 进行调试,MPLAB X IDE v1.51,PIC16F876 uC。

main.c 中的主要代码:

当我尝试调试时,我在调试器控制台中得到以下信息:

0 投票
1 回答
466 浏览

java - 是什么导致 Java 库在被 JRuby 调用时表现不同?

我是 Java 世界的新手,但对 Ruby 很熟悉。我正在尝试编写一个与一些第三方 jar 文件交互的程序。

虽然如果从 Java 调用这些库似乎表现良好,但当我在 JRuby 中调用它们时它们的行为不正确。这是一个问题,因为我真的很想使用 JRuby。例如,下面的两个程序尝试做完全相同的事情,但它们产生不同的输出:

该 Java 程序运行正常。

我在 Netbeans 中开发了下面的 Java 程序并按 F6(运行主项目)运行它。项目的 Libraries 文件夹设置为“C:\Program Files (x86)\Microchip\MPLABX\mplab_ide\lib\nblibraries.properties”。当我运行它时,它会打印“pins: 17”。

这个 JRuby 程序的行为不正确。

我只需键入即可运行下面的 JRuby 程序jruby bug_reproduce.rb,它打印出“pins: 0”。我希望它像 Java 程序一样打印“pins: 17”。

更多细节

大约有80个第三方jar文件。它们由 Microchip 作为MPLAB X的一部分提供,并为其微控制器实现模拟器。jar 文件随 MPLAB X 一起提供,我还下载了MPLAB X SDK以获得使用它们的帮助。我正在使用库的许多未记录的功能,但我没有看到任何替代方案。

我正在使用 Windows 7 64 位 SP1。我在“程序和功能”下安装并列出了以下与 Java 相关的东西:

  • Java 7 更新 17
  • Java 7 更新 17(64 位)
  • Java SE 开发工具包 7 更新 17(64 位)
  • Java(TM) 6 更新 22(64 位)
  • Java(TM) 6 更新 29
  • Java(TM) SE 开发工具包 6 更新 22(64 位)
  • JRuby 1.7.3
  • IntelliJ IDEA 社区版 12.0.4
  • Netbeans IDE 7.3
  • MPLAB X IDE v1.70

我曾经System.getProperty("java.version")验证我的两个程序都在 Java 1.6.0_22 下运行。这很好,因为我遵循了 MPLAB X SDK 中的说明“为了获得最佳效果,请使用与构建代码将与之通信的 IDE/MDBCore 完全相同的 JDK。对于 MPLAB X v1.70,这是 JDK 6u22来自甲骨文。” 遇到这个问题后我只安装了JDK 7u17,并没有什么不同。

我能够找到示例中确定的特定问题的解决方法,但随后我继续开发并遇到了库行为不同的另一个问题。这让我觉得我在使用 JRuby 的方式上做错了什么。

考虑到不同的类路径可能会导致这个问题,我尝试让 java 程序打印出它的类路径,然后编辑我的 JRuby 程序以精确地要求该列表中的文件,但这没有任何区别。

问题

  • 您是否知道从 JRuby 而不是 Java 调用时可能导致 JAR 文件中的代码行为不同的任何事情?
  • JRuby 1.7.3 使用什么版本的 JDK,或者这个问题是否有意义?

更新:已解决

感谢 D3mon-1stVFW 真正获得 MPLAB X 并为我解决了我的问题!对于那些对细节感兴趣的人:引脚数为 0,因为引脚在使用 PinSet.getPin(String) 访问时是延迟加载的。通常所有引脚都会被加载,因为外围设备会加载它们,但在 JRuby 下没有检测到外围设备。这是因为找不到外围文档。这是因为 PerDocumentLocator.findDocs() 返回了一个空列表。PerDocumentLocator 失败,因为com.microchip.mplab.open.util.pathretrieval.PathRetrieval.getPath(com.microchip.mplab.libs.MPLABDocumentLocator.MPLABDocumentLocator.class))返回了错误的东西。

考虑下面的代码,它类似于 PathRetrieval.getPath 中发生的事情(除了它是用 Java 编写的):

如果我遵循 D3mon-1stVFW 的提示并将 JAR 文件添加到 $CLASSPATH,那么该代码将返回:

文件:C:/Program Files (x86)/Microchip/MPLABX/mplab_ide/mplablibs/modules/com-microchip-mplab-libs-MPLABDocumentLocator.jar!/com/microchip/mplab/libs/MPLABDocum entLocator/MPLABDocumentLocator.class

但是,如果我不向类路径添加东西,那么该代码会奇怪地返回:

文件:C:%5CProgram%20Files%20(x86)%5CMicrochip%5CMPLABX%5Cmplab_ide%5Cmplablibs%5Cmodules%5Ccom-microchip-mplab-libs-MPLABDocumentLocator.jar!/com/microchip/mpl ab/libs/MPLABDocumentLocator/MPLABDocumentLocator。班级”

%5C 实际上是反斜杠的代码。PathRetrieval.getPath 中的 Microchip 代码执行大量字符串操作,并且无法正确处理斜杠由 %5C 表示的情况。如果有人对 %5C 出现的原因有任何进一步的了解,我很想知道,但我的问题已经解决了。

结论:有时 Java 的getResource()会返回一个带有 %5C 而不是斜杠的 URL,这会受到 CLASSPATH 上的内容的影响。如果您想安全起见,请在需要之前将 jar 文件添加到 $CLASSPATH,如下所示: