====== ストップウォッチ(8ビット版) ======
===== 概要 =====
前回製作した、ストップウォッチ(16ビット版)の8ビット版を製作してみました。機能、性能は同じです。
プログラムの構造上は、16ビット版の方が少しだけですが簡単です。
===== 動作原理 =====
* クロックには、20.0000MHzの高精度なクロックモジュールを使用しました。
* 正確な1msecを得る方法\\ CCPモジュールをコンペアモードで使用しました。\\ TMR1とPIR1がコンペアされTMR1がPIR1に達すると割り込みが発生します。プリスケール値は、1/1とします。\\ PIR1には、5000を設定します。\\ 5000=1msec÷(1÷(20MHz÷4))
{{:imgpaste:202004:htmikan-20200429-203307.png}}
* ストップウォッチの開始\\ 単純にポートを監視し、立下りで、即開始します。
* カウント\\ 開始されると、先程の1msecの割り込み処理の中でカウント値をインクリメントします。
* ストップウォッチの停止\\ 外部割込み(立下り)で停止します。
===== 回路図 =====
{{:imgpaste:202004:htmikan-20200429-203334.png}}
===== ソースコード =====
//**********************************************************************
/*
<ストップウオッチ>
■機能概要
・開始と停止スイッチによるストップウオッチの機能を提供する。
・精度は、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");
}
}
}
//**********************************************************************
===== 動作確認 =====
緑色スイッチがスタート、黄色スイッチがストップです。
{{:imgpaste:202004:htmikan-20200429-203450.png?500}}
{{:imgpaste:202004:htmikan-20200429-203509.png?500}}
左側:計測しているところです。秒以下は目では見えないです。
右側:停止したところです。1msecの単位まで分かります。
{{:imgpaste:202004:htmikan-20200429-203519.png}}{{:imgpaste:202004:htmikan-20200429-203521.png}}
このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。[[elechobby:picdic:picdic|詳細]]
This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.[[elechobby:picdic:picdic|Details]]