问题标签 [xc8]

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 投票
8 回答
7012 浏览

compiler-construction - PIC16 C 编译器

我正在为 PIC 16 系列寻找一个好的 C 编译器,在 Windows 上工作。

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

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

  • 还有很多其他的选择,都是根据自己的最佳选择。我发现一些论坛讨论这个话题,似乎没有人同意彼此。MikroCCCS(昂贵)、HiTech、BoostC。

我想知道什么是好什么是坏的一些真实的信息。

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

0 投票
0 回答
1207 浏览

c - XC8 pconfig.h 没有选择芯片

我正在使用 XC8 1.20 和 PIC18F66K80 并且在使用 pwm.h 库时遇到了一些问题。每当我打开 pwm.h 时,实际生成的唯一函数(IE,#ifdef 编译时条件返回 true)都是用于 PWM1。跟踪代码后,我来到 pconfig.h 文件,然后下到关于 18F66K80 的部分,这一切都被忽略了。

返回 false 的条件是:

事实上,没有正在编译的部分。就像我没有选择芯片一样,即使该项目针对的是 18F66K80。我进入编译器宏选项并添加 __18F66K80 作为定义的宏,这个块突然被编译,让我可以访问 PWM2-5。

我的问题是 - 告诉 pconfig.h 我正在使用什么芯片的正确方法是什么?我的项目设置清楚地将 PIC18F66K80 显示为目标设备,但 pconfig.h 的行为就像我没有选择设备一样。通过添加这个宏,它似乎可以工作,但我觉得这是一种黑客行为,而不是正确的做事方式。

0 投票
2 回答
861 浏览

c - 非标准函数返回类型:修复 Splint 解析错误

我正在使用嵌入式系统 XC8 C 编译器(用于 PIC 微处理器)。以下是允许的:

但作为非标准 C,Splint 静态分析器会给出以下错误:

解析错误:非函数声明:位:“--------------------------”诠释。

错误的文件/行是相应 .h 文件中的函数原型。

我该如何解决这个问题,以便 Splint 可以分析其余文件?我认为可能有两种方法:

  1. 我想我记得看到一个可以通过 CLI 传递给 Splint 的标志,它告诉它将给定的非标准类型替换为标准类型(例如位到无符号字符),但我现在似乎根本找不到它!

  2. 此外,也许还有另一种方法可以编写满足 ANSI-C 要求的 c 代码,同时仍然允许 XC8 将返回类型解释为bit?

进步:

我在论坛上找到了以下内容,但在手册中找不到有关如何使用 -D 标志的信息

要忽略关键字,请添加 -Dnonstandardkeyword= 以使预处理器将其消除

使用 -Dspecialtype=int 将自定义类型解析为 int。

0 投票
3 回答
461 浏览

c - 为什么这个状态机不保持它的状态?

嘿,StackOverflow!

在下面的代码中,我有一个简单的状态机,它改变了一些外部照明设备的操作(正如注释所暗示的那样)。通过按下连接到 GP1 的按钮改变状态。连接到 GP1 的电路是一个比较器去抖电路,它将 VDD 与 0.6VDD 进行比较(我也尝试过 RC/二极管/施密特触发电路),然后强制信号 LO。在示波器上,当按钮被快速启动时,我们会看到一个干净的方波。

PIC10F200当前(和不良行为如下:

  1. 开关被按下(状态 = 0)
  2. 状态机变量增量(状态 = 1)
  3. 照明转到案例 1,然后打开
  4. 照明至少保持一秒钟
  5. 照明关闭
  6. 系统保持此状态,直到再次按下按钮或关闭电源

问题是:为什么它会这样?如果可能的话,我如何修复它,使单次按下按钮相当于一个状态增量,只要系统通电并且按钮不再被启动,PIC就会保持这种状态?

更新:由于我试图用这个代码/系统完成什么似乎有点混乱,让我们提供完整的上下文。这款微控制器PIC10F200是电致发光 (EL) 线驱动器整体电路板设计的一部分。微控制器通过连接到驱动IC的端口来简单地控制驱动电路是否启用。系统有四种操作模式,线常亮,线闪烁,线闪烁更快,每当检测到低频拍(系统中的另一个电路)时,线闪烁。GP0EN这些操作模式的转换由安装在 PCB 上的按钮(瞬间打开)开关控制。这需要state在上面的代码中在按钮驱动之间保持稳定。它目前不这样做,其行为如本文原始部分所述。正如问题标题所述,为什么state目前不稳定,我该如何做到这一点?

更新(2014-03-08):解决方案

假设 GP0 是输出,需要设置以下设置,GP2 是您的 T0CKI,并且您有一个在启动时将信号驱动到 LO 的开关。

OPTION 的 0-3 位是否真的很重要,取决于您是否选择使用 WDT 模块。

此外,按钮释放检测的实现是一种简单的计数器机制,在计数期间的任何时间点 GP2 为 LO 时都会重置。

0 投票
1 回答
495 浏览

c - XC8 库组织和跨多个源文件的#defines

这是一个复杂的帖子,所以请耐心等待。我试图尽可能地浓缩它......

我从使用不同的 PIC 微控制器工具链来到 XC8。使用以前的编译器,设置和使用我自己的库以及跨这些库使用定义似乎要容易得多。

我想编写自己的函数库以供重用。我还想将它们全部存储在我自己选择的目录结构中(这是为了使它们在多台机器之间自动同步以及出于各种其他原因)。这是一个简化的虚构文件结构。

\projects\my_project //当前项目目录

\some_other_directory\my_library\comms_lib //我的通讯库

\some_other_directory\my_library\adc_lib //我的 ADC 库

现在让我们假设我的每个库都需要 __XTAL_FREQ 定义。每个项目的频率可能会有所不同。
以下是我的问题:

  1. 告诉编译器我的库文件所在位置的最佳/最有效方法是什么?

  2. 没有将 __XTAL_FREQ 添加到每个头文件中,如何使定义对所有头文件都可用?
    可能有人会说它应该在一个单独的头文件中(我们称之为 project_config.h)。然后可以将该文件与每个未来的项目一起定位并相应地进行更改。如果单独的头文件是答案,那么接下来的问题是,如何让库头(与项目不在同一目录中)为每个新项目正确引用 project_config.h 文件?

在此先感谢,马克

0 投票
1 回答
725 浏览

c - 用 XC8 C 编译器除法后打印的负数

这些代码行:

当 g_sampleTimeInSeconds 大于 65 时会产生负数。当 g_sampleTimeInSeconds = 65 时,打印的数字是 541,但当它是 66 时,打印的数字是 -542 而不是正确的 550。当 g_sampleTimeInSeconds 替换为硬编码值。

此代码使用 XC8 编译器编译,可在 Microchip PIC 上运行

更新:

g_sampleTimeInSeconds 是一个 16 位整数

0 投票
0 回答
3959 浏览

i2c - XC8 pic16f876a I2C slave

How to implement the code to use the peak in slave mode?I come to you because I have not found on the web a satisfactory answer to my search.

I am an experienced train principle on orders outsourced PIC16FXXX. The goal is to unload the electronic map of the less urgent tasks.

To do this, I would use the I2C. Until then, I merely driven components already established. And now, I have my own component.

You might say to me that all the crap is useless but it is important to know where you are going.

So I set up a toolchain cross between my PC and my pic with MPLAB and reliable compiler XC8 Hi-Tech.

I Locate a good example of code and it seems complete to send data to a component. I have not been able to receive control on my PIC.

This is what I wrote in C (the compilation is ok): i2c.h

#xA;

main.c

#xA;

Example of communication: Start bit 11110000 -> 1111000 (code) + 0 (write) ACK (slave) 00000001 -> LED 7 = 0/6 = 0 Led / Led 5 = 0/4 = 0 Led / Led 3 = 0/2 = 0 LED / LED 1 = 0/0 = 1 Led Stop bit

wait Master

Start bit 11110000 -> 1111000 (code) + 0 (write) ACK (slave) 00000000 -> LED 7 = 0/6 = 0 Led / Led 5 = 0/4 = 0 Led / Led 3 = 0/2 = 0 LED / LED 1 = 0/0 = 0 Led Stop bit

wait master Loop

Here are question I pose now. How to implement the code to use the peak in slave mode?

Thank you very much for your help.

0 投票
2 回答
559 浏览

c - C char 数组或字符串中的变音符号

背景

我正在处理一些嵌入式项目,并且正在尝试处理非标准字符和字体。

我在 600+ 元素数组中有原始位图字体。该数组的每 5 个元素包含一个字符。我在前 5 个元素中有 32 个字符(空格),在 6-10 个元素中有 33 个字符(!)等。

我必须处理国家变音符号(例如“ę”)。我在 122 个字符之后找到了它们。现在我试图重新映射字符,以便在我输入print("Test ę");C 源代码时打印正确的字符。

问题

所以我想在源代码中这样输入:

当我尝试这个时(我试图查看 C 将为“ę”输入什么代码):

如何解决这个问题?

我使用 XC8 编译器(基于 gcc?)。

我在编译器手册中发现它使用 7 位字符编码,但也许有什么办法?我的源文件以 UTF-8 编码。

编辑

看起来 Emilien 建议的 wchar.h 可以为我工作,但不幸的是我的编译器没有 wchar.h。

也许一些预处理器技巧?我真的很想避免这样的硬核文本准备:

0 投票
2 回答
1095 浏览

assembly - 为什么 Microchip XC8 写入 .as 文件那么复杂?

在下面的代码中,我设置了 TRIS 寄存器的第一个位,然后是第二位,然后是第三位,最后是第四位。为什么生成的汇编代码……奇怪

很高兴知道:编译代码的微控制器的数据存储器分为几个存储区。位 6 和 7 进入status寄存器的位置 5 和 6,只有位 0-5 存储在操作码中。因此,当访问TRIS位置 0x86 的寄存器时,存储在操作码中的值是6.

具体问题:

  • (134)^080: 这转换为6,这是TRIS特定银行的地址。为什么编译器不只写(6)or (134)?只是为了明确TRIS不在bank 0上,还是有其他原因?
  • +(0/8):0代表位位置,8表示该寄存器中的总位数。在我看来,这个表达式没有任何用途,因为结果总是一个分数,而不是一个整数。因此它对地址计算没有贡献。
  • (0)&7:再次代表位位置,但我一直不清楚(0)二进制与服务的目的。7
  • 命令有什么作用line

代码(从生成的 *.as 文件中提取)

0 投票
2 回答
1969 浏览

c - 程序退出无限循环(PIC 单片机)?

在注意到我的程序似乎正在退出无限循环后,我为 PIC 16f690 微控制器编写了一个程序。

PORTC 的 3、4、5 引脚上有 LED。

据我了解,LED 应该亮约 1 秒,然后永远熄灭。相反,它们每秒都在闪烁。

我在 MPLABX 中编写了此代码,并使用 PICkit3 和 C8 编译器进行了编程。