0

設計上の制限により、PIC18F4550の3つの異なるポートに分割されたメモリコントローラーのアドレスラインがあります。マッピング:

#define A0 PORTBbits.RB2
#define A1 PORTBbits.RB3
#define A2 PORTBbits.RB4
#define A3 PORTBbits.RB5
#define A4 PORTAbits.RA0
#define A5 PORTAbits.RÄ1
#define A6 PORTAbits.RÄ2
#define A7 PORTAbits.RÄ3
#define A8 PORTAbits.RÄ4
#define A9 PORTAbits.RÄ5
#define A10 PORTEbits.RE0
#define A11 PORTEbits.RE1
#define A12 PORTEbits.RE2

これに単一の変数ADDRESSとしてアクセスしたいので、ユニオンを使用してアクセスしようとしましたが、次のような「構文エラー」が発生します。

union
{
        struct
        {
            A0 :1;
            A1 :1;
            A2 :1;
            A3 :1;
            A4 :1;
            A5 :1;
            A6 :1;
            A7 :1;
            A8 :1;
            A9 :1;
            A10 :1;
            A11 :1;
            A12 :1;
        };
} ADDRESS;

どうすればこれを行うことができますか?

4

1 に答える 1

0

使用しているI/Oが複数のポートにハッシュされているため、これは非常に簡単ではありません。

あなたができる唯一の単純化は、3つの異なるアドレスチャンクによってアクセスされるページにあなたのメモリを管理することです:

lowAddr will be RB2:RB5
midAddr will be RA0:RA5
highAdd will be RE0:RE2

メモリページを大きくできるように、低アドレス部分には大きなチャンクを使用することが望ましいでしょう。ここでは、16バイトのページしかありません。

したがって、ビットフィールド構造を定義して、メモリを単一の変数に管理できます。

struct {
   uint16 lowAddr : 4;
   uint16 midAddr : 6;
   uint16 highAddr : 3;
   uint16 : 3;
} memoryAddr;

このようにして、portBのようにポートの更新をより効率的に処理できます。

LATB &= 0xFF ^ (3 << 2);
LATB |= memoryAddr.lowAddr << 2;
于 2011-03-31T22:10:44.857 に答える