标签: pic

用C语言为微控制器编写应用程序

您知道哪些资源专用于C单片机的C单片机软件开发?

我想看到某种框架可以处理IO(输入按钮和输出LCD)和应用程序逻辑.你可以把它想象成一个非常简单的操作系统.我知道PIC的内存对于这样的框架来说可能很小,所以我认为它可能是一个基于配置文件创建特定代码的代码生成器.然后添加特定于您的应用程序的代码片段.你见过类似的东西吗?

c embedded microcontroller pic

5
推荐指数
1
解决办法
1560
查看次数

PIC16 C编译器

我正在寻找一个适用于PIC 16系列的优秀C编译器,适用于Windows.

  • 一些同事使用bknudc,但有些人似乎不喜欢它.显然你不能有效地使用链接器,事实证明最好是在包含文件中设置所有代码.

  • SDCC看起来不错,但看起来它仍处于测试阶段,并且不易设置或不得不处理.

  • 还有其他一些选择,根据他们自己的最佳选择.我找到了一些讨论这个主题的论坛,似乎没有人互相认同.MikroC,CCS(昂贵),HiTech,BoostC.

我希望得到一些关于什么是好的和什么是坏的真实信息.

如果我做对了,PIC16架构真的不是C友好的吗?是否有编译器让程序员在ANSI C中工作?还有一种设置足够好的调试器的方法吗?

compiler-construction embedded pic mikroc

5
推荐指数
3
解决办法
6553
查看次数

我想继续进行μC编程,但我完全不知道从哪里开始

我一直在考虑"继续"进行MCU编程,但问题是我从未使用过任何微控制器或类似产品.据我所知,AVR和PIC是业余爱好者中最常见的微控制器,显然大多数人建议AVR为像我这样的新手,因为它的"C友好架构"(无论这意味着什么),它的C编译器及其大型业余爱好者社区.AVR或PIC或其他任何东西,对我来说并不重要,我希望能够在Linux上用一个好的编译器编写C代码,并最终能够在我的MCU上添加一个LCD屏幕(只是为了输出基本的ASCII字符,也许在这里和那里画几个像素,单色,没什么大的).我不需要任何复杂或极快或甚至大量的记忆,因为我喜欢有限(但不是太有限)的事情,你需要一些创造力来实现目标.我在互联网上环顾四周,但我发现的大多数页面已经有几十年的历史了,并且/或者没有提出我可以购买的任何好的'包'(这将支持上面提到的内容).这就是为什么我问你,希望你能帮助我一点.:)

谢谢,霍法.

linux microcontroller avr pic

5
推荐指数
1
解决办法
689
查看次数

USB HID协议问题

我正在使用通用HID接口在PIC 18F2550上实现USB .我已经设置了HID配置文件配置,以便为输入和输出提供单个64字节消息.

现在它基本上工作了.设备在Windows中注册OK.我可以在PC上的程序中找到它,并可以向它发送和接收数据.但问题是这样 - 从PC到PIC的消息被截断为EP0端点缓冲区的大小.

在我进一步调试之前,我想尝试澄清我对USB协议的理解,并检查我是否正确.

假设EP0输入缓冲区是8个字节.据我所知,PC端将发送一个8字节的控制包.在那里有数据的字节长度.然后它将发送一系列8字节数据包,PIC端必须确认每一个.

据我所知,PC端通过查看设备描述符中的最大数据包大小字段来了解每个数据包的大小,并将相应的消息分成多个数据包.

在我寻找代码的更多时间之前,有人可以确认这基本上是正确的吗?如果EP0缓冲区大小是8字节,那么PC应该知道这一点,因为我上面提到的配置字段并发送多个数据包?

如果我在PIC 64字节上创建接收缓冲区,那么我得到64字节的消息,这足以满足我的需要,但我不喜欢不理解为什么它不适用于小缓冲区,有一天我会无论如何可能还需要他们.

欢迎任何建议或信息.

usb protocols hid pic

5
推荐指数
1
解决办法
4158
查看次数

在Visual Studio中嵌入式代码开发(特别是对于带有C18的PIC)

我正在使用Visual Studio编写桌面应用程序,我发现它非常用户友好且易于使用.

如果可能,我还想在Visual Studio中编写嵌入代码.例如,是否可以使用C18或任何其他类似的基于C语言生成PIC18Fxxx系列的.hex文件?

ide embedded pic pic18 visual-studio

5
推荐指数
2
解决办法
3072
查看次数

用于不同大小阵列的 UART DMA

将 MPLAB X 1.70 与 dsPIC33FJ128GP802 微控制器一起使用。

我有一个应用程序,它以不同的采样率(一个为 50Hz,另一个为 1000Hz)从两个传感器收集数据,两个传感器数据包的大小也不同(一个是 5 字节,另一个是 21 字节)。到目前为止,我一直使用手动 UART 传输,如下所示:

