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


PIC−USBIO using BASIC

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第64回]



●PICUSBIO−03(13)Timer0

PICUSBIO−03についての記事が続いています。
最初はそれ以外のボードと同様にPICUSBIO用BASICインタプリタのOUT、INを使ってPORTC、PORTBにアクセスするだけのものでした。
しかし他のボードと違ってPICUSBIO−03はそこに搭載しておりますPIC18F13K50(ひょっとするとPIC18F14K50を使うことになるかもしれません)をただのUSBインターフェースICとして使うだけではなくてPIC18F13K50そのものをターゲットにしてもっといろいろ使うことができるのではないか、なんてとんでもないことを思いついてしまいました。
そのためにスタンダードなOUT命令、IN関数に加えてPICOUT命令、PICIN関数をつくり、それを使ってとりあえずTRISC、TRISB、PORTC、PORTBにアクセスしました。
それが前回までのところです。
そしていよいよこれからさらに進んでPICUSBIO用BASICインタプリタをツールとして使い、PICの機能を可能な限り使ってみようというところまできたのですが。
そうするとPICUSBIO−03の項がどんどん深くなってなかなか終らないということになってしまいそうです。
本当はPICUSBIO−03については別立てにして、それ以前のボードだけをまとめて「供給開始」ということにすべきだったかもしれません。
しかしここまできてしまってからPICUSBIO−03だけを切り離すというのもなんだかなあと思います。
それにせっかくここまで考えてきたのですからPICUSBIO−03以外のボードでもPICOUT、PICINも一応は使えるようにしたいと思い始めています(それなりに制約はあると思いますが)。
そういうことですので、これからしばらくはPICUSBIO−03という見出しのままたらたらと書いていくことになってしまいそうです。
まとまりのない展開になってしまいましたがしばらくお付き合いをお願いいたします。

前置きが長くなりました。
今回からいよいよI/Oポート以外のPICの機能について考えていきます。
まずはTimer0です。
PICは多機能ですけれど、扱い方がよくわからないとか、特にPICアセンブラにはクセがあってなかなか理解できないという批判が多いようです。
それで近年はMicrochip社がPIC用に頒布しているCコンパイラを使う方が多いようです。
しかしCなら簡単かといいますと、そんなことはない、ということはやってみられた方ならば皆様すでに経験してみえるかと思います。
さらにさらにCならなんとかなったとしてもConfigの設定でおそらく皆様つかえてしまうのでは。
などなど。
そういう困難をPICUSBIO用BASICインタプリタは全てきれいに除去してしまいます。
あ。
また、余計な前置きを書いてしまいました。
ともかく。
一体どれほど簡単になってしまうのか。
期待しながらお読みください。

PIC18F13K50/PIC18F14K50のTimer0はわりとシンプルな機能です(ごく一部の違いを除いてはPIC18F13K50とPIC18F14K50の機能は同じですので以下はPIC18F14K50と表記することにします)。
最初に取り掛かるのにはちょうど都合がよいかもしれません。
下はPIC18F14K50のData SheetからTimer0の部分を丸ごと引用しました。

