我正在尝试用C编写程序,以便将DS1302 RTC与PIC16F877a配合使用

时间:2012-12-06 00:59:37

标签: c pic real-time-clock

所以我目前正在尝试读取和写入RTC的时间,这些方法将无法正常工作。

这就是我所拥有的: 所以它发送地址字节以确定它想从哪里读取,然后将引脚翻转到输入并读出每个位,直到字节完成。

 char ReadByte(char ByteToRead)
 {
    RB0 = 0; // ensure CLK low
    RB5 = 1;
    char received = 0;
    int i;

    for(i =0;i < 8 ;i++)
    {   
        RB4 = ByteToRead & 1;
        RB0 = 0;
        ByteToRead >>= 1;       
        RB0 = 1;

    }
    TRISB4 = 1;//B4 = input port

    for(i =0;i < 8 ;i++)
    {
        received |= RB4;
        RB0 = 1;
        received <<= 1;
        RB0 = 0;
    }

    RB5=0;

    TRISB4 = 0;

    return DecimalToBCD(received);
}

第二个样本是我的写法:

void WriteByte(char ClockReg ,char data)

{
    RB0 = 0; // ensure CLK low
    RB5 = 1; // raises RST bit
    int i;
    for(i =0;i < 8 ;i++)
    {   
        RB4 = ClockReg & 1;
        RB0 = 0;
        ClockReg >>= 1;     
        RB0 = 1;
    } 

    for(i =0;i < 8 ;i++)
    {   

        RB4 = data & 1;
        RB0 = 0;
        data >>= 1;     
        RB0 = 1;

    }
    RB5 = 0;
    __delay_us(1);
    RB5 = 1;
}

这对于第一位确定寄存器写入你给它的值是一样的。

我在网上找到的唯一帮助是指向一个2岁页面的链接,其中没有代码或帮助人们要求PMed。如果你能提供帮助,请随时

提前致谢

2 个答案:

答案 0 :(得分:0)

在处理WriteByte之前,我会使用ReadByte方法,因为这样你就可以通过回读来验证写入。因此,查看ReadByte例程,我可以很快发现一个问题。

DS1302的数据表显示“数据位在时钟的下降沿输出”,但在ReadByte例程中,读取RB4上的输入,然后将时钟设置为低电平。另外“注意,要写入的第一个数据位发生在写入命令字节的最后一位之后的第一个下降沿。”但是你第一次通过循环,你是在第一个下降边缘之前读取RB4。

答案 1 :(得分:0)

要被确认!

我相信这是因为我没有禁用写保护位也为将来的读卡器清除时钟停止标志(CH)而不设置。

希望这可以帮助任何人寻找它 丹