Team for GR-PEACH Producer Meeting

GR-PEACHのI2C(master)が使用できるようになりました

03 Dec 2014

GR-PEACHのI2C(master)が使用できるようになりました。
ご自身のプロジェクトの mbed-src を右クリックして update を選択すると、使用可能になります。
/media/uploads/RyoheiHagimoto/mbed-src_update.png
以下の端子に対応しています。

SDASCL
P1_1P1_0
P1_3P1_2
D14D15
I2C_SDAI2C_SCL
P1_7P1_6

D14とI2C_SDAはP1_3の別名です。
D15とI2C_SCLはP1_2の別名です。

03 Dec 2014

I2Cをトライしてみましたが、うまく動作しませんでした。
mbed-srcのrevisionは、425を試してダメだったので424もトライしてみましたが、やはりだめでした。
出来れば、成功したソフトをライブラリーと組み合わせて暫定公開いただけないでしょうか?
尚、今回Gyroを試しましたが、Nucleo F401REでは、GR-PEACHのテストの前後で動作している回路でHWの問題とは思えません。
ロジアナで波形確認しましたが、クロックが端子に出ていません。
どなたか成功した方はおいででしょうか?

03 Dec 2014

秋月で売っているMCP4726でI2C試して動作しました。

/media/uploads/abanum/i2ctest.jpg

mbed-srcのrevisionは、426です。

でも、周波数変えようとしてi2c.frequency(50000);を追加しても100kHzのままでした。

i2c test

#include "mbed.h"
#include "MCP4726.h"

I2C i2c(D14,D15);
MCP4726 mcp4726(i2c);

int main() {
unsigned short x;
i2c.frequency(50000);
    while(1) {
            // D/A
        mcp4726.put(x++);
        wait(0.2);
        if(x>4095)x=0;
    }
}
03 Dec 2014

abanumさん
情報ありがとうございました。revison=426で、上記プログラムを走らせ、I2C信号確認しました。
MCP4726は、実装していないのでADDR送出後NACKが戻りますが、信号が出ているのは確認できました。
ご指摘のようにクロック周波数の変更は出来なく、100KHzのままで変化しません。
上記プログラムは、revision=425でも動作することも確認できました。
私が使用していたプログラムは、下記のようなもので、相変わらず動きません(ほかのmbedでは、くどいですがHW&SWともに問題ありません)。

Not Good!

#include "mbed.h"
#include "L3GD20.h"

I2C i2c(D14,D15);
L3GX_GYRO   gyro(i2c, L3GD20_V_CHIP_ADDR, L3GX_DR_95HZ, L3GX_BW_HI, L3GX_FS_250DPS);

float fg[3];        // Gyro 0:X, 1:Y, 2:Z

int main() {
    while (true) {
        gyro.read_data(fg);    
        printf("G:%+6.1f,%+6.1f,%+6.1f \r\n", fg[0], fg[1], fg[2]);              
        wait(1.0);
    }
}


私が使用したライブラリーは、下記の自作したものです。

Import libraryL3GD20

L3GD20 & L3G4200D / STMicroelectronics / MEMS motion sensor, three-axis gyroscope library


今までのところ、初期化のI2Cのread動作で止まっているところまで判明しました。チップのIDが正しいか確認していますがデータを要求(デバイスへのRead)でSTOPを発行しているように見えます。
0x0bのデバイスアドレスでACKが返り、0x0fでIDが格納されているアドレスを設定して、次の読み出しで0x0fのレジスタを読みに行ってますがGR-PEACHがSTOP信号を出して自ら通信を終わりにしています(と解釈できます)。折角ACKでデバイスがクロックさえ送ってくれればデータを出そうとしているのに・・・・
出社前Debugなのでここまで。
/media/uploads/kenjiArai/i2c.png

03 Dec 2014

追加で、
Hagimotoさんのコメントに下記表記があります。
SDA SCL
P1_1 P1_0
動作させていませんのでどちらが正しいかわかりませんが、上記表記は公式なピンサインと信号逆じゃないですか?

04 Dec 2014

ご報告ありがとうございます。
I2Cクロックが変更できない問題を修正しました。
お手数ですが、再度mbed-srcをupdateしていただけますでしょうか。
また、P1_0とP1_1の割り当てですが、P1_0=SCL,P1_1=SDAで正しいです。
GR-PEACHのページは後ほど修正予定です。

