Renesas Rulz - Japan
Renesas Rulz - Japan
  • User
    Join or sign in
  • Site
  • Search Japan.RenesasRulz.com
  • User
  • Renesas Rulz
  • FAQ
  • パートナー
  • 半導体セミナ
  • eラーニング
  • ヘルプ
  • More
  • Cancel
  • かふぇルネ
  • がじぇるね
  • English Community
  • More
  • Cancel
がじぇっとるねさすコミュニティ
がじぇっとるねさすコミュニティ
GR-KURUMI フォーラム ★ご意見ください!RL78/G13のライブラリ統合化したいと思います。
  • Forums
  • Blog
  • Files
  • がじぇっとるねさす ゆーざー会 - Wiki
  • Tags
  • More
  • Cancel
  • New

 

 GR-SAKURA

 GR-KURUMI

 GR-COTTON

 GR-CITRUS

 GR-PEACH

 GR-KAEDE

 GR-ADZUKI

 GR-LYCHEE

 GR-ROSE

 GR-MANGO(*)

 SNShield

 Web Compiler

 IDE for GR

 TOPPERS関連

 女子美コラボ

 その他

 ※プロデューサミーティング中

 作り方使い方資料

 イベント関連

 作品記事

 体験記事

 その他

 

 ライブラリ

 ツール

 その他・過去ファイル

  • Replies 176 replies
  • Subscribers 281 subscribers
  • Views 59861 views
  • Users 0 members are here
  • GR-COTTON
  • GR-KURUMI
  • GR-ADZUKI
Options
  • Share
  • More
  • Cancel
Related Tags
  • Arduino Pro-mini
  • E1
  • GPS
  • GR-ADZUKI
  • GR-COTTON
  • GR-KURUMI
  • GR-KURUMI 書き込み
  • gr-sakura
  • Guthub
  • i2c
  • JPEG
  • Kirin
  • PMT
  • RL78 レジスタバンク
  • rx
  • S/Wシリアル
  • sd card
  • Serial2
  • WDT
  • webコンパイラ
  • xbee
  • コンパイル
  • シリコンマイク
  • 誤差補正
  • 音源
Related

★ご意見ください!RL78/G13のライブラリ統合化したいと思います。

Okamiya Yuuki
Okamiya Yuuki over 3 years ago

がじぇるね岡宮です。

RL78/G13のボードとしてGR-KURUMI、GR-COTTON、GR-ADZUKIの3つがありますが、これらのライブラリをマージしようと思います。

★3/13を目途にご要望や修正点などを締め切り、その後検証して3月末にWebコンパイラに反映、順次IDE for GRへ適用したいと思います。

 

■概要

ライブラリについて、これまで多くのご意見やご提案があり、それぞれを独立してライブラリアップデートを図っていましたが、マージすることでメンテナンス性の向上と、見やすさ・分かりやすさを向上するために、ファイル構成変更をArduinoや既存のGR-SAKURAと同様にしたいと思います。

・マージについて

 __RL78_G13__ をRL78/G13のGRボード共通マクロとして定義。コンパイルオプションで指定。ちなみにArduinoでは__AVR_ATmega1280__という感じ。

 ボードごとにGRKURUMI, GRADZUKIなどコンパイルオプションを付加することで、切り分けを行う。(テスト版ではまだ付加しておらず、GR-ADZUKIで動作確認してます)

・ファイル構成変更

 ・GR-SAKURAと同様に以下の構成に変更

  Arduino\cores\ 

                 \libraries (階層変更なし)

                 \rl78\ (portableフォルダを廃止してrl78直下に変更)

 ・主な変更

  ・RLduino78_mcu_depend.hや、RLduino78_basic.cpp、RLduino78_timer.cなど、独自にArduinoライブラリが形成されていたものを以下のファイルに移植。

   ただし、関数の中身変更は改善事項を除いて基本的に実施しません。比較的RL78ライブラリは安定しているためです。(microsの検証ですごい苦労したのがトラウマです)

   \Arduino.h (標準ライブラリに広くインクルードされるヘッダ)

         \pins_arduino.h (ボードごとのピンに関するヘッダ)

         \wiring_private.h (wiring**や、W**などのArduino基本ライブラリから参照されるヘッダ)

         \wiring.c (millis()やdelay())

         \wiring_digital.c (digital系)

         \wiring_analog.c (analog系)

         \wiring_pulse.c (pulse系)

         \wiring_shift.c (shift系)

         \WMath.cpp (算数)

         \WInterrupts.c (外部割込み)

         \Tone.cpp (Tone関係)

         \utilities.cpp (GRで独自のもの。例えば省電力やattachIntervalTimerとか)

         \rl78\specific_instructions.h (Fujitaさんが作ってくれた高速化やお役立ち)

 

 

