问题标签 [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.
c - 使用未声明的标识符“RD16”
我正在尝试为 PIC18F4550 设置 TMR1 T1CON 寄存器,但出现与 RD16 位相关的错误。我得到:
根据数据表:
RD16:16 位读/写模式使能位
1 = 在一次 16 位操作中启用 Timer1 的寄存器读/写
0 = 在两个 8 位操作中启用 Timer1 的寄存器读/写
我读了一些帖子,应该是正确的。我正在使用 XC8 和 MPLab
我的 config.c 完整代码:
c - XC8 编译器:程序返回到 main() 的开头
我是 PIC 微控制器编程的新手,我在编写一段代码时遇到了一些困难。在main()
函数中,它设置了一些寄存器,然后进入一个无限的while循环。在这个 while 循环中,调用了第二个函数,这会产生延迟(没有调用任何其他函数,包括main()
then 返回。但是,似乎当第二个函数结束时,程序会回到顶部main()
,而不是继续while 循环。
编辑1:我做了更多的测试,但没有这个功能我仍然遇到问题,所以几乎可以肯定微控制器每隔一秒左右就会重置一次,原因不明。应该有一个寄存器告诉你重置的原因,所以我会看看。
编辑 2:这是一个非常基本的代码版本,其中 RC0 LED 每 2 秒短暂闪烁一次(它应该保持关闭)。
编辑 3:原来是看门狗定时器导致了复位,现在通过在循环中放置一个 CLRWDT() 来修复。
c - 如何使用 C 宏定义 PIC 单片机引脚名称?
PIC 微控制器有 3 个基本寄存器来设置 GPIO(通用 I/O)引脚状态。它们是: TRIS(Tri-status,方向寄存器。将引脚设置为输入或输出) PORT(输入缓冲器) LAT(锁存器,输出缓冲器)。
端口可以是 A、B、C……等等。所以端口 A 的 TRIS 寄存器是 TRISA。
最后是密码。例如,TRISA1。
TRISA1 定义为:
我想定义一个宏来轻松地将引脚命名为:
所以我可以做如下代码:
并由预处理器将其转换为:
所以我以后可以扩展到其他引脚寄存器,例如 ANSEL、WPU 等,而无需重写宏或添加特殊情况。
这可能吗?或者我能做的最接近的事情是什么?
c - 如何将 10 位值传递给两个寄存器?
我正在尝试将 的值传递DC
给CCPR1L
、DC1B1
和DC1B0
,现在我正在手动进行,但是有没有办法DC
直接使用 的值?
现在我没有使用DC
,因为我不知道如何正确地将值传递给寄存器。DC
是一个 10 位的值,DC1B1
必须DC1B0
有 1 位和 2 位,并且CCPR1L
必须有 3 - 10 位。
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.
c - 问题隐式地将带位移的有符号长转换为无符号 8 位值
将带符号的 long 传递给函数后,我遇到了 uint8 值不正确的问题。您可以在右侧轴的原始数据值中看到发生溢出(?)的峰值
我正在使用 MPLABX 5.0 和 XC8 编译器为 PIC 编写这个。我的代码的简化版本如下:
SERIAL_WRITE 是函数:
我设法通过修改它来修复它,如下所示:
现在给出以下输出:
问题是,我不明白它是如何解决的。在第一个实例中,我有一个 32 位有符号整数(最多只有 16 位;由于它的乘法,它必须进入 32 位,但这后来用除法取反),它被右移八位并且然后隐式转换为 uint8_t。
第二个版本有一个 32 位整数,它被显式转换为 int16_t,然后将其右移八位,然后隐式转换为 uint8_t。这些给出不同结果的方法有什么不同?
pic - 无法在代码中运行中断功能不起作用
这部分代码有问题:void interrupt ISR_Timer0_Int
mplabs x ide 5.10 显示错误:
newmain.c:26:6:错误:变量的类型不完整'void'
newmain.c:26:15:错误:预期';' 在顶级声明者之后
我正在使用 XC8 V2 编译器,它将进入 PIC18f4550
代码:
mplab - MPLAB:XC8:无法分配结构变量
我正在尝试使用 XC8 为 PIC18 在 MPLab v5.10 中编译以下代码。
代码如下:
这会产生以下错误:
这段代码在我的本地 gcc 编译器上编译得很好。
如果我将代码更改为以下内容,错误就会消失。
我正在使用 XC8 的免费版本,版本 2.05。这是一个错误,还是我忽略了有关 PIC 架构的某些内容?
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
,const
或extern const
),但也有enum
s 和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
。缺点:污染全局命名空间。
pic - 无法执行中断功能
为 pic18f4550 使用 Mplab ide 5.10 和 xc8 编译器我无法让代码进入中断函数,目标是让 J 在后台计数,直到有东西触发它在 lcd 中输出一个值。目前只有 lcd 显示第一条消息,使用 ICD 3,J 的值不会改变,看起来程序根本没有运行中断函数