pic18F47J53 RTCC未启动

pic18F47J53 RTCC未启动,pic,rtcc,Pic,Rtcc,使用PIC18F47J53、MPLAB x、XC8(v2.31),我试图使用内部RTCC,但我看不到它正在计数(秒)。寄存器RTCVALL在等待几秒钟后没有更改 我想使用8MHz内部振荡器作为主时钟,内部INTRC作为RTCC。也许首先有人可以确认是否可以使用这2个 代码相当简单,只需在RTCVALL中设置一个“秒”值,稍等片刻,读取相同的寄存器,并希望发现它已更改。。但事实并非如此 我张贴代码的主要部分。 另一个问题,RTCC引脚应该输出什么?我选择了“秒”作为输出,但如果它应该每秒钟切换一次

使用PIC18F47J53、MPLAB x、XC8(v2.31),我试图使用内部RTCC,但我看不到它正在计数(秒)。寄存器RTCVALL在等待几秒钟后没有更改

我想使用8MHz内部振荡器作为主时钟,内部INTRC作为RTCC。也许首先有人可以确认是否可以使用这2个

代码相当简单,只需在RTCVALL中设置一个“秒”值,稍等片刻,读取相同的寄存器,并希望发现它已更改。。但事实并非如此

我张贴代码的主要部分。 另一个问题,RTCC引脚应该输出什么?我选择了“秒”作为输出,但如果它应该每秒钟切换一次高/低,我可以在数据表中看到占空比在哪里?在我的情况下,RTCC引脚上的LED保持稳定的高电平

