首页 > 解决方案 > 使用未声明的标识符“RD16”

问题描述

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

config.c:17:1: error: use of undeclared identifier 'RD16'
RD16 = 1;
^
1 error generated.

根据数据表:

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

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

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

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

我的 config.c 完整代码:

#include <xc.h>
void configPIC(void){
    T3CCP2:T3CCP1 = 01;   //TMR1 para CCP1    
    CCP1M0 = 0;           //Captura flancos de subida
    CCP1M1 = 1;
    CCP1M2 = 0;
    CCP1M3 = 1;
    CCP1IF = 0 ;          //Bandera de Captura CCP1
}

void timer1config(void){
    //TMR1 Config Registros   
    TMR1ON = 1;
    RD16   = 1;
    T1RUN  = 0;     //Usar reloj interno
    TMR1CS = 0;     // FOSC / 4
    T1CKPS1:T1CKPS0 = 00;
    T1OSCEN = 0;
}

标签: cpicmplabxc8

解决方案


RD16在 T1CON字节/寄存器内。标xc.h头将其指定为 T1CONbits 结构中的位域成员,如下所示

extern volatile near union {
  struct {
    unsigned TMR1ON:1;
    unsigned TMR1CS:1;
    unsigned T1SYNC:1;
    unsigned T1OSCEN:1;
    unsigned T1CKPS0:1;
    unsigned T1CKPS1:1;
    unsigned T1RUN:1;
    unsigned RD16:1;
  };
  struct {
    unsigned :2;
    unsigned NOT_T1SYNC:1;
  };
} T1CONbits;

你应该像这样使用它:

T1CONbits.RD16 = 1;

与 PIC 设备上任何寄存器中的所有其他位一样。检查p18f4500.h标头以找出所有寄存器的名称。

PS。无论如何,我想补充一点,如果您将 PIC18 用于使用免费 xc8 编译器或 sdcc 编译器的自定义项目,请不要这样做,将所有 pic 设备放入垃圾箱并购买更便宜、更快、更好、更简单的产品STM32 设备。除非您使用付费的 xc8 编译器或为必须使用 PIC 的项目工作,否则不要浪费您的时间。


推荐阅读