RL78/G13,CS+ for CA,CXを使用しています。
1秒のパルス出力を行いたくポート(P0.0等)を引数に関数を作りたいのですが、引数の型はどのようにすれば可能でしょうか。
ポートの数が多いのでポートを引数にとる関数化したいです。
ポートはuserdifine.h等で
#define OUTPUT1 (P0.0)
のようにdefineして。
static void pulseOutput(int port){ port = 1;
static void pulseOutput(int port)
{
port = 1;
//1秒待機 port = 0;}
//1秒待機
port = 0;
}
上記関数を
pulseOutput(OUTPUT1);
というように関数をコールしたいです。
調べたつもりですが、既に回答が出ていれば申し訳ありません。あればそちらのpostのURLをいただけると幸いです。
static void pulseOutput(int portnum, int bitnum) { (&P0)[portnum] |= (1 << bitnum); //1秒待機 (&P0)[portnum] &= ~(1 << bitnum); }
とかして pulseOutput(0, 0); とかすれば良いのでは?
> やりたい内容はarduinoのdigitalWrite関数と同じです。
> あちらは引数が(port番号,レベル)となっています。
じゃあ↓で。
void digitalWrite(int portnum, int bitnum, int level) { if (level) { (&P0)[portnum] |= (unsigned char)(1 << bitnum); } else { (&P0)[portnum] &= (unsigned char)~(1 << bitnum); } }
わわいです
void portout(int portno,int onof){ static const unsigned char* PORTADR[]={ &P0, &P1, &P2, &P3, &P4, }; if(onof){ *PORTADR(portno>>3) |= 1<<(portno&7); }else{ *PORTADR(portno>>3) &= ~(1<<(portno&7)); }}
こんなんとか?
> (&P0)[portnum]という書き方ですが、
> 配列へのアクセスの様な考え方であってますか。
C言語では p[i] は *(p + i) と等価なので (&P0)[portnum] は *(&P0 + portnum) と等価です。
配列ではなくポインタ演算結果の指すオブジェクトへのアクセス、と理解されるのが良いでしょう。