2012-02-05 14 views
2

私は非常に基本的な質問があります。しかし、これまで何を試みても、私はこれをうまく実装できませんでした。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; 
    } 
} 

私がしたいよう上記のコードは実行されません。私がそれを実行すると、0b11111111ucRegister変数にロードしたかのように、すべての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;の行にある可能性が最も高いですが、私はそれを見ても、それは私には大丈夫です。私のコードで何が間違っていますか?

ご協力いただければ幸いです。

+0

MBLABシミュレータを使用してコードを実行し、ビットが期待どおりにオン/オフします。私はあなたのコンパイラのバージョンが期待どおりの出力をオンにする命令を生成していることを確認するために同じことをお勧めします。コンパイラが悪いコードを生成している場合は、最新のコンパイラreleeにアップグレードします。シミュレータがうまくいけば、もっと不吉なことが起こっているかもしれません。それはタイミングの問題かもしれませんか?動作するコードは、動作しないコードよりもはるかに高速にシフトレジスタをクロックすることになります。しかし、より速いコードが遅くなる前に失敗することに感謝します。 – user957902

答えて

2

コードが正常に動作するように見えます。私は(お使いのシステムは、バレルシフタを持っていると仮定して)、より読みやすく、効率的に、このようにそれを記述します。システムの

for (i=7; i>=0; i--) 
{ 
    SCLCD_CLOCK = 0; 
    SCLCD_DATA = ((ucRegister >> i) & 1); 
    SCLCD_CLOCK = 1; 
} 

をバレルシフタせずに、あなたのコードのバリエーションを

unsigned char ucMask = 0x80; 

    for (i=0; i<8; i++) 
    { 
     SCLCD_CLOCK = 0; 
     SCLCD_DATA = (ucRegister & ucMask) ? 1:0; 
     ucMask >>= 1; 
     SCLCD_CLOCK = 1; 
    } 

を私の場合最初または2番目の例がうまくいくと、コンパイラが定数値を処理していないか、元のコードと正しく比較しているように見えます。

0

あなたのパラメータは、誤って入力されている可能性がありますが、あなたのパラメータは、ucRegisterではなく登録されていません。 ucRegisterが0b11111111のグローバルである可能性はありますか?

関連する問題