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

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

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

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

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

C++

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

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

解決済

2回答

2435閲覧

PIC18F27Q84で指定した時間スリープにならない

klose0609

総合スコア11

C

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

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

C++

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

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

1クリップ

投稿2021/08/19 22:25

最近PICを使い始めた初心者です。
現在、PICを使用して温度センサーを作ってます。温度センサーの詳細は下記の通りです。

・白金抵抗を使用して、温度による抵抗値の変換を電圧値として測定⇒計算式から温度に変換
・温度を1分ごとに測定
・測定の間は、電力消費を抑えるためにスリープモード

スリープモードに入る前に、スリープモードへ移行することを知らせるためにLEDを点滅させています。
現在の問題は、MPLAB Code Configurator(MCC)で設定した時間スリープしないことです。
具体的には、MCCで下記の通りにWatchdog timer(WDT)を使用してスリープ時間を設定しています。

イメージ説明

この画面上では、WDTは67.65006sです。
プログラミングコードは下記の通りです。

C

1void main(void) 2{ 3 // Initialize the device 4 SYSTEM_Initialize(); 5 6 // If using interrupts in PIC18 High/Low Priority Mode you need to enable the Global High and Low Interrupts 7 // If using interrupts in PIC Mid-Range Compatibility Mode you need to enable the Global Interrupts 8 // Use the following macros to: 9 10 // Enable the Global Interrupts 11 // INTERRUPT_GlobalInterruptEnable(); 12 13 // Disable the Global Interrupts 14 // INTERRUPT_GlobalInterruptDisable(); 15 16 int tempValue = 0; 17 double tempVoltage = 0; 18 double temp = 0; 19 20 while (1) 21 { 22 tempValue = ADC_GetSingleConversion(RA0); 23 tempVoltage = tempValue * 5 / 1024; //Convert to voltage 24 temp = 34.283 * tempVoltage + 24.29; // Convert to temperature 25 printf(temp); 26 27 RC5 = 1; 28 __delay_ms(3000); 29 RC5 = 0; 30 31 SLEEP(); 32 33 // Add your application code 34 }

当初、温度を出力した後にLEDが3秒間点灯し、スリープモードへ移行、その後67.65006秒後にスリープから復帰して再度温度を出力、という流れを想定しておりました。しかしながら、実際は、温度出力、3秒間LED点灯、その後一瞬だけLEDが消えて、すぐに温度出力、LED点灯となってしまいました。WDTが指定した時間作動してないのだと思います。
ADCを作動させずに、LEDの点滅だけのコードで試したところ、LEDが3秒間点灯、消滅した後67秒後に再点灯、という当初予想していた流れとなりました。
この結果から、ADCを作動させることで、WDTがリセット?されているのではないかと考えております。
ADCを作動させる場合でも同じように、設定した時間スリープモードへ移行させたいのですが、コードをどのように修正するべきかご教授いただきたく存じます。
なお、使用しているマイコンはPIC18F27Q84です。開発環境はMPLAB X IDE v5.45になります。MPLABではMCCを使用しています。

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

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

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

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

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

y_waiwai

2021/08/19 23:05

コードを提示しましょう
guest

回答2

0

ベストアンサー

PIC18F26Q84 にてテストしてみました

#include "mcc_generated_files/mcc.h" void main(void) { unsigned char num = 0; SYSTEM_Initialize(); __delay_ms(2000); printf("¥033[2J\r\n"); // CLS printf(" PIC18F26Q84 TEST!! \r\n"); WWDT_SoftEnable(); while (1) { printf("%3d ADC_A0 = %04X \r\n", num , ADC_GetSingleConversion( channel_ANA0 ) ); num++; IO_RC3_Toggle(); SLEEP(); // __delay_ms(3000); } }

実行結果↓

PIC18F26Q84 TEST!!

0 ADC_A0 = 0800
1 ADC_A0 = 080A
2 ADC_A0 = 07FF
3 ADC_A0 = 0FFA
4 ADC_A0 = 0FFF
5 ADC_A0 = 0ED5
6 ADC_A0 = 0BF6
7 ADC_A0 = 07FF
8 ADC_A0 = 0286
9 ADC_A0 = 0018
10 ADC_A0 = 0000
11 ADC_A0 = 0000
12 ADC_A0 = 084C
13 ADC_A0 = 084D
14 ADC_A0 = 0FFF
15 ADC_A0 = 0FFF

設定↓
イメージ説明
イメージ説明

pragma config JTAGEN = OFF
ADC クロック FRC
メインクロック 64MHz
設定しました。

投稿2021/08/22 16:05

koujikuu

総合スコア401

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

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

thkana

2021/08/22 21:56

PICには手を出していないのでウォッチだけしているのですが、 つまりその実験では症状が再現した(WDTによるリセットはかかっていない)、ということまでですね?
koujikuu

2021/08/22 22:34

PICクロックが停止している → SLEEP動作 numがカウントしている → WDT RESET が発生していない ADC変換後 SLEEP で PIC動作停止 WDT (67s) で SLEEP復帰 しているので正常動作です 質問者の状態は再現していません。
thkana

2021/08/22 23:39

> PIC動作停止 WDT (67s) で SLEEP復帰 している これはちょっと読み取れませんでしたが。 WDTっつうからリセットだと思いこんでたけど、ただの割り込みとして使ってるんですね?
koujikuu

2021/08/23 00:22

WDT ウォッチドッグタイマ は、PICが異常動作した時にリセットをかけ復帰させるのもですが SLEEP中からの復帰信号としても使えます、割り込みとは別です。
thkana

2021/08/23 13:33

> SLEEP中からの復帰信号としても使えます 了解。
klose0609

2021/08/30 14:56

koujikuu様 コードまで提示いただきましてありがとうございました。無事ADCを動かしながら、指定した時間スリープさせることが出来ました。 因みにですが、スリープモードを使用して、電池で長時間センサーを動かしたことはございますでしょうか? 現在、温度センサーを作っておりまして、1分ごとに測定した温度データを外付けのEEPROMへ保存するようにしたいと考えています。このデバイスを2週間ほど一つのコインバッテリーで動かしたいので、スリープモードは必須だと考えておりました。ネット等で調べてもスリープモードを使用して1ヵ月以上動かしているものも見受けられます。 しかし、実際に測定と測定の間をスリープするように設定してデバイスを、3Vの2032型近バッテリーで動かしたところ、2、3時間で電圧が1.6V程度まで低下し、マイコンが動かなくなってしまいました。 温度センサーに使用しているオペアンプや外付けEEPROMの消費電流をみても2032型のバッテリーが数時間でなくなるようなものではないので、なぜ、バッテリーがすぐになくなってしまうかわからず困っております。
koujikuu

2021/08/30 15:48

デジタル時計のバッテリーバックアップ、赤外線リモコン にsleep機能を使いました スリープ中は、 マイコン以外の外部回路の電源をOFFにする  入力ポートを開放のまま放置しない 、(プルアップ、プルダウン) 出力ポートは、LOWに設定 (接続回路電源が切れるとGNDに接地されたと同じ) 試してみて下さい。
klose0609

2021/08/31 08:48

アドバイスありがとうございました。試してみます。
guest

0

スリープってのは割り込みでウェークアップするんですから、ADCが割り込み使ってるんじゃないんですか?

投稿2021/08/19 23:53

kabasan

総合スコア18

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問