私は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();
}
すべてが期待どおりに動作します。私がどのように元の "データ"変数をシフトして型キャストするかには明らかに問題がありますが、私はすべての種類の並べ替えを同じ結果で試みました。誰かが私が間違っているかもしれないところを指摘できれば、非常に感謝しています。
インクリメントと左シフトを実行しているコードを表示できますか?たぶんそのコードは悪いです。 –
呼び出しコードを教えてください... –
gccは本当に '1077WriteDiv'を識別子として使用するのではありませんか?本当のコードを見せてくれますか? –