void UART_send(char *txbuf, char size) {
    // Loop variable.
    char i;

    // Loop through the size of the buffer until all data is sent. The while
    // loop inside checks for the buffer to be clear.
    for (i = 0; i < size; i++) {
        while (U1STAbits.UTXBF);
        U1TXREG = *txbuf++;
    }
}
Run Code Online (Sandbox Code Playgroud)

不同大小的数组(5 或 21 字节)被发送到这个函数,它们的大小和一个简单的 for 循环遍历每个字节并通过 UART tx 寄存器 U1TXREG 输出它。

现在,我想实现DMA来减轻传输大量数据时对系统的压力。我已将 …

c microcontroller pic dma mplab

5
推荐指数
1
解决办法
3955
查看次数

x86 PIC,QEMU在所有CPU上引发中断是否正确?

我最近不得不解决x86 PIC的专有操作系统问题,该操作系统期望的计时器仅在CPU0上中断。我启用了IO-APIC来解决此问题,并进行了CPU引导,因此中断仅进入CPU0。问题解决了。

有人告诉我,我们的硬件坏了,无法做到这一点。即,仅使用PIC时,在所有CPU上引发定时器中断。有问题的“硬件”是QEMU / KVM。

QEMU / KVM在这里吗?操作系统是否做出了无效的假设?

我怀疑QEMU / KVM完全正确,操作系统应该能够处理CPU上的定时器中断!= 0 ...

x86 kvm qemu pic apic

5
推荐指数
1
解决办法
956
查看次数

如何配置8051引脚作为输入/输出?

在pic微控制器中,TRIS寄存器确定端口是作为输入还是输出,PORT寄存器将确定内容,应该写入(在输出的情况下)或读取(在输入的情况下).

但是在8051中没有任何这种TRIS寄存器.要将寄存器配置为输入/输出,必须写入同一寄存器并写入/读取必须再次使用相同寄存器的数据.我这是对的吗?如果是,那么请解释一下怎么可能?如果没有,那么请解释正确的理论.

microcontroller input pic 8051 output

5
推荐指数
1
解决办法
7135
查看次数

强制链接器将相同的代码放在 2 个部分中

我试图强制链接器(来自 XC32 的 ld)将相同的可执行代码放置在闪存的两个不同部分中。

该应用程序使得代码可以作为独立应用程序运行,并且复位向量可以被引导加载程序覆盖,然后引导加载程序可以分支到伪复位向量。

我的链接器脚本的相关部分是

MEMORY
{
  kseg1_boot_mem     : ORIGIN = 0xBFC00000, LENGTH = 0x480
  bootload_boot_mem  : ORIGIN = 0x9D1F0000, LENGTH = 0x480
}

SECTIONS
{
  .reset 0xBFC00000 :
  {
    KEEP(*(.reset))
  } > kseg1_boot_mem

  .bootloadreset 0x9D1F0000 :
  {
    KEEP(*(.reset))
  } > bootload_boot_mem
}
Run Code Online (Sandbox Code Playgroud)

使用它,0xBFC00000 处的区域按预期填充,但没有放置在 0x9D1F0000 处。我尝试将选项 --no-gc-sections 传递给链接器,但似乎没有任何区别。

我的问题是:是否可以强制链接器将相同的代码放入 2 个不同的部分,以及如何这样做?

linker pic ld

5
推荐指数
1
解决办法
1085
查看次数

嵌套 if 与 for 循环的速度

我最近在中断服务例程(ISR)中遇到了这段代码:

\n
#define MAX_CHANNELS 4\nstatic uint16_t volatile* ADCVALS[MAX_CHANNELS] = {\n    &ADC1BUF0, &ADC1BUF1, &ADC1BUF2, &ADC1BUF3\n};\nstatic uint8_t CHANNELS = 0;\nstatic uint16_t volatile* volatile BUFFER_IDX[MAX_CHANNELS];\n\nvoid __attribute__((interrupt, no_auto_psv)) _AD1Interrupt(void) {\n    *(BUFFER_IDX[0]++) = *ADCVALS[0];\n    if (CHANNELS >= 1) {\n        *(BUFFER_IDX[1]++) = *ADCVALS[1];\n        if (CHANNELS >= 2) {\n            *(BUFFER_IDX[2]++) = *ADCVALS[2];\n             if (CHANNELS >= 3) {\n                *(BUFFER_IDX[3]++) = *ADCVALS[3];\n            }\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

它将 1-4 个寄存器值复制到内存中,具体取决于 的值CHANNELS,该值是 0-3 之间的值,通过 setter 函数在程序中的其他位置设置。

\n

我发现嵌套的 if 非常丑陋,并将其更改为:

\n
int i;\nfor (i = 0; i <= CHANNELS; …
Run Code Online (Sandbox Code Playgroud)

c embedded performance interrupt pic

5
推荐指数
1
解决办法
148
查看次数