米粒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%前後の数値・・・デフォルトで何か割り込みでも動いているのでしょうか・・・
ただ単にテスターが安物すぎて、校正が悪いのか・・・
はたまた僕の勘違いで実験自体が成り立っていないのか・・・

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

関連記事

raspi-config

Raspbianの最初の設定

  Raspbianのインストール後にraspi-configを使って行う最初の設定

記事を読む

秋月電子 キャラクタLCD

秋月の小型キャラクタLCD

今回秋月電子で売られている小型のキャラクター液晶2種を買ったので、ちょっと比較してみる。 買っ

記事を読む

soundIR 送信機

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

前回は受信機で、今回は送信機を作ってみました。 受信機と違って、送信機の作成は少し面倒です。

記事を読む

Arduinoで温湿度データロガー

Arduinoで温湿度計 #2

今回は、前回作った温湿度計にRTCモジュールとSDカードアダプタを取り付けて温湿度データロガーを

記事を読む

no image

PIC24FJ64GB002でADKを試す(その1)

先日、MicrochipからPIC向けのAndroid Open Accessoryのライブラリが公

記事を読む

no image

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

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

記事を読む

Androidから米粒AVRへデータを送る

米粒AVRでSoftModem的なこと その2

前回は「米粒AVRからAndroidへデータを送る」ことを試しました。 今回はその逆の「And

記事を読む

米粒AVT(tiny10) リモコンレシーバー

米粒AVRでリモコン受信処理

  米粒AVR(Tiny10)で赤外線リモコンを受信して処理をするサンプルを作ってみまし

記事を読む

no image

AVRISPmk2

米粒AVR(ATtiny10)のプログラム書き込み用にAVRISPmk2を購入しました。 先人

記事を読む

no image

Android+Arduinoでリモコン3 その2(AndroidAccessory接続)

何度か、Android+リモコンのネタを書いたことがあるのですが、今回はAndroid Access

記事を読む

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

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

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

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

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

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

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

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

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

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

PAGE TOP ↑