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

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

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

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

受付中

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

klose0609
klose0609

総合スコア10

C++

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

2回答

0リアクション

0クリップ

946閲覧

投稿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を使用しております。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

C++

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