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

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

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

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

1回答

2054閲覧

Arduinoのスリープモードからの割り込み

nutssensei

総合スコア11

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

1クリップ

投稿2018/11/11 11:51

はじめまして。
Arduinoのスリープモードからの割り込みを様々なサイトを見ながら学習中なのですが、プログラムの作成方法が分からず困っております。
電子工作およびプログラミングの初心者ですが、なんとかしたいので、皆様のご指導をお願いいたします。

<やりたいこと>
通常はスリープさせて、タクトスイッチを押すと割り込みが発生してLEDが点滅。その後、再度スリープ状態に戻る。

<回路>
・ArduinoのPD2を割り込み用ソケットに指定して、外部抵抗を通してプルダウンし、タクトスイッチの片方に接続しました。タクトスイッチのもう片方は5Vの電源に接続しました。
・ArduinoのPD8を出力ソケットに指定して、LEDに接続しました。

<プログラム>
#include <avr/sleep.h>
#include <avr/interrupt.h>
int led = 8;
volatile int state = LOW;

void sleepNow(){
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
attachInterrupt(0, interruptsw , RISING);
sleep_mode();
sleep_disable();
detachInterrupt(0);
}

void setup() {
pinMode(led, OUTPUT);
}

void loop() {
if (state){
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
}else{
sleepNow();
}

void interruptsw(){
state = !state;
}

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

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

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

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

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

guest

回答1

0

ベストアンサー

まずはスリープに移行しないで、
プログラムループにしといて、スイッチの割り込みがかかるのを確認しましょう
それがきちんと動作するのを確認したあと、スリープモードに移行させてみればどうでしょう


こういうことをする場合は、まずCPUのデータシートを読みましょう。
すると、今の回路/コードではいろいろまずい、というのが見えてきます
0. スリープから復帰するためには、INT0/1ではレベル割り込みしか使えない
0. レベル割り込みは、Lowレベル割り込みしかないので、スイッチ入力回路を修正する必要がある(現状はSWを押してHighとなる)
0. そして、レベル割り込みでは、Lowレベルになっている間、割り込みが繰り返しかかるようになっている
これじゃまずいので、割り込み関数でdetachInterruptを呼ぶ?

実際に動かしたわけじゃないのでアレですが、参考にどうぞ

投稿2018/11/11 12:45

編集2018/11/12 01:28
y_waiwai

総合スコア87719

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

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

nutssensei

2018/11/11 13:01

waiwaiさん、ご回答いただきありがとうございました。 そうですね。おっしゃる通り、まずは割り込みがかかるのを確認したいと思います。
nutssensei

2018/11/12 10:07

wiwaiさん、丁寧なご指摘ありがとうございます。 CPUのデータシートを確認してみます。 正直これまでサイトの情報をつなぎ合わせていただけでしたので、「なぜこのようにプログラミングするのか?」など深く追求できていませんでしたので、基本に立ち戻りたいと思います。 英語のマニュアルは気が重いですが、頑張ります。 また、ご指導いただくかもしれませんが、どうぞこれからもよろしくお願いいたします。
nutssensei

2018/11/13 12:23

waiwaiさん ありがとうございます。 拝見いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問