问题标签 [dspic]
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.
mplab - 从数组中的实时数据中检测峰值
我通过使用 dsPIC33FJ32MC204 控制器将幅度为 3V 的正弦波与 1.5V 的正弦波连接到 12 位 ADC 通道,并存储在一个数组中。我想检测每个间隔的峰值,所以请给我任何建议。我刚刚发布了五个样本中最大值检测的逻辑。我的输出为零。
pic - Microchip dsPIC33 同时启动所有 PWM
在 Curiosity 板上使用 dsPIC33CK256MP508。
尝试在高分辨率模式下运行 4 个 PWM 发生器。
我将以单循环模式运行它们。试图弄清楚如何同时启动所有 4 个信号,或者从同一个事件中触发它们,但我无法理解这个外围设备相当复杂的触发安排。
数据表显示的图表似乎表明它们都从相同的时基运行,或者至少它们似乎都在完全相同的时间开始,但实际上,随着每个 PWM 发生器启用或使用 PGxSTAT 位启动一个周期。 TRSET,每个循环将按顺序启动,因为它们是由顺序命令在不同时间启动的。
是否有捷径可寻?理想情况下,我想写一点,甚至驱动一个引脚或其他东西,以便每个发电机同时启动。只要它们同时开始,触发器和它们实际开始之间可能会有一些延迟。
谢谢你。
c - 从 UINT16 到 UINT8 提取和组合位的更快方法
我正在为我所需的特殊提取和组合操作寻找一种更快的方法,如下所述:
为简单起见,上面只是一个 8 位示例,同样适用于 16 位值。它应该在 dsPIC33F 微控制器上尽快实现。
C中的简单方法是:
这将产生大约。40 条指令(使用 O3)在我的情况下对应于 1µs。
如果可能,应减少指令周期的数量。在 C 或内联汇编中有更快的方法吗?
pic - EZBL_EraseAll 或 EZBL_NVMKEY 在 mplab x IDE 版本 5.4 中不起作用
我有一个为 mplab x IDE v4.2 工作多年的引导加载程序。它与 XC16 1.35 一起编译。
我们正在更新它以在 MPalb x IDE v5.40 上使用。我已经能够通过创建一个 ezbl 示例并用我的 4.2 版代码替换文件来做到这一点。
我不得不对某些文件进行一些小改动(只是在最新版本中没有定义几个未定义的端口)。
我的引导加载程序在 SD 存储器中搜索固件更新并将其刻录到闪存中。正如我所说,这段代码在 4.2 中运行良好
这里的问题是 EZBL_EraseAll 没有在 5.4 版本中删除闪存。如果我将其设置为详细模式,我会得到:
写操作也不起作用
当显示读取时,某些扇区是 FFFF,特别是最后一个扇区,并且写入操作不会修改它们。
EZBL_NVMKey 设置为 0xFC21
好吧,我想知道为什么相同的代码适用于 4.2 版而不适用于 5.4 版,即使编译器在两种情况下都是 XC16。
我的一些日志:
提前致谢。
c - 如何在 dsPIC33F 上正确设置 DMA
我有其他人编写的代码(对于 dsPIC33FJ128MC706A) - 它初始化UART1
和 PWM 并在中断中使用忙等待U1Rx
来获取 14 个字节,如果新数据到达,则 timer1 中断以更新 PWM 寄存器(已调试 - 它进入_U1RXInterrupt
数据何时发送)
我尝试修改它以使用 DMA 而不是忙等待。我在初始化中没有任何改变,但在初始化 UART 后调用了以下函数:
这是基于FRM 中的示例 22-10,有一些细微的变化(UART1
receiver 而不是UART2
)。我似乎找不到其他不使用库函数的示例(在遇到这些示例之前我什至不知道存在)。(另外,为了与我得到的代码保持一致,我在_ISR
之后void
而不是创建interrupt
一个属性,但这并没有改变任何东西)
在示例中,接收器没有中断UART1
- 但根据 FRM,它应该被启用。对我来说,我不需要自己清除中断标志是有道理的(如果我需要使用 CPU,它会有点违背 DMA 的目的)。
然而,当我发送数据时,DMA0Interrupt
不会触发断点,但默认中断上的断点会触发,而且我有PWMIF=1
and U1RXIF=1
。我还尝试注释掉默认 ISR 并添加一个_U1ErrInterrupt
即使检查标志我没有注意到任何错误标志被引发,只是正常的U1RXIF
.
我不明白为什么会发生这种情况。我根本没有更改 PWM 代码,当我在_U1RxInterrupt
. 我什至不明白 DMA 设置如何导致 PWM 错误。
该U1RXIF
标志似乎告诉我 DMA 没有处理传入的字节(我假设是 DMA 清除了标志),这再次与“我在这个 DMA 设置中做错了什么”这个问题有关
UART初始化代码:
在一般初始化函数中(由 调用main()
)
也被 main 调用:
(原始代码作者的评论)
interrupt - iexternal 中断函数 dspic33f 的意外行为
我拼命尝试完成的项目在微控制器编程方面相当简单。我使用的 dspic33fj128mc802 基本上要做 3 件事:
通过UART接收数据并将其转换为伺服电机的PWM信号
定期唤醒其 ADC 以检查电池电量
输入外部中断时更改其波特率工作值。
这是导致问题的最后一点。在我的电路中,我有一个开关。一个位置对应一个波特率值,另一个位置对应第二个值。我没有找到任何关于如何在任何电压电平变化时触发中断的文档,所以我结合使用上升沿和下降沿触发来检查我为中断选择的引脚的当前状态。
此外,我的代码中还有另外两个中断函数,一个用于 UART 接收,第二个是用于定期唤醒 ADC 的定时器中断。中断优先级如下:UART -> 1,定时器 -> 2,外部中断 -> 6(实际上是 2 以上的任何数字)。
这是我的中断代码:
现在奇怪的行为->当将引脚拉低时,波特率设置为正确的值,UART通信完美。当拉高时,之前的通信不再起作用,证明波特率已经改变,但是将新的通信设置为新的波特率也不起作用。LED 状态更改也可以正常工作。
需要注意的是,这个项目的所有不同方面都经过了多次测试,每个部分都运行良好,只是添加了这个外部中断导致整个事情崩溃。微控制器工作正常,我的波特率值很好,我的电路已经过测试并且没有问题......我想我不知道如何正确使用外部中断。
c - Microchip C 内联汇编不会为内联汇编中的立即数生成前缀
我试图memcpy
在 asm 中实现我自己的功能。CPU是dsPIC33F,编译器Microchip C30。
当len
是变量时,这很好用:编译器选择一个寄存器并且没有问题。但是什么时候len
是编译时常量(例如 10),汇编器说:Error: Invalid operands specified ('repeat 10').
这是因为微芯片汇编器要求#
在立即数之前:在源代码中repeat #10
使用#%2
是不可行的,因为如果编译器选择了一个寄存器,那将会中断。
它是微芯片编译器的错误吗?
有什么方法可以编写可以正确扩展为
repeat reg
or repeat #imm
for "ri"
or的内联 asm"g"
吗?
spi - 使用 16 位处理器 (dsPIC) 读取 32 位 SPI 数据
我正在将 M90E32AS 电能表 IC 与 dsPIC33F 系列处理器连接。我成功读取了电压和电流值。我也尝试读取功率值,根据数据表,功率寄存器为 32 位宽。我尝试使用以下代码读取 32 位值,但没有成功。帮助我纠正错误。
这是电源寄存器的数据表屏幕截图
microchip - 如何在 Microchip Data Visualizer 中绘制浮点数
我在通过 UART 发送浮点数以绘制在 Microchip 的数据可视化器上的图表中时遇到问题。
int
我可以毫无问题地绘制数字,但浮点数让我发疯。
我用 Laplace trnasform 做了一个正弦波。之后通过双线性 z 变换将其放在“z”平面上,然后将方程放入 dsPIC33FJ128GP802 的主程序中。它工作正常。在终端中,我可以看到这些值,如果我在 gnumeric 上复制/粘贴这些值并制作图表,它会显示我的离散正弦波。
当我尝试在 MPLABX 的数据可视化器中绘制浮点数“yn”时,问题就出现了。我在中间缺少一些东西。
我在 Debian Bullseye 上使用 MPLABX v5.45、XC16 v1.61。与微控制器的通信是透明的@9600-8N1。
这是我的主要代码:
方程中的变量
像#define
这样
和WriteUART1(0x03);
用于WriteUART1(0xFC);
Data Visualizer 查看第一个字节和最后一个字节。就像 Microchip 视频中的示例一样。
问题是:如何管理yn
要由 Microchip Data Visualizer 绘制的浮点数。
提前致谢。
timer - 我想使用两个不同的时间通过单个 UART 发送和接收数据
我想使用 10ms 和 1ms 的定时器通过单个 UART 发送和接收数据。如果设置了 1ms 定时器标志,则 10ms 传输应该停止,其他应该开始,因为 1ms 传输是紧急的。完成后,第一个应该恢复。dspic33ep微控制器系列怎么做?
注意:Uart 可用性受应用程序限制。