Arduinoのwhile文等で疑問があります。
while 文は条件文と実行文があったと思うのですが
実行文終わるまで条件文の確認は行われないのですか。
条件文の確認の頻度はどのくらいですか。

A 回答 (2件)

> 実行文終わるまで条件文の確認は行われないのですか。


はい。

while文の処理は以下のとおりです。
1. 条件文を確認する。
2. trueならば、実行文を実行する。falseならば、while文を抜ける。
3. 1に戻る。

たぶん「条件文がtrueの間、実行文を実行する」みたいな説明を見て、「実行文の実行と同時に条件文を確認する」ような解釈をしてしまったのだと思いますが、
そのような処理マルチスレッドやマルチコアでなければできません。
    • good
    • 0
この回答へのお礼

ありがとうございます。やはりそうですか。
モーターをセンサが一定値以下になるまでずっとモーター動かすプログラムを作ろうと思ったのですがそれだとモーターがカクカクするかと思い質問させていただきました。

お礼日時:2017/06/17 01:19

>while 文は条件文と実行文があったと思うのですが


>実行文終わるまで条件文の確認は行われないのですか。

その辺りは普通のC言語と同じかと思いますが…。
どういうコード(スケッチ)書いて、どういう動作を期待した上での疑問なんでしょうか?
    • good
    • 0
この回答へのお礼

超音波センサ値が一定値以下になるまでモーターを動かし続けるという動作です。
ありがとうございます。

お礼日時:2017/06/14 17:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

QArduino

Arduinoで一バイト受信
http://www.musashinodenpa.com/arduino/ref/index.php?f=1&pos=470
とあるのだが
一バイト受信は一個の数字を受信するという意味で大丈夫でしょうか

また()に何も入れないと一バイト受信なのですか

Aベストアンサー

>一バイト受信は一個の数字を受信するという意味で大丈夫でしょうか

8Bit分のデータを受信する。
というだけです。
# 0~255までの数値を受信する。と言い換えてもいいかも知れません。(ただし、送信側が256以上の数値を送った場合にどう受信されるかは環境依存…でしょう。)
# 「ASCIIコードで1個の数字を受信する」という解釈であれば合っています。(ただし、文字列としては使えないが)

とりあえず確認しますが……「数値」と「数字」の区別はつきますか?

>また()に何も入れないと一バイト受信なのですか

引数を取らない関数である。
というだけですので、入れた/入れないでどうこうではありません。
# 入れるとビルドでエラーになるか、無視されるかのどちらか。

Qarduino

arduinoに超音波センサと東芝のモータードライバを使ってセンサの値に応じてモーターを動くプログラムを書いているものなのですが

電源不足なのか知りませんがArduinoのーledが一瞬つくもののすぐ消えてしまいます。
しかしセンサを抜くとつくようになります。
電池を昇圧してDC給電してもpcからUSB給電しても同じです。
電池はものすごい暑くなります。
対処法はなんでしょうか

Aベストアンサー

症状から超音波センサを繋ぐと以上に大きな電流が流れて電池の電圧が下がりLEDが一瞬ついてすぐ消えてしまってるようです。

超音波センサの型番は?その超音波センサとaruduinoと電源の接続回路はどうなってますか?
可能性としては超音波センサの電源をプラスとマイナスを逆につないでしまってる。この場合はセンサーは壊れてしまってる可能性が大きいです。
それから全体の相互の接続が分かるような回路図も提示してもらった方がアドバイスしやすいです。

QArduinoやRaspberry PiにおけるSPI通信の挙動について

電子工作向けのプログラミングの勉強をしておりますが、SPI通信で気になることがあって質問させていただきました。

ArduinoやRaspberry Pi向けのOSに含まれるSPI関連のAPIを使うと、数バイトを一度に送受信することができます。

