パルスの周期を測定するユニットです。
心拍検知ユニットの出力(心拍パルス)の周期を測定するのにも最適です。
PIC16F88に装備されているCCPモジュールには外部信号の間隔を測定できるキャプチャモードがありますのでこれを使用し、パルスの立ち上がりから次のパルスの立ち上がりまでの時間を計測します。
//********************************************************************** void main() { unsigned long dat; unsigned int dat2; unsigned char buf[20]; // OSCCON = 0b01000000; // クロックは1Mhz CMCON = 0b00000111; // コンパレータは使用しない。 ANSEL = 0b00000000; // A/D変換は使用しない。 TRISA = 0b00111110; TRISB = 0b00001111; // T1CON.TMR1CS = 0; T1CON.T1CKPS0 = 1; T1CON.T1CKPS1 = 1; T1CON.TMR1ON = 0; TMR1H = 0; TMR1L = 0; PIE1.TMR2IE = 0; PIR1.TMR2IF = 0; // CCP1CON.CCP1M3 = 0; CCP1CON.CCP1M2 = 1; CCP1CON.CCP1M1 = 0; CCP1CON.CCP1M0 = 1; CCPR1H = 0; CCPR1L = 0; PIE1.CCP1IE = 0; PIR1.CCP1IF = 0; // Lcd_Custom_Config(&PORTB, 4, 5, 6, 7, &PORTA, 0, 7, 6); Lcd_Custom_Cmd(LCD_CURSOR_OFF); Lcd_Custom_Out(1, 1, "Pulse Measure v1"); Lcd_Custom_Out(2, 1, "JF3SFB{^_^}chan!"); Delay_ms(1000); Lcd_Custom_Cmd(LCD_CLEAR); // T1CON.TMR1ON = 1; while (1) { asm { // キャプチャフラグ確認(asm) 高速化!! loop_001: btfss PIR1, 2 goto loop_001 } // // while (PIR1.CCP1IF == 0) // キャプチャフラグ確認(c) // ; // T1CON.TMR1ON = 0; // タイマーオフ TMR1H = 0; TMR1L = 0; T1CON.TMR1ON = 1; // タイマーオン PIR1.CCP1IF = 0; // dat = CCPR1H << 8; dat |= CCPR1L; // dat2 = (double)dat * 0.032; // msec変換 0.032 = (1 / 1000000Hz) * 4 * 8 * 1000 IntToStr(dat2, buf); Lcd_Custom_Out(1, 1, &buf[2]); Lcd_Custom_Out_Cp("msec"); // dat2 = 60000.0 / (double)dat2; // 脈拍数変換(1分間) IntToStr(dat2, buf); Lcd_Custom_Out(2, 1, &buf[2]); Lcd_Custom_Out_Cp("カイ "); } } //**********************************************************************