04 Dec 2014

情報に誤りがあり、混乱させてしまい申し訳ございませんでした。GR-PEACHのページを更新いたしました。

06 Dec 2014

全然使えないのですが・・・なぜでしょう。 通信すらしません。L3GD20が動いたプログラムを見せてほしいです。

06 Dec 2014

Ishimotoさん
私のプログラムはまだ動いていません(2014年12月6日午後2時50分現在)。 上記でコメントした
私が使用していたプログラムは、下記のようなもので、相変わらず動きません(ほかのmbedでは、くどいですがHW&SWともに問題ありません)
のままです。
Hagimotoさんは、①I2Cクロックが変更できない問題を修正、②ピン配置間違いを訂正更新に言及していますが、私の書き方が悪くて、
0x0bのデバイスアドレスでACKが返り、0x0fでIDが格納されているアドレスを設定して、次の読み出しで0x0fのレジスタを読みに行ってますがGR-PEACHがSTOP信号を出して自ら通信を終わりにしています(と解釈できます)
に関してはコメントいただいていませんので、ユーザー側の問題(Araiの問題)と解釈していると思われます。
今日、別のことで時間が割けませんが後でもう少し追跡調査してみます。
I2Cは大切なインターフェイスですので、私もどなたかGR-PEACH上で動いたプログラムがあれば公開を希望いたします。

06 Dec 2014

Araiさん つまりI2Cは完成はしているけど、我々の使い方が間違えているという意味ですね。

06 Dec 2014

Ishimotoさん
<質問> つまりI2Cは完成はしているけど、我々の使い方が間違えているという意味ですね
<回答> いや、現在のGR-PEACH用I2Cライブラリーには間違いなくBugがあります(断言)

少し調べた内容を途中報告します。
先ずは、I2Cラインへの書き込みだけで済めば動作しそうです。少なくてもLCDで下記のサンプルプログラムが動きました。
秋月のキャラクタLCD/AQM0802を接続して動作確認しました(mbed-srcはrevision427(12月6日21:04JST最新))。

[Repository '/users/kenjiArai/code/GR-PEACH_i2C_LCD/' not found]


しかしI2Cラインを読み込もうとすると問題があります。
例えば、センサーデータの読み込みのような動作は問題があります(少なくても前述のGyro/L3GD20は動いていません)。
0x0bのデバイスアドレスでACKが返り、0x0fでIDが格納されているアドレスを設定して、次の読み出しで0x0fのレジスタを読みに行ってますがGR-PEACHがSTOP信号を出して自ら通信を終わりにしています(と解釈できます)
に関しては、やはり下記に問題があります。読み込み部分です。

\mbed-src\targets\hal\TRAGET_RZ_A1H\TAGET_MBED_MBRZA1H\i2c_api.c

int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
    int count = 0;
    int status;
    int value;
    volatile uint32_t work_reg = 0;


//  DELETE PART OF LINES
    
    /* wati RDRF */
    i2c_wait_RDRF(obj);
    /* check ACK/NACK */
    if ((REG(SR2.UINT32) & (1 << 4) == 1)) {
        /* Slave sends NACK */
        i2c_stop(obj);
        return I2C_ERROR_NO_SLAVE;
    }
    
// ???????????????????? length == 1? 
    // Read in all except last byte
    if (length > 1) {
        for (count = 0; count < (length - 1); count++) {
            if (count == (length - 2)) {
                value = i2c_do_read(obj, 1);
            } else if ((length >= 3) && (count == (length - 3))) {
                value = i2c_do_read(obj, 2);
            } else {
                value = i2c_do_read(obj, 0);
            }
            status = i2c_status(obj);
            if (status & 0x10) {
                i2c_stop(obj);
                return count;
            }
            data[count] = (char) value;
        }
    }

    // read in last byte
    i2c_wait_RDRF(obj);
    /* RIICnSR2.STOP = 0 */
    REG(SR2.UINT32) &= ~(1 << 3);

//  DELETE PART OF LINES

    return length;
}


