//********************************************************************** /*    <簡易周波数感応スイッチ>   ・感応周波数=100Hz~1MHz   ・判断範囲=±10Hz、±100Hz、±1KHz、±10KHz */ //********************************************************************** //SWITCH&LED sbit SW_MODE_0 at GPIO.B0; sbit SW_MODE_1 at GPIO.B1; sbit SW_SET at GPIO.B3; sbit LED_H at GPIO.B5; sbit LED_L at GPIO.B4; //OTHER #define BYTE unsigned short #define WORD unsigned int #define DWORD unsigned long //********************************************************************** extern void main(); extern void set_gate_time(); extern void init_counter(); extern void interrupt(); extern DWORD measurement(); extern void Soft_Uart_Write_String(char *buf); extern DWORD get_scope(); extern void judgment(DWORD freq, DWORD target, DWORD scope); //********************************************************************** //■■■メイン関数■■■ void main() { DWORD freq; char buf[11]; short mode; union { DWORD _DWORD; BYTE _BYTE[4]; } target; // OSCCON = 0b01110000; CMCON0 = 0b00000111; ANSEL = 0b00000000; TRISIO = 0b00001111; // LED_H = 0; LED_L = 0; //動作モードを決定します。 mode = 0; if (SW_SET == 0) { while (Button(&GPIO, 3, 1, 1) == 0) { LED_H = 1; Delay_ms(100); LED_H = 0; Delay_ms(100); } // mode = 1; // Soft_Uart_Init(&GPIO, 3, 4, 9600, 0); } //目標値をEEPROMより読み込みます。 target._BYTE[0] = EEPROM_Read(0); target._BYTE[1] = EEPROM_Read(1); target._BYTE[2] = EEPROM_Read(2); target._BYTE[3] = EEPROM_Read(3); if (target._DWORD > 1000000) { target._DWORD = 1000000; } //ゲートタイム(100msec)を設定します。 set_gate_time(); //カウンターを初期化します。 init_counter(); // while (1) { //周波数を測定します。 freq = measurement(); //目標値を設定します。 if (SW_SET == 0) { target._DWORD = freq; //目標値をEEPROMに書き込みます。 EEPROM_Write(0, target._BYTE[0]); EEPROM_Write(1, target._BYTE[1]); EEPROM_Write(2, target._BYTE[2]); EEPROM_Write(3, target._BYTE[3]); } // switch (mode) { case 0: //測定結果を判定します。 judgment(freq, target._DWORD, get_scope()); break; case 1: //目標値と測定結果をUSART(RS232C)出力します。 LongWordToStr(target._DWORD, buf); Soft_Uart_Write_String(buf); LongWordToStr(freq, buf); Soft_Uart_Write_String(buf); Soft_Uart_Write_String("\r\n"); break; } } } //********************************************************************** //■■■判定関数■■■ void judgment(DWORD freq, DWORD target, DWORD scope) { if (freq > (target + scope)) { LED_H = 1; LED_L = 0; return; } if (freq < (target - scope)) { LED_H = 0; LED_L = 1; return; } LED_H = 1; LED_L = 1; } //********************************************************************** //■■■ゲートタイム設定関数■■■ void set_gate_time() { // CCPの設定 PIE1.CCP1IE = 1; PIR1.CCP1IF = 0; CCP1CON = 0b00001011; CCPR1L = 0xA8; // 0.1sec...(1÷8000000)*4*8*25000 CCPR1H = 0x61; // TIMER1の設定 PIE1.TMR1IE = 0; PIR1.TMR1IF = 0; TMR1L = 0; TMR1H = 0; T1CON.T1CKPS0 = 1; T1CON.T1CKPS1 = 1; T1CON.TMR1ON = 1; } //********************************************************************** //■■■カウンター初期化関数■■■ void init_counter() { INTCON.T0IE = 0; INTCON.T0IF = 0; TMR0 = 0; OPTION_REG.T0CS = 1; OPTION_REG.T0SE = 0; OPTION_REG.PSA = 1; OPTION_REG.PS0 = 0; OPTION_REG.PS1 = 0; OPTION_REG.PS2 = 0; } //********************************************************************** //■■■割り込み関数■■■ short flg = 0; void interrupt() { if (PIR1.CCP1IF == 1) { PIR1.CCP1IF = 0; // switch (flg) { case 1: TRISIO.B2 = 1; flg = 2; break; case 2: TRISIO.B2 = 0; GPIO.B2 = 0; flg = 0; break; } } } //********************************************************************** //■■■周波数測定関数■■■ DWORD measurement() { DWORD freq; // TRISIO.B2 = 0; GPIO.B2 = 0; freq = 0; TMR0 = 0; INTCON.T0IF = 0; flg = 1; // 割り込みを許可します。 INTCON.PEIE = 1; INTCON.GIE = 1; // while (flg != 0) { if (INTCON.T0IF == 1) { INTCON.T0IF = 0; freq++; } } if (INTCON.T0IF == 1) { INTCON.T0IF = 0; freq++; } // 割り込みを停止します。 INTCON.PEIE = 0; INTCON.GIE = 0; // return (((freq * 256) + TMR0) * 10); } //********************************************************************** //■■■USART文字列送信関数■■■ void Soft_Uart_Write_String(char *dat) { while (*dat != 0x00) { Soft_Uart_Write(*dat); dat++; } } //********************************************************************** //■■■判定範囲取得関数■■■ DWORD get_scope() { if ((SW_MODE_1 == 0) && (SW_MODE_0 == 0)) { return (10); //±10Hz } if ((SW_MODE_1 == 0) && (SW_MODE_0 == 1)) { return (100); //±100Hz } if ((SW_MODE_1 == 1) && (SW_MODE_0 == 0)) { return (1000); //±1KHz } if ((SW_MODE_1 == 1) && (SW_MODE_0 == 1)) { return (10000); //±10KHz } } //**********************************************************************