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

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

[第532回]


●PICサンプルプログラムの説明(割込みルーチン)その2

前回からの続きです。
今回のサンプルプログラムは、先日特注品として受けたシステムを模したものですので、ちょっと変わったことをやっています。
ですので割込みプログラムだけを見ても何をやっているのかよくわからないかも知れません。

        movlw 1
        xorwf PORTE,f;pulse out
        bcf T1CON,0;stop T1
        movf t1Hdata,w
        movwf TMR1H
        movf t1Ldata,w
        movwf TMR1L
        movlw 1
        movwf T1CON;start T1


最初の2行、
movlw 1
xorwf PORTE,f
はPORTEのビット0の出力を反転させます。
他のビットを変化させずに特定のビット(複数も可)出力を反転させることができる簡便な方法です。
ただし注意点があります。
この動作はread modify write動作となるため、ポートの設定がアナログ入力のままだと誤動作につながります([第526回]参照)。
誤動作を避けるためには、直接ポートにアクセスしないで、ワークレジスタを経由して、
movlw 1
xorwf portewk,w
movwf portewk
movwf PORTE
とすればよいのですが、そんな面倒なことをしなくても、[第526回]に書きましたように、最初からANSEL、ANSELHをデジタルに設定しておくことを習慣にしたほうが余計な気を使わなくて済みます。

bcf T1CON,0 で、Timer1を一時停止させます。
このあとTimer1の初期値を設定するのですが、タイマーが動いたままでそれをやるとちょうど桁上がりのタイミングに当たったりすると期待した通りの動作になりません。
そのあとの
movf t1Hdata,w
movwf TMR1H
movf t1Ldata,w
movwf TMR1L
で、初期値を設定したあと、最後の
movlw 1
movwf T1CON
でTimer1をスタートさせます。

こうやって後から見直して見ると、そのときには気がつかなかったことが見えてきます。
ここも上で説明しましたように、Timer1をストップするために
bcf T1CON,0
としたわけですから、
bsf T1CON,0
のほうがずっとスマートです。

さて、Timer1に初期値として与えるために読んでいるt1Hdataとt1Ldataなのですが、一体それはどういう値なのでしょうか?
そしてこの割込みプログラムは一体何をしているのでしょうか?
t1Hdataとt1Ldataはメインプログラムでテーブル参照によって値をセットしています。
そこでやっとテーブル参照について説明をすることになるのですが、それはまた次回にすることにいたします。

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

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