I2CはSPIに比べて格段に難易度が高いライブラリーだと思います。 私のGyroライブラリーが動かないのは、上記length == 1の取り扱いです。元のプログラムではクロックが発生しないで、そのまま何も行われていません。
下記のようにすると、少なくともコンストラクタ宣言部分の初期化ルーチンを無事通過をします(チップが認識され初期化完了)。
しかし、main()に制御が移った後もまだ問題があり、途中で止まってしまいます。
日本酒を飲みながらのDebugではここまでが限界です。

    if ((REG(SR2.UINT32) & (1 << 4) == 1)) {
        /* Slave sends NACK */
        i2c_stop(obj);
        return I2C_ERROR_NO_SLAVE;
    }

    if (length == 1) { // need clock output
        if (obj->dummy) {
            volatile int dummy = REG(DRR.UINT32);
            obj->dummy = 0;
        }
    } else if (length > 1) {
        for (count = 0; count < (length - 1); count++) {
            if (count == (length - 2)) {
                value = i2c_do_read(obj, 1);
            } else if ((length >= 3) && (count == (length - 3))) {
                value = i2c_do_read(obj, 2);
            } else {
                value = i2c_do_read(obj, 0);
            }


06 Dec 2014

ありがとうございます。 なるほど、値を読み取れないのですね。 今私もライブラリーをのぞきました。普通に難しいです。

07 Dec 2014

一様、問題点が見つかり、ソースコードを修正し、動作確認しました。
I2C Gyroからのデータ読み込みも含め、動作し始めました。
充分な検証はできていませんが、もしI2Cタイプのセンサーなどお持ちでしたら、動かしてみてください。
保証は致しかねますが、問題点をお知らせいただければ修正したいと思います。
勿論、最終判断は中の人に確認いただき、正式版発行につなげていただければと思います。

問題点
1) 私のL3GD20のライブラリーに一点問題があり、修正しました(言い訳->ほかのmbedでは動作していましたが、仕様上は修正すべきでした)
2) i2c_api.c内に幾つかの問題あり
① MR3レジスタ内でACTBTへのアクセスは、(マニュアルでは)ACKWP=1でないとアクセスできないはずなのにそのままアクセスしていた
② STOP=1を待つ条件が反対の条件で待っていたので、ほとんど待たずに次のステップに行ってしまっていた
③ 1Byte読み込みが出来なかったので、マニュアル通りのフローチャート(R01UH0403JJ0100 Rev.1.00 2014.04.25 RZ/A1H ユーザーズマニュアル  ハードウェア編 図18.14)をそのままソースコードへ展開(なぜルネサスエンジニアは、マニュアル通りに最初から作らなかったのだろうか?)

今回、printfとロジアナのみでDebugし、ご存じのようにプログラム書き込みにも時間がかかるので、すべての問題点の見極めに時間がかかってしまいました。
自作ライブラリーにも問題があり(すでにアップデート終了)、更に複雑になってしまいました。
日曜午後の3時間半をDebugに費やしてしまい、本来部品がそろったので作ろうとしていた別のおもちゃ(F411RE使用)に着手できませんでした。残念!

下記を元の”ic2_read()”と置き換えてみてください。

/mbed-src/targets/hal/TARGET_RENESAS/TARGET_RZ_AH1H/i2c_api.c

