プログラムを割り込みで終了

17 Nov 2011

初心者です。

  1. include "mbed.h"

DigitalOut myled(LED4);

int main() { while(1) { myled = 1; wait(0.2); myled = 0; wait(0.2); } }

このプログラムを、リセットボタンを押せば終了できるようにしたいのですが、可能でしょうか?

18 Nov 2011

シバ様

通常、リセットボタンを押せば、リセットがかかりプログラムは終了しますが、 リセットボタンを離せばまた動き出します。

新しいプログラムをロードした後、そのプログラムを動かすには、リセット する必要があります。もし、リセットボタンを押して離しても動かないようにすると、 プログラム自体が最初から動かないことになります。

DigitalIn を使って、停止ボタンを別に設けたほうが良いのでは、と思います。

もし、どうしても、というのなら、リアルタイムクロックを使ったり、初期設定 ファイルを使ったりして、起動時の条件判断で動くか動かないかを決めるという 方法もあると思いますよ。ちょっと面倒ですが・・・

柴田

19 Nov 2011

柴田様 

ありがとうございます。 リセットスイッチでは簡単にはできないんですね。停止ボタンを別に付けてやってみます。リレースイッチみたいに、1回押したらon 、もう一度押すとoffになるように、プログラムで簡単にやれるのかな?と思ったもので・・

21 Nov 2011

Quote:

リレースイッチみたいに、1回押したらon 、もう一度押すとoffになるように、プログラムで簡単にやれるのかな?と思ったもので・・

そういうことでしたら、なんだか可能な気がして、試しに書いて見ました。 リセットすると、2回に1回、何もしない無限ループに入れています。 プログラムは走っているのですが、外からは動いていないように見えます。

//
// Toggle running with reset button  by K.Shibata
// 
// Push reset button to stop running.
// Push reset button to run again. 
//

#include "mbed.h"

DigitalOut myled(LED1);

LocalFileSystem local( "local" );   // Create the local filesystem under the name "local"

int main() {
    FILE *fp;
    bool is_checked = false;

    fp = fopen( "/local/toggle.txt", "r" ); // Open "toggle.txt" on the local file system for reading.
    if ( fp != NULL ) {
        int c = fgetc( fp );
        if ( c == '1' ) {
            is_checked = true;
        }
        fclose( fp );
    }

    fp = fopen( "/local/toggle.txt", "w" ); // Open "toggle.txt" on the local file system for writing.
    if ( fp != NULL ) {
        if ( is_checked ) {
            fputc( '0', fp );
        } else {
            fputc( '1', fp );
        }
        fclose( fp );
    }

    if ( is_checked ) while( 1 ); // Infinite loop.

    while (1) {
        myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);
    }
}

Import programToggleRunning_With_ResetButton

Toggle running with reset button. You can run and stop mbed without external switch. Push reset button to stop program. Push reset button to run program again. This sample program uses LocalFileSystem to save next running status.

どうでしょう。お役に立ちますでしょうか? 柴田

21 Nov 2011

Very interesting! A little simpler version follows...

#include "mbed.h"

DigitalOut myled(LED1);

int main() {
    LocalFileSystem local("local");
    const char *TOGGLE = "/local/toggle.txt";

    FILE *fp = fopen(TOGGLE, "r");
    if (fp) {
        fclose(fp);
        remove(TOGGLE);
        return 0;
    } else {
        fp = fopen(TOGGLE, "w");
        fclose(fp);
    }

    while (1) {
        myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);
    }
}
22 Nov 2011

Hello Hiroshi. It is better than mine. Now we can do many things before returning 0 in main(), power off peripherals, switch to sleep mode ... etc.

山口様、 いいですね。main() で return 0 する前に、周辺装置をOFFしたり、スリープモードに入れたり、なんてこともやろうと思えばできますね。

22 Nov 2011

なるほど・・何もしない無限で実現するわけですね。 やってみます、ありがとうございます。