質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

mbed

mbed(エンベッド)は、Webサイト上でC++を使って開発を行う、ワンボードマイコンのプロトタイピングツールです。PCに開発環境をインストールする必要がなく、Webにアクセスできればどこにいても開発を行うことができます。

Q&A

2回答

2230閲覧

mbedに搭載されているLED点灯処理について教えてください。

fafw

総合スコア7

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

mbed

mbed(エンベッド)は、Webサイト上でC++を使って開発を行う、ワンボードマイコンのプロトタイピングツールです。PCに開発環境をインストールする必要がなく、Webにアクセスできればどこにいても開発を行うことができます。

0グッド

0クリップ

投稿2020/07/24 02:13

編集2020/07/24 02:21

mbedで搭載されているLED1からLED4までの4つのLEDを用いて、押しボタン・スイッチが押されるたびに点灯する順が反転する処理がしたいです。
具体的には以下のような処理です。また、左からLED1、LED2、LED3、LED4となっています。
★★★★↑↓
☆★★★↑↓繰り返し
★☆★★↑↓    ★:消灯
★★☆★↑↓    ☆:点灯
★★★☆↑↓
リセットボタンを押して、まず☆★★★(LED1)から順に0.1秒ずつ点灯させ、次のLEDの処理の間には0.2秒ごとにLEDの変化があります。その後、外部のボタンを押されたとき、割り込み入力でp5ポートで点灯する順が変わります。また、連続してスイッチを押すとLEDの点灯が左右に行き来したりします。

試したこと

mbedで書いているコードの言語はC++で以下のような処理を考えました。

c++

1#include "mbed.h" 2InterruptIn button(p5); // 割り込み入力としてp5を設定 3// LED1,LED2,LED3,LED4のそれぞれの配列を4個用意して、定義 4DigitalOut myled[4]={LED1,LED2,LED3,LED4}; 5 6// 割り込み処理(ボタンが押されたとき) 7void flip() { 8 int i; 9 while(1) { 10 for(i=3; i>=0; i--){ 11 myled[i] = !myled[i]; 12 wait(0.1); 13 myled[i] = 0; 14 wait(0.2); 15 } 16 } 17} 18 19// メイン処理 20int main() { 21 int i; 22 button.rise(&flip); 23 while(1) { 24 for(i=0; i<4; i++){ 25 myled[i] = !myled[i]; 26 wait(0.1); 27 myled[i] = 0; 28 wait(0.2); 29 } 30 } 31}

上記のコードを試したところ、ボタンを押したとき、逆の順に点灯することが出来ましたが、再びボタンを押したところ、無限ループということもあり、逆の順のまま、繰り返し処理がされてしまいます。ボタンを押されたとき、順序が逆になる処理が思いつきません。どうすれば、ボタンを連続して押したとき、行き来できるようなプログラムができますでしょうか。よろしければ教えてください。

mbedの操作が未経験なので、困っています。
よろしくお願いいたします。

補足情報(使用している機材)

使用している機材はmbed LPC1768と外部ボタン一個です。
ブレッドボードを使用して、抵抗やジャンパー線で接続しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

基本的に、割り込みでは時間のかかる処理をしてはいけません
割り込みルーチンの中でループ回してますが、割り込みルーチンの中にいるときは、メインループは実行されません

割り込みルーチンでは、グローバル変数のセットだけにしておいて、メインループでは、その変数の値を見て処理を分けるようにしましょう

んで、割り込み、メイン双方で操作参照する変数には、volatileを付けておきます

投稿2020/07/24 02:19

編集2020/07/24 02:20
y_waiwai

総合スコア88024

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2020/07/24 21:57

現時点で低評価が入ってるけど、その理由を知りたい。内容は順当だと思うけど。
guest

0

模擬コード

グローバル変数:点灯順の向き main while(1) 次に点灯するled番号=前回点灯した番号と向きから算出 点灯処理 割り込み 向きを逆にする

投稿2020/07/24 02:19

編集2020/07/24 02:20
ozwk

総合スコア13551

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問