■その他

・標準以外のArduinoのライブラリでよく使われるdigitalPinToPortなどを実装

・RTOS用の記述は削除(動作検証できておらず、あまり使用した事例もみないため。)

・attachMicroIntervalTimer、MsTimer2の時間ずれ不具合は反映しました(Fujitaさんありがとうございます!)

・makeでarによるアーカイブ化してから、リンクするとなぜか不要なものがリンクされてしまうため、適用保留としてます。

 

■テストファイル

・makefile

 ※make用ですが、ActivePerlを組み込んでC:\Program Files (x86)\KPITにGNURL78v14.03-ELFをコピーし、コマンドプロンプトでbuild実行してもOKです。ちなみに.batを実行してもOKで、これがWebコンパイラのビルド実体でもあります。

・e2studio用

 インポートしてビルドできます。

■ご意見、要望などまとめ

No. 内容 対応方針 コメント
1 シリアルバッファを任意に変更できるように 専用のクラスメソッドを用意する  
2

-mcpu=g13 -mmul=noneを指定

以下で分ける

#if __RL78__
 /* 全ボード全RL78共通 */
 #if GRKURUMI
  /* GR-KURUMI 固有 */
 #elif GRCOTTON
  /* GR-COTTON 固有 */
 #elif GRADZUKI
  /* GR-ADZUKI 固有 */
 #endif
 #if __RL78_G13__
  /* RL78/G13 固有 */
 #elif __RL78_G14__
  /* RL78/G14 固有 */
 #elif __RL78_G10__
  /* RL78/G10 固有 */
 #endif
#endif
 その通りに行う  
3

MsTimer2は標準ではないので、librariesフォルダに入れる

その通りに行う  
  • Reply
  • Cancel
  • Cancel
