06 clockを変えてみる

すべからくsystemの理解にはclockから、わたしはそう思います.

制御屋の場合は割り込み系統が一番大事なのかしら?

わたしは信号処理屋なので、clock系統がどうなっているのかが一番大事なことのように思います.

今回は、PIC18F65K80 のclockを切り替えてみようと思います.

まずは、clockに何も触らない下記のコードでPICを動かして見ると、630kHzでポートG4がオンオフします.defaultで16MHzになっているようです.

#include "18F65K80.h"

void main(void){

while(1){

output_high(PIN_G4);

output_low(PIN_G4);

} }

つぎに、CSSライブラリのhelpからみつけた setup_oscillator() という関数をつかってclockを変えてみますと、ポートG4の周波数が83kHzに変わりました.仕組みはわからんけど、なにか変えれたようです.

#include "18F65K80.h"

void main(void){

setup_oscillator( OSC_2MHZ );

while(1){

output_high(PIN_G4);

output_low(PIN_G4);

} }

setup_oscillator()の引数にはどんな選択肢がある?

デバイスの素性を定義しているヘッダファイル C:\Program Files (x86)\PICC\Devices\18F65K80.h を開くと次の記述がみつかります.

いろいろと変えられるようですね.

#define OSC_31250 0x8000

#define OSC_PLL_ON 0x4000

#define OSC_PLL_OFF 0

#define OSC_31KHZ 0

#define OSC_250KHZ 0x10

#define OSC_500KHZ 0x20

#define OSC_1MHZ 0x30

#define OSC_2MHZ 0x40

#define OSC_4MHZ 0x50

#define OSC_8MHZ 0x60

#define OSC_16MHZ 0x70

clock系統図

とここまで味見できたところで、PIC18F65K80のデータシートからclock系統を調べてみますと、こういう図がありました.

この図をみると、いろいろなことがわかります.

・16MHz~31kHzまで段階的に可変である.

・内部発振回路はHF,MF,LFの3ヶある.

・CPUとPeripheralの駆動周波数は常に同じ.

・外部発振はOSC,SOSCの2ヶある. → 下記

・PLLってなんだろう? → 下記

SOSCって何?

Secondary OSCの略で、データシートをサラッと読んだところでは、あまり深い意味はないようです.

パワーセーブモードとか、watchdog timerとかを使う場面で便利なこともあると、そういうレアケースでしか使う場面がないっぽく感じました.

PLLって何?

clock周波数を最大64MHzまで上げることができる4倍PLLです.

図からわかるとおりclock sourceは、OSC、または内部16M,8M,4MHzのどれか.

setup_oscillator()の引数の全部

C:\Program Files (x86)\PICC\Devices\18F65K80.h に書かれている setup_oscillator() の引数は下記が全部です

OSC_SOSCはSOSCに切り替えるらしいです.OSC_INTRCは内部発振への切替.OSC_NORMALはお任せ.

他にもいろいろあるけど、いまのところは触らぬ神に祟りなしでいいじゃないかと思います.

そうそう、setup_oscillator(OSC_250KHZ | OSC_INTRC)のようにORして使うようです.

OSC_PLL_ONを引数に与えてみましたが、うまく動きませんでした.こういう場合はライブラリのソースコードを読むしかありませんが、めんどくさいのでここではやめておきます.必要が生じたら読めばいいだろう.

#define OSC_31250 0x8000

#define OSC_PLL_ON 0x4000

#define OSC_PLL_OFF 0

#define OSC_31KHZ 0

#define OSC_250KHZ 0x10

#define OSC_500KHZ 0x20

#define OSC_1MHZ 0x30

#define OSC_2MHZ 0x40

#define OSC_4MHZ 0x50

#define OSC_8MHZ 0x60

#define OSC_16MHZ 0x70

// The following may be OR'ed in with the above using |

#define OSC_SOSC 1

#define OSC_INTRC 2

#define OSC_NORMAL 0

// The following may be OR'ed in with the above using |

#define OSC_IDLE_MODE 0x80

// The following may be OR'ed in with the above using |

#define OSC_MFINTRC_ON 0x10000 //MF-INTOSC used instead of HF-INTOSC for 500KHZ, 250KHZ and 31KHZ operating frequencies.

#define OSC_SOSC_ON 0x80000

// A second optional parameter may be used with this part to fine

// tune the speed (signed int,-32 to 31)

// Result may be (ignore all other bits)

#define OSC_STATE_STABLE 4

#define OSC_STATE_PRIMARY_RUNNING 8