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

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

[第529回]


●PICサンプルプログラムの説明(Timer1割込みの設定)

またまた何日もお休みしてしまいました。
いよいよ年の瀬も押し迫ってきましたが、お得意さまからまとまったご注文をいただきましたので、その作業で目下のところ大忙しなのです。
それから、これはいずれ(おそらく年が改まりましたらそのあたりで)お知らせすることになるかと思いますが、必要にせまられて、先日からちょいと新しいことに挑戦を始めてしまいましたので、それもあっていつもにまして時間がありません。
ホームページもテーマ違い続きで読みにくい状態が続いておりますので、それも整理したいと思っております。
もっと時間がほしい!というのが今の心境です。

しかしテーマ違いとはいうものの、書き出してしまったものを途中で投げ出してしまうわけにもいきませんので、しばらくはとりあえずこのままのスタイルで、まずは前回からの続きを書いていくことにいたします。

        movlw 4;*****************
        movwf PCLATH;************
;intset
        bsf STATUS,5;bank1
        bsf PIE1,0
        bcf STATUS,5;bank0
        clrf TMR1H
        clrf TMR1L
        movlw 1 
        movwf T1CON;T1 start
    movlw 0c0
   movwf INTCON
;


最初の2行はテーブルアクセスのための準備です。
これについてはまたそのうち説明をいたします。
その次の行からがTimer1割込みの設定です。
Timer1は16ビットのカウンタ、タイマーで、ここではシステムクロックをカウントするという使い方をします。
Timer1は初期値を与えてそこからカウントアップするアップカウンタです(初期値からダウンカウントするほうが使いやすいのですけれど)。


[出典]Microchip Technology Inc. PIC16F882〜887Data Sheet

TMR1H(上位8ビット)、TMR1L(下位8ビット)に16ビットの初期値を与えてスタートするとシステムクロック(または外部クロック)をカウントしFFFFまでカウントしたあとロールオーバーして0000に戻るときに、もし割込み許可が設定されていたら、そこで割込みが発生します。


[出典]Microchip Technology Inc. PIC16F882〜887Data Sheet

Timer1割込みを有効にするには
1)PIE1レジスタのTimer1 interrupt enable bit(TMR1IE)をセットする
2)INTCONレジスタのPEIEビットをセットする
3)INTCONレジスタのGIEビットをセットする
ことが必要、と書いてあります。
またNote:では、割込みを許可する前にTMR1H、TMR1LとTMR1IFビットはクリアしておくこと、と書いてあります。
下表はTimer1に関係するレジスタの一覧です。


[出典]Microchip Technology Inc. PIC16F882〜887Data Sheet

TMR1IEはPIE1のビット0です。
このレジスタは、サンプルプログラムの
bsf PIE1,0
でセットしています。
INTCONについては後で説明をします。

Note:にあった、TMR1IFはPIR1レジスタにあります(ビット0)。
あれ?
上のサンプルプログラムのリストではTMR1HとTMR1Lはクリアしていますが、PIR1については何もしていませんねぇ。
リセット後はPIR1=00Hになるので、とりあえずはまともに動いたのですが、最初はこのPIR1の処理をうっかり忘れてしまったために、期待通りの動きをしてくれなくてかなりじたばたしてしまいました。
TIMER1は以前も何回か使ったことがありますから、ついわかっているつもりでポカをやってしまいました。
PIR1は後ほど出てきます。

サンプルプログラムではT1CONに1を与えています。
T1CONはTimer1の動作を設定するためのレジスタです。



ビット7、6はTimer1をタイマーとして使う場合には無関係ですから、0にしておきます。
ビット5、4はプリスケーラです。
今回はクロックソース(Fosc/4)をそのまま使いますから、ここも00です。
ということでビット3〜1も000です。
Timer1をスタートするには、ビット0を1にします(つまりここではT1CON=01にします)。
細かいことを言えば、ここでは最初はT1CON=00にしておいて、実際にスタートしてからT1ON=01にする、というのが教科書的模範解答なのですが、面倒くさいので、ここでいきなりスタートしてしまっています。

最後にINTCONの設定です。


[出典]Microchip Technology Inc. PIC16F882〜887Data Sheet

PEIEはビット6、GIEはビット7です。
この2つをセットしますから、
movlw 0c0
movwf INTCON
です。

GIEはどの割込みでも必ず設定しなければなりません。
Timer1は内蔵ペリフェラルの1機能という位置づけなのでTimer1だけの割込みではなくてペリフェラルの割込み許可(PEIE)になります。

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

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