マイクロチップ C30 コンパイラでは、次の方法で LAT レジスタを使用してピン i/o 値を設定できます。
LATBbits.LATB10=1;
LATBbits は次のように定義されます。
typedef struct tagLATBBITS {
unsigned LATB0:1;
unsigned LATB1:1;
unsigned LATB2:1;
unsigned LATB3:1;
unsigned LATB4:1;
unsigned LATB5:1;
unsigned LATB6:1;
unsigned LATB7:1;
unsigned LATB8:1;
unsigned LATB9:1;
unsigned LATB10:1;
unsigned LATB11:1;
unsigned LATB12:1;
unsigned LATB13:1;
unsigned LATB14:1;
unsigned LATB15:1;
} LATBBITS;
extern volatile LATBBITS LATBbits __attribute__((__sfr__));
私の目標は、疑似コードで、LAT レジスタを引数として使用して i/o 値を設定できる関数を作成することです。
void setPin(unsigned int* latReg, unsigned int value){
(*latReg)=value;
}
setPin(&LATBbits.LATB10, 1);
残念ながら、「ビットフィールド 'LATB10' のアドレスを取得できない」ため、このコードはコンパイルされません。
ポートエクスパンダを扱えるsimil-classライブラリを実現したいので必要です。各ポート エクスパンダは異なるピンを持つことができるので、それを構成する必要があり、次のようにする必要があります。
typedef struct sPortExpander{
unsigned int* CS;
unsigned int* SPBUFF;
ecc...
} PortExpander
void PortExpander_setOutput(PortExpander p, unsigned char value){
(*p.CS)=0;
// Send SPI data
(*p.CS=1);
}
このようにして、複数のポート エクスパンダを管理できます。
だから、私がやろうとしていることをする方法はありますか?
ありがとう。