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ボードで、ライブラリバージョンV2.xxではanalogWriteのソフトPWMが動かないようです。主には3,5,6,9,10以外のピンを指定したときに発生します。(GR-ADZUKIでは10ピンもsoftwarePWM)
V2.xxにバージョンアップした際に、コンパイラバージョンを14.03→4.9.2にしたことで、下記getPinTableのアセンブルが正しく動作しなくなってしまったようです。#if 1にしてC言語の方を有効にすると、analogWriteが機能します。
Fujitaさん、ここのアセンブルの修正案をいただくことできないでしょうか?
(pintable.h)
#if 0 // GCC の吐くコードの効率が悪いのでインラインアセンブラを使用#define getPinTable(u8Pin) (&PinTable[u8Pin])#else#define getPinTable(u8Pin) \({ \ PinTableType* p; \ __asm __volatile( \ " mov a, %1 \n" \ " mov x, %2 \n" \ " mulu x \n" \ " addw ax, %3 \n" \ " movw %0, ax \n" \ : "=r"(p) \ : "r"((uint8_t)(u8Pin)), "i"((unsigned)&PinTable[1] - (unsigned)&PinTable[0]), "i"(PinTable) \ : "a", "x" \ ); \ p; \})#endif
とりあえず以下の修正で analogWrite() は動作するようなるようです。
--- gr_common/cores/wiring_analog.c +++ gr_common/cores/wiring_analog.c @@ -395,2 +395,3 @@ void analogWrite(uint8_t pin, int val) { } else { + const PinTableType* p = getPinTable(pin); g_SwPwm[i].valid = false; @@ -398,4 +399,4 @@ void analogWrite(uint8_t pin, int val) { g_SwPwm[i].value = g_SwPwm[i].newValue = val; - g_SwPwm[i].port = getPinTable(pin)->portRegisterAddr; - g_SwPwm[i].mask = getPinTable(pin)->mask; + g_SwPwm[i].port = p->portRegisterAddr; + g_SwPwm[i].mask = p->mask; g_SwPwm[i].valid = true;
確認用スケッチ
/*GR-KURUMI Sketch Template Version: V2.01*/ #include <Arduino.h> // Pin 22,23,24 are assigned to RGB LEDs. #define LED_RED 22 // LOW active #define LED_GREEN 23 // LOW active #define LED_BLUE 24 // LOW active void setup() { } void loop() { analogWrite(LED_RED, 127 + int(127 * sqrtf(0.5f * cosf(M_PI * millis() / 2e3f) + 0.5f))); analogWrite(LED_GREEN, 127 + int(127 * sqrtf(0.5f * cosf(M_PI * millis() / 3e3f) + 0.5f))); analogWrite(LED_BLUE, 127 + int(127 * sqrtf(0.5f * cosf(M_PI * millis() / 5e3f) + 0.5f))); }
問題の原因としてコンパイラの不具合臭いのですが、まだ確認に到っておりません。現在普段使いの PC を修理に出している関係で携帯用のゴミスペック PC しか使える状況になく、作業効率が著しく低下しています。問題原因の確認にまで到りましたら再度報告します。