前回SC1602のコントロールを行ったので、応用として時計を作ってみた。タイマーを利用した割り込みを使用している。「https://sourceforge.net/p/flashforthforarduino/wiki/Timer/」を参考にさせていただいた。
割り込みにはTimer2を利用している。本当は1秒毎の割り込みが欲しかったが8ビットタイマのためプリスケーラを最大利用(1024)しても、16MHzクロックでは最大(1/16MHz)*1024*256=16msecにしかならない。そこで156(0x9c)をセットして9.984msec毎に割り込みを行い、100回カウントすることで1秒作成することにした。
その上で、' start is turnkey とすることで起動時に自動的に時計が動くようにしている。
-clock
marker -clock
variable data 6 allot ( HHMMSS )
: inch ( -- ) data dup c@ 23 = if 0 else dup c@ 1+ then swap c! ;
: incm ( -- ) data 1+ dup c@ 59 = if inch 0 else dup c@ 1+ then swap c! ;
: incs ( -- ) data 2+ dup c@ 59 = if incm 0 else dup c@ 1+ then swap c! ;
: disp2 ( pos -- )
dup 3 * >r data + c@ #10 u/mod $30 + swap $30 +
r@ 1+ wrch r@ wrch r> ;
: disp ( -- )
0 disp2 2 + [char] : swap wrch
1 disp2 2 + [char] : swap wrch
2 disp2 drop ;
: set ( HH MM SS -- )
data 2+ c! data 1+ c! data c! ;
variable count
: t2_compa_isr ( 10msec interrupt )
1 count +!
count @ 99 > if
0 count !
incs
disp
then
;i
$b0 constant TCCR2A
$b1 constant TCCR2B
$b3 constant OCR2A
$70 constant TIMSK2
#8 constant OC2Aaddr
: start
#15 ms
init \ lcd initialize
0 TCCR2B c! \ stop timer2
$9c OCR2A c! \ $9c=156 (1/16MHz)*1024*156=9.984msec
['] t2_compa_isr OC2Aaddr int!
0 count !
2 TCCR2A c! \ ctc mode
7 TCCR2B c! \ prescaler = 1024
2 TIMSK2 c! \ interrupt enable
;
※コメント投稿者のブログIDはブログ作成者のみに通知されます