1

PIC 用のCマクロの作成に問題があります。他の C ベースのシステムでも同じなので、PIC 以外のCの専門家も大歓迎です。

LED_1 ピンを定義したと仮定しましょう:

#define LED_1 A1    //A1 as output for LED_1

したがって、LED を点灯させたい場合は、次のように記述します。

PORTAbits.RA1 = 1;

LED_1 定義を使用して実行したい場合は、さらに 2 つのマクロを追加する必要があります。

#define change_PORT_(var) PORTAbits.R##var
#define change_PORT(var) change_PORT_(var

そしてそれを使用するには:

change_PORT(LED_1) = 1;

そして、それは魅力のように機能します。しかし、問題は、上記の定義で私が持っていることです

PORT Aビット.##var

では、PORTB の値を変更したい場合はどうすればよいでしょうか? ポート A とポート B に対して別々のマクロを作成する必要があります。しかし、それは堅牢なソリューションにはほど遠いものです。そして、理由はわかりませんが、うまくいかないアイデアを思いつきました。

#define LED_1 A1
#define LED_2 B1

#define __A1 A   //This would be defined for all PORTA's pins such as A2,A3,A4 etc
#define __B1 B

#define ___change_PORT(var,var2)    PORT##var2 bits.R##var
#define __change_PORT(var,var2)   ___change_PORT(var,var2)
#define _change_PORT(var)    __change_PORT(var,__##var) // creating e.g. __A1
#define change_PORT(var)   _change_PORT(var)

そして、これを実行しようとすると:

change_PORT(LED_1);

コンパイラは__##var___A1に変更しますが、__ A1Aに変更しないため、このマクロは想定どおりに機能しません。

私はそれを修正するのに多くの時間を費やしたので、助けていただければ幸いです:)


編集::


問題の解決策を見つけたかもしれません:
(LAT は別のレジスタ名ですが、PORT と同じように機能するため、この名前の変更は関係ありません)

#define ___PORTchange(var,var2) PORT##var2##bits.R##var
#define __PORTchange(var,var2)  ___PORTchange(var,var2)
#define CHANGE_TO_PORT_NAME(var) ___##var
#define _PORTchange(var)    __PORTchange(var,CHANGE_TO_PORT_NAME(var))
#define PORTchange(var) _PORTchange(var)

しかし、コンパイルエラーが発生します:

100: PORTAbits.RA0 = 1;
^ (374) 基本型がありません。int と見なされます (警告)
^ (983) ストレージ クラスが再宣言されました
^ (984) タイプが再宣言
されました ^ (239) 識別子 "PORTAbits" が再定義されました (3900 行目から)
^ (314) ";" 期待される

いいえ、正しく置き換えられませんが、理解できないPORTAbitsを再定義することを知らせるコンパイラ警告が表示されます。プリプロセッサでPORTchange(var)PORTxbits.Rvar ( x は A または B) に変更したかったのですが、代わりに何かを再宣言しているようです。

理解できません。

4

1 に答える 1

2

私が前処理した場合(いくつかのgccバージョンとsun ccで試しました)

#define LED_1 A1
#define LED_2 B1

#define __A1 AX
#define __B1 BX

#define ___change_PORT(var,var2)    PORT##var2##bits.R##var
#define __change_PORT(var,var2)   ___change_PORT(var,var2)
#define _change_PORT(var)    __change_PORT(var,__##var)
#define change_PORT(var)   _change_PORT(var)

change_PORT(LED_1);
change_PORT(LED_2);

私は得る

PORTAXbits.RA1;
PORTBXbits.RB1;

これは明らかにあなたが望んでいるものです。コンパイラのバグ?

于 2011-04-16T16:53:33.883 に答える