问题标签 [pic24]
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.
bootloader - PIC24FJ128GC006的Flash烧写问题
我正在为 PIC24FJ 制作 USB 引导加载程序。我现在正在通过软件将应用程序代码十六进制文件写入闪存,而不使用 ICD3。下载应用程序代码 hex 文件后,我使用 MPLAB Window Toolbar 的 PIC Memory Views 检查了 PIC 的程序存储器,这就是它的样子。PIC24_BOOT_APP_VECTOR_AREA如图所示,操作码并不是连续写入每个地址的。它与 000000 交替出现。
我还将使用引导加载程序下载的应用程序代码的操作码与不使用引导加载程序的应用程序代码进行了比较。我发现操作码中的某些数据并不单独存在于应用程序中。附上照片。Application_Code_Alone_User_Area , PIC24_Boot_App_User_Area这可能会在跳转到应用程序时产生问题。
下面是我在缓冲区中存储数据并写入闪存的代码。(我对闪存使用单字编程)
bootloader - 无法为 PIC24FJ128GC006 的链接描述文件定义 __BOOTLOADER
我正在为 PIC24FJ128GC006 制作一个 USB 引导加载程序,我将为引导加载程序和应用程序代码映射部分闪存。我将 Microchip MLA v2015_08 USB 设备引导加载程序中的链接描述文件添加到我的 PIC24FJ 代码文件中。
在链接器文件中,__BOOTLOADER
必须定义 才能访问0x400
地址区域。
在我的引导加载程序代码的 main.c 中,我已经有了#define __BOOTLOADER
,但是当我使用 ICD3 将引导加载程序代码编程到 PIC 并使用 MPLAB 窗口工具栏的 PIC Memory Views 检查程序存储器时,数据被写入0x4002
地址和不在0x400
.
可能是什么问题?
interrupt - 这是在 PIC24 上禁用中断的安全方法吗?
我正在开发一个使用 Microchip PIC24FJ256GA702 的项目。几天来,我一直在寻找一些 UART 代码的间歇性错误。它使用中断服务例程 (ISR) 来传输名为的缓冲区char txBuff[]
及其长度int txLen
。
在主要(即不是 ISR)代码中,我偶尔会访问缓冲区以添加字节或查看还有多少字节要传输。为了确保主代码看到缓冲区的干净副本,它具有以下形式的关键部分:
有几种方法可以禁用此 PIC 上的 ISR。包括:使用DISI
指令,或清除GIE
位,或改变中断优先级。
但我选择了清除中断以启用 中特定中断位的位IECx
。在这种情况下,它是 IEC1bits.U2TXIE,因为我使用的是 UART2。我这样做是因为它很简单,它不会禁用不相关的中断,而且它在我的其他项目中一直运行良好。所以在 C 中,关键部分是:
反汇编清单开始:
问题:我现在相当肯定 ISR 偶尔会在调用ISR 之前的read txLen
值copyOfTxLen
最终成为txLen
ISR 之前的值,但关键部分的其余部分会看到变量处于调用 ISR 之后的状态。
问题:我的代码有问题吗?如果是这样,如何避免故障?
一些背景:
- UART 以 8 MHz 的 PIC24 时钟高速(250 kBaud)运行,每 160 条指令一个字节,因此 ISR 非常繁忙,与我以前的项目相比,我认为这增加了达到竞争条件的机会。
- 我看到dsPIC33/PIC24 系列参考手册/中断,第 2.3.1 节注 2 说“在清除 GIE 位和禁用中断之间存在一个周期延迟。” 现在这是指
GIE
,不是U2TXIE
,我不确定它是否会导致我看到的问题,因为该MOV
指令是 2 周期指令。但是,这似乎是一种诱捕粗心的程序员的狡猾方法。 - 如果我尝试调试它或添加任何调试代码,那么已经非常间歇性的问题就会消失(感觉就像一个竞争条件)。我不想在
NOP
不知道为什么要添加的情况下添加一些 s,因为除非你真的修复它们,否则竞争条件总是会咬你。
sleep - PIC24FJ128GA204无法从深度睡眠中唤醒
我一直试图将我的 PIC 控制器从深度睡眠中唤醒,但我无法唤醒它。根据数据表,它说有 3 种方法可以唤醒它:1)RTCC 警报 2)外部中断 3)深度睡眠看门狗定时器(DSWDT)
我正在使用第三个选项,因为 RTCC 有点难以初始化,并且外部中断不适合我的项目,所以我决定使用 DSWDT。
下面是我的深度睡眠功能。它消耗 80 uA 电流,而在数据表中声称它在深度睡眠中消耗 66 nA。
为了唤醒它,我在预处理部分配置了深度睡眠看门狗定时器。我将其更改了 4.2 秒,但它甚至无法调试。编译器指出振荡器有问题。我认为深度睡眠看门狗定时器的时钟不好。我想初始化或配置什么?
这是我的预处理配置:
c - MPLAB IDE x 3.55 在项目中包含文件的最佳方式
我正在编译一个使用 USB 作为数据记录器的项目。主机 PIC micro 是 PIC24FJ,但是编译器总是抱怨没有这样的文件或目录。我尝试了以下方法来包含编译器应该能够找到和包含的那些文件。
1:在左侧项目窗格的头文件下添加。
2:通过项目属性->常规->添加添加。
3:通过Project Properties -> XC-16-gcc -> option categories -> Prepocessign and messages -> c include dirs 添加。
我使用了相对路径和绝对路径。所以我真的很困惑在 MPLAB IDE x 中包含目录和文件的最佳方式是什么。
c - 错误:二进制的无效操作数>>(有'float'和'int')
我正在尝试将 float 转换为 C 中的按位 int。这是我的代码片段:
我收到以下错误:
在尝试编译时。在这里,temperature_offset 是一个浮点类型,我试图将它转换为高整数和低整数,因为我试图将数据以 16 位块的形式保存在 EEPROM 中(因为我使用的是 16 位微控制器)。我知道“>>”不适用于浮点类型。我该如何解决这个问题?
c - MPLABX - PIC24FJ1024GB610 - 多重定义错误
我正在使用MPLABX为C中的PIC24FJ1024GB610微控制器编写一个简单的 gpio 程序。我创建了两种与 Arduino 引脚方向和数字写入方法类似的方法。我有 2 个 .c 文件和 3 个 .h 文件:
- 主程序
- gpio.c
- 主文件
- gpio.h
- 板子.h
当我构建代码时,我收到一条错误消息,指出我有一个名为`_TRIS_REG'的数组的多个定义。该数组在gpio.h的底部声明。当我将所有代码从gpio.c移到main.c并且代码运行良好时,错误就消失了。将代码移回gpio.c 后,我再次收到错误消息。
主程序
gpio.c
主文件
gpio.h
板子.h
错误
很抱歉,代码中没有任何注释,我刚开始写,无法弄清楚。任何帮助将不胜感激。
microcontroller - 仅 AN0 无法在 pic24f 上接收多个模拟输入值
我正在从传感器接收数据到我的 pic24f 板,但只显示来自 an0 的值,而不显示 an1。
我是微芯片板的新手,需要帮助。我知道只有 1 个 A/DC,所以需要一个循环来处理每个模拟输入。
这是我使用的下面的代码。
我不确定我是否正在初始化模拟输入以使其正常工作。显然 an0 有效。我什至将 an0 放在 case1 中,但值不是 an0 给我的。
microcontroller - PIC24FJ64GA002 中的 PWM 设置
美好的一天,我正在使用 PIC24FJ64GA002 微控制器,并且正在努力让 PWM 为我想要使用的伺服系统工作。我的代码如下:
我将 T1CON 的周期设置为 2 ms,而 OC1R 的周期为该周期的一半,这将导致占空比为 50%。我正在使用 FRC 振荡器 (8MHz),我的预分频器值为 <0,1>。我知道是 OC1R 引脚给出了周期为高的周期,但在数据表中,他们将其称为引脚,但是他们没有给出它是什么引脚(即 A0、A1、R15 等)。我也可以找到很少的示例代码来解释如何很好地编码。如果有人是某种帮助的PIC专家,将不胜感激!MCU 的数据表可在https://www.microchip.com/en-us/product/PIC24FJ64GA002下载。
c - 显示控制PIC24FJ128GC010
我在 MPLAB® Starter Kit for Intelligent.Integrated.Analog 上使用 PIC24FJ128GC010 和编译器 XC16。我将读取 16 位 Sigma-Delta ADC 并在 LCD 显示器上显示结果。我在 C 语言中找到了一些用于电路板的示例代码,但它现在不起作用。当我运行代码时,编译器没有出错,但他在每个“LCDPSbits”下划线。和“LCDREFbits”。红色,显示屏上不显示任何内容。这是我最新状态的代码。谁能帮我?