问题标签 [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 投票
1 回答
4610 浏览

c - ADC dsPIC33 问题

我正在努力让 ADC 与我的设备一起工作。我正在使用 dsPIC33FJ128GP802 并尝试通过手动采样和转换来缓慢启动。

我的代码发布在下面,我已经为 ADC 设置了每个寄存器,然后尝试仅采样一次以从我连接的传感器获取电压。我应该看到的值大约是 0.7V,但我得到的是 -17408(10111100 00000000)区域。这可以上升到 -2000 左右,但该值首先不应为负。

我使用 PIC 使用的相同轨道为传感器供电,并且我将传感器的输出连接到 AN0(引脚 2),正如我在代码中设置的那样。PIC 由标准 Vss 和 Vdd(引脚 8 和 13)、模拟电源引脚 AVdd 和 AVss(引脚 28 和 27)以及 Vcap 和 Vss(引脚 20 和 19)之间的 33uF 电容器供电。我还需要在硬件方面做些什么吗?我对 AD1CHS0bits.CH0NA 寄存器有点困惑,因为我不知道是否必须将地连接到 VREFL 或在这种情况下该怎么做。

任何关于我应该做些什么来纠正这个问题的帮助将不胜感激!此外,任何有关如何在正确接收到值后转换值的帮助都将非常有帮助。

0 投票
1 回答
5148 浏览

accelerometer - I2C 采样率

我在尝试使用 dsPIC33f 微控制器对 I2C 从设备进行采样时遇到问题。

我正在使用 PIC 内部 timer1 计时器以定义的采样率“滴答”并获取必要的数据。不幸的是,获得结果的速度不够快,我不知道为什么。我的从属设备之一是 ADXL345 加速度计,它的最大输出数据速率为 3600Hz。我几乎不需要这么高,但我似乎没有在 50Hz 以上的任何地方成功采样。

I2C 设置为 400KHz 的“快速模式”。我想要对加速度计进行采样的绝对最大值是 1KHz,虽然这有点矫枉过正,但我​​真的对 128Hz 更感兴趣。我设置的加速度计的参数是:

  • 数据格式 (0x31) - 自检关闭、中断反转关闭、全分辨率开启、对齐位关闭、范围位 +/-16g。
  • 数据速率 (0x2C) - 低功耗模式关闭(正常模式),输出数据速率模式 400Hz(我在数据表中读到 400KHz I2C 仅支持高达 800Hz,所以我在使用 400Hz 时比较安全)。
  • 电源控制(0x2D)——自动睡眠关闭,测量模式开启,睡眠位关闭,睡眠模式采样率8Hz(虽然没有使用,所以可以忽略)。
  • 中断 (0x2E) - 启用数据就绪中断,其他一切都关闭。

我正在使用 timer1 以指定的采样率进行采样,我知道采样率工作得很好,因为我有一个计数器,它会在计数器达到一分钟后输出一条消息;我用秒表来确保它是正确的。例如,在 100Hz 采样率下,我等待计数器计数到 6,000 (100 * 60) 并显示一条消息,如果秒表在 1 分钟时看到该消息,我知道它至少在一定程度上进行了采样。

当我尝试仅从加速度计采样(I2C 多字节读取模式,一次调用读取所有六个字节)时,它的执行速度不够快。使用我的秒表方法,它似乎需要大约一分 15 秒来完成一项应该需要一分钟的工作(以 100Hz 采样),即它处理 I2C 命令的速度不够快。更高的采样率会增加更多的延迟。

我感觉这与 I2C 时钟和 timer1 未同步有关,因此在我对加速度计数据的调用中存在不必要的等待。我无法想象 I2C 的 400KHz 时钟是不够的,但如果我错了,请纠正我。

我应该如何正确地从 I2C 从设备读取数据?我还有一个陀螺仪和磁力计,我想以足够高的采样率读取它们,磁力计的限制为 160Hz,所以正如我所说,128Hz 的采样率对于所有三个设备都很好。尝试同时读取所有三个设备显然会增加比预期慢的采样速度。

我还将同时从 4 个引脚(ADC 10 位)收集模拟数据。这段代码已经实现,我可以读取 1KHz 的模拟数据,采样率按预期工作,只是 I2C 设备运行缓慢!

我希望加速度计在尝试以 100Hz 采样时会很好,那时我可以以 3600Hz(I2C 的最大 800Hz)输出,但它真的很挣扎,我不知道还能尝试什么。

干杯!

0 投票
2 回答
11154 浏览

c - 需要常量表达式

不编译。我收到错误(6 次):需要常量表达式

每个变量都声明为无符号字符。我尝试过强制转换为 (const) ,但没有成功。

这是 MPLAB X IDE,C 语言,使用 Hi-Tech-PICC 编译器 v9.65PL1。

问题是什么?

当我如下定义变量时它可以工作,但我需要使用上面的变量。

0 投票
1 回答
4538 浏览

serial-port - MPlab 中的 RS232 通信

我正在使用 MPlab 从 pic 微控制器读取数据。我正在使用 pic18F87J11。我要读取的数据在 RS232 的 DB9 的引脚 3 上,我的 RS232 连接到 pic 微控制器。谁能帮助我或给我一个简单的示例代码来做到这一点?

谢谢,

0 投票
1 回答
601 浏览

c - 当使用 -Wmissing-prototypes 时,如何抑制 GCC 警告没有中断例程的原型?

我正在使用 MPLABX(Microchip 产品的 IDE)和 XC16 编译器(基于 GCC)在 C 中编写嵌入式代码。

-Wmissing-prototypes用来确保我的所有功能都有原型。我的问题是我有很多中断服务例程,这导致编译器也抱怨缺少这些的原型。

因为用户软件从不直接调用 ISR 函数,所以我不想将它们的原型放在我的代码中的任何位置。

除了中断服务例程(即,用 标记的函数)之外,有什么方法可以显示缺少原型的警告__attribute__((interrupt,auto_psv))

0 投票
2 回答
594 浏览

c - 让 C18 抛出编译器错误

有没有办法让 C18 编译器在编译期间抛出自己的自定义错误消息?

例如,考虑具有两个用户定义设置的情况:

假设这些设置不能同时是 0x00. 当用户将两个设置都设置为 时,有没有办法让编译器抛出错误(或至少是警告)0x00

0 投票
1 回答
812 浏览

c - 嘈杂的 ADC dsPIC

我有一个 dsPIC33F 同时从两个 ADC 通道以 10 位收集。我正在使用定时器以 64Hz 采样并将 ADC 设置为自动采样,但手动转换。每次轮询定时器中断时,我都会清除采样位,并且 DMA 缓冲区充满了我的 ADC 数据。绘制此数据表明它给出了正确的值,但我注意到它非常嘈杂!

在此处输入图像描述

忽略绿线。红线正确地绘制了我的 ADC 结果(峰值是故意的),但正如您所见,它自始至终都有非常多的噪音。

关于可以做些什么来减少这种情况的任何想法?当与 DAQ 同时绘图时(但使用相同的电源并连接地面),它会平滑得多,所以我知道这种噪音并不总是存在。PIC上的去耦电容可能吗?我正在使用面包板和通孔组件,模拟传感器放置在尽可能靠近 PIC 引脚的位置。我的印象是这是一个硬件问题,但让我知道是否可以在软件方面做一些事情。

0 投票
1 回答
432 浏览

bluetooth - RN-41 蓝牙和 dsPIC

有几个问题我希望是相当直截了当的。

我一直在通过 RS232 以 115200 的波特率将数据从我的 PIC 传输到 PC。我最近有一个 RN-41 蓝牙模块,希望开关就像为模块供电和连接 PIC TX 一样简单(通过 max3232)到 RN-41 的 RX,正如在线社区让我相信的那样。

我可以连接它并将其与计算机配对,我还可以使用 PUTTY/Realterm 更改参数,例如名称和波特率。最后,通过将链接连接到蓝牙模块上的 RX 和 TX 并为其供电,我可以通过使用 PUTTY 发送和回显文本来 ping 文本,因此我相当确定模块没有损坏。

但是,当我尝试将我的数据从 PIC 传输到蓝牙模块并使用 realterm(有线连接工作正常)查看它时,我收到了数据,但这不是预期的。我期待一个 25 字节的数据包,标头值为 2,我得到大约 12-15 个字节和 -65 的标头。

第一个值 -65 始终相同,其他数据可以更改,这确实表明波特率有问题,但我尝试了各种波特率(在我的 UART 代码、蓝牙参数和实时中更改) ,并且数据根本没有变化;总是错的。

我错过了什么?我需要更改蓝牙配置吗?我还检查了奇偶校验位、停止位等,彼此都一样。

0 投票
2 回答
11565 浏览

c - Setting up a C project with multiple source files in MPLAB

I'm using the MPLAB IDE and the XC8 compiler for a C project for PIC18 devices. I'm building a project with multiple source files and don't know how to make the structure.

In the project, I have the following things:

  • A file main.c where the main code is located. From here, several files are included:
    • xc.h: to define chip-specific variables and so
    • stdlib.h, stdio.h, plib.h, delays.h: for the compiler's functions
    • enc28j60.h: a homebrew file with definitions and prototypes
  • A file enc28j60.c, where the functions of the prototypes in enc28j60.h go

I cannot compile enc28j60.c as standalone file because it depends on definitions in main.c.

I have a few questions on how to set this project up:

  1. Should I add enc28j60.c to the source files of my MPLAB project? If I do this, MPLAB tries to compile the file, which fails. If I don't do this, the linker cannot find the symbols that are defined in enc28j60.c and prototyped in enc28j60.h.
  2. Should I #include enc28j60.c from somewhere? If not, how does MPLAB know where to get the file?
  3. Should I add enc28j60.h to the header files of my MPLAB project?
  4. Should I #include enc28j60.h from somewhere? Right now, I do this in main.c, after the definitions enc28j60.h needs in order to run (and not throw #errors).
0 投票
1 回答
7431 浏览

pic - 使用 PIC16F877A 使用 C 复用 7 个段

这只是我第二次在这里提出问题。上次非常有帮助,所以我想我会重新访问,因为我被困在另一个 C 项目上!

我只是补充一点,我或多或少是 C 的总 n00b,但知道几乎足以在最少的帮助下尝试这个(直到现在!)而且我不是要求有人为我做这件事,只是为了几个指向正确方向的指针(没有双关语)。

我已经在这个主题上进行了相当多的谷歌搜索,但我正在尽力不只是从一些在线资源中复制和粘贴代码,因为我想从中学习,所以我正在尝试自己开发代码.

然后我要做的是:我已经为自己构建了一个 PIC 开发板,其中两个共阴极 7 段显示器连接到 '877A 的 PORTD。我已将 RB0 和 RB1 连接到打开 7 段的晶体管,并用简单的代码测试了所有内容,它工作正常,因此电路完全没有问题。我设法创建了一个从 0-9 计数的程序,这是非常基本的,我现在决定尝试多路复用并从 0-99 计数。我已经编写了一些代码并将其发布在下面,我想请人向我指出我做错了什么。到目前为止,我的个位数是 0-9,但十位数字似乎停留在 0。

我有一种感觉,我遗漏了一些东西,但我不知道是什么。我可能也有点过于复杂了。

我正在尝试制作一个用作温度传感器的程序,该程序使用热敏电阻分压器电路输入到 PIC 的 ADC(这是我的实际项目)并在多路复用显示器上显示该值实际上不是项目的一部分(我们只应该使用在“2”和“5”和“C”之间交替的一位数字“25C”等),但我想更进一步,所以我我试图开发这个改进版本。

无论如何,这已经够我胡说八道了,我将代码粘贴进去,希望有人能提供帮助。

如果我忘记添加任何内容,请告诉我。非常感谢您的帮助!