** Hitech_Cのコードです。** /********************************************************* PIC12F675 MPLAB v8.84 Hitech PIC C pro9.83 port assignment 1 VDD 8 VSS 2 GP5 LM324から ON=1 7 GP0 (PGD)(1st bit) 3 GP4 0を出力 to リレー 6 GP1 (PGC)(2nd bit) 4 GP3 (no use) 5 GP2 (3rd bit) ◎LM324から信号(ON)があると、リレーを一定時間(Time)ONする (一定時間後リレーはOFFになる) ◎一定時間内に信号があれば、リレーのONは継続する。 GP0〜GP2に3PのDIP-SWをつないで、外部から時間設定をする *********************************************************/ #include #define _LEGACY_HEADERS #define _XTAL_FREQ 4000000 // configuration __CONFIG(CP_OFF & BOREN_OFF & MCLRE_OFF & PWRTE_OFF & WDTE_OFF & FOSC_INTRCIO); unsigned int Time; // 遅延秒数 unsigned char t_cnt; // タイマ0の割り込みカウント用(1バイト) void delay_100ms(unsigned char temp){ // n × 100ms 待機 while(temp--){ __delay_ms(100); } } int SetTime(){ unsigned int S_Time;// 設定秒数 unsigned char s_sw; s_sw = GPIO; // ビットのデータを取り込む s_sw &= 0x07; // GP0-2を数値(0〜7)に変換 S_Time = s_sw * 20 + 10; // 10秒〜150秒 return(S_Time); } void main(){ CMCON = 0x07 ; // コンパレータは使用しない ANSEL = 0b00000000 ; // すべてデジタルI/Oに割当てる TRISIO = 0b00101111 ; // 1=入力、0=出力 /* タイマー0の設定 */ // OPTION_REG = 0b00000011; // 一括設定の場合 nGPPU = 0; // ウィークプルアップ使用 WPU = 0b00000111; // プルアップポート指定(0-2) T0CS = 0; // タイマー0使用 PSA = 0; // プリスケーラをタイマ0用に PS2 =0; PS1 = 1; PS0 = 1; // プリスケーラ 16分周 // 1μs×16分周×256≒4.1ms 244回割込で1秒 (TRM0 は8ビット=256) TMR0 = 0; // タイマ0 初期値 T0IF = 0; // タイマ0スタート準備 GIE = 1; // 割り込みを使う t_cnt = 12; // 256-12=244回割込で1秒 GP5 = 0; // ピンの初期化 GP4 = 1; delay_100ms(2); // 始動安定化 while(1){ if(GP5 == 1){ // スイッチon(GP5がON)なら GP4 = 0; // GP4を接地してリレー on Time = SetTime(); // 遅延時間(秒)をセット T0IE = 1; // タイマ0始動 } } } /* タイマ0割込 */ void interrupt warikomi(void){ T0IF = 0; t_cnt++; // 4.1msずつカウント、244回で1秒 if(t_cnt == 0){ t_cnt = 12; // 256-244=12 Time--; // 1秒ずつ減算 if(Time == 0){ // タイムアップ? GP4 = 1; // ポートをUP ⇒ リレー OFF T0IE = 0; // タイマ0停止 } } }