Test program GR-PEACH
このプログラムには、二つの気になる点があります。
1)LEDのON/OFFがほかのmbedと論理が反対です。
ほかのmbedボードは正論理(1=ON)ですが、このボードは負論理(0=ON)です。
良いとか悪いとかコメントする気はありませんが、ほかのボードから移植するときに、暗黙にONを1とするmbed文化と衝突することは間違いないでしょう。
ポートの出力電流も調べてみましたが、+/-2mAと規定(P1_0から7は10mA)されています。
現在、どのくらいの電流が流れているかは調査していませんが、今の使い方であれば、アノードコモンからカソードコモンのLEDに変えれば同じように実力での駆動は問題ないでしょう?
2)もう一点はprintf()の出力タイミングです。
LEDの個別のON/OFFとprintf()で仮想COMを経由してホストPCに吐き出される文字列が同期していません。
どうもwait()関数の呼び出しまでFIFO(詳しくまだ調べていないので憶測)に蓄えて一気に吐き出しているように見えます。
printf()機能はmbedでは大切なDebugツールです。内容を精査いただけると幸いです。
変更した点
2) printf(debug用)とSerialを宣言してのちのprintfを使い分けて、動作が違うことが判明。
宣言したprintfでは問題なし。この差の原因が何かは現時点では不明。
使用方法
//#define DISP_COM //コメントアウトしてコンパイルで問題発生(旧バージョンと同等) #define DISP_COM //問題が消える
Diff: main.cpp
- Revision:
- 2:3747397a1618
- Parent:
- 1:a399a743d109
- Child:
- 3:989d13762f43
--- a/main.cpp Sat Nov 29 12:35:30 2014 +0000 +++ b/main.cpp Thu Dec 04 12:03:04 2014 +0000 @@ -21,6 +21,22 @@ #define LED_NAME //#define LED_COLOR +//#define DISP_COM + +// Com +#ifdef DISP_COM +#define BAUD(x) pcm.baud(x) +#define PRINTF(...) pcm.printf(__VA_ARGS__) +#else +#define BAUD(x) baud(x) +#define PRINTF(...) printf(__VA_ARGS__) +#endif + +#ifdef DISP_COM +// com +Serial pcm(USBTX, USBRX); +#endif + #if defined(PIN_NUM) DigitalOut myledR(P4_4); DigitalOut myledG(P3_2); @@ -44,103 +60,103 @@ int main() { uint32_t n = 0; - printf("Start mbed program\r\n"); + PRINTF("Start mbed program\r\n"); myledR = OFF; - printf("RF,"); + PRINTF("RF,"); myledG = OFF; - printf("GF,"); + PRINTF("GF,"); myledB = OFF; - printf("BF,"); + PRINTF("BF,"); myledU = ON; - printf("UN"); + PRINTF("UN"); while(1) { wait(5.0); - printf(" passed %4d Sec\r\n", n +=5); - printf("R=ON ,G=OFF,B=OFF "); + PRINTF(" passed %4d Sec\r\n", n +=5); + PRINTF("R=ON ,G=OFF,B=OFF "); myledR = ON; - printf("RN,"); + PRINTF("RN,"); myledG = OFF; - printf("GF,"); + PRINTF("GF,"); myledB = OFF; - printf("BF,"); + PRINTF("BF,"); myledU = OFF; - printf("UF"); + PRINTF("UF"); wait(5.0); - printf(" passed %4d Sec\r\n", n +=5); - printf("R=OFF,G=OFF,B=OFF "); + PRINTF(" passed %4d Sec\r\n", n +=5); + PRINTF("R=OFF,G=OFF,B=OFF "); myledR = OFF; - printf("RF,"); + PRINTF("RF,"); myledG = OFF; - printf("GF,"); + PRINTF("GF,"); myledB = OFF; - printf("BF,"); + PRINTF("BF,"); myledU = ON; - printf("UN"); + PRINTF("UN"); wait(5.0); - printf(" passed %4d Sec\r\n", n +=5); - printf("R=OFF,G=ON ,B=OFF "); + PRINTF(" passed %4d Sec\r\n", n +=5); + PRINTF("R=OFF,G=ON ,B=OFF "); myledR = OFF; - printf("RF,"); + PRINTF("RF,"); myledG = ON; - printf("GN,"); + PRINTF("GN,"); myledB = OFF; - printf("BF,"); + PRINTF("BF,"); myledU = OFF; - printf("UF"); + PRINTF("UF"); wait(5.0); - printf(" passed %4d Sec\r\n", n +=5); - printf("R=OFF,G=OFF,B=OFF "); + PRINTF(" passed %4d Sec\r\n", n +=5); + PRINTF("R=OFF,G=OFF,B=OFF "); myledR = OFF; - printf("RF,"); + PRINTF("RF,"); myledG = OFF; - printf("GF,"); + PRINTF("GF,"); myledB = OFF; - printf("BF,"); + PRINTF("BF,"); myledU = ON; - printf("UN"); + PRINTF("UN"); wait(5.0); - printf(" passed %4d Sec\r\n", n +=5); - printf("R=OFF,G=OFF,B=ON "); + PRINTF(" passed %4d Sec\r\n", n +=5); + PRINTF("R=OFF,G=OFF,B=ON "); myledR = OFF; - printf("RF,"); + PRINTF("RF,"); myledG = OFF; - printf("GF,"); + PRINTF("GF,"); myledB = ON; - printf("BN,"); + PRINTF("BN,"); myledU = OFF; - printf("UF"); + PRINTF("UF"); wait(5.0); - printf(" passed %4d Sec\r\n", n +=5); - printf("R=OFF,G=OFF,B=OFF "); + PRINTF(" passed %4d Sec\r\n", n +=5); + PRINTF("R=OFF,G=OFF,B=OFF "); myledR = OFF; - printf("RF,"); + PRINTF("RF,"); myledG = OFF; - printf("GF,"); + PRINTF("GF,"); myledB = OFF; - printf("BF,"); + PRINTF("BF,"); myledU = ON; - printf("UN"); + PRINTF("UN"); wait(5.0); - printf(" passed %4d Sec\r\n", n +=5); - printf("R=ON ,G=ON ,B=ON "); + PRINTF(" passed %4d Sec\r\n", n +=5); + PRINTF("R=ON ,G=ON ,B=ON "); myledR = ON; - printf("RN,"); + PRINTF("RN,"); myledG = ON; - printf("GN,"); + PRINTF("GN,"); myledB = ON; - printf("BN,"); + PRINTF("BN,"); myledU = OFF; - printf("UF"); + PRINTF("UF"); wait(5.0); - printf(" passed %4d Sec\r\n", n +=5); - printf("R=OFF,G=OFF,B=OFF "); + PRINTF(" passed %4d Sec\r\n", n +=5); + PRINTF("R=OFF,G=OFF,B=OFF "); myledR = OFF; - printf("RF,"); + PRINTF("RF,"); myledG = OFF; - printf("GF,"); + PRINTF("GF,"); myledB = OFF; - printf("BF,"); + PRINTF("BF,"); myledU = ON; - printf("UN"); + PRINTF("UN"); } }