ATtiny10 用プログラム (7)

ATtiny10 の「OSCCAL」レジスタ (アドレス 0x39) に設定する値と、内蔵 8 MHz クロック・オシレータの発振周波数の関係を測定し、グラフにしてみました。
単に CPU クロック周波数の測定なら、フューズ・ビットの設定で、CLKO 端子 (4 番ピン) にクロックが出力されるようにして、外部の周波数カウンタで測ればすみます。
ここでやりたいのは OSCCAL レジスタの値を変えながらの測定なので、ATtiny10 が「自力」で周波数を測定し、外部に結果を出力するようにしました。
周波数の測定は、以前 Arduino 用に作成した周期カウンタの仕組みを利用することにしました。
「周期」を測定するので、逆数を計算して「周波数」を求める、つまり「レシプロカル・カウンタ」の構成となりますが、ATtiny10 では演算処理は無理なので、周期測定の結果 (整数値) をシリアル出力し、PC 上のターミナル・ソフトでテキスト・キャプチャしてファイル化し、あとは PC 上のプログラムで計算して周波数を求めています。
Vcc = 5 V の場合の周波数のグラフを下に示します。
OSCCAL を変えながらクロック周波数を測定するループを 6 回繰り返して平均を求めたものです。

OSCCAL のデフォルト値、つまり、リセット時にフラッシュ・メモリから読み込まれてセットされる値は、0x98 となっており、対応するクロック周波数は、7.741 MHz (-3.2%) となっています。
内蔵 8 MHz オシレータのキャリブレーションは Vcc = 3 V で行われているので、電源電圧 5 V になると誤差が大きくなるものと思われます。
5 V 電源の Arduino につないだまま実験を行っているので、まだ 3 V 台の電源電圧での測定は行っていません。
クロック周波数が 8 MHz に最も近いのは OSCCAL = 0x9E (158) の場合で 8.006 MHz (+0.075%) になっています。
OSCCAL = 0x21 の場合でクロックは約 3.79 MHz、OSCCAL = 0xE4 の場合が約 11.3 MHz で、周波数は約 3 倍の変化をしており、この範囲外では不安定な挙動が見られたので、測定はこの範囲に制限しました。
OSCCAL の値を 1 増やしたときの周波数の増分をプロットしたのが下のグラフです。

OSCAL の値を増やした場合にクロック周波数が減少する場所は 1 箇所もなく、常に増加しており、「単調性」(monotonicity) が保たれていることが分かります。
クロック周波数が 8 MHz 程度となる OSCCAL の値が 160 の近辺では、OSCCAL の値を 1 増減させると、クロック周波数は 30 〜 50 kHz の増減となることが読み取れます。
回路や、プログラムについての説明は次回以降に回します。