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

c - 使用未声明的标识符“RD16”

我正在尝试为 PIC18F4550 设置 TMR1 T1CON 寄存器,但出现与 RD16 位相关的错误。我得到:

根据数据表:

RD16:16 位读/写模式使能位

1 = 在一次 16 位操作中启用 Timer1 的寄存器读/写

0 = 在两个 8 位操作中启用 Timer1 的寄存器读/写

我读了一些帖子,应该是正确的。我正在使用 XC8 和 MPLab

我的 config.c 完整代码:

0 投票
1 回答
226 浏览

c - XC8 编译器:程序返回到 main() 的开头

我是 PIC 微控制器编程的新手,我在编写一段代码时遇到了一些困难。在main()函数中,它设置了一些寄存器,然后进入一个无限的while循环。在这个 while 循环中,调用了第二个函数,这会产生延迟(没有调用任何其他函数,包括main()then 返回。但是,似乎当第二个函数结束时,程序会回到顶部main(),而不是继续while 循环。

编辑1:我做了更多的测试,但没有这个功能我仍然遇到问题,所以几乎可以肯定微控制器每隔一秒左右就会重置一次,原因不明。应该有一个寄存器告诉你重置的原因,所以我会看看。

编辑 2:这是一个非常基本的代码版本,其中 RC0 LED 每 2 秒短暂闪烁一次(它应该保持关闭)。

编辑 3:原来是看门狗定时器导致了复位,现在通过在循环中放置一个 CLRWDT() 来修复。

0 投票
2 回答
2179 浏览

c - 如何使用 C 宏定义 PIC 单片机引脚名称?

PIC 微控制器有 3 个基本寄存器来设置 GPIO(通用 I/O)引脚状态。它们是: TRIS(Tri-status,方向寄存器。将引脚设置为输入或输出) PORT(输入缓冲器) LAT(锁存器,输出缓冲器)。

端口可以​​是 A、B、C……等等。所以端口 A 的 TRIS 寄存器是 TRISA。

最后是密码。例如,TRISA1。

TRISA1 定义为:

我想定义一个宏来轻松地将引脚命名为:

所以我可以做如下代码:

并由预处理器将其转换为:

所以我以后可以扩展到其他引脚寄存器,例如 ANSEL、WPU 等,而无需重写宏或添加特殊情况。

这可能吗?或者我能做的最接近的事情是什么?

0 投票
2 回答
246 浏览

c - 如何将 10 位值传递给两个寄存器?

我正在尝试将 的值传递DCCCPR1LDC1B1DC1B0,现在我正在手动进行,但是有没有办法DC直接使用 的值?

现在我没有使用DC,因为我不知道如何正确地将值传递给寄存器。DC是一个 10 位的值,DC1B1必须DC1B0有 1 位和 2 位,并且CCPR1L必须有 3 - 10 位。

0 投票
1 回答
225 浏览

c - What is the equivalent of EEDATA from BASIC and EWrite in C language?(How to use the EEPROM with xc8 compiler?)

I am having a very hard time figuring out how I can use:

and turn that into C code. From what I can understand, it's a way of allocating memory in BASIC, but I really do not know. If anyone out there could help I would much appreciate it.

It was programmed using PROTON. I believe it's got to do with EEPROM used for PIC hardware.

0 投票
0 回答
184 浏览

c - 问题隐式地将带位移的有符号长转换为无符号 8 位值

将带符号的 long 传递给函数后,我遇到了 uint8 值不正确的问题。您可以在右侧轴的原始数据值中看到发生溢出(?)的峰值

在此处输入图像描述

我正在使用 MPLABX 5.0 和 XC8 编译器为 PIC 编写这个。我的代码的简化版本如下:

SERIAL_WRITE 是函数:

我设法通过修改它来修复它,如下所示:

现在给出以下输出:

在此处输入图像描述

问题是,我不明白它是如何解决的。在第一个实例中,我有一个 32 位有符号整数(最多只有 16 位;由于它的乘法,它必须进入 32 位,但这后来用除法取反),它被右移八位并且然后隐式转换为 uint8_t。

第二个版本有一个 32 位整数,它被显式转换为 int16_t,然后将其右移八位,然后隐式转换为 uint8_t。这些给出不同结果的方法有什么不同?

0 投票
1 回答
1921 浏览

pic - 无法在代码中运行中断功能不起作用

这部分代码有问题:void interrupt ISR_Timer0_Int

mplabs x ide 5.10 显示错误:

newmain.c:26:6:错误:变量的类型不完整'void'
newmain.c:26:15:错误:预期';' 在顶级声明者之后

我正在使用 XC8 V2 编译器,它将进入 PIC18f4550

代码:

0 投票
1 回答
572 浏览

mplab - MPLAB:XC8:无法分配结构变量

我正在尝试使用 XC8 为 PIC18 在 MPLab v5.10 中编译以下代码。

代码如下:

这会产生以下错误:

这段代码在我的本地 gcc 编译器上编译得很好。

如果我将代码更改为以下内容,错误就会消失。

我正在使用 XC8 的免费版本,版本 2.05。这是一个错误,还是我忽略了有关 PIC 架构的某些内容?

0 投票
1 回答
519 浏览

c - 多次定义符号“file@variable”

IDE:MPLAB X v2.15

抄送:XC8 v1.32

目标器件:PIC18f45k20

我有一个头文件reg.h,其中包含一个变量

该标头在开头具有适当的包含防护:

最后:

如果我在任何其他头文件上有相同的变量,它编译得很好,但是当那个变量在这个特定的文件中时,它给了我error: (845) symbol "reg@aaasdf" defined more than once

但是如果我评论那个变量,它就不再存在了,它会抱怨,因为我需要在某个 .c 文件中使用它。

奇怪的名字只是为了测试,以确保没有任何其他同名的变量。

我还能做些什么来调试这个?

编辑:

它适用于我在该文件中创建的任何static const变量(明天我将只测试static,constextern const),但也有enums 和static inline函数,它们都没有给我重复的符号错误。

编辑:

我认为这是损坏的编译器:

我从标题和源文件中删除了所有内容。现在 main 是一个无限循环,一切都是这样。

标题为空,但用于触发错误的变量。

我的任何标题都不包括我的任何其他标题。

触发错误的原因:许多源文件中包含的任何标头,并且包含static const任何类型的变量。我的意思是,如果我仅在其源文件和另一个文件中包含标头,它不会触发错误,但如果它包含在不是其源文件的 2 个源文件中,则会触发错误.

编辑:

根据要求,这是我想要的 MCV 示例(不是编译错误):

// reg.h

// pwm.c

选项 1:如上所示,使用扩展为const 复合数组文字的宏,我可以在其中访问其任何元素(在编译时或运行时)。需要C99,我没有。 编辑const复合文字可能是也可能不是常量表达式(使用 const 复合文字的元素初始化静态变量),因此作为变量的初始化器可能有效可能无效static

选项 2:将宏更改为static const数组。优点:不需要C99。缺点:不能初始化static变量。编译器似乎坏了,不允许我这样做。

选项 3:幻数。优点:不需要C99。可以初始化一个 static变量。缺点:魔术数字。

选项4:很多宏(对于每个数组,因为它不仅仅是这个!)。优点:不需要C99。缺点:污染全局命名空间。

0 投票
0 回答
342 浏览

pic - 无法执行中断功能

为 pic18f4550 使用 Mplab ide 5.10 和 xc8 编译器我无法让代码进入中断函数,目标是让 J 在后台计数,直到有东西触发它在 lcd 中输出一个值。目前只有 lcd 显示第一条消息,使用 ICD 3,J 的值不会改变,看起来程序根本没有运行中断函数