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

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

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

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

Q&A

解決済

3回答

2381閲覧

PIC24FJのRTCがスリープ復帰後にリセットされる

klose0609

総合スコア11

C++

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

0グッド

0クリップ

投稿2022/08/10 21:48

前提

現在PIC24FJ256GA702を使用して、温度センサーを作製しております。

実現したいこと

約60秒ごとに時間と温度を計測し、SDカードへ記録するようにしたいです。また、計測時以外はスリープ状態にして、消費電力を抑えたいと考えております。

発生している問題・エラーメッセージ

WDTを使用し、約60秒ごとにㇲリープから目覚め、時間と温度を計測し、SDカードへ記録するようにしたところ、SDカードへデータは記録されていたのですが、時間のデータが初期に設定した値のままで、下記のようにずっと同じ時間を記録している状態でした。

時間       温度
22/7/27 13:19:32 28℃
22/7/27 13:19:32 25℃
22/7/27 13:19:32 25℃
22/7/27 13:19:32 24℃
22/7/27 13:19:32 25℃
22/7/27 13:19:32 25℃
22/7/27 13:19:32 25℃
22/7/27 13:19:32 24℃
22/7/27 13:19:32 24℃

該当のソースコード

C++(main.c) #define FCY 8000000UL #include "mcc_generated_files/system.h" #include "mcc_generated_files/fatfs/fatfs_demo.h" #include "mcc_generated_files/fatfs/ff.h" #include "mcc_generated_files/sd_spi/sd_spi.h" #include "mcc_generated_files/adc1.h" #include "mcc_generated_files/rtcc.h" #include <libpic30.h> #include <stdio.h> #include <stdlib.h> static FATFS drive; static FIL file; int adcValue = 0; unsigned int temp = 0; unsigned int year; unsigned int month; unsigned int date; unsigned int hour; unsigned int min; unsigned int sec; int main(void) { // initialize the device SYSTEM_Initialize(); LATBbits.LATB8 = 0; char str[100]; while (1) { UINT actualLength; adcValue = ADC1_GetConversion(channel_AN9); temp = 0.49 * adcValue; year = (DATEH & 0xFF00) >> 8; month =(DATEH & 0x00FF); date = (DATEL & 0xFF00) >> 8; hour = (TIMEH & 0xFF00) >> 8; min = (TIMEH & 0x00FF); sec = (TIMEL & 0xFF00) >> 8; if( SD_SPI_IsMediaPresent() == false) { return; } if (f_mount(&drive,"0:",1) == FR_OK) { if (f_open(&file, "Temp.CSV", FA_WRITE | FA_OPEN_APPEND ) == FR_OK) { sprintf(str, "%x/%x/%x %02x:%02x:%02x, %d\r\n", year, month, date, hour, min, sec, temp); f_write(&file, str, strlen(str), &actualLength ); f_close(&file); } f_mount(0,"0:",0); } LATBbits.LATB8 = 1; __delay_ms(50); LATBbits.LATB8 = 0; __delay_ms(50); Sleep(); } return 1;} /** End of File */

なお、コードの作成にはMCCを使用しておりまして、System Module、WDT、RTCCの設定は下記の通りです。

System Module
イメージ説明

WDT
イメージ説明

RTCC
イメージ説明

なお、RTC用の振動子は11ピンと12ピンに接続した外部振動子を使用しております。

試したこと

試しにSleep()を使用せずに、delayで60秒待機した場合は、正常に作動し、60秒ごとの更新された時間がSDカードに記録されていました。
ですので、Sleep()が原因と考えておりますが、Sleep()を使用するとRTCが初期値にリセットされるなどはございますでしょうか?

また、外部振動子の波形をオシロスコープで観察したところ、スリープ中も波形を確認できたので、振動子が停止しているということはなさそうです。ただ、Sleep()から復帰するタイミングで、一瞬波形が消えておりました。

補足情報(FW/ツールのバージョンなど)

開発環境はMPLAB v5.45、MCCはv4.2.1を使用しております。

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

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

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

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

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

guest

回答3

0

自己解決

時間がかかってしまいましたが、問題を解決することができました。
当初マイコンのVcapピンはどこにも接続しておりませんでしたが、このピを10uFのキャパシタを介してGNDに接続したところ、RTCが正常に作動しました。
おそらくですが、Vcapにキャパシタを接続していなかったことで、Sleepから復帰した際の内臓レギュレータの動作が不安定になり、マイコンが一旦停止、RTCも初期設定値にリセットされていたことが原因と考えております。
皆様アドバイスいただきましてありがとうございました。

投稿2023/01/03 22:15

klose0609

総合スコア11

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

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

0

リセットが発生するなら RCONレジスタ でリセット要因を特定します

参考↓
PIC24F セクション 7. リセット

引用↓
質問 1: RCON レジスタはどのように使うのですか。
回答 : リセット後の初期化コードでは、RCON と RCON2 レジスタを読み出してリセット要因
を確認する必要があります。アプリケーションによっては、この情報に基づいてリセット発生
の原因となった問題を是正できます。RCON レジスタの全てのリセット ステータスビットは、
読み出し後にクリアする必要があります。これにより、次回のデバイスリセット時に RCON 値
から正しい情報を得る事ができます。

投稿2022/08/13 22:38

koujikuu

総合スコア401

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

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

0

何がどういうふうに異常であるのかデバッグしましょう。
思いつくものとして、現状のコードのsleepの前に、30秒ほどのdelayを入れてみたらどうなるでしょうか。
それで時刻が進んで行くのであれば、sleep中がRTCが動いていないってことがわかります
時刻が全く進まないのであれば、おっしゃるようにリセットされるのか、最初からRTCが起動していないのか、ってことが判明します。
こうやって、現象を絞り込み、それが起こりうる設定を推測していきます。

#この手のMCUにあるあるなのが、オプションレジスタなどの設定値で、sleep中のRTCの動作を切り替える、ってのがあったりします

投稿2022/08/11 02:41

y_waiwai

総合スコア87684

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

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

klose0609

2022/08/12 14:27

早速、アドバイスいただきましてありがとうございました。 delayを使用した場合、時計のカウントが進んで記録されますので、やはりSleepが原因である可能性が高いです。 RTC用にSOSCに接続した外部振動子を使用し、Sleep中も作動するように設定しております。オシロスコープで波形を見ても、Sleep中に振動子が機能していることは確認できております。ただ、Sleepから復帰する際に一瞬だけ振動子の波形がなくなり、停止しているように見えます。復帰の際に何らかの原因でRTCが機能しなくなっているのかもしれません。 因みにSleepではなく、Idleの場合はこのような現象は起こらず、正常に時計のカウントが進んで記録されておりました。
y_waiwai

2022/08/12 22:14

まあ、現実に動いてない、ってことはあなたのいってることの何処かが間違っている、ってことです。 こうなってるはず、ってのがあなたの頭の中にある限りは問題は解決しません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.54%

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

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

質問する

同じタグがついた質問を見る

C++

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