[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet

Timer0は8ビット/16ビットのTimer/Counterです。
タイマカウンタ(レジスタ)はREAD/WRITEできます。
Timer0専用の8ビットプリスケーラが使えます。
内部クロック(システムクロック/4)か外部入力(RC5端子入力)を選択できます。
PICUSBIO−03のPIC18F13K50のシステムクロックは48MHzなのでその1/4は12MHzになります。
オーバーフロー割り込みを発生させることができます。
T0CONはTimer0の特殊レジスタです(以下普通にレジスタと表記します)。
PICOUT命令、PICIN関数でWRITE/READできます。
bit7=1のときカウントスタート、=0のときカウントストップします。
bit6=1のとき8ビットタイマ/カウンタ、=0のとき16ビットタイマ/カウンタになります。
bit5=1のときクロックはT0CKI(RC5ピン)入力、=0のときシステムクロック/4(12MHz)になります。
bit4=1のときT0CKIがH→Lでカウントアップ、=0のときL→Hでカウントアップします。
bit3=1のときプリスケーラは使いません。=0のときクロックはプリスケーラ経由になります。
bit2−0はプリスケーラの分周比を規定します(上記ドキュメント参照)

Data Sheetの続きです。

[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet

Data Sheetの左側部分(10.1 Timer0 Operation)は概ねその上のところに書いた内容と同じです。
右側部分(10.2 Timer0 Reads and Writes in 16−Bit Mode)は16bit modeでのRead/Writeについて説明をしています。
TMR0Hは16bit modeでのTimer0の上位バイトですがカウンタ本体ではなくて上位バイトのバッファです。
カウンタ本体の上位バイトは直接Read/Writeできません。
TMR0Hにはカウンタの下位バイト(TMR0L)をReadしたときにカウンタ上位バイトの値が入ります。
下位バイトと上位バイトを読み出すタイミングによって間違った値を読み出してしまわないようにするためです。
同じことはTMR0Hの値が16bitカウンタの上位バイトにWriteされるときにもあてはまります。
TMR0Hに値をWriteしただけでは直接Timer0に影響を与えません。
TMR0LにWriteを実行したときにTimer0の上位バイトにTMR0Hの値が書き込まれます(下図FIGURE 10−2参照)。

Data Sheetの続きです。

[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet

Data Sheetの左側部分(10.3 Prescaler)はプリスケーラについての説明です。
プリスケーラはRead/Writeできません。
T0CONの下位4ビットでプリスケーラの使用/不使用と分周比を決定します。
Timer0にWrite命令が実行されるとプリスケーラはクリアされます(プリスケーラはクリアされますが設定されている使用/不使用および分周比はそのまま残ります)。
右側部分(10.3.1)では”on−the−fly”という語が使われていますがここでは「プログラムの実行中にいつでも」の意だと思います。
T0CONのプリスケーラについての設定はTimer0の状態など他の条件に関係なくいつでもソフトウェアで設定可能です。

10.4 Timer0 InterruptはTimer0の割り込みについての説明です。
Timer0の割り込みは8bit modeのときにはカウンタの値がFFから00になったときに発生します。
16bit modeではFFFFから0000になったときに発生します。
このオーバーフローによってINTCONレジスタのTMR0IFフラグビットがセットされます。
上記割り込みはINTCONレジスタのTMR0IEビットを0にすることで禁止されます。
PICUSBIO用BASICインタプリタでは基本的には割り込みを使うことは考えていません。
PICUSBIO用BASICインタプリタはUSBホスト(Windowsパソコン)の側からPICに対して定期的にポーリングを行なうことでPICボードをコントロールしています。
そのタイミングを外れて割り込みが発生してもホスト(Windowsパソコン)が直ちにそれに応答することはできませんから特別の場合を除いてはPICUSBIOボードで割り込みを使うことは無意味です。
ですから割り込みについての更なる説明とそれに続くSleep modeについての説明は割愛します。

TABLE10−1はTimer0に関係するレジスタです。
TMR0LはTimer0の下位バイトレジスタです。
TMR0HはTimer0の上位バイトレジスタです。
INTCONは割り込み制御レジスタです。
影がついているビットはTimer0では使われません。
PICUSBIO用BASICインタプリタではTimer0の割り込みは使いませんがビット2のTMR0IFについては後の回で説明する予定です。
T0CONは上のほうで説明をしています。
TRISCはビット7〜ビット5が関係するように記載されていますがおそらくこれはMicrochip社の誤記です。
TRISC(およびPORTC)のビット5のみがカウンタモードで使用されます。
Note 1も誤記だと思います。
Note 1はTimer0と無関係です。

今回はData Sheetの内容を説明するだけで疲れてしまいました。
お読みいただくのもお疲れになったかと思います。
実際にPICUSBIO用BASICインタプリタで簡単なプログラムを書いてPICUSBIO−03のTimer0を使ってみるのは次回にいたします。
もうほんとうに簡単なのです。
乞う。ご期待。

PIC−USBIO using BASIC[第64回]
2022.9.28upload

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