私は IC の DS1620 を使用して、単一のラインで受信する 1 ビットのシリアル データを読み取ります。ARM マイクロコントローラ (LPC2378) のポートの 1 つを使用して、このデータを読み取る必要があります。ARM ポートは 32 ビットです。この値を 1 ビット変数に入れるにはどうすればよいですか?
編集:つまり、ポートピンへの直接参照が必要です。
私は IC の DS1620 を使用して、単一のラインで受信する 1 ビットのシリアル データを読み取ります。ARM マイクロコントローラ (LPC2378) のポートの 1 つを使用して、このデータを読み取る必要があります。ARM ポートは 32 ビットです。この値を 1 ビット変数に入れるにはどうすればよいですか?
編集:つまり、ポートピンへの直接参照が必要です。
1 ビットの変数はありませんが、たとえば次のように特定のビットを分離できます。
uint32_t original_value = whatever();
uint32_t bit15 = (original_value >> 15) & 1; /*bit15 now contains either a 1 or a 0 representing the 15th bit */
注: 0 または 1 から始まるビット番号をカウントしていたかどうかはわかりません>> 15
。
もう 1 つのオプションはビット フィールドを使用することですが、それは面倒になり、値のすべてのビットが何らかの方法で役立つ場合を除き、IMO は価値がありません。1 つか 2 つのビットだけが必要な場合は、シフトとマスキングが最適です。
全体として、この記事は役に立つかもしれません。
CPU については、Evan Teran からの回答を使用する必要があります。Cortex-M3 のような他の ARM CPU のビットバンド機能について言及したかっただけです。RAM/ペリフェラルの一部の領域では、簡単にアクセスできるようにすべてのビットが個別のアドレスにマップされます。
詳細については、 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337e/Behcjiic.htmlを参照してください。
ポート レジスタに直接アクセスできれば (私は ARM の経験がありません)、必要なビットに対応するバイナリ マスクをビットごとに AND するだけで簡単です。
var = (PORT_REGISTER & 0x00008000);
現在、var には、15 番目のビットが「0」の場合は 0、15 番目のビットが「1」の場合は 0x00008000 が含まれます。
また、「0」または「1」のいずれかが必要な場合は、シフトできます。
var = ((PORT_REGISTER & 0x00008000) >> 15);
LPC2378 (他の LPC2xxxx マイクロコントローラ ファミリと同様) では、I/O ポートはシステム メモリ内にあるため、次のようにいくつかの変数を宣言する必要があります。
#define DALLAS_PIN (*(volatile unsigned long int *)(0xE0028000)) /* Port 0 data register */
#define DALLAS_DDR (*(volatile unsigned long int *)(0xE0028008)) /* Port 0 data direction reg */
#define DALLAS_PIN (1<<15)
0xE0028000 はポート 0 のデータ レジスタのアドレスであり、0xE0028008 はポート 0 のデータ方向レジスタ アドレスであることに注意してください。アプリで使用されているポートとビットに応じて、これを変更する必要があります。その後、コード関数で、書き込み 1、書き込み 0、および読み取りのコードまたはマクロは、次のようにする必要があります。
#define set_dqout() (DALLAS_DDR&=~DALLAS_PIN) /* Let the pull-up force one, putting I/O pin in input mode */
#define reset_dqout() (DALLAS_DDR|=DALLAS_PIN,DALLAS_PORT&=~DALLAS_PIN) /* force zero putting the I/O in output mode and writing zero on it */
#define read_dqin() (DALLAS_DDR&=~DALLAS_PIN,((DALLAS_PORT & DALLAS_PIN)!= 0)) /* put i/o in input mode and test the state of the i/o pin */
これが役立つことを願っています。
よろしく!