1

そのため、現在 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);
}

2 番目のサンプルは、私の書き込み方法です。

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 年前のページへのリンクか、PM を求めている人だけのヘルプです。では、お役に立てることがあればお願いします

前もって感謝します

4

2 に答える 2

0

WriteByteで作業する前に、ReadByteメソッドで作業します。これは、書き込みを読み戻すことで検証できるためです。したがって、ReadByteルーチンを見ると、1つの問題がすぐにわかります。

DS1302のデータシートには、「データビットはクロックの立ち下がりエッジで出力される」と記載されていますが、ReadByteルーチンでは、RB4の入力が読み取られ、後でクロックをローに設定します。また、「送信される最初のデータビットは、コマンドバイトの最後のビットが書き込まれた後の最初の立ち下がりエッジで発生することに注意してください。」しかし、ループを初めて通過するときは、最初の立ち下がりエッジの前にRB4を読み取っています。

于 2012-12-06T13:04:56.323 に答える
0

確認する!

将来の読者のために、書き込み保護ビットを無効にしていないため、クロック停止フラグ (CH) を設定せずにクリアする必要があるためだと思います。

これがダンを探している人の助けになることを願っています

于 2012-12-07T15:34:11.570 に答える