0

私はいくつかの AVR プログラミングを行っており、このビット操作全体を少し理解していますが、データ型変換についてはまだ確信が持てません。

例えば:

2 つのポート上の 16 個の LED の状態に対応する16 ビット変数 ( myValue) があります (例: ポート A に 8 個の LED、ポート D に 8 個の LED)。の上位 8 ビットはmyValueポート Dにあります。

したがって、私の考えは、基本的(0b0000000011111111 & myValue)にポート A と(0b1111111100000000 & myValue)ポート Dの値を取得するために使用することでした。

問題は、その後、次のようなことができるuint8_t portA = (0b0000000011111111 & myValue)かということです。私は簡単に設定できると信じています

PORTA |= portA

ポート A には 8 つのピンしかないため (私の場合)。

&ポート D で問題が発生するのは、操作後も 16 ビット変数のままであるため、ポート D では符号なし 8 ビットを使用できないためです。16 ビット変数で 8 ピンのポート D を設定するにはどうすればよいですか?

4

2 に答える 2

2

宛先より大きいサイズの値を割り当てると、上位ビットが切り捨てられます。これだけ

PORTA = (uint8_t)myValue;

で十分ANDです。

同様に、ポート D にも使用できます

PORTD = (uint8_t)(myValue >> 8);

ここでのキャストは不要です。これらは、場合によってはコンパイラの警告を無効にするためのものであり、明確にするためのものでもあります

から値をコピーする場合は、値を直接割り当てる必要があることに注意してくださいmyValue。を使用ORするには、現在のポートの値を読み込み、マスクを使用して読み込んでからOR書き戻す必要がありますが、これは単なるコピーよりも遅くなります。ポートの一部のビットを調整したい場合にのみ、値に対してロジックを実行する必要があります。

于 2013-10-21T05:14:19.953 に答える
1

使用する:

PORTD = (myValue >> 8) & 0xff;

また、安全な側にとどまり、ポート A のクリッピングを行います。

PORTA = myValue & 0xff;

|=を使用すると、0 から 1 までのビットのみを設定できることに注意してください。すでに 1 になっているビットは、or 操作によって変更されません。

于 2013-10-20T22:12:47.713 に答える