石原 博の覚書

電子工作に関する日々の覚書を記載します

FlashForthで割り込み

2021-11-19 20:42:13 | 日記

前回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
;