概要
PIC12F1840で、スリープとウォッチドックタイマーを使った簡易的な間欠起動タイマーを作る。
外観
回路
プログラム
PIC(C言語)
#include <xc.h>
//config1
#pragma config FOSC = INTOSC //Oscillator Selection:内部クロック使用
#pragma config WDTE = ON //Watchdog timer
#pragma config PWRTE = ON //Power up timer(スイッチを入れた直後電源が安定するまで待つ)
#pragma config MCLRE = OFF //MCLR PIN off (ハードウェアリセットのピンの用途を無しにしてdigital pinとして使えるようにする)
#pragma config CP = OFF //CODE PROTECT (プログラムの読み出しのプロテクト)
#pragma config CPD = OFF //Data Protect (データ領域の読み出しのプロテクト)
#pragma config BOREN = ON // Brownout (もし電源が不安定のときは一時停止)
#pragma config CLKOUTEN = OFF // CLOCK(信号の外部出力)
#pragma config IESO = OFF // 2段階クロック(立ち上がりで即安定する内部クロックを使いその後外部クロックに切り替える)
#pragma config FCMEN = OFF //Fale-safe Clock Monitor(外部クロックが壊れたとき内部クロックに切り替える)
//config2
#pragma config WRT = OFF //Write Protection(プログラム領域の書き込み):禁止
#pragma config PLLEN = OFF //クロック逓倍off (onにすると発生したクロックが4倍になる)
#pragma config STVREN = ON //スタック領域をオーバーしたらリセットする(offは何もしない)
#pragma config BORV = LO //Brounout電圧設定 (HI:電源電圧がちょっとさがるとリセット、LO:うんと下がるとリセット)
#pragma config LVP = OFF //プログラム書き込み電圧(ON;低電圧書き込み有効 マイコンの電圧で書き込める off:低電圧書き込み無効 PICKIT3のときoffに)
#define _XTAL_FREQ 31250
void main(void) {
OSCCON = 0b00010000;//オシレータ31.25kHz
ANSELA = 0x00;//全ピン デジタルI/Oピン
TRISA = 0x00;//全てのピンを出力
PORTA = 0x00;//全てのピンを初期化(LOW(0)に設定)
WDTCONbits.SWDTEN = 1; // WDTを有効
WDTCONbits.WDTPS = 0b10010;// 1:8388608 (インターバル 256s typ.)
unsigned char count,i;
while(1){
count = eeprom_read(0);
count++;
if(count>7){
RA0 = 1;
for(i=0;i<60;i++){ //60秒待機
__delay_ms(1000);
CLRWDT();
}
eeprom_write(0, 0);
RA0 = 0;
}else{
eeprom_write(0, count);
}
SLEEP();
}
return;
}
詳細
PICでなんちゃって間欠起動タイマー https://tiblab.net/blog/2023/03/so_called_onoff_timer_by_pic/
参照サイト
PIC16F1829でウォッチドックタイマーとスリープ機能を利用して低消費電力なLチカをさせてみた https://asukiaaa.blogspot.com/2020/06/pic16f1829l.html
PICマイコン入門 第14回 EEPROM(2) 〜タイマー設定値保存機能を追加する〜 https://tool-lab.com/pic-app-14/
電子工作室 ウォッチドッグタイマ http://www.picfun.com/pic18/pic18xx13.html
データシート
http://ww1.microchip.com/downloads/jp/devicedoc/41413c_jp.pdf
(PIC12F1840は英語なので、日本語のPIC12F1840の)