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:
- 0:a17b3cf2f466
- Child:
- 1:a399a743d109
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Nov 29 12:29:49 2014 +0000 @@ -0,0 +1,129 @@ +#include "mbed.h" + +//#define PIN_NUM +#define LED_NAME +//#define LED_COLOR + +#if defined(PIN_NUM) +DigitalOut myledR(P4_4); +DigitalOut myledG(P3_2); +DigitalOut myledB(P4_6); +DigitalOut myledU(P4_7); +#elif defined(LED_NAME) +DigitalOut myledR(LED1); +DigitalOut myledG(LED2); +DigitalOut myledB(LED3); +DigitalOut myledU(LED4); +#elif defined(LED_COLOR) +DigitalOut myledR(LED_RED); +DigitalOut myledG(LED_GREEN); +DigitalOut myledB(LED_BLUE); +DigitalOut myledU(LED_USER); +#endif + +#define ON 0 +#define OFF 1 + +int main() { + uint32_t n = 0; + + printf("Start mbed program\r\n"); + myledR = OFF; + printf("RF,"); + myledG = OFF; + printf("GF,"); + myledB = OFF; + printf("BF,"); + myledU = ON; + printf("UN"); + while(1) { + wait(5.0); + printf(" passed %4d Sec\r\n", n +=5); + printf("R=ON ,G=OFF,B=OFF "); + myledR = ON; + printf("RN,"); + myledG = OFF; + printf("GF,"); + myledB = OFF; + printf("BF,"); + myledU = OFF; + printf("UF"); + wait(5.0); + printf(" passed %4d Sec\r\n", n +=5); + printf("R=OFF,G=OFF,B=OFF "); + myledR = OFF; + printf("RF,"); + myledG = OFF; + printf("GF,"); + myledB = OFF; + printf("BF,"); + myledU = ON; + printf("UN"); + wait(5.0); + printf(" passed %4d Sec\r\n", n +=5); + printf("R=OFF,G=ON ,B=OFF "); + myledR = OFF; + printf("RF,"); + myledG = ON; + printf("GN,"); + myledB = OFF; + printf("BF,"); + myledU = OFF; + printf("UF"); + wait(5.0); + printf(" passed %4d Sec\r\n", n +=5); + printf("R=OFF,G=OFF,B=OFF "); + myledR = OFF; + printf("RF,"); + myledG = OFF; + printf("GF,"); + myledB = OFF; + printf("BF,"); + myledU = ON; + printf("UN"); + wait(5.0); + printf(" passed %4d Sec\r\n", n +=5); + printf("R=OFF,G=OFF,B=ON "); + myledR = OFF; + printf("RF,"); + myledG = OFF; + printf("GF,"); + myledB = ON; + printf("BN,"); + myledU = OFF; + printf("UF"); + wait(5.0); + printf(" passed %4d Sec\r\n", n +=5); + printf("R=OFF,G=OFF,B=OFF "); + myledR = OFF; + printf("RF,"); + myledG = OFF; + printf("GF,"); + myledB = OFF; + printf("BF,"); + myledU = ON; + printf("UN"); + wait(5.0); + printf(" passed %4d Sec\r\n", n +=5); + printf("R=ON ,G=ON ,B=ON "); + myledR = ON; + printf("RN,"); + myledG = ON; + printf("GN,"); + myledB = ON; + printf("BN,"); + myledU = OFF; + printf("UF"); + wait(5.0); + printf(" passed %4d Sec\r\n", n +=5); + printf("R=OFF,G=OFF,B=OFF "); + myledR = OFF; + printf("RF,"); + myledG = OFF; + printf("GF,"); + myledB = OFF; + printf("BF,"); + myledU = ON; + printf("UN"); + } +}