繁体   English   中英

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

[英]I am trying to write a program in C to use an DS1302 RTC with a PIC16F877a

因此,我目前正在尝试向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的人们提供帮助。 所以请你帮忙

提前致谢

在处理WriteByte之前,我先处理ReadByte方法,因为这样您可以通过回读来验证写入。 因此,查看ReadByte例程,我可以很快看到一个问题。

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

要认罪!

我相信这是因为我没有为以后的阅读器禁用写保护位,也没有清除时钟暂停标志(CH)。

希望这对任何人都有帮助Dan

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM