【内蔵クロック】
PIC16F818/819には8MHz(INTOSC)を源振とする内蔵クロックが追加されました。
さらにこれに分周器が追加されて7種類のクロック周波数を取り出せます。
これに従来からある31kHzの内蔵RC発振(INTRC)を加えて8種類の周波数から
命令で1つを選択して使います。
命令で切替えて使うことができるようになっていますので、プログラム実行中にも
任意のタイミングでクロック周波数を切替えることができます。
【クロックの供給】
PIC16F818/819のクロック供給部のブロック構成は下図のようになっています。
この中でINTRCに相当する31kHzの内部RC発振の信号は、システムクロック
の他に、ウォッチドッグタイマやパワーアップタイマにも使われます。
この図から解るように、システムクロックとして下記のように選択することができます。
選択指定方法 供給クロック コンフィギュレーション
ビット指定OSCCONレジスタ LP、XT、HSモード -- OSC1,OSC2による外部発振クロック EXTCLKモード(EC) -- 外付け発振器によるクロック INTRCモード IRCF2:0ビット指定 8MHz、4MHz、2MHz、1MHz、500kHz
250kHz、125kHz、31kHzのいずれかEXTRC(RC) -- 外付けRCによる外部発振クロック
【クロックの切替え方】
コンフィギュレーションでINTRCモードの内蔵クロックを指定した場合には、
OSCCONレジスタでクロック周波数を切替えることができます。
まず、OSCCONレジスタは下図のようになっています。
このOSCCONレジスタを使って下記の手順で切替えられます。
(1) コンフィギュレーションでINTRCを指定しておく
(2) 任意の時点でOSCCONを設定変更する。
この時点から、
次のクロックの立下りでまずCLKO出力がLowになる
内部で8クロック待つ
この時点で新しいクロックに切替りCLKOが新しい周波数に変わる。
ただし、INTRC(31kHz)から他の周波数への切替えの場合には、ここから
さらに1msec待ってから切替る。
これはINTOSCの発振が安定するまで待つためです。この間OSCCON
レジスタのIOFSが「0」になっています。切替った時点でIOFSビットが「1」
になります。
(注意) 電源電圧が2.5V以下の時には4MHz以上の周波数では動作しません
ので、切替えるときに注意が必要です。
【クロック切替えプログラム例】
内部クロックモードで、クロックを命令で切替えた例題です。
下記のリストでは、リセット時は8MHzで動作し、ポートBに接続された8個のLED
が0.1秒間隔で点滅します。
ポートAの2ビット目にあるスイッチを押すと、押した都度、OSCCONレジスタの
クロック選択が−1されて遅くなり、31kHzの次に押すと、また8MHzに戻るという
動作をします。
クロックの切替え制御は、CHGCLKというサブルーチン内で実行しています。
SPEEDという変数を7から0までサイクリックに変更しています。この値をSWAP
してからOSCCONレジスタに設定しています。
上記の完全なソースファイルは下記でダウンロードできます。
★ クロック切替えの例題 (sample1.asm)