ただ、ウィキペディア英語版(https://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus)によると、SPI通信時は、1クロックで1ビットのデータの送信と受信が同時に行われていると解釈できます。また、ざっと調べる限り、PICマイコンで送受信を同時に実装する場合、1バイト送信したら、1バイトの受信を待たないと正しく動作しないようです。

上記のようなAPIを利用した送受信が機能しているのであれば、一方がマルチバイトデータを送信しているときは、同時に相手側の機器からもダミーのバイトデータを送信していると解釈してもよいのでしょうか。あるいは、一通りの受信が終わるまで相手側は待機状態に入っている、もしくは、対象の機器の挙動にたいしてケース・バイ・ケースで対応する必要があるのでしょうか。

電子工作向けのプログラミングの勉強をしておりますが、SPI通信で気になることがあって質問させていただきました。

ArduinoやRaspberry Pi向けのOSに含まれるSPI関連のAPIを使うと、数バイトを一度に送受信することができます。

ただ、ウィキペディア英語版(https://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus)によると、SPI通信時は、1クロックで1ビットのデータの送信と受信が同時に行われていると解釈できます。また、ざっと調べる限り、PICマイコンで送受信を同時に実装する場合、1バイト...続きを読む

Aベストアンサー

>SPI通信時は、1クロックで1ビットのデータの送信と受信が同時に行われていると解釈できます。
そうですね
>また、ざっと調べる限り、PICマイコンで送受信を同時に実装する場合、
>1バイト送信したら、1バイトの受信を待たないと正しく動作しないようです。
それはそのモジュールだかがそういう作りになってるだけです。

大概は8ビットを1文字として、意味ないヌルコードなら受け取っても捨てればいいし
それ以外のコードなら双方の約束に従って解釈し動作すればいい

>あるいは、一通りの受信が終わるまで相手側は待機状態に入っている、
>もしくは、対象の機器の挙動にたいしてケース・バイ・ケースで対応する必要があるのでしょうか。

SPI通信は「データ送受信」の信号形態を規定するものであり
データの中身とかは規定してません。
送受信双方の設計者が自由自在勝手気ままに決めればいいです。

QVisual Sutdio 2017 でのC言語のプログラミングについて困っていることがあります

こんにちは。
Visual Studio 2017のことについて教えていただきたいことがあります。
以下のC++のプログラムを作成し、実行するとあとちょっとというところで「(ファイル名)は動作を停止しました。問題が発生したためプログラムが正しく動作しなくなりました。解決策がある場合は、Windowsから通知されます」と出て先へ進めなくて困っています。

プログラムは、
i#nclude <stdio.h>

int main(void) {
int a, b;

printf("整数aを入力してください\n");
scanf("%d", &a);

printf("整数bを入力してください\n");
scanf("%d, &b");

printf("a+b=%d\n", a + b);


return 0;
}
です。
デバッグを行うと、「例外はハンドルされていません。 ハンドルされない例外が 0x569ED4A2 (ucrtbased.dll) で発生しました(C言語.exe 内): 0xC0000005: 場所 0x009C1046 への書き込み中にアクセス違反が発生しました。 」

と表示されます。
このサイトのほかの質問者の方のページを見たり、Microsoftのページを見たりしましたが、それでもわかりませんでした。初歩的なことだとは思いますが、ご教授お願いいたします、

Windows10で、機種はNECのhybrid-zeroを使用しています。

こんにちは。
Visual Studio 2017のことについて教えていただきたいことがあります。
以下のC++のプログラムを作成し、実行するとあとちょっとというところで「(ファイル名)は動作を停止しました。問題が発生したためプログラムが正しく動作しなくなりました。解決策がある場合は、Windowsから通知されます」と出て先へ進めなくて困っています。

プログラムは、
i#nclude <stdio.h>

int main(void) {
int a, b;

printf("整数aを入力してください\n");
scanf("%d", &a);

printf("整数bを入...続きを読む

Aベストアンサー

とりあえず、変な箇所

>i#nclude <stdio.h>
#include <stdio.h>

>scanf("%d, &b");
scanf("%d", &b);

QArduinoIDEのコンパイル結果の表示

Arduino言語で書かれたプログラムがArduinoIDEでどのような機械語に翻訳されているか、ちょっと興味があり確かめてみたくなりました。
コンパイル結果を機械語(アセンブラ)で表示する方法教えてください。

ArduinoIDEのオプションなど探してみたのですが、表示方法がみつからなかったので、よろしくお願いします。

Aベストアンサー

>ArduinoアセンブラでLチカ
>http://qiita.com/TakeoChan/items/8362eaf53cf199262cb7

>【Arduino】アセンブラ入門 その1
>http://nn-hokuson.hatenablog.com/entry/2017/09/11/194125

>arduinoの逆アセンブラーリスト
>http://blog.goo.ne.jp/cookchant/e/2e7d037ebaea8f7d395773b44966c9b9

 こういう感じらしいです。

Qarduino

arduinoって同時にプログラム実行できないんでしょうか。例えばシリアル通信中にLチカをして通信状態確認するとか。回答よろしくお願いします。

Aベストアンサー

>arduinoって同時にプログラム実行できないんでしょうか。

できません。
ちなみにマルチコアなどでない限りPCでも同時に実行できるのは1つの命令が基本です。
# 最近はマルチコアも普通になってきていますが。

>例えばシリアル通信中にLチカをして通信状態確認するとか。

処理を細切れにして実行するようにスケッチを作成すれば可能です。

シリアルの受信バッファにデータがあったら1文字(1Byte)読み込んで配列に格納。なかったら次の処理へ。
時間を取得して、前回のLED点灯(または消灯)から一定時間過ぎていたらLEDを消灯(または点灯)。
シリアルからの受信データがある程度貯まったら内容判定して必要な処理を実行、

というかんじでループ中に細切れに処理していきます。
# シリアル送信も1ループ中に1文字(1Byte)だけ送信。とか。

QArduinoでターミナル等に触ると誤動作する

Arduino Unoで図のような回路を組んでいます。
なぜか矢印のターミナルに触るとその先のスイッチがONになったと勘違いした動作をします。
なぜこのようになってしまうかと対策など、ご存知の方に教えていただけたらとおもいます。

最初はこの回路でなく、内蔵プルアップにしました(その時は4.7kΩは無かった)。内臓プルアップでこれと同じ誤動作が起きたのでそれを止めてこの形になりました。

ターミナルに触ると言うのはドライバの先やテスターのプローブの片方だけが触れると言う意味です。それは手持ちで、身体やその物のどこか一部が別の場所に触れていると言う事はありません。

図は、実際の基板のレイアウトとほぼ同じです。ターミナルの列から上はユニバーサル基板に乗っていて半田付けされています。Arduinoの電源はUSB経由です。

Aベストアンサー

回答NO.2です。
 すみません、回路でLEDの抵抗3本の共通ラインはGNDにつながってたのを見落としてました。
回路図を書き直して添付しました。この回路でそういう現象が起きるという事はAC電源の誘導電圧が大きいとしか考えられませんので添付図のように電解コンデンサC1とC2(それぞれ10uF/10V)を追加すれば誤動作はなくなると思います。

Qc言語プログラミングでアルファベットの一覧を5,10,15,20,25文字目については大文字、それ以

c言語プログラミングでアルファベットの一覧を5,10,15,20,25文字目については大文字、それ以外は小文字で表示するプログラムを作成できる方お願いします
char x;
for(x=0;x<26;x++)
[
if(x%2==0) printf(”%c”___);
else printf(”%c”,___);
]

ここまで作ったんですけど、下線部がわかりません
あと、違っている箇所があれば教えいただける方お願いします

Aベストアンサー

No.2修正
前:    if ((pt - ss + 1) % 5 == 0) {
後:    if (!((pt - ss + 1) % 5)) {

QC言語で四則演算を使って10を作るプログラム

C言語のプログラミングの問題です。
1桁の整数4つをキーボードから入力して、四則演算で10になる式をすべて出力するという問題で、演算子の優先順位ありで、括弧は使わないとし、数字は入れ替え可能です。
また、プログラムはint型の変数を用いるというものです。
とりあえずは数字入れ替えなしで、次のような力技でソースコードを作ってみたのですが、数字の入れ替えまで考えるとあまりに力技すぎるようなだらだらとしたプログラムになってしまいます。。。
数字の入れ替え可能としてもっと簡単なプログラムを作るにはどのようなソースコードになるのでしょうか。

以下ソースコードです。

#include<stdio.h>
#include<math.h>

int main(void) {

int a, b, c, d = 0;

printf("一桁の整数4つを入力してください。\n");
scanf_s("%d %d %d %d", &a, &b, &c, &d);

if (a + b - c * d == 10)
printf("%d+%d-%d*%d\n", a, b, c, d);
else if (a + b - c / d == 10)
printf("%d+%d-%d/%d\n", a, b, c, d);
else if (a + b * c - d == 10)
printf("%d+%d*%d-%d\n", a, b, c, d);
else if (a + b * c / d == 10)
printf("%d+%d*%d/%d\n", a, b, c, d);
else if (a + b / c - d == 10)
printf("%d+%d/%d-%d\n", a, b, c, d);
else if (a + b / c * d == 10)
printf("%d+%d/%d*%d\n", a, b, c, d);
else if (a - b + c * d == 10)
printf("%d-%d+%d*%d\n", a, b, c, d);
else if (a - b + c / d == 10)
printf("%d-%d+%d/%d\n", a, b, c, d);
else if (a - b * c + d == 10)
printf("%d-%d*%d+%d\n", a, b, c, d);
else if (a - b * c / d == 10)
printf("%d-%d*%d/%d\n", a, b, c, d);
else if (a - b / c + d == 10)
printf("%d-%d/%d+%d\n", a, b, c, d);
else if (a - b / c * d == 10)
printf("%d-%d/%d*%d\n", a, b, c, d);
else if (a * b + c - d == 10)
printf("%d*%d+%d-%d\n", a, b, c, d);
else if (a * b + c / d == 10)
printf("%d*%d+%d/%d\n", a, b, c, d);
else if (a * b - c + d == 10)
printf("%d*%d-%d+%d\n", a, b, c, d);
else if (a * b - c / d == 10)
printf("%d*%d-%d/%d\n", a, b, c, d);
else if (a * b / c + d == 10)
printf("%d*%d/%d+%d\n", a, b, c, d);
else if (a * b / c - d == 10)
printf("%d*%d/%d-%d\n", a, b, c, d);
else if (a / b + c - d == 10)
printf("%d/%d+%d-%d\n", a, b, c, d);
else if (a / b + c * d == 10)
printf("%d/%d+%d*%d\n", a, b, c, d);
else if (a / b - c + d == 10)
printf("%d/%d-%d+%d\n", a, b, c, d);
else if (a / b - c * d == 10)
printf("%d/%d-%d*%d\n", a, b, c, d);
else if (a / b * c + d == 10)
printf("%d/%d*%d+%d\n", a, b, c, d);
else if (a / b * c - d == 10)
printf("%d/%d*%d-%d\n", a, b, c, d);
else {
printf("10になる組み合わせはありません。");
}

return 0;

}

C言語のプログラミングの問題です。
1桁の整数4つをキーボードから入力して、四則演算で10になる式をすべて出力するという問題で、演算子の優先順位ありで、括弧は使わないとし、数字は入れ替え可能です。
また、プログラムはint型の変数を用いるというものです。
とりあえずは数字入れ替えなしで、次のような力技でソースコードを作ってみたのですが、数字の入れ替えまで考えるとあまりに力技すぎるようなだらだらとしたプログラムになってしまいます。。。
数字の入れ替え可能としてもっと簡単なプログラ...続きを読む

Aベストアンサー

No14です。
calcに一部誤りがありましたので、修正しました。
下記URLが正しいソースになります。こちらを使用してください。
http://climbi.com/b/10192/1
不明点があれば、補足してください。

QマイコンSPI入門

現在マイコン初心者でD/A変換、SPI通信について勉強しております。現在ポテンショメータの入力に応じて電圧を変化させLEDの明るさを調整しようとしています。(master側からの一方通行)
使用チップ:atmel atmega328p(master)
mcp4921 (slave)
配線図:添付画像を参照ください
開発環境:atmel studio 7(c言語)

ADCを用いてポテンショメータの値はとれるようになったのですが、SPI通信でつまずいております。色々なサイトでコードを見てみているのですが、どのようにmaster側とslave側でコードを分けているのかが分からない状態です。両方にmain関数があるのですがどのようにファイルを配置してビルドしているのでしょうか?

なにか参考になるサイトなどがありましたら、そちらも教えていただけると助かります。

Aベストアンサー

オシロスコープかロジックアナライザがあれば良いのですが、無いという前提で。
MOSIとMISOを接続しておいてSPIFフラグが立った時にデータレジスタを読めば自分が送信したデータが受信されているはずです。
しかし、このエコーバックではクロック速度と動作モードがスレーブの仕様に合っているかは確認できません。
まあ、スレーブは20MHzのクロックまで行けますし、MODE0で使えるようなので、そこは大丈夫かと思います。
補足提示いただいたコードは特に間違っていないと思いますよ。


このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング

おすすめ情報