RL78,ポート操作,関数の引数にポート番号を指定する方法

Former Member
Former Member

RL78/G13,CS+ for CA,CXを使用しています。

1秒のパルス出力を行いたくポート(P0.0等)を引数に関数を作りたいのですが、引数の型はどのようにすれば可能でしょうか。

ポートの数が多いのでポートを引数にとる関数化したいです。

ポートはuserdifine.h等で

#define OUTPUT1 (P0.0)

のようにdefineして。

static void pulseOutput(int port)
{
 port = 1;

 //1秒待機
 port = 0;
}

上記関数を

pulseOutput(OUTPUT1);

というように関数をコールしたいです。

調べたつもりですが、既に回答が出ていれば申し訳ありません。あればそちらのpostのURLをいただけると幸いです。

  • わわいです
    まー、まずおもいつくのは、そのポートをON/OFFする関数を、ポートの数だけ用意しておいて、portの数値によりON/OFF関数を切り替えていく、ってかんじでしょうか?

    具体的になにをどうしたい、ということを説明してくれれば、他になにかいい方法があるかもしれませんが。
  • Former Member
    Former Member in reply to わわい
    回答ありがとうございます。
    やりたい内容はarduinoのdigitalWrite関数と同じです。
    あちらは引数が(port番号,レベル)となっています。
    RL78の場合、PX.Yという形でポート操作できるのでそれをそのまま引数に出来れば楽かと思い質問させていただきました。
    出力ポートと同じ数だけdefineを行ってswitch文で分岐して中でポートに代入してみようかと思います。
  • static void pulseOutput(int portnum, int bitnum)
    {
        (&P0)[portnum] |= (1 << bitnum);
        
        //1秒待機
        
        (&P0)[portnum] &= ~(1 << bitnum);
    }
    

    とかして pulseOutput(0, 0); とかすれば良いのでは?

  • design様

    対応するビットをON-1s-OFFというのであり
    defineで定義するのであれば
    何も考えず適当な形ですが

    #define OUTPUT1 0x01
    #define OUTPUT2 0x02
    ~略~
    #define OUTPUT8 0x80

    void pulseOutput(int port)
    {
    P0 = 0x80;

    delay 1s

    P0 = 0x00;
    }

    のように、ポートの出力ビットを
    指定でもいいのではないでしょうか?

  • > やりたい内容は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);
        }
    }
    
  • Former Member
    Former Member in reply to Sugachance

    回答ありがとうございます。

    Sugachance様
    こちらの例の場合引数のportはどのように扱われるのでしょうか。

     

  • Former Member
    Former Member in reply to fujita nozomu
    回答ありがとうございます。
    fujita nozomu様

    知識不足で申し訳ありません。
    (&P0)[portnum]という書き方ですが、
    配列へのアクセスの様な考え方であってますか。
  • わわいです


    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));
        }
    }

    こんなんとか?

  • わわいです
    あ、*PORTADR[portno>>3] ですね
    複数のポートを横断して指定できるようにするにはこういう形にするしかないかと。。
  • > (&P0)[portnum]という書き方ですが、

    > 配列へのアクセスの様な考え方であってますか。

    C言語では p[i] は *(p + i) と等価なので (&P0)[portnum] は *(&P0 + portnum) と等価です。

    配列ではなくポインタ演算結果の指すオブジェクトへのアクセス、と理解されるのが良いでしょう。