// all modification following R01UH0403JJ0100 Rev.1.00 2014.04.25 Users Manual HW
//      by JH1PJL / Kenji Arai on Dec. 7th, 2014
int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
    int count = 0;
    int status;
    volatile uint32_t work_reg = 0;

    // full reset
    i2c_reg_reset(obj);
    status = i2c_start(obj);
    if (status == 0xff) {
        i2c_stop(obj);
        return I2C_ERROR_BUS_BUSY;
    }
    status = i2c_do_write(obj, (address | 0x01));
    if (status & 0x01) {
        i2c_stop(obj);
        return I2C_ERROR_NO_SLAVE;
    }
    // Read in all except last byte
    if ((length == 1) || (length == 2)){  
        /* wati RDRF */
        i2c_wait_RDRF(obj);
        /* check ACK/NACK */
        if ((REG(SR2.UINT32) & (1 << 4) == 1)) {
            /* Slave sends NACK */
            i2c_stop(obj);
            volatile int dummy = REG(DRR.UINT32);
            /* wait SR2.STOP = 1 */
            work_reg = REG(SR2.UINT32);
            while ((work_reg & (1 << 3)) == 0) {
                work_reg = REG(SR2.UINT32);
            }
            /* SR2.NACKF = 0 */
            REG(SR2.UINT32) &= ~(1 << 4);
            /* SR2.STOP  = 0 */
            REG(SR2.UINT32) &= ~(1 << 3);            
            return I2C_ERROR_NO_SLAVE;
        }
        /* RIICnMR3.WAIT = 1 */
        REG(MR3.UINT32) |= (1 << 6);
        if (length == 2){
            volatile int dummy = REG(DRR.UINT32);
            i2c_wait_RDRF(obj);
        }
        /* RIICnMR3.ACKBT = 1 */
        REG(MR3.UINT32) |= (1 << 4);    // ACKWP = 1 before write ACTBT
        REG(MR3.UINT32) |= (1 << 3);
        if (length == 2){
            data[0] = (char)(REG(DRR.UINT32) & 0xFF);
        } else {
            volatile int dummy = REG(DRR.UINT32);
        }      
        /* wati RDRF */
        i2c_wait_RDRF(obj);
        /* RIICnSR2.STOP = 0 */
        REG(SR2.UINT32) &= ~(1 << 3);
        /* RIICnCR2.SP   = 1 */
        REG(CR2.UINT32) |= (1 << 3);
        /* RIICnDRR read */
        if (length == 2){
            data[1] = REG(DRR.UINT32) & 0xFF;
        } else {
            data[0] = REG(DRR.UINT32) & 0xFF;
        }
        /* RIICnMR3.WAIT = 0 */
        REG(MR3.UINT32) &= ~(1 << 6);
        /* wait SR2.STOP = 1 */
        work_reg = REG(SR2.UINT32);
        while ((work_reg & (1 << 3)) == 0) {
            work_reg = REG(SR2.UINT32);
        }
        /* SR2.NACKF = 0 */
        REG(SR2.UINT32) &= ~(1 << 4);
        /* SR2.STOP  = 0 */
        REG(SR2.UINT32) &= ~(1 << 3);
    } else if (length > 2) {  
        /* wati RDRF */
        i2c_wait_RDRF(obj);
        /* check ACK/NACK */
        if ((REG(SR2.UINT32) & (1 << 4) == 1)) {
            /* Slave sends NACK */
            i2c_stop(obj);
            volatile int dummy = REG(DRR.UINT32);
            /* wait SR2.STOP = 1 */
            work_reg = REG(SR2.UINT32);
            while ((work_reg & (1 << 3)) == 0) {
                work_reg = REG(SR2.UINT32);
            }
            /* SR2.NACKF = 0 */
            REG(SR2.UINT32) &= ~(1 << 4);
            /* SR2.STOP  = 0 */
            REG(SR2.UINT32) &= ~(1 << 3);            
            return I2C_ERROR_NO_SLAVE;
        }
        volatile int dummy = REG(DRR.UINT32);
        for (count = 0; count < (length - 1); count++) {
            i2c_wait_RDRF(obj);
            if (count == (length - 2)) {
                /* RIICnMR3.WAIT = 1 */
                REG(MR3.UINT32) |= (1 << 6);
            }
            data[count] = (char)(REG(DRR.UINT32) & 0xFF);
        }
        /* RIICnMR3.ACKBT = 1 */
        REG(MR3.UINT32) |= (1 << 4);    // ACKWP = 1 before write ACTBT
        REG(MR3.UINT32) |= (1 << 3);
        /* RIICnDRR read */
        count++;
        data[count] = (char)(REG(DRR.UINT32) & 0xFF);       
        /* wati RDRF */
        i2c_wait_RDRF(obj);
        /* RIICnSR2.STOP = 0 */
        REG(SR2.UINT32) &= ~(1 << 3);
        /* RIICnCR2.SP   = 1 */
        REG(CR2.UINT32) |= (1 << 3);
        /* RIICnDRR read */
        count++;
        data[count] = (char)(REG(DRR.UINT32) & 0xFF);
        /* RIICnMR3.WAIT = 0 */
        REG(MR3.UINT32) &= ~(1 << 6);
        /* wait SR2.STOP = 1 */
        work_reg = REG(SR2.UINT32);
        while ((work_reg & (1 << 3)) == 0) {
            work_reg = REG(SR2.UINT32);
        }
        /* SR2.NACKF = 0 */
        REG(SR2.UINT32) &= ~(1 << 4);
        /* SR2.STOP  = 0 */
        REG(SR2.UINT32) &= ~(1 << 3);
    }
    // If not repeated start, send stop.
    if (stop) {
        i2c_stop(obj);
    }
    return length;
}
07 Dec 2014