Parents
  • @chobichan
    @chobichan over 3 years ago
    ledのポートの初期化手順で、pinModeの先にdigitalWriteを書くと、正常に初期化されない?

    つまり
    pinMode(led_red, OUTPUT);
    pinMode(led_green, OUTPUT);
    pinMode(led_blue, OUTPUT);
    digitalWrite(led_red, HIGH);
    digitalWrite(led_green, HIGH);
    digitalWrite(led_blue, HIGH);
    なら全部のLEDは点灯しないのですが、
    digitalWrite(led_red, HIGH);
    digitalWrite(led_green, HIGH);
    digitalWrite(led_blue, HIGH);
    pinMode(led_red, OUTPUT);
    pinMode(led_green, OUTPUT);
    pinMode(led_blue, OUTPUT);
    では青と緑のLEDは点灯してしまいます。

    なぜ?
    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
  • fujita nozomu
    fujita nozomu over 3 years ago in reply to @chobichan

    > ledのポートの初期化手順で、pinModeの先にdigitalWriteを書くと、正常に初期化されない?

    ライブラリ V2.02 の gr_common/cores/wiring_digital.c の 454行目以下のインラインアセンブラ部分を

    	__asm __volatile(
    	    "\n"
    	    "        /* %%0 = %0 */                  \n"
    	    "        /* %%1 = %1 */                  \n"
    	    "        /* %%2 = %2 */                  \n"
    	    "        /* %%3 = %3 */                  \n"
    	    "        /* %%4 = %4 */                  \n"
    	    "        /* %%5 = %5 */                  \n"
    	    "        /* %%6 = %6 */                  \n"
    	    "        /* %%7 = %7 */                  \n"
    	    "        /* %%8 = %8 */                  \n"
    	    "        mov     a, %0                   \n"
    	    "        cmp     a, %1                   \n"
    	    "        skc                             \n"
    	    "        br      $!9f                    \n"
    	    "        mov     x, %2                   \n"
    	    "        mulu    x                       \n"
    	    "        movw    bc, ax                  \n"
    	    "        movw    ax, %u3[bc]             \n"
    	    "        movw    hl, ax                  \n"
    	    "        mov     a, %u7[bc]              \n"
    	    "        and     a, [hl]                 \n"
    	    "        movw    ax, %u5[bc]             \n"
    	    "        bnz     $8f                     \n"
    	    "        movw    hl, ax                  \n"
    	    "        mov     a, %8                   \n"
    	    "        add     a, #0xff                \n"
    	    "        mov     a, %u6[bc]              \n"
    	    "        bt      a.2, $4f                \n"
    	    "        bt      a.1, $2f                \n"
    	    "        bt      a.0, $1f                \n"
    	    "        mov1    [hl].0, cy              \n"
    	    "        br      $9f                     \n"
    	    "1:                                      \n"
    	    "        mov1    [hl].1, cy              \n"
    	    "        br      $9f                     \n"
    	    "2:                                      \n"
    	    "        bt      a.0, $3f                \n"
    	    "        mov1    [hl].2, cy              \n"
    	    "        br      $9f                     \n"
    	    "3:                                      \n"
    	    "        mov1    [hl].3, cy              \n"
    	    "        br      $9f                     \n"
    	    "4:                                      \n"
    	    "        bt      a.1, $6f                \n"
    	    "        bt      a.0, $5f                \n"
    	    "        mov1    [hl].4, cy              \n"
    	    "        br      $9f                     \n"
    	    "5:                                      \n"
    	    "        mov1    [hl].5, cy              \n"
    	    "        br      $9f                     \n"
    	    "6:                                      \n"
    	    "        bt      a.0, $7f                \n"
    	    "        mov1    [hl].6, cy              \n"
    	    "        br      $9f                     \n"
    	    "7:                                      \n"
    	    "        mov1    [hl].7, cy              \n"
    	    "        br      $9f                     \n"
    	    "8:                                      \n"
    	    "        push    ax                      \n"
    	    "        movw    ax, %u4[bc]             \n"
    	    "        movw    hl, ax                  \n"
    	    "        mov     a, %8                   \n"
    	    "        add     a, #0xff                \n"
    	    "        mov     a, %u6[bc]              \n"
    	    "        bt      a.2, $4f                \n"
    	    "        bt      a.1, $2f                \n"
    	    "        bt      a.0, $1f                \n"
    	    "        mov1    [hl].0, cy              \n"
    	    "        pop     hl                      \n"
    	    "        mov1    [hl].0, cy              \n"
    	    "        br      $9f                     \n"
    	    "1:                                      \n"
    	    "        mov1    [hl].1, cy              \n"
    	    "        pop     hl                      \n"
    	    "        mov1    [hl].1, cy              \n"
    	    "        br      $9f                     \n"
    	    "2:                                      \n"
    	    "        bt      a.0, $3f                \n"
    	    "        mov1    [hl].2, cy              \n"
    	    "        pop     hl                      \n"
    	    "        mov1    [hl].2, cy              \n"
    	    "        br      $9f                     \n"
    	    "3:                                      \n"
    	    "        mov1    [hl].3, cy              \n"
    	    "        pop     hl                      \n"
    	    "        mov1    [hl].3, cy              \n"
    	    "        br      $9f                     \n"
    	    "4:                                      \n"
    	    "        bt      a.1, $6f                \n"
    	    "        bt      a.0, $5f                \n"
    	    "        mov1    [hl].4, cy              \n"
    	    "        pop     hl                      \n"
    	    "        mov1    [hl].4, cy              \n"
    	    "        br      $9f                     \n"
    	    "5:                                      \n"
    	    "        mov1    [hl].5, cy              \n"
    	    "        pop     hl                      \n"
    	    "        mov1    [hl].5, cy              \n"
    	    "        br      $9f                     \n"
    	    "6:                                      \n"
    	    "        bt      a.0, $7f                \n"
    	    "        mov1    [hl].6, cy              \n"
    	    "        pop     hl                      \n"
    	    "        mov1    [hl].6, cy              \n"
    	    "        br      $9f                     \n"
    	    "7:                                      \n"
    	    "        mov1    [hl].7, cy              \n"
    	    "        pop     hl                      \n"
    	    "        mov1    [hl].7, cy              \n"
    	    "9:                                      \n"
    	    :
    	    : "m"(pin),
    	      "i"(NUM_DIGITAL_PINS),
    	      "i"((unsigned)&PinTable[1] - (unsigned)&PinTable[0]),
    	      "i"(&PinTable->portModeRegisterAddr),
    	      "i"(&PinTable->portPullUpRegisterAddr),
    	      "i"(&PinTable->portRegisterAddr),
    	      "i"(&PinTable->bit),
    	      "i"(&PinTable->mask),
    	      "m"(val)
    	    : "a", "x", "b", "c", "h", "l"
    	);
    

    以上に置き換えることで期待した動作となると思います。

    要望とコード提供があっても運営側がそれを汲む姿勢はないので以降の版でこの修正が行われるかは期待薄ですね。

    https://japan.renesasrulz.com/gr_user_forum_japanese/f/gr-kurumi/2549/wdt

    https://japan.renesasrulz.com/gr_user_forum_japanese/f/gr-adzuki/4745/wdt

    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
  • @chobichan
    @chobichan over 3 years ago in reply to fujita nozomu
    それもそうです。
    ちょっと待ってください。別の謎現象に悩んでいるので。
    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
  • @chobichan
    @chobichan over 3 years ago in reply to fujita nozomu
    お世話になっています。

    視覚的に判る様に以下の様に書くと、私のところでは緑のLEDのみ点灯します。テスターで見ても、5番のみLOWに落ちています。
    Modeしてwriteすれば、全部点灯します。

    #define LED_RED 22 // LOW active
    #define LED_GREEN 23 // LOW active
    #define LED_BLUE 24 // LOW active

    #define relay1 4 //
    #define relay2 5 //
    #define relay3 6 //

    // the setup routine runs once when you press reset:
    void setup() {
    // turn the LEDs on, glow white.
    digitalWrite(LED_RED, HIGH);
    digitalWrite(LED_GREEN, HIGH);
    digitalWrite(LED_BLUE, HIGH);

    pinMode(LED_RED, OUTPUT);
    pinMode(LED_GREEN, OUTPUT);
    pinMode(LED_BLUE, OUTPUT);

    digitalWrite(relay1, LOW);
    digitalWrite(relay2, LOW);
    digitalWrite(relay3, LOW);

    pinMode(relay1, OUTPUT);
    pinMode(relay2, OUTPUT);
    pinMode(relay3, OUTPUT);

    digitalWrite( LED_RED, digitalRead(relay1) );
    digitalWrite( LED_GREEN, digitalRead(relay2) );
    digitalWrite( LED_BLUE, digitalRead(relay3) );

    while( 1 ) {}
    }
    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
  • fujita nozomu
    fujita nozomu over 2 years ago in reply to @chobichan
    OUTPUT に設定したピンの出力状態を digitalRead() で参照したいということでしょうか?
    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
  • @chobichan
    @chobichan over 2 years ago in reply to fujita nozomu
    そうです。並行してテスターで4,5,6の電圧も計りました。
    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
  • fujita nozomu
    fujita nozomu over 2 years ago in reply to @chobichan

    緑だけ点灯、というのは確認できなかったのですが、下記スケッチで

    /*GR-KURUMI Sketch Template Version: V2.02*/
    #include <Arduino.h>
    
    #define LED_RED   22 // LOW active
    #define LED_GREEN 23 // LOW active
    #define LED_BLUE  24 // LOW active
    
    void setup()
    {
        Serial.begin(9600);
        pinMode(LED_RED,   INPUT);
        pinMode(LED_GREEN, INPUT);
        pinMode(LED_BLUE,  INPUT);
        digitalWrite(LED_RED,   LOW);
        digitalWrite(LED_GREEN, LOW);
        digitalWrite(LED_BLUE,  LOW);
        pinMode(LED_RED,   OUTPUT);
        pinMode(LED_GREEN, OUTPUT);
        pinMode(LED_BLUE,  OUTPUT);
    }
    
    void loop()
    {
        Serial.print(digitalRead(LED_RED));
        Serial.print(" ");
        Serial.print(digitalRead(LED_GREEN));
        Serial.print(" ");
        Serial.print(digitalRead(LED_BLUE));
        Serial.println("");
        digitalWrite(LED_RED,   !digitalRead(LED_RED));
        digitalWrite(LED_GREEN, !digitalRead(LED_GREEN));
        digitalWrite(LED_BLUE,  !digitalRead(LED_BLUE));
        delay(1000);
    }
    

    入力モードで LOW を digitalWrite() し、出力モードに切り替えて digitalRead() すると HIGH が読める期待しない動作が確認できたので今週末辺りに作業したいと思います。

    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
  • @chobichan
    @chobichan over 2 years ago in reply to fujita nozomu
    了解です。お手数お掛けします。
    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
  • エイジ
    エイジ over 2 years ago in reply to fujita nozomu
    これは,RL78では当然の動作です。
    RL78で,ポートのビット操作はリード・モディファイ・ライトの動作です。また,入力に設定してあると,ポートを読むと外部端子の状態が,出力では出力ラッチの値が読まれます。
    つまり,最後に設定したLED_BLUEの出力ラッチはLOWになっていますが,その他の出力ラッチはLED_BLUEを設定したときの端子の値になってしまいます。
    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
  • @chobichan
    @chobichan over 2 years ago in reply to エイジ
    つまり入力モードの時に出力ラッチに書き込むと、入力端子の状態を読み込んで、出力ラッチに書き戻すと言うことでしょうか?
    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
  • エイジ
    エイジ over 2 years ago in reply to @chobichan

    はい,そうです。(操作対象のビット以外のビットはそうなります。)
    RL78/G13のハードウェアマニュアルの"4. 6. 1 ポート・レジスタn(Pn)に対する1ビット・メモリ操作命令に関する注意事項"に明記されています。
    これを避けようとすると,出力ラッチの設定値を変数に入れておいて,ビット操作は変数に対して演算を行い,結果を出力ラッチに書き込む必要があります。

    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
  • @chobichan
    @chobichan over 2 years ago in reply to エイジ
    なるほど、うーん、正直言って汎用ポートとしては使いにくい。

    今出先で確認できないのですが、d4、d5、d6はNPNトランジスタのベースに接続されていて、おそらく入力時には0.6Vくらいしか見えない気がするんですが。
    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
  • エイジ
    エイジ over 2 years ago in reply to @chobichan
    ポートで直接ベースをドライブすることはなく,ベースの保護のためにシリーズ抵抗が入っているはずです。その影響が考えられます。
    直接LEDをドライブしている場合には,ドライブしていないときにLEDが発電してVf程度の電圧を発生していることがあり,電源電圧によっては,中間電位になり,入力レベルは不定になることも考えられます。
    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
  • @chobichan
    @chobichan over 2 years ago in reply to エイジ
    そうです、2kの抵抗が入っています。リーク電流がどれほどなのかで変わると思いますが。
    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
  • @chobichan
    @chobichan over 2 years ago in reply to エイジ
    光電効果は知ってます。
    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
  • fujita nozomu
    fujita nozomu over 2 years ago in reply to エイジ
    情報ありがとうございます。
    ハードウェアマニュアルの『4. 6 ポート機能使用時の注意事項』に同様の記述を確認しました。
    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
  • fujita nozomu
    fujita nozomu over 2 years ago in reply to @chobichan

    gr_common/cores/wiring_digital.c の digitalWrite() のインラインアセンブラの部分を下記に戻し

    	__asm __volatile(
    	    "\n"
    	    "        /* %%0 = %0 */                  \n"
    	    "        /* %%1 = %1 */                  \n"
    	    "        /* %%2 = %2 */                  \n"
    	    "        /* %%3 = %3 */                  \n"
    	    "        /* %%4 = %4 */                  \n"
    	    "        /* %%5 = %5 */                  \n"
    	    "        /* %%6 = %6 */                  \n"
    	    "        /* %%7 = %7 */                  \n"
    	    "        /* %%8 = %8 */                  \n"
    	    "        mov     a, %0                   \n"
    	    "        cmp     a, %1                   \n"
    	    "        bnc     $8f                     \n"
    	    "        mov     x, %2                   \n"
    	    "        mulu    x                       \n"
    	    "        movw    bc, ax                  \n"
    	    "        movw    ax, %u3[bc]             \n"
    	    "        movw    hl, ax                  \n"
    	    "        mov     a, %u7[bc]              \n"
    	    "        and     a, [hl]                 \n"
    	    "        movw    ax, %u5[bc]             \n"
    	    "        skz                             \n"
    	    "        movw    ax, %u4[bc]             \n"
    	    "        movw    hl, ax                  \n"
    	    "        mov     a, %8                   \n"
    	    "        add     a, #0xff                \n"
    	    "        mov     a, %u6[bc]              \n"
    	    "        bt      a.2, $4f                \n"
    	    "        bt      a.1, $2f                \n"
    	    "        bt      a.0, $1f                \n"
    	    "        mov1    [hl].0, cy              \n"
    	    "        br      $8f                     \n"
    	    "1:                                      \n"
    	    "        mov1    [hl].1, cy              \n"
    	    "        br      $8f                     \n"
    	    "2:                                      \n"
    	    "        bt      a.0, $3f                \n"
    	    "        mov1    [hl].2, cy              \n"
    	    "        br      $8f                     \n"
    	    "3:                                      \n"
    	    "        mov1    [hl].3, cy              \n"
    	    "        br      $8f                     \n"
    	    "4:                                      \n"
    	    "        bt      a.1, $6f                \n"
    	    "        bt      a.0, $5f                \n"
    	    "        mov1    [hl].4, cy              \n"
    	    "        br      $8f                     \n"
    	    "5:                                      \n"
    	    "        mov1    [hl].5, cy              \n"
    	    "        br      $8f                     \n"
    	    "6:                                      \n"
    	    "        bt      a.0, $7f                \n"
    	    "        mov1    [hl].6, cy              \n"
    	    "        br      $8f                     \n"
    	    "7:                                      \n"
    	    "        mov1    [hl].7, cy              \n"
    	    "8:                                      \n"
    	    :
    	    : "m"(pin),
    	      "i"(NUM_DIGITAL_PINS),
    	      "i"((unsigned)&PinTable[1] - (unsigned)&PinTable[0]),
    	      "i"(&PinTable->portModeRegisterAddr),
    	      "i"(&PinTable->portPullUpRegisterAddr),
    	      "i"(&PinTable->portRegisterAddr),
    	      "i"(&PinTable->bit),
    	      "i"(&PinTable->mask),
    	      "m"(val)
    	    : "a", "x", "b", "c", "h", "l"
    	);
    

    pinMode() を下記に差し替えてみて下さい。

    void pinMode(uint8_t pin, uint8_t u8Mode)
    {
    #ifndef __RL78__
    	uint8_t bit = digitalPinToBitMask(pin);
    	uint8_t port = digitalPinToPort(pin);
    	volatile uint8_t *reg, *out;
    
    	if (port == NOT_A_PIN) return;
    
    	// JWS: can I let the optimizer do this?
    	reg = portModeRegister(port);
    	out = portOutputRegister(port);
    
    	if (mode == INPUT) { 
    		uint8_t oldSREG = SREG;
                    cli();
    		*reg &= ~bit;
    		*out &= ~bit;
    		SREG = oldSREG;
    	} else if (mode == INPUT_PULLUP) {
    		uint8_t oldSREG = SREG;
                    cli();
    		*reg &= ~bit;
    		*out |= bit;
    		SREG = oldSREG;
    	} else {
    		uint8_t oldSREG = SREG;
                    cli();
    		*reg |= bit;
    		SREG = oldSREG;
    	}
    #else /*__RL78__*/
    	if (pin < NUM_DIGITAL_PINS) {
    		// アナログピンかどうか?
    		if (14 <= pin && pin <= 21) {
    			// ピンモードをデジタルモードに変更
    			if (pin == 20) {
    				PMC14.pmc14 &= ~0x80;// P147をデジタルポートに設定
    			}
    			else if (pin == 21) {
    				PMC12.pmc12 &= ~0x01;// P120をデジタルポートに設定
    			}
    			else {
    				uint8_t oldadpc = ADPC.adpc;
    				uint8_t newadpc = (pin - 14) + ANALOG_ADPC_OFFSET - 1;
    				if ((oldadpc  == 0x00 ) || (oldadpc > newadpc)) {
    					ADPC.adpc = newadpc;
    				}
    			}
    		}
    
    		PinTableType* p = getPinTable(pin);
    		{
    			if (g_u8AnalogWriteAvailableTable[pin]) {
    				_turnOffPwmPin(pin);	// PWMの設定解除
    			}
    			if (!(*p->portModeRegisterAddr & p->mask)) {
    				if (*p->portRegisterAddr & p->mask) {
    					if (u8Mode == INPUT) {
    						u8Mode = INPUT_PULLUP;
    					} else if (u8Mode == INPUT_TTL) {
    						u8Mode = INPUT_TTL_PULLUP;
    					}
    				}
    			}
    			switch (u8Mode) {
    			case INPUT:
    			case INPUT_PULLUP:
    			case INPUT_TTL:
    			case INPUT_TTL_PULLUP:
    				if (u8Mode == INPUT_PULLUP || u8Mode == INPUT_TTL_PULLUP) {
    					sbi(p->portPullUpRegisterAddr,  p->mask);	// プルアップ抵抗を有効に設定
    				} else {
    					cbi(p->portPullUpRegisterAddr,  p->mask);	// プルアップ抵抗を無効に設定
    				}
    				if (u8Mode == INPUT_TTL || u8Mode == INPUT_TTL_PULLUP) {
    					sbi(p->portInputModeRegisterAddr, p->mask);	// TTL入力バッファに設定
    				} else {
    					cbi(p->portInputModeRegisterAddr, p->mask);	// CMOS入力バッファに設定
    				}
    				sbi(p->portModeRegisterAddr,  p->mask);	// 入力モードに設定
    				break;
    			case OUTPUT:
    			case OUTPUT_OPENDRAIN:
    				if (*p->portModeRegisterAddr & p->mask) {
    					if (*p->portPullUpRegisterAddr & p->mask) {
    						sbi(p->portRegisterAddr, p->mask);
    					} else {
    						cbi(p->portRegisterAddr, p->mask);
    					}
    				}
    				if (u8Mode == OUTPUT_OPENDRAIN) {
    					sbi(p->portOutputModeRegisterAddr, p->mask);	// N-chオープン・ドレイン出力モードに設定
    				} else {
    					cbi(p->portOutputModeRegisterAddr, p->mask);	// 通常出力モードに設定
    				}
    				cbi(p->portModeRegisterAddr,  p->mask);	// 出力モードに設定
    				break;
    			}
    		}
    	}
    #endif/*__RL78__*/
    }
    
    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
Reply
  • fujita nozomu
    fujita nozomu over 2 years ago in reply to @chobichan

    gr_common/cores/wiring_digital.c の digitalWrite() のインラインアセンブラの部分を下記に戻し

    	__asm __volatile(
    	    "\n"
    	    "        /* %%0 = %0 */                  \n"
    	    "        /* %%1 = %1 */                  \n"
    	    "        /* %%2 = %2 */                  \n"
    	    "        /* %%3 = %3 */                  \n"
    	    "        /* %%4 = %4 */                  \n"
    	    "        /* %%5 = %5 */                  \n"
    	    "        /* %%6 = %6 */                  \n"
    	    "        /* %%7 = %7 */                  \n"
    	    "        /* %%8 = %8 */                  \n"
    	    "        mov     a, %0                   \n"
    	    "        cmp     a, %1                   \n"
    	    "        bnc     $8f                     \n"
    	    "        mov     x, %2                   \n"
    	    "        mulu    x                       \n"
    	    "        movw    bc, ax                  \n"
    	    "        movw    ax, %u3[bc]             \n"
    	    "        movw    hl, ax                  \n"
    	    "        mov     a, %u7[bc]              \n"
    	    "        and     a, [hl]                 \n"
    	    "        movw    ax, %u5[bc]             \n"
    	    "        skz                             \n"
    	    "        movw    ax, %u4[bc]             \n"
    	    "        movw    hl, ax                  \n"
    	    "        mov     a, %8                   \n"
    	    "        add     a, #0xff                \n"
    	    "        mov     a, %u6[bc]              \n"
    	    "        bt      a.2, $4f                \n"
    	    "        bt      a.1, $2f                \n"
    	    "        bt      a.0, $1f                \n"
    	    "        mov1    [hl].0, cy              \n"
    	    "        br      $8f                     \n"
    	    "1:                                      \n"
    	    "        mov1    [hl].1, cy              \n"
    	    "        br      $8f                     \n"
    	    "2:                                      \n"
    	    "        bt      a.0, $3f                \n"
    	    "        mov1    [hl].2, cy              \n"
    	    "        br      $8f                     \n"
    	    "3:                                      \n"
    	    "        mov1    [hl].3, cy              \n"
    	    "        br      $8f                     \n"
    	    "4:                                      \n"
    	    "        bt      a.1, $6f                \n"
    	    "        bt      a.0, $5f                \n"
    	    "        mov1    [hl].4, cy              \n"
    	    "        br      $8f                     \n"
    	    "5:                                      \n"
    	    "        mov1    [hl].5, cy              \n"
    	    "        br      $8f                     \n"
    	    "6:                                      \n"
    	    "        bt      a.0, $7f                \n"
    	    "        mov1    [hl].6, cy              \n"
    	    "        br      $8f                     \n"
    	    "7:                                      \n"
    	    "        mov1    [hl].7, cy              \n"
    	    "8:                                      \n"
    	    :
    	    : "m"(pin),
    	      "i"(NUM_DIGITAL_PINS),
    	      "i"((unsigned)&PinTable[1] - (unsigned)&PinTable[0]),
    	      "i"(&PinTable->portModeRegisterAddr),
    	      "i"(&PinTable->portPullUpRegisterAddr),
    	      "i"(&PinTable->portRegisterAddr),
    	      "i"(&PinTable->bit),
    	      "i"(&PinTable->mask),
    	      "m"(val)
    	    : "a", "x", "b", "c", "h", "l"
    	);
    

    pinMode() を下記に差し替えてみて下さい。

    void pinMode(uint8_t pin, uint8_t u8Mode)
    {
    #ifndef __RL78__
    	uint8_t bit = digitalPinToBitMask(pin);
    	uint8_t port = digitalPinToPort(pin);
    	volatile uint8_t *reg, *out;
    
    	if (port == NOT_A_PIN) return;
    
    	// JWS: can I let the optimizer do this?
    	reg = portModeRegister(port);
    	out = portOutputRegister(port);
    
    	if (mode == INPUT) { 
    		uint8_t oldSREG = SREG;
                    cli();
    		*reg &= ~bit;
    		*out &= ~bit;
    		SREG = oldSREG;
    	} else if (mode == INPUT_PULLUP) {
    		uint8_t oldSREG = SREG;
                    cli();
    		*reg &= ~bit;
    		*out |= bit;
    		SREG = oldSREG;
    	} else {
    		uint8_t oldSREG = SREG;
                    cli();
    		*reg |= bit;
    		SREG = oldSREG;
    	}
    #else /*__RL78__*/
    	if (pin < NUM_DIGITAL_PINS) {
    		// アナログピンかどうか?
    		if (14 <= pin && pin <= 21) {
    			// ピンモードをデジタルモードに変更
    			if (pin == 20) {
    				PMC14.pmc14 &= ~0x80;// P147をデジタルポートに設定
    			}
    			else if (pin == 21) {
    				PMC12.pmc12 &= ~0x01;// P120をデジタルポートに設定
    			}
    			else {
    				uint8_t oldadpc = ADPC.adpc;
    				uint8_t newadpc = (pin - 14) + ANALOG_ADPC_OFFSET - 1;
    				if ((oldadpc  == 0x00 ) || (oldadpc > newadpc)) {
    					ADPC.adpc = newadpc;
    				}
    			}
    		}
    
    		PinTableType* p = getPinTable(pin);
    		{
    			if (g_u8AnalogWriteAvailableTable[pin]) {
    				_turnOffPwmPin(pin);	// PWMの設定解除
    			}
    			if (!(*p->portModeRegisterAddr & p->mask)) {
    				if (*p->portRegisterAddr & p->mask) {
    					if (u8Mode == INPUT) {
    						u8Mode = INPUT_PULLUP;
    					} else if (u8Mode == INPUT_TTL) {
    						u8Mode = INPUT_TTL_PULLUP;
    					}
    				}
    			}
    			switch (u8Mode) {
    			case INPUT:
    			case INPUT_PULLUP:
    			case INPUT_TTL:
    			case INPUT_TTL_PULLUP:
    				if (u8Mode == INPUT_PULLUP || u8Mode == INPUT_TTL_PULLUP) {
    					sbi(p->portPullUpRegisterAddr,  p->mask);	// プルアップ抵抗を有効に設定
    				} else {
    					cbi(p->portPullUpRegisterAddr,  p->mask);	// プルアップ抵抗を無効に設定
    				}
    				if (u8Mode == INPUT_TTL || u8Mode == INPUT_TTL_PULLUP) {
    					sbi(p->portInputModeRegisterAddr, p->mask);	// TTL入力バッファに設定
    				} else {
    					cbi(p->portInputModeRegisterAddr, p->mask);	// CMOS入力バッファに設定
    				}
    				sbi(p->portModeRegisterAddr,  p->mask);	// 入力モードに設定
    				break;
    			case OUTPUT:
    			case OUTPUT_OPENDRAIN:
    				if (*p->portModeRegisterAddr & p->mask) {
    					if (*p->portPullUpRegisterAddr & p->mask) {
    						sbi(p->portRegisterAddr, p->mask);
    					} else {
    						cbi(p->portRegisterAddr, p->mask);
    					}
    				}
    				if (u8Mode == OUTPUT_OPENDRAIN) {
    					sbi(p->portOutputModeRegisterAddr, p->mask);	// N-chオープン・ドレイン出力モードに設定
    				} else {
    					cbi(p->portOutputModeRegisterAddr, p->mask);	// 通常出力モードに設定
    				}
    				cbi(p->portModeRegisterAddr,  p->mask);	// 出力モードに設定
    				break;
    			}
    		}
    	}
    #endif/*__RL78__*/
    }
    
    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
Children
  • @chobichan
    @chobichan over 2 years ago in reply to fujita nozomu
    ありがとうございます。
    家に帰ったら試してみます。
    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
  • @chobichan
    @chobichan over 2 years ago in reply to fujita nozomu
    以下のコードで、驚きの白さです。
    成功みたいです!
    お手数お掛けしました。

    void setup() {
    // turn the LEDs on, glow white.
    digitalWrite(LED_RED, HIGH);
    digitalWrite(LED_GREEN, HIGH);
    digitalWrite(LED_BLUE, HIGH);

    pinMode(LED_RED, OUTPUT);
    pinMode(LED_GREEN, OUTPUT);
    pinMode(LED_BLUE, OUTPUT);

    digitalWrite(relay1, LOW);
    digitalWrite(relay2, LOW);
    digitalWrite(relay3, LOW);

    pinMode(relay1, OUTPUT);
    pinMode(relay2, OUTPUT);
    pinMode(relay3, OUTPUT);

    digitalWrite( LED_RED, digitalRead(relay1) );
    digitalWrite( LED_GREEN, digitalRead(relay2) );
    digitalWrite( LED_BLUE, digitalRead(relay3) );

    while( 1 ) {}
    }
    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
サイト使用条件
プライバシーポリシー
お問い合わせ
© 2010-2020 Renesas Electronics Corporation. All rights reserved.