0

私はMPLABxとHITechPICCコンパイラを使用しています。私のターゲットチップはPIC16F876です。pic16f876.hインクルードファイルを見ると、チップのシステムレジスタを名前で参照することで設定できるはずです。

たとえば、CCP1CONレジスタ内のビット0〜3は、CCPおよびPWMモジュールの動作を設定します。pic16f876.hファイルを見ると、CCP1CONレジスタの残りの値を変更せずに、これらの4ビットだけを参照できるはずです。

しかし、私はこれらの4ビットをさまざまな方法で参照しようとしましたが、成功しませんでした。

私が試してみました;

CCP1CON.CCP1M=0xC0; this results in "error: struct/union required
CCP1CON:CCP1M=0xC0; this results in "error: undefined identifier "CCP1M"

しかし、両方とも失敗しました。Hi Tech PICCコンパイラのマニュアルを読みましたが、その方法がわかりません。

pic16f876.hファイルからは、.hファイルで定義されているため、システムレジスタ内のこれらのサブセットを名前で参照できるはずであるように見えます。誰かがこれを達成する方法を知っていますか?

pic16f876.hからの抜粋

// Register: CCP1CON
volatile unsigned char           CCP1CON             @ 0x017;
// bit and bitfield definitions
volatile bit CCP1Y               @ ((unsigned)&CCP1CON*8)+4;
volatile bit CCP1X               @ ((unsigned)&CCP1CON*8)+5;
volatile bit CCP1M0              @ ((unsigned)&CCP1CON*8)+0;
volatile bit CCP1M1              @ ((unsigned)&CCP1CON*8)+1;
volatile bit CCP1M2              @ ((unsigned)&CCP1CON*8)+2;
volatile bit CCP1M3              @ ((unsigned)&CCP1CON*8)+3;
#ifndef _LIB_BUILD
volatile union {
struct {
    unsigned    CCP1M               : 4;
    unsigned    CCP1Y               : 1;
    unsigned    CCP1X               : 1;
};
struct {
    unsigned    CCP1M0              : 1;
    unsigned    CCP1M1              : 1;
    unsigned    CCP1M2              : 1;
    unsigned    CCP1M3              : 1;
};
} CCP1CONbits @ 0x017;
#endif
4

1 に答える 1

1

構造体のインスタンスを介してビットフィールドメンバーにアクセスする必要があります。この場合、それはCCP1CONbitsです。これはビットフィールドであるため、コードの8ビット全体ではなく、ビットフィールドで定義されている有効ビット数だけが必要です。

それで:

CCP1CONbits.CCP1M = 0x0c;

あなたがやろうとしていることと同等でなければなりません。8ビットすべてを一度に設定したい場合は、を使用できますCCP1CON = 0xc0。これにより、CCP1Mビットが0x0cに設定され、他のすべてのビットがゼロに設定されます。

指定したヘッダーにも個別のビット記号があるため、これも実行できます。

CCP1M0 = 1;
CCP1M1 = 1;
CCP1M2 = 0;
CCP1M3 = 0;

ビットフィールドアプローチはよりクリーンですが。

于 2012-01-23T05:37:51.503 に答える