2011-10-29 23 views
2

私はAVRマイクロコントローラを使用して、I2Cバスを介してプログラマブル周波数分周器チップに書き込みます。AVR GCC - タイプキャストの問題

void 1077WriteDiv(int16_t data) 
{ 
    uint8_t upperByte = (uint8_t)((uint16_t)data>>2); 

    i2c_start(DS1077_BASE_ADDRESS); 
    i2c_write(DIVIDE_REGISTER); 
    i2c_write(upperByte); 
    i2c_write(0x0); 
    i2c_stop(); 
} 

私は、「データ」の10ビット値の上位8ビットを取得しようとしている:一定の間隔で、私はチップの周波数出力を更新するために呼び出され、次の機能を持つようにしようとしています変数を作成して書き出します。第2の「書込み」コマンドは、チップ上の「除算」レジスタの下位8ビット、この場合は0を書き込む。

私はテストケースとして、「データ」変数(特定の理由で署名する必要があります)を0からインクリメントして、2ビット左にシフトし、毎回この関数を呼び出します。私はゴミを出します。しかし、私がこれをするとき:

void 1077WriteDiv(int16_t data) 
    { 
     //uint8_t upperByte = (uint8_t)((uint16_t)data>>2); 
      static uint8_t thing = 0;  

     i2c_start(DS1077_BASE_ADDRESS); 
     i2c_write(DIVIDE_REGISTER); 
     i2c_write(thing++); 
     i2c_write(0x0); 
     i2c_stop(); 
    } 

すべてが期待どおりに動作します。私がどのように元の "データ"変数をシフトして型キャストするかには明らかに問題がありますが、私はすべての種類の並べ替えを同じ結果で試みました。誰かが私が間違っているかもしれないところを指摘できれば、非常に感謝しています。

+1

インクリメントと左シフトを実行しているコードを表示できますか?たぶんそのコードは悪いです。 –

+0

呼び出しコードを教えてください... –

+0

gccは本当に '1077WriteDiv'を識別子として使用するのではありませんか?本当のコードを見せてくれますか? –

答えて

1

はあなたがを取り除くためにしようとしている上位ビットを削除するには、小さなint型へのキャストに頼ることはできません

uint8_t upperByte = (uint8_t) ((data & 0x3FC) >> 2); 

を試してみてください。

1
i2c_write(thing++); 

あなたの分割機は、すべてのコールが増加することを意味します。 「データ」をインクリメントして2だけ右にシフトすると、割り算器はすべての4つのコールをインクリメントします。あなたの2つのコードセクションは同等ではありません。

この機能をどのような間隔で呼び出していますか? 「ゴミ出し」とは何ですか?関数に渡された値が正しいことをどのように知っていますか? DS1077に送信された値が間違っていることをどのように知っていますか?

すべての前提条件を確認してください。

キャストとシフトは私にとっては美しく見えます。少なくとも私はこれまで使用してきたCコンパイラで動作すると思います。このドラフト(ISO/IEC 9899:TC2 6.3コンバージョン)を参照することができるC標準の観点から:新しいタイプが符号なしの場合

そうでない場合、値は 最大値より1を加算または減算繰り返し によって変換され値が 新しいタイプで表示されるまで新しいタイプで表現することができます。

これは現在私がアクセスできる唯一のものです。たぶん誰かが標準的な質問をすることができます。コンパイラが標準に準拠していない可能性があります...

+0

残念ながら、これはいくつかの不明確なハードウェア問題である可能性が高いようです。ディスアセンブラを慎重に見て、シミュレータ上でコードをステップ実行するのに数時間を費やしました。シミュレーションではすべてが完璧に機能します。_software_が正しく動作しない理由を見つけるのが本当に困っています。 – Bitrex

+0

@Bitrexは、あなたの詳細な発見で質問を修正し、多分誰かがあなたを助けることができます...残念ながら、ほとんどの問題は "duh" momemnt :-)まであいまいです –