/***************************************************************** Alarm by RX By JA3OOK T.nakamura v11 2025/06    ・次の入出力ハードウェアを接続       自動点灯ライト(100mA以下)       Cds および Cdsプルアップ抵抗    ・次の事象でsleep解除し、       回りが暗くなると電源を供給し、明るくなると供給断       明るさ継続中、暗さ継続中はsleep ------------------------------------------------------------------ 開発環境 MPLAB X IDE MPLAB XC8 C Compiler ******************************************************************/ // refer \c:Program Files(x86)\Microchip\xc8\v1.40\docs\chips\16f1619.html #pragma config BOREN = OFF //Brown-out Reset enable #pragma config WRT =OFF //Write protection off #pragma config FOSC = INTOSC//INTOSC oscillator: I/O function on CLKIN pin #pragma config PLLEN =OFF //4x PLL is enabled when software sets the SPLLEN bit #pragma config MCLRE =OFF //MCLR disabled #pragma config WDTE =OFF //WDT disabled #pragma config CP =ON //Code protection on #pragma config LVP =OFF //High-voltage on MCLR/VPP must be used for programming #pragma config PWRTE =OFF //Power-up Timer Enable #pragma config IESO =OFF //Internal External Switchover mode disabled #pragma config FCMEN =OFF //Fail-Safe Clock Monitor disabled #include "pic16f1619.h" //#include //#include #include #define MHz 000000 #define _XTAL_FREQ 1MHz //PIC_OSC_FREQ #define Cds_port RC3 // Cds 明るい:0 暗い:1 #define out_pwr_port LATC4 // 自動点灯ライトへの電源供給 bit dark; // 暗い・明るい unsigned int sec_from_sense ; // 検出からの経過秒数 unsigned int t1count ; // タイマー設定値 unsigned int tm1_count ; // タイマーの割込み発生回数をカウントする変数 unsigned int timer ; //temporaryタイマー用(符号無し16ビット長) void interrupt InterTimer( void ){ // タイマー割込み if (IOCCF3) { // Cdsの割込み発生か? IOCCF3 = 0; // APを記述 } if (TMR1IF) { // タイマー1(タイムユニット発生用)の割込み発生か? TMR1H = (t1count >> 8); // タイマーの初期化 TMR1L = (t1count & 0x00FF) ; // タイマーの初期化 TMR1IF = 0 ; // タイマー割込フラグをリセット sec_from_sense ++; // 経過時間 秒 } } void Analize_msg(void){ TMR1IE = 1; sec_from_sense = 0; while(1){ //無限loop if(TMR1ON == 0){ // タイマー1:タイムユニット発生用 未動作 if(Cds_port){ // 1:暗い out_pwr_port = 1; TMR1ON = 1; } else{ // 0:明るい out_pwr_port = 0; SLEEP(); NOP(); } } else{ //自動点灯ライトが20sで消えるので 30sはCdsをセンスしない // 理由はCdsのセンスを無視しないと点滅/点灯が短時間で繰り返される if(sec_from_sense >= 30){ TMR1ON = 0; sec_from_sense = 0; // 経過時間 if(Cds_port){ // 1:暗い out_pwr_port = 1; } else{ // 0:明るい out_pwr_port = 0; } SLEEP(); NOP(); } } } } void main(void){ // see Data sheet PIC16F1619 OSCCON = 0b01011000; //internal OSC 1Mz OPTION_REG = 0b10000011; //All weak pull-ups are disabled (except MCLR, if it is enabled) //Prescaler is assigned to the Timer0 module, 1 : 16 ANSELA= 0b00000000; //All デジタル(既定値:アナログ) TRISA = 0b00000000; // PORTA = 0b00000000; //初期化 ANSELB= 0b00000000; //All デジタル(既定値:アナログ) TRISB = 0b00000000; // PORTB = 0b00000000; //初期化 ANSELC= 0b00000000; //All デジタル(既定値:アナログ) TRISC = 0b01001000; //Cds PORTC = 0b00000000; //初期化 //タイマー1:タイムユニット発生用 //割込間隔を1sの場合 カウント数 = (1,000,000*1)/(4*8) =31250 // (Fosc=1MHz Prescale=8 において) T1CON = 0b00110000;// 内部クロック Fosc/4、Prescaler 1:8 t1count = -31250; // タイマー1用カウントの初期値(31250カウントでオーバー) T1GCON= 0b00000000; TMR1H = (t1count >> 8); // タイマーの初期化 TMR1L = (t1count & 0x00FF) ; // タイマーの初期化 TMR1IF = 0 ; // タイマー0割込フラグを0 tm1_count = 0 ; // 割込み発生の回数カウンターを0 // for Sds sensor IOCCP3 = 1; //Sds-sensor_port Positive Edge Enable. IOCCN3 = 1; //Sds-sensor_port Negative Edge Enable. IOCCF3 = 0; //Sds-sensor_port pin interuupt flag // debug /* out_pwr_port = 1; timer=4; while(timer--){__delay_ms(500);}; //Wait 2sec. out_pwr_port = 0; timer=4; while(timer--){__delay_ms(500);}; //Wait 2sec. */ TMR1IE = 0 ; // TMR1ON = 0 ; // HIDC4 = 1 ; // RC4 駆動可能電流をmax100mAへ増強 IOCIE = 1 ; // All PORT-pin change interrupt PEIE = 1 ; // 周辺割込みをマスクしない GIE = 1 ; // 全割込み処理をマスクしない Analize_msg(); }