'''

//CONFIG1L
#pragma config WDTEN=OFF//看门狗定时器(禁用-由SWDTEN位控制)
#pragma config PLLDIV=1//PLL预分频器选择(无预分频(4 MHz振荡器输入直接驱动PLL))
#pragma config CFGPLLEN=OFF//PLL启用配置位(PLL禁用)
#pragma config STVREN=ON//堆栈溢出/下溢重置(已启用)
#pragma config XINST=OFF//扩展指令集(已禁用)
//配置1H
#pragma config CPUDIV=OSC1//CPU系统时钟后定标器(无CPU系统时钟分割)
#pragma config CP0=OFF//代码保护(程序内存不受代码保护)
//配置2L
#pragma config OSC=INTOSC//振荡器(INTOSC)
#pragma config SOSCSEL=高//T1OSC/SOSC功率选择位(选择高功率T1OSC/SOSC电路)
#pragma config CLKOEC=ON//EC时钟输出启用位(在RA6引脚上启用CLKO输出)
#pragma config FCMEN=ON//Fail-Safe时钟监视器(已启用)
#pragma-config-IESO=ON//内部-外部振荡器切换模式(启用)
//配置2H
#pragma-config-WDTPS=32768//Watchdog-Postscaler(1:32768)
//配置3L
#pragma config DSWDTOSC=INTOSCREF//DSWDT时钟选择(DSWDT使用INTRC)
#pragma config RTCOSC=INTOSCREF//RTCC时钟选择(INTRC)
#pragma config DSBOREN=ON//Deep Sleep BOR(已启用)
#pragma config DSWDTEN=ON//Deep Sleep Watchdog Timer(已启用)
#pragma-config-DSWDTPS=G2//Deep-Sleep-Watchdog-Postscaler(1:2147483648(25.7天))
//CONFIG3H
#pragma config IOL1WAY=ON//IOLOCK单向设置启用位(IOLOCK位(PPSCON)可以设置一次)
#pragma config ADCSEL=BIT10//ADC10或12位选择(启用10位ADC)
#pragma config MSSP7B_EN=MSK7//MSSP地址屏蔽(7位地址屏蔽模式)
//配置4L
#pragma config WPFP=PAGE_127//写入/擦除保护页开始/结束位置(写入保护程序闪存页127)
#pragma config WPCFG=OFF//Write/Erase-Protect配置区域(配置字页面未擦除/写保护)
//配置4h
#pragma config WPDIS=OFF//写保护禁用位(忽略WPFP/WPEND区域)
#pragma config WPEND=PAGE_WPFP//Write/Erase-Protect Region选择位(当WPDIS=0时有效)(通过配置字Erase/Write-protected分页WPFP)
#pragma config LS48MHZ=SYS48X8//具有48 MHz系统时钟位的低速USB模式(48 MHz USB时钟的系统时钟除以设置为8)
#定义单位到单位(x)((x)%10)
#定义单位到单位数(x)((x)%100)/10)
#将BCD_定义为十(x)((x)>>4)
#将BCD_定义为(x)((x)和0x0F)
真空总管(真空)
{
//设置为8MHz内部振荡器
OSCCON=0x70;
//不确定这是否必要,但0或1不起作用
OSCTUNEbits.INTSRC=1;
pic_uart1_init(UART_BDS_9600);
__延迟μms(1000);
uint8_t秒=0;
//秒RTCC输出引脚
PADCFG1bits.RTSECSEL1=0;
PADCFG1bits.RTSECSEL0=1;
pic_rtc_设置_报警_输出(ON);
pic_rtc_启用(ON);
pic_rtc_wr_启用(ON);
pic_rtc_设置_秒(45);
pic_rtc_wr_启用(关闭);
//等一会儿
对于(int i=0;i<12;i++){
__延迟μms(1000);
printf(“->RTCVALL=%d\n”,RTCVALL);
printf(“->RTCVALH=%d\n”,RTCVALH);
}
pic_rtc_读取_秒(&s);
pic_rtc_启用(关闭);
printf(“秒=%d\n”,秒);
}
pic_状态pic_rtc_启用(功能状态设置状态)
{
pic_rtc_wr_启用(ON);
RTCCFGbits.RTCEN=设置_状态;
pic_rtc_wr_启用(关闭);
返回picu成功;
}
pic_状态pic_t rtc_设置报警输出(功能状态设置状态)
{
RTCCFGbits.RTCOE=设置_状态;
返回picu成功;
}
pic_状态pic_rtc_wr_启用(功能状态设置状态)
{
INTCONbits.GIE=0;
EECON2=0x55;
EECON2=0xAA;
RTCCFGbits.RTCWREN=设置_状态;
INTCONbits.GIE=1;
返回picu成功;
}
pic_状态pic_rtc_读取秒数(uint8_t*秒)
{
//指向分钟
RTCCFGbits.RTCPTR1=0;
RTCCFGbits.RTCPTR0=0;
printf(“RTCCFGbits.RTCPTR1=%d\n”,RTCCFGbits.RTCPTR1);
printf(“RTCCFGbits.RTCPTR0=%d\n”,RTCCFGbits.RTCPTR0);
printf(“RTCCFGbits.RTCWREN=%d\n”,RTCCFGbits.RTCWREN);
uint8_t buffer_rd_sec=RTCVALL;
printf(“缓冲区秒(BCD)=0x%02x\n”,缓冲区秒);
*秒=(单位8秒)(单位十秒(缓冲区秒)*10秒)+(单位八秒(缓冲区秒));
返回picu成功;
}
pic_状态pic_rtc设置秒数(uint8秒)
{
如果(秒>59)
返回picu失败;
//指向秒
RTCCFGbits.RTCPTR1=0;
RTCCFGbits.RTCPTR0=0;
printf(“RTCCFGbits.RTCPTR1=%d\n”,RTCCFGbits.RTCPTR1);
printf(“RTCCFGbits.RTCPTR0=%d\n”,RTCCFGbits.RTCPTR0);
printf(“RTCCFGbits.RTCWREN=%d\n”,RTCCFGbits.RTCWREN);
uint8_t buf_ones=UINT_至_BCD_ones(秒);
printf(“buf_one=0x%02x\n”,buf_one);
uint8_t buf_tens=UINT_至_BCD_tens(秒);
printf(“buf_tens=0x%02x\n”,buf_tens);

uint8\u t buffer=buf\u tens我让它工作起来了,看起来好像不是p的理解
// CONFIG1L
#pragma config WDTEN = OFF      // Watchdog Timer (Disabled - Controlled by SWDTEN bit)
#pragma config PLLDIV = 1       // PLL Prescaler Selection (No prescale (4 MHz oscillator input drives PLL directly))
#pragma config CFGPLLEN = OFF   // PLL Enable Configuration Bit (PLL Disabled)
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset (Enabled)
#pragma config XINST = OFF      // Extended Instruction Set (Disabled)
// CONFIG1H
#pragma config CPUDIV = OSC1    // CPU System Clock Postscaler (No CPU system clock divide)
#pragma config CP0 = OFF        // Code Protect (Program memory is not code-protected)
// CONFIG2L
#pragma config OSC = INTOSC     // Oscillator (INTOSC)
#pragma config SOSCSEL = HIGH   // T1OSC/SOSC Power Selection Bits (High Power T1OSC/SOSC circuit selected)
#pragma config CLKOEC = ON      // EC Clock Out Enable Bit  (CLKO output enabled on the RA6 pin)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor (Enabled)
#pragma config IESO = ON        // Internal External Oscillator Switch Over Mode (Enabled)
// CONFIG2H
#pragma config WDTPS = 32768    // Watchdog Postscaler (1:32768)
// CONFIG3L
#pragma config DSWDTOSC = INTOSCREF// DSWDT Clock Select (DSWDT uses INTRC)
#pragma config RTCOSC = INTOSCREF       // RTCC Clock Select (INTRC)
#pragma config DSBOREN = ON     // Deep Sleep BOR (Enabled)
#pragma config DSWDTEN = ON     // Deep Sleep Watchdog Timer (Enabled)
#pragma config DSWDTPS = G2     // Deep Sleep Watchdog Postscaler (1:2,147,483,648 (25.7 days))
// CONFIG3H
#pragma config IOL1WAY = ON     // IOLOCK One-Way Set Enable bit (The IOLOCK bit (PPSCON<0>) can be set once)
#pragma config ADCSEL = BIT10   // ADC 10 or 12 Bit Select (10 - Bit ADC Enabled)
#pragma config MSSP7B_EN = MSK7 // MSSP address masking (7 Bit address masking mode)
// CONFIG4L
#pragma config WPFP = PAGE_127  // Write/Erase Protect Page Start/End Location (Write Protect Program Flash Page 127)
#pragma config WPCFG = OFF      // Write/Erase Protect Configuration Region  (Configuration Words page not erase/write-protected)
// CONFIG4H
#pragma config WPDIS = OFF      // Write Protect Disable bit (WPFP<6:0>/WPEND region ignored)
#pragma config WPEND = PAGE_WPFP// Write/Erase Protect Region Select bit (valid when WPDIS = 0) (Pages WPFP<6:0> through Configuration Words erase/write protected)
#pragma config LS48MHZ = SYS48X8// Low Speed USB mode with 48 MHz system clock bit (System clock at 48 MHz USB CLKEN divide-by is set to 8)

#define UINT_TO_BCD_ONES(x) ((x) % 10)
#define UINT_TO_BCD_TENS(x) (((x) % 100) / 10)
#define BCD_TO_UINT_TENS(x) ((x) >> 4)
#define BCD_TO_UINT_ONES(x) ((x) & 0x0F)

void main(void)
{
    // set to 8MHz internal oscillator
    OSCCON = 0x70;
    // not sure that is necessary but either 0 or 1 don't work
    OSCTUNEbits.INTSRC = 1;

    pic_uart1_init(UART_BDS_9600);
    __delay_ms(1000);

    uint8_t seconds = 0;

    // seconds RTCC output pin
    PADCFG1bits.RTSECSEL1 = 0;
    PADCFG1bits.RTSECSEL0 = 1;
    pic_rtc_set_alarm_output(ON);

    pic_rtc_enable(ON);
    pic_rtc_wr_enable(ON);
    pic_rtc_set_seconds(45);
    pic_rtc_wr_enable(OFF);

    // wait some time
    for (int i = 0; i < 12; i++){
        __delay_ms(1000);
        printf("-> RTCVALL = %d\n", RTCVALL);
        printf("-> RTCVALH = %d\n", RTCVALH);
    }

    pic_rtc_read_seconds(&seconds);
    pic_rtc_enable(OFF);

    printf("seconds = %d\n", seconds);
}

pic_status_t pic_rtc_enable(feature_status_t set_status)
{
    pic_rtc_wr_enable(ON);
    RTCCFGbits.RTCEN = set_status;
    pic_rtc_wr_enable(OFF);
    return PIC_SUCCESS;
}

pic_status_t pic_rtc_set_alarm_output(feature_status_t set_status)
{
    RTCCFGbits.RTCOE = set_status;
    return PIC_SUCCESS;
}

pic_status_t pic_rtc_wr_enable(feature_status_t set_status)
{
    INTCONbits.GIE = 0;
    EECON2 = 0x55;
    EECON2 = 0xAA;
    RTCCFGbits.RTCWREN = set_status;
    INTCONbits.GIE = 1;

    return PIC_SUCCESS;
}

pic_status_t pic_rtc_read_seconds(uint8_t *seconds)
{
    // point to minutes
    RTCCFGbits.RTCPTR1 = 0;
    RTCCFGbits.RTCPTR0 = 0;

    printf("RTCCFGbits.RTCPTR1 = %d\n", RTCCFGbits.RTCPTR1);
    printf("RTCCFGbits.RTCPTR0 = %d\n", RTCCFGbits.RTCPTR0);
    printf("RTCCFGbits.RTCWREN = %d\n", RTCCFGbits.RTCWREN);

    uint8_t buffer_rd_sec = RTCVALL;

    printf("buffer_rd_sec (BCD) = 0x%02x\n", buffer_rd_sec);

    *seconds = (uint8_t)((BCD_TO_UINT_TENS(buffer_rd_sec) * 10) + (BCD_TO_UINT_ONES(buffer_rd_sec)));

    return PIC_SUCCESS;
}

pic_status_t pic_rtc_set_seconds(uint8_t seconds)
{
    if (seconds > 59)
        return PIC_FAIL;

    // point to seconds
    RTCCFGbits.RTCPTR1 = 0;
    RTCCFGbits.RTCPTR0 = 0;

    printf("RTCCFGbits.RTCPTR1 = %d\n", RTCCFGbits.RTCPTR1);
    printf("RTCCFGbits.RTCPTR0 = %d\n", RTCCFGbits.RTCPTR0);
    printf("RTCCFGbits.RTCWREN = %d\n", RTCCFGbits.RTCWREN);

    uint8_t buf_ones = UINT_TO_BCD_ONES(seconds);
    printf("buf_ones = 0x%02x\n", buf_ones);

    uint8_t buf_tens = UINT_TO_BCD_TENS(seconds);
    printf("buf_tens = 0x%02x\n", buf_tens);

    uint8_t buffer = buf_tens << 4 | buf_ones;
    printf("buffer = 0x%02x\n", buffer);

    RTCVALL = buffer;

    return PIC_SUCCESS;
}
pic_status_t pic_rtc_enable(feature_status_t set_status)
{
    while(!RTCCFGbits.RTCWREN); // wait for the bit to be set
    RTCCFGbits.RTCEN = set_status;
    return PIC_SUCCESS;
}
typedef enum {
    OFF = 0,
    ON = 1,
} feature_status_t;
pic_status_t pic_rtc_wr_enable(feature_status_t set_status)
{
    if (set_status == 1) {

        INTCONbits.GIE = 0;
        EECON2 = 0x55;
        EECON2 = 0xAA;
        RTCCFGbits.RTCWREN = 1;
        INTCONbits.GIE = 1;
    }

    return PIC_SUCCESS;
}