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