2014.1.6
前へ
次へ
ホームページトップへ戻る

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第535回]


●テーブル参照(2)

あけましておめでとうございます。
昨年1年拙い文章にお付き合いいただき有難うございました。
本年もよろしくお願いいたします。

さて。
昨年の続きを、ということなのですが、読み返してみますと大体のところはもうすでに書いてしまっておりました。
残っておりますのは、一体このテーブルは何を意味しているのか?
というあたりのところだけのようです。

下がそのテーブルです。

;
        org 400
;
Htable
    addwf PCL,f
    retlw 0d8
    retlw 0dc
    retlw 0e0
    retlw 0e4
    retlw 0e8
    retlw 0ec
    retlw 0f0
    retlw 0f4
    retlw 0f8
    retlw 0fc
;
Ltable
    addwf PCL,f
    retlw 0f0
    retlw 0d8
    retlw 0c0
    retlw 0a8
    retlw 90
    retlw 78
    retlw 60
    retlw 48
    retlw 30
    retlw 18
;
     end


HtableはTIMER1に設定する初期値の上位8ビットの値で、Ltableは下位8ビットの値です。
その上下の値を並べてみるとこうなります。

D8F0  55536(65536−10000)
DCD8  56536(65536−9000)
E0C0  57536(65536−8000)
E4A8  58536(65536−7000)
E890  59536(65536−6000)
EC78  60536(65536−5000)
F060  61536(65536−4000)
F448  62536(65536−3000)
F830  63536(65536−2000)
FC18  64536(65536−1000)

右の数値はそれぞれの16進数を10進数に直したものです。
( )内の計算式はその数値の根拠です。
例として上から3番目の値について説明をします。
この数値はTIMER1割込みを8ms後に発生させるための設定値です。
すでに説明しましたようにサンプルプログラムはPIC16F887を内部発振クロック4MHzで動作させます。
プログラムの設定ではTIMER1は発振クロックの1/4である1μsごとにカウンタレジスタをアップカウントします。
8msで割込みを発生させるためのカウント数は8000になります。
ところでこれも説明しましたようにTIMER1はレジスタに設定した値をアップカウントしてFFFFになったあとカウントオーバーして0000になったときに割込みを発生させます。
ですのでTMR1HおよびTMR1Lレジスタに設定する初期値は8000(の16進数)ではなくて8000カウントでオーバーするような値ということになります(このあたりがなかなかに面倒なところです)。
FFFF+1でオーバーフローする値は10000Hです。
その10進数は65536です。
そこで65536−8000の計算をして得られる値の57536が求める値になります。
その16進数がE0C0です。

サンプルプログラムはなかなか面倒なことをやっています。
200Hzのパルスを出力しつつ、同時に10ms〜1msまで10段階に変化するパルス(H=10ms、L=10ms〜H=1ms、L=1ms)をTIMER1割込みによって出力するというものです。

アドレス400H番地台においたテーブルを参照するために、プログラムの先頭でPCLATHに4を入れています(プログラムリストは[第516回]参照)。
PCLATHに値を設定しているところはそこだけです。
ここで注目していただきたいのは、TIMER1の割込みプログラムをアドレス300Hに置いていることです。
割込みプログラムへは4番地のgoto命令でジャンプします。
PCLATHには4が設定してありますから、その設定によるアクセス範囲は400H〜4FFHになるはずですが、それにもかかわらず300Hに置いた割込みプログラムは正しく実行されます。

下は実行中のパルス出力をオシロで観測した写真です。



上(CH1)が200HZのパルスで下(CH2)がTIMER1割込みによる出力パルスです。
パルスの幅が変化しているのがわかると思います。

年をまたいで長々と説明をしてきましたが、(プログラムが2KBの範囲に収まっているならばという条件付で)、PCLATHレジスタはテーブル参照には使われますが、それ以外のgoto、call命令には影響しません、ということを納得していただけましたでしょうか。

次回から新しいテーマでスタートする予定です。
ご期待願います。

ワンボードマイコンでCP/Mを![第535回]
2014.1.6upload

前へ
次へ
ホームページトップへ戻る