0

私は組み込みプログラミングが初めてです。私は 2 つのヘッダー ファイルを持つ PIC マイクロコントローラーを持っています:pic.hTimer_peripheral.h.

タイマー コンフィギュレーション レジスタではpic.h、次のように定義されています。

__extension__ typedef struct tagT1CONBITS {
union {
  struct {
    unsigned :1;
    unsigned TCS:1;
    unsigned TSYNC:1;
    unsigned :1;
    unsigned TCKPS:2;
    unsigned TGATE:1;
    unsigned :6;
    unsigned TSIDL:1;
    unsigned :1;
    unsigned TON:1;
  };

  struct {
    unsigned :4;
    unsigned TCKPS0:1;
    unsigned TCKPS1:1;
   };
};
} T1CONBITS;

および ではtimer.h、いくつかのマクロが次のように定義されています。

/* Timer1 Control Register (T1CON) Bit Defines */

#define T1_ON               0xffff      /* Timer1 ON */
#define T1_OFF              0x7fff      /* Timer1 OFF */

これは、マイクロコントローラのデータシートに対応しています。unsignedタイプは 16 ビットです。この方法でT1_ON を構造体変数に割り当てようとしましたT1CONBITS:

T1CONBITS=T1_ON   // which is wrong.

構造体を初期化できることはわかっていますが、メイン関数で割り当てを行いたいのですが、次のような構造体メンバーを使用してそれを行いたくありません。

T1CONBITS.TCS=1; 
T1CONBITS.TSYNC=1;

それを行う方法はありますか?そうでない場合、なぜこれらのマクロtimer.hが定義されていると思いますか?

洞察をありがとう

4

4 に答える 4

1

これを前処理したら

T1CONBITS=T1_ON;

これは次のようになります:

T1CONBITS=0xffff;

変数にするには、同じ型の変数structのみを割り当てることができます。


T1CONBITSそうすることで、すべて1の s に簡単に設定できます。

memset(&T1CONBITS, 0xff, sizeof(T1CONBITS));
于 2013-09-04T14:46:58.153 に答える
1

構造体 T1CONBITS の名前は、T1CONのビットにアクセスするためのものであることを示しています。次のように記述できるレジスタ T1CON も定義されていますか?

T1CON = T1_ON ;

さらに良いことに、意図したとおりに T1CONBITS を使用するだけで、T1_ON と T1_OFF を完全に使用する必要がなくなります。

T1CONBITS.TON = 0 ; // Off
T1CONBITS.TON = 1 ; // On

T1CON を直接割り当てると、他のすべてのビットが 1 に設定されますが、これはおそらく意図したものではありません。むしろ、読み取り-変更-書き込みを行います。これは、本質的にビット アクセスが行うことであり、エラーが発生しにくく、より明確になります。

于 2013-09-05T11:02:55.183 に答える