割込みパルスは入力されているのにめったに割込みがかからない、
というか正確に10回に1回しか受付けていない状況ですが、これはもう早い話がパルス幅が狭すぎてレベル割込みに必要な幅に不足しているということです
インテルのMCS-80/85 FAMILY USER'S MANUALにレベル割込みに関して以下の記述がありました
インテルのMCS-80/85 FAMILY USER'S MANUALにレベル割込みに関して以下の記述がありました
つまり割込み信号のサンプリングは実行中命令の最後の1クロックの間でしかしない。
命令は最大長CALL命令の18クロックがあるから確実に割込みを受けたいなら少なくとも17クロック分+α(HOLD時間)の間、保持しろ、ということらしいです。
ところがこのシステムでは/TIMEROUTを反転した割込み信号は1クロック分しかHレベルになりません。
これでは割込みが全く発生しないかと言うと、僥倖にもTIMEROUTがHの時期と実行中命令の最後のクロックがピタリと一致すると割込みが起きるということです。
これでは割込みが全く発生しないかと言うと、僥倖にもTIMEROUTがHの時期と実行中命令の最後のクロックがピタリと一致すると割込みが起きるということです。
テストプログラムのメインループはOUT命令とJMP命令で構成されていて伴に10クロックサイクル掛かります。
この10クロックと割込み周期の位相関係は割込み周期Tとその周回数nの積の10の剰余(nT(mod 10))になるのでこれをを表にすると
この10クロックと割込み周期の位相関係は割込み周期Tとその周回数nの積の10の剰余(nT(mod 10))になるのでこれをを表にすると
タイマ周期Tが3FFF(16383)と10は「互いに素」なので10周回しないと元に戻りません
(16383と10の最小公倍数が163830)割込みができるジャストの位相関係を仮に「8」とすると、
このうち剰余が8になるのは1回しかないので割込みが10回に1回しか発生しないということになります
タイマ周期Tを3FFE(16382)など偶数にすると公約数2を持つのでチャンスが2回巡ってきます。
そのため割込みの頻度も2倍になり5回に1回掛かるようになります
ところがタイマ周期が5や10の倍数になると命令と割込み信号の周期がぴったりと割り切れるのでフェーズがシフトしなくなり割込みも全く発生しなくなります
・・・逆に初期位相があっていれば100%割込みを受け付けるかも。
CPUの演算機能ではなく専用ハードウェアで演算してる雰囲気になってきました
約数、素数を見つけるのにこのように周波数比が使えないかと一瞬思い付きましたが
長いビット数のカウンタを巡回させるのは天文学的時間がかかるわけですぐ却下です