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関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
がじぇるね岡宮です。
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用
インポートしてビルドできます。
■ご意見、要望などまとめ
-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
MsTimer2は標準ではないので、librariesフォルダに入れる
> 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
緑だけ点灯、というのは確認できなかったのですが、下記スケッチで
/*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 が読める期待しない動作が確認できたので今週末辺りに作業したいと思います。
はい,そうです。(操作対象のビット以外のビットはそうなります。) RL78/G13のハードウェアマニュアルの"4. 6. 1 ポート・レジスタn(Pn)に対する1ビット・メモリ操作命令に関する注意事項"に明記されています。 これを避けようとすると,出力ラッチの設定値を変数に入れておいて,ビット操作は変数に対して演算を行い,結果を出力ラッチに書き込む必要があります。