私は非常に基本的な質問があります。しかし、これまで何を試みても、私はこれをうまく実装できませんでした。PIC C18:バイトからビットを読み取る
Iは、次のハードウェア構成でPIC18F2550に接続されたシフトレジスタ(74LS164)を有する:
// Data pin
#define SCLCD_DATA LATBbits.LATB7
#define SCLCD_DATA_TRIS TRISBbits.TRISB7
// Clock pin
#define SCLCD_CLOCK LATBbits.LATB6
#define SCLCD_CLOCK_TRIS TRISBbits.TRISB6
LEDは、そのステータスを表示する74LS164の出力端子に接続されています。私はunsigned char
と宣言された8ビットの変数を持っています。この変数のビットをシフトレジスタに送りたいと思います。シフトレジスタは内部フリップフロップを有し、その出力はQ0-Q7と名付けられる。最初に送られたビットはQ0にロードされ、2番目のビットを送信すると、前のQ0はQ1にシフトし、新しく送信されたビットはQ0になります。送信が完了すると、変数のLSBがシフトレジスタのQ0にあると想定され、MSBはQ7になります。
私のコードは、(言語がC18である)このようなものです:
void SCLCD_SendSerialBits(unsigned char unRegister)
{
// ucRegister is always passed as 0b10101010 for test
for (i=0; i<8; i++)
{
SCLCD_CLOCK = 0;
SCLCD_DATA = ((ucRegister & 0b10000000) == 0b10000000) ? 1 : 0;
ucRegister = ucRegister << 1;
SCLCD_CLOCK = 1;
}
}
私がしたいよう上記のコードは実行されません。私がそれを実行すると、0b11111111
をucRegister
変数にロードしたかのように、すべてのLEDが点灯します。
ただし、以下の一つは非常にうまく機能:
void SCLCD_SendSerialBits(void)
{
SCLCD_CLOCK = 0; SCLCD_DATA = 1; SCLCD_CLOCK = 1;
SCLCD_CLOCK = 0; SCLCD_DATA = 0; SCLCD_CLOCK = 1;
SCLCD_CLOCK = 0; SCLCD_DATA = 1; SCLCD_CLOCK = 1;
SCLCD_CLOCK = 0; SCLCD_DATA = 0; SCLCD_CLOCK = 1;
SCLCD_CLOCK = 0; SCLCD_DATA = 1; SCLCD_CLOCK = 1;
SCLCD_CLOCK = 0; SCLCD_DATA = 0; SCLCD_CLOCK = 1;
SCLCD_CLOCK = 0; SCLCD_DATA = 1; SCLCD_CLOCK = 1;
SCLCD_CLOCK = 0; SCLCD_DATA = 0; SCLCD_CLOCK = 1;
}
私のコードが間違っていますか?私の問題は、エラーSCLCD_DATA = ((ucRegister & 0b10000000) == 0b10000000) ? 1 : 0;
の行にある可能性が最も高いですが、私はそれを見ても、それは私には大丈夫です。私のコードで何が間違っていますか?
ご協力いただければ幸いです。
MBLABシミュレータを使用してコードを実行し、ビットが期待どおりにオン/オフします。私はあなたのコンパイラのバージョンが期待どおりの出力をオンにする命令を生成していることを確認するために同じことをお勧めします。コンパイラが悪いコードを生成している場合は、最新のコンパイラreleeにアップグレードします。シミュレータがうまくいけば、もっと不吉なことが起こっているかもしれません。それはタイミングの問題かもしれませんか?動作するコードは、動作しないコードよりもはるかに高速にシフトレジスタをクロックすることになります。しかし、より速いコードが遅くなる前に失敗することに感謝します。 – user957902