XC8 的 PIC18 IO 端口新手问题
PIC18 IO-Port noobie issues with XC8
我从事 AVR 多年,开始使用 PIC18F46K42 开始我的第一个 PIC 项目。
使用带有 XC8 编译器 v2.05(设置为 C99 标准)的实际 MPLAB v5.15。
(在microchip论坛注册好几天都不行...)
现在我遇到了一些基本问题,无法让简单的 IO 端口访问正常工作:
首先将RC6设置为输出:
TRISC = 0b10111111;
正在尝试读取 IO 端口 RC6:
uint8_t LEDstate = PORTCbits_t.RC6; // auto completition of PORTC.. command by xc8
=> 编译错误:意外的类型名称'PORTCbits_t':预期的表达式
许多教程中发布的命令 "PORTCbits.RC6, without "_t" 根本无法被编译器识别
然后尝试写入 IO 端口 RC6:
LATCbits_t.LATC6 = 0; // auto completition of LATC.. command by xc8
=> 编译错误:预期标识符或'('
同样在许多教程中发布的命令 "LATCbits.LATC6, without "_t" 也根本无法被编译器识别
阅读 xc8 手册和数据表并没有真正帮助...
我想,我错过了这个 IDE / 编译器的一些基本知识。也许在设置中...
非常感谢文档的任何想法或建议!
非常感谢!!
..._t
是错误的,它是一个类型定义。看一下 header (pic18lf46k42.h) 部分,第 46579 行。在下一行定义的实际端口结构称为 PORTCbits
。为了识别此名称,您需要在源代码中 #include <xc.h>
并确保在 MPLAB 项目中设置了正确的部分。
我一直在使用这个表示法,它总是有效,前提是该引脚存在并且满足上述两个条件。示例:
https://github.com/felis/stirrer/blob/f-desk/board_control/code/stirrer/bsp.h#L58
您可能要考虑使用 MCC(MPLAB 代码配置器)。这将使外围设备的使用变得更容易——即使只是简单的引脚 I/O.
它还使您更容易跟踪资源。
您可以为引脚创建别名,然后 MCC 将为您提供干净的宏,例如:
#define LEDState_SetHigh() do { LATCbits.LATC6 = 1; } while(0)
如 Oleg 所述,..._t 不正确。将这一行更改为下面的行,它将顺利编译。
uint8_t LEDstate = PORTCbits.RC6; // auto completition of PORTC.. command by xc8
我刚刚用你的芯片试过下面的代码,编译没有任何问题。
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <stdint.h>
int main(int argc, char** argv) {
uint8_t LEDstate = PORTCbits.RC6; // auto completition of PORTC.. command by xc8
return (EXIT_SUCCESS);
}
我从事 AVR 多年,开始使用 PIC18F46K42 开始我的第一个 PIC 项目。 使用带有 XC8 编译器 v2.05(设置为 C99 标准)的实际 MPLAB v5.15。 (在microchip论坛注册好几天都不行...)
现在我遇到了一些基本问题,无法让简单的 IO 端口访问正常工作:
首先将RC6设置为输出:
TRISC = 0b10111111;
正在尝试读取 IO 端口 RC6:
uint8_t LEDstate = PORTCbits_t.RC6; // auto completition of PORTC.. command by xc8
=> 编译错误:意外的类型名称'PORTCbits_t':预期的表达式
许多教程中发布的命令 "PORTCbits.RC6, without "_t" 根本无法被编译器识别
然后尝试写入 IO 端口 RC6:
LATCbits_t.LATC6 = 0; // auto completition of LATC.. command by xc8
=> 编译错误:预期标识符或'('
同样在许多教程中发布的命令 "LATCbits.LATC6, without "_t" 也根本无法被编译器识别
阅读 xc8 手册和数据表并没有真正帮助... 我想,我错过了这个 IDE / 编译器的一些基本知识。也许在设置中...
非常感谢文档的任何想法或建议!
非常感谢!!
..._t
是错误的,它是一个类型定义。看一下 header (pic18lf46k42.h) 部分,第 46579 行。在下一行定义的实际端口结构称为 PORTCbits
。为了识别此名称,您需要在源代码中 #include <xc.h>
并确保在 MPLAB 项目中设置了正确的部分。
我一直在使用这个表示法,它总是有效,前提是该引脚存在并且满足上述两个条件。示例:
https://github.com/felis/stirrer/blob/f-desk/board_control/code/stirrer/bsp.h#L58
您可能要考虑使用 MCC(MPLAB 代码配置器)。这将使外围设备的使用变得更容易——即使只是简单的引脚 I/O.
它还使您更容易跟踪资源。
您可以为引脚创建别名,然后 MCC 将为您提供干净的宏,例如:
#define LEDState_SetHigh() do { LATCbits.LATC6 = 1; } while(0)
如 Oleg 所述,..._t 不正确。将这一行更改为下面的行,它将顺利编译。
uint8_t LEDstate = PORTCbits.RC6; // auto completition of PORTC.. command by xc8
我刚刚用你的芯片试过下面的代码,编译没有任何问题。
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <stdint.h>
int main(int argc, char** argv) {
uint8_t LEDstate = PORTCbits.RC6; // auto completition of PORTC.. command by xc8
return (EXIT_SUCCESS);
}