マイクロコントローラをプログラムしたことがある場合は、特定のレジスタの選択ビットを操作したり、全体にバイトを書き込んだりすることに慣れているでしょう。たとえば、C を使用する PIC では、1 バイト全体を PORTA に書き込んですべてのビットを設定するか、単純に PORTAbits.RA# をアドレス指定して 1 つのビットを設定することができます。これらの構造体/共用体が定義されている方法を模倣しようとしているので、プログラムの変数で同じことを行うことができます。具体的には、マイクロコントローラがオンになったときに、自分で定義したレジスタを次のようなものでリセットできるようにしたい
REGISTER = 0;
対
REGISTERbits.BIT0 = 0;
REGISTERbits.BIT1 = 0;
...
//or
REGISTERbits = (0,0,0,0,0,0,0,0);
等
明らかに、前者の方がエレガントで、行スペースを大幅に節約できます。マイクロコントローラーのヘッダー ファイルは、次のようになります。
#ifndef __18F2550_H
#define __18F2550_H
....
extern volatile near unsigned char LATA;
extern volatile near struct {
unsigned LATA0:1;
unsigned LATA1:1;
unsigned LATA2:1;
unsigned LATA3:1;
unsigned LATA4:1;
unsigned LATA5:1;
unsigned LATA6:1;
} LATAbits;
...すべてのレジスタに対して、および複数バイトのレジスタは、Registerbits に構造体の共用体を使用します。私の初期化/宣言はヘッダーではなくメイン ソース ファイルにあるため、extern を削除し、私の近くに置きました。
volatile unsigned char InReg;
volatile struct{
unsigned NSENS:1; //One magnetic sensor per direction
unsigned SSENS:1;
unsigned ESENS:1;
unsigned WSENS:1;
unsigned YBTN:1; //One crosswalk button input per axis
unsigned XBTN:1; //(4 buttons tied together each)
unsigned :2;
} InRegbits;
...しかし、コンパイル時に、InReg と InRegbits はメモリ内の 2 つの別々の場所として定義されます。つまり、InReg に書き込んで InRegbits を変更することはできません。これが機能するように変更するにはどうすればよいですか?私がコピーしようとしているのは、特別なマイクロコントローラ レジスタであるため、機能するだけですか?
助けてくれてありがとう