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に変更しますが、__ A1をAに変更しないため、このマクロは想定どおりに機能しません。
私はそれを修正するのに多くの時間を費やしたので、助けていただければ幸いです:)
編集::
問題の解決策を見つけたかもしれません:
(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) に変更したかったのですが、代わりに何かを再宣言しているようです。
理解できません。