前提
現在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の設定は下記の通りです。
なお、RTC用の振動子は11ピンと12ピンに接続した外部振動子を使用しております。
試したこと
試しにSleep()を使用せずに、delayで60秒待機した場合は、正常に作動し、60秒ごとの更新された時間がSDカードに記録されていました。
ですので、Sleep()が原因と考えておりますが、Sleep()を使用するとRTCが初期値にリセットされるなどはございますでしょうか?
また、外部振動子の波形をオシロスコープで観察したところ、スリープ中も波形を確認できたので、振動子が停止しているということはなさそうです。ただ、Sleep()から復帰するタイミングで、一瞬波形が消えておりました。
補足情報(FW/ツールのバージョンなど)
開発環境はMPLAB v5.45、MCCはv4.2.1を使用しております。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。