米粒AVRの動作周波数

公開日: 電子工作 |

米粒AVR 周波数 

米粒AVR(ATtiny10)のデフォルトでは内臓発振器利用の1MHzが指定されています。
これは、プログラム内で変更可能で、内臓発振器利用の場合は最大8MHzの間で設定できます。
ちなみに、外部発振器を使う場合、米粒AVRは最大12MHzで動作可能です。

設定方法

CLKMSRレジスタと、CLKPSRレジスタの2つレジスタの値の組み合わせで設定します。
ただし、この2つのレジスタは、誤変更防止の為にプロテクトされています。
プロテクトを外すには、CCPレジスタにSignature値(0xD8)を書き込みます。
CCPレジスタにSignatureを書き込んだ後、4CPU命令サイクル以内にCLKMSR/CLKPSRを行います。

例)

CCP = 0xD8;<br />
CLKMSR = 0;<br />
CCP = 0xD8;<br />
CLKPSR = 0;<br />

 

CLKMSRでは、発振器の選択を行います。

CLKMSR 発振器の選択
内臓8MHz発振器
内臓128kHz発振器(WDT発振器)
外部クロック

 

CLKPSRでは、選択した発振器のプリスケーラー(周波数の分周数)を選択します。

CLKPSR 分周数 内臓8MHz設定時 内臓128kHz設定時
1 8MHz 128kHz
2 4MHz 64kHz
4 2MHz 32kHz
8 1MHz 16kHz
16 500kHz 8kHz
32 250kHz 4kHz
64 125kHz 2kHz
128 62.5kHz 1kHz
256 31.25kHz 500Hz

 

周波数の確認実験

#include <avr/io.h><br />
<br />
int main(void)<br />
{<br />
    CCP = 0xD8;<br />
    CLKMSR = 0;<br />
    CCP = 0xD8;<br />
    CLKPSR = 0;<br />
<br />
    DDRB |= _BV(PB0);<br />
    <br />
    while(1)<br />
    {<br />
        PORTB ^= _BV(PB0);<br />
    }<br />
}<br />

上記のプログラムを走らせ、PB0ピンに現れる周波数を計測してみました。
6行目 ・8行目で、周波数の設定をしています。
この場合、CLKMSR = 0; CLKPSR = 0; で8MHz動作となる。

while内のアセンブラの内容は

<br />
ldi    r25, 0x01<br />
in    r24, 0x02<br />
eor    r24, r25<br />
out    0x02, r24<br />
rjmp    .-8<br />

と、5つの命令でループしている。
このループの1回目でHigh、2回目でLowと、2回のループで1周期の矩形波が出力されるはずです。
10命令で1周期。
AVRは1クロックあたり1命令実行されるとのことなので、このプログラムを走らせると単純に動作周波数の10分の1の周波数が測定できるはずです。
後は、CLKMSR/CLKPSRの値を書き換えて測定すればOKと言う手はず。

 

metex-p10
しかしまともな測定機を持っていないのでorz、周波数はテスターについている周波数カウンターで見てみます(´・ω・`)
ちなみに、このテスターは秋月電子で売っている METEX P-10 と言うものです。
周波数カウンターの性能は、10Hz~10MHzとなっています。

 

CLKMSR CLKPSR CPU周波数 期待値 実測定値  
0 0 8MHz 800kHz 779kHz
0.97375
0.779KHz
0 1 4MHz 400kHz 389.6kHz
0.97375
389.6kHz
0 2 2MHz 200kHz 194.8kHz
0.974
194.8kHz
0 3 1MHz 100kHz 97.4kHz
0.974
97.4kHz
0 4 500kHz 50kHz 48.71kHz
0.9742
48.71kHz
0 5 250kHz 25kHz 24.35kHz
0.974
24.35kHz
0 6 125kHz 12.5kHz 12.17kHz
0.9736
12.17kHz
0 7 62.5kHz  6.25kHz 6.08kHz
0.9728
6.08kHz
0 8 31.25kHz 3.125kHz 3.044kHz
0.97408
3.044kHz

 

期待値より微妙に少ない周波数が測定されました。
どれも97.4%前後の数値・・・デフォルトで何か割り込みでも動いているのでしょうか・・・
ただ単にテスターが安物すぎて、校正が悪いのか・・・
はたまた僕の勘違いで実験自体が成り立っていないのか・・・

でもまぁ、だいたい合ってるので良しとしましょうか・・・と言うことで、実験終了です。

関連記事

soundIR 受信機 回路図

赤外線リモコン受信機(イヤホンジャック接続)の回路

  前回からだいぶと時間が経ってしまっていますが、今回はイヤホンジャック接続のリモコン受

記事を読む

no image

Androidで一眼レフカメラのシャッターを制御する

またSoftModemネタです。 調子に乗って arms22さんの記事 iPhoneで一眼レフカメ

記事を読む

no image

Androidで一眼レフカメラのシャッターを制御する(MicroBridge接続)

以前書いた、Androidで一眼レフカメラのシャッターを制御するでは、AndroidとArduino

記事を読む

Androidで温度計

Androidで温度計(STTS751使用)

  Androidに温度センサー(STTS751)を繋いで温度表示してみました。 温度

記事を読む

no image

Androidとオーブントースターを繋いでみた

Android端末とオーブントースターを、Arduino+USBホストシールドで作ったADKっぽい奴

記事を読む

no image

USBホストケーブルとUSBケーブルの違い

USBホストケーブル(OTGケーブル)と普通のUSBケーブルの違いは、USBホストケーブルとして振る

記事を読む

no image

気になる物

HT-03Aで使えるのかどうかは知らないけど、Bluetooth-シリアルモジュール(BT-MOD1

記事を読む

SDカード・マイクロSDカード

ArduinoでSDカード

電子工作で大量のデータを保存する方法を調べていると、 Arduinoでも比較的簡単にSDカードを

記事を読む

no image

Android + Bluetooth + Arduino

 以前書いた『気になる物』で紹介したBluetoothモジュールですが、本当に気になって実

記事を読む

no image

ボツネタ~CAN的な何か

少し前に必死になって作ってたデバイス+アプリですが、気持ちが萎えてしまい、結果ボツと

記事を読む

Arduinoで温湿度データロガー
Arduinoで温湿度計 #2

今回は、前回作った温湿度計にRTCモジュールとSDカードアダプタを

Arduinoで温湿度計
Arduinoで温湿度計

秋月電子の温湿度モジュールを使って、温湿度計を作ってみました。 以前

SDカード・マイクロSDカード
ArduinoでSDカード

電子工作で大量のデータを保存する方法を調べていると、 Arduin

秋月電子 リアルタイムクロック(RTC)モジュール
秋月のリアルタイムクロック(RTC)モジュール

今回は秋月電子のI2C接続のリアルタイムクロック(RTC)モジュールを

秋月電子 キャラクタLCD
秋月の小型キャラクタLCD

今回秋月電子で売られている小型のキャラクター液晶2種を買ったので、

PAGE TOP ↑