2

マイクロチップ 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);
}

このようにして、複数のポート エクスパンダを管理できます。

だから、私がやろうとしていることをする方法はありますか?

ありがとう。

4

1 に答える 1

1

構造体を として宣言し__attribute__((packed))、次を使用します。

void function setPin(struct LATBBITS *reg, unsigned int fieldno, unsigned int value){
    if (value)
        *(uint16_t *)reg |= (1 << fieldno);
    else
        *(uint16_t *)reg &= ~(1 << fieldno);
}
于 2012-08-12T12:48:27.477 に答える