追加確認で同じI2Cラインで、
① LCD AQM0802A(秋月)
② 加速度センサー LIS3DH(秋月)
③ ジャイロセンサー L3GD20(秋月)
が動作することが確認できました。
SPIのLCDと合わせて、動作しています。
/media/uploads/kenjiArai/i2c_peach.png

07 Dec 2014

おぉすごいです。いまセンサを手元に持ってないので試せませんので、明日ためさせて頂きます。 「中の人にはやく見てもらって」、ぜひ、正式版発行してほしいです。

08 Dec 2014

Araiさん、ありがとうございます。温度センサ(秋月ADT7410モジュール)を接続して動作を確認できました。 /media/uploads/skycatneo/gr-peach_adt7410.jpg

08 Dec 2014

ちっと気になる点もあり、もう少し検証しないといけないと思っています。
しかし動作例が自分だけでなく広がったのは、良かったです。

09 Dec 2014

まだちゃんと調べておらず恐縮ですが、、、

デバイスの問題かもしれません

測距センサーGP2Y0E03でBurst-Readを試そうとしたのですが

i2c->write(address, (char*)&regAddress, 1, true);
i2c->read(address, (char*)data, dataSize);

がうまく動作しないようです。

https://developer.mbed.org/users/matsujirushi/code/MjGP2Y0E03/

/media/uploads/matsujirushi/20141209b.png

(後日、正常な波形と比較してみます。)

09 Dec 2014

Matsuokaさん 出張中で、充分拝見できていませんが、trueを削除して試していただけませんか? 自作ライブリーも、ここで問題発生しました。。私の修正プログラムの問題かI2Cの仕様なのか専門家の意見をお聞きしたいです。

09 Dec 2014

Araiさん、今夜試してみます。 意図的にSTOPを送出しないようにtrueとしています。最終的には、きちんと動くようにしたいですね。 (write()の後処理ではなく、read()の前処理が影響しているのでは?もしくはデバイス異常?を疑っています。)

10 Dec 2014

1バイト,2バイトデータの通信に問題がありましたので修正いたしました。
ご自身のプロジェクトの mbed-src を右クリックして update を選択すると、修正が反映されます。
再三の修正となり申し訳ありません。

10 Dec 2014

1バイト、2バイト処理を入れ込んでいただきまして、①②③のアドバイスがすべて入り、出しゃばった甲斐がありました。
さすがにきれいに作り直していただいたようで、私のものより洗練されていますね(ホビーで場当たり対応とは違う!)。
ACKWPの操作も追加されているので安心しました。
但し、書き込み禁止だったのを許可にしてもう一度禁止にしているようですが、何か重要な意味があるのでしょうか?
まあ、問題がなかったら覗かなくともいい場所なので、これは回答いただかなくても結構です。
少なくとも私のバラックセットでは、新しいLibで動作確認できました。
私が自分のプログラムで気になった点も、新しいLib.では解決されていました。
後はみなさんのレポートを待つことになるでしょうが、Matsuokaさんの件が気になります。

10 Dec 2014

みなさん、ありがとうございます。新しいライブラリで音声合成のAquesTalk-picoが正常に動作しました。

/media/uploads/skycatneo/aquestalk.jpg

10 Dec 2014

mbed-src 434でi2cのクロック周波数がちゃんと出ているか確認しました。
10kHz,100kHzはそれなりに出ているのですが、400kHzは357kHzでした。
/media/uploads/abanum/i2c_400khz.jpg

例によって、ソース眺めていたのですが・・・400kHzからレジスタの設定値を計算するのが複雑すぎる・・・。
なんか、10kHzごとのテーブル持って設定したくなりますw

10 Dec 2014

mbed-src Rev.434で試しました。

残念ながら、

i2c->write(address, (char*)&regAddress, 1, true);
i2c->read(address, (char*)data, dataSize);

だと、writeの最後で変化無くなります。

/media/uploads/matsujirushi/20141210e.png

正常なのはコレ。(mbed LPC1114FN28) /media/uploads/matsujirushi/20141210c.png

ちなみに、

i2c->write(address, (char*)&regAddress, 1);
i2c->read(address, (char*)data, dataSize);

は動作します。(本来、わたしがやりたい通信とは違いますが。) /media/uploads/matsujirushi/20141210d.png

10 Dec 2014

Matsuokaさん
私も、何故自作ライブラリーを変えないといけないか? 悩みました。
波形を見る限り、STOPを入れずに動作しているLPC1114FNの120円チップが正常ですよね。 まだよくわかりません。
どなたか専門家の方に、最終結論出していただきましょう。
私が現時点で言えることは、ほかのmbedと何らかの違いがあることのみ。

10 Dec 2014

abanumさん
中の人の公式見解を聞かなくてはいけませんが、10KHz毎のテーブルを用意するほど残念ながら選択肢がなくて、33MHzクロックでは400KHz目標に対して、357KHzが一番近い最適値ではないでしょうか?
RZ/A1Hは、タイマーパルスユニットをはじめ、パルス生成とその分周回路がほかのARMと比べて自由度が少ない気がします。

11 Dec 2014

マイコンマニュアル828ページに400kHzのレジスタ例が載っていたので出来る物だと思っていました。確かに近似値かもしれませんね。(検証は・・・ゲフンゲフン)

11 Dec 2014

abanumさん
大変失礼しました。
私も同じページを見てから答えたつもりでしたが、自由度はもう少しありそうです。
先ずは早とちりと充分な考察もせずに断言して申し訳ありませんでした。お詫びします。

結論は、この波形です。
/media/uploads/kenjiArai/i2c_peach_400khz.png 33.33HMzの時に、BRHとBRLそれぞれで、Hレベルのパルス幅とLレベルのバルス幅を決めてBRL+BRHの和で周波数が決まる仕組みになっていました。 しかし、今の周波数設定プログラム(/mbed-src/targets/hal/TARGET_RENESAS/TARGET_RZ_A1H/i2c_api.c)内のi2c_frequency()とi2c_reg_reset()の二つの関数内で、手抜きでBRLとBRHを同じ値を設定しています。
そうするとご指摘の357KHzが出てきています。
中の人のバックには優秀なソフトウェアエンジニアがたくさんいらっしゃり、I2Cやwait_ms()の解決も問題を指摘するとその後の対応は早かったので、今回は作ったソフトを公開するのは止めたいと思います。正式版の早いリリースを期待しましょう。
と言ってますが、実はこの部分は非常に複雑でもう少しじっくり考えないと最終解決策が見つかりません→というのが本音です。
下記に400KHzだけは動く修正部分を載せています。
この他、レジスターのDefaut値がたまたま一緒だったので動いている部分とか地雷がありますが、コードレビューをしっかりやれば見つかるレベルと思います。

i2c_api.c

static void i2c_reg_reset(i2c_t *obj) {
// 途中省略
#if 0
    REG(BRL.UINT32)    =  obj->width;
    REG(BRH.UINT32)    =  obj->width;
#else
    REG(BRL.UINT32)    =  obj->width & 0x0ff;
    REG(BRH.UINT32)    =  (obj->width >> 8) & 0x0ff;
#endif
// 途中省略
}

void i2c_frequency(i2c_t *obj, int hz) {
// 途中省略
    /* Min 10kHz, Max 400kHz */
    if (hz < 10000) {
        freq = 10000;
#if 0
    } else if (hz > 400000) {
        freq = 400000;
#else
    } else if (hz >= 400000) {
        freq = 400000;
        obj->pclk_bit = 0x10;  // P_phi / xx
        obj->width    = 0xf4ec; // BRH(bit15:8), BRL(bit7:0) P828の数値では400KHzにならなかった!!!
        return;   
#endif     
    } else {
        freq = hz;
    }
// 途中省略
}

現時点(2014年12月11日JST19:10)での残存不具合
1) 上記周波数設定(汎用化してどんな値が来てもそれに近い値を出すのは大変だと認識しました)
2) i2c->write(address, (char*)&regAddress, 1, true); のふるまい

以上、よろしくお願いします。

新しいCMSIS-DAPファームウエア、気持ちいいです。だいぶ快適になってきました。もう一歩だと思います。
このDebugも大変効率よくで出来るようになりました。
但しオンラインコンパイラーが、ユーザーが多くてアップアップしてそうですね!
たまに反応なしでエラーで戻って来ます(mbed-srcをコンパイルしていることにも起因?)。

15 Dec 2014

ご報告ありがとうございます。
本件、対応中です。