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);
}