ストップウォッチ(8ビット版)
概要
前回製作した、ストップウォッチ(16ビット版)の8ビット版を製作してみました。機能、性能は同じです。
プログラムの構造上は、16ビット版の方が少しだけですが簡単です。
動作原理
- クロックには、20.0000MHzの高精度なクロックモジュールを使用しました。
- 正確な1msecを得る方法
CCPモジュールをコンペアモードで使用しました。
TMR1とPIR1がコンペアされTMR1がPIR1に達すると割り込みが発生します。プリスケール値は、1/1とします。
PIR1には、5000を設定します。
5000=1msec÷(1÷(20MHz÷4))
- ストップウォッチの開始
単純にポートを監視し、立下りで、即開始します。 - カウント
開始されると、先程の1msecの割り込み処理の中でカウント値をインクリメントします。 - ストップウォッチの停止
外部割込み(立下り)で停止します。
回路図
ソースコード
- StopWatchV2.c
//********************************************************************** /* <ストップウオッチ> ■機能概要 ・開始と停止スイッチによるストップウオッチの機能を提供する。 ・精度は、1msecとする。 ■CONFIGの設定 ・LVP_OFF ・MCLR_OFF ・WDT_OFF ・EXTCLK */ //********************************************************************** #define LED PORTA.F2 #define START_SW PORTB.F1 #define STOP_SW PORTB.F0 //********************************************************************** static unsigned long cnt; static unsigned char flag; void interrupt() { // 1msecの割り込み処理 if (PIR1.CCP1IF == 1) { PIR1.CCP1IF = 0; // if (flag == 1) { cnt++; } } // 停止スイッチの割り込み処理 if (INTCON.INTF == 1) { INTCON.INTF = 0; // flag = 2; // count stop! LED = 1; // LED off! } } //********************************************************************** void main() { static unsigned char buf[20]; // アナログの設定 ANSEL = 0b00000000; // 使用しない。 // ポートの設定 TRISA = 0b10111000; TRISB = 0b00001111; OPTION_REG.F7 = 0; // PORTBをプルアップする。 // 入力割り込みの設定 INTCON.INTE = 1; INTCON.INTF = 0; OPTION_REG.INTEDG = 0; // CCPの設定 PIE1.CCP1IE = 1; PIR1.CCP1IF = 0; CCP1CON = 0b00001011; CCPR1L = 0x88; // 0.001sec...(1÷20000000)*4*5000 CCPR1H = 0x13; // TIMER1の設定 PIE1.TMR1IE = 0; PIR1.TMR1IF = 0; TMR1L = 0; TMR1H = 0; T1CON.T1CKPS0 = 0; T1CON.T1CKPS1 = 0; T1CON.TMR1ON = 1; // 変数の初期化 TMR1L = 0; TMR1H = 0; // LCD(液晶モニタ)の初期化 Lcd_Custom_Config(&PORTB,4,5,6,7,&PORTA,1,0,6); Lcd_Custom_Cmd(LCD_CURSOR_OFF); Lcd_Custom_Out(1, 1, "StopWatch V2"); Delay_ms(1000); Lcd_Custom_Cmd(LCD_CLEAR); // 割り込み(全体)の設定 INTCON.PEIE = 1; INTCON.GIE = 1; // LED = 1; // LED off! flag = 0; cnt = 0; // while(1) { // 開始を判断する。 if ((flag != 1) && (START_SW == 0)) { cnt = 0; flag = 1; // count start! LED = 0; // LED on! Lcd_Custom_Out(1, 1, "Start!"); } // 停止を判断する。 if (flag == 2) { Lcd_Custom_Out(1, 1, "Stop! "); flag = 0; // LongToStr(cnt, buf); Lcd_Custom_Out(2, 1, buf); Lcd_Custom_Out(2, 12, "msec"); } // 開始中はカウント値を表示する。 if (flag == 1) { LongToStr(cnt, buf); Lcd_Custom_Out(2, 1, buf); Lcd_Custom_Out(2, 12, "msec"); } } } //**********************************************************************





