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をいただけると幸いです。

Parents
  • 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);
        }
    }
    
  • 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) と等価です。

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

  • Former Member
    Former Member in reply to わわい
    わわい様
    回答ありがとうございます。
    *PORTADR[portno>>3]の所ですが、
    例えばP1.6のときportno=16とすると
    portno>>3 = 2となって&P2となってしまう気がするのですが、
    引数の入れ方はこのような理解で良いでしょうか。
  • Former Member
    Former Member in reply to fujita nozomu
    fujita nozomu様
    解説ありがとうございます。
    ポートレジスタへのアクセスがイメージできました。マニュアルのPxxの項も見てわかりました。
  • チョコです。
    わわいさんは,ポートの指定は3ビット(8進数)で表され,連続しているものとして処理されています。

    P1.6を16と10進数で表すのであれば,3ビットシフトではなく,10で割るべきでしょう。
  • わわいです
    元質問のポート番号というものがどういうもんであるかがわかりませんが、、
    portno と出力ビットの関係は以下のようになります
    0 P0のbit0
    1 P0のbit1
    2 P0のbit2
    3 P0のbit3
    4 P0のbit4
    ... ... ...
    7 P0のbit7
    8 P1のbit0
    9 P1のbit1
    10 P1のbit2
    ... ... ...
    15 P1のbit7
    16 P2のbit0
    ... ... ...
    24 P3のbit0
    ... ... ...
    32 P4のbit0

    とゆーとこらへんでどーでしょう
  • Former Member
    Former Member in reply to わわい
    チョコ様
    わわい様
    回答ありがとうございます。

    質問に不足が有り申し訳ありませんでした。
    指摘の通りで
    >P1.6を16と10進数で表す
    という書き方で考えていました。

    皆様回答ありがとうございました。
    やりたい動作が可能になりました。
Reply
  • Former Member
    Former Member in reply to わわい
    チョコ様
    わわい様
    回答ありがとうございます。

    質問に不足が有り申し訳ありませんでした。
    指摘の通りで
    >P1.6を16と10進数で表す
    という書き方で考えていました。

    皆様回答ありがとうございました。
    やりたい動作が可能になりました。
Children
No Data