米粒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-colortest

Raspbianの起動

Raspbianの起動画面をキャプチャしてみた。 SDカードにイメージを書き込んだままのデフォ

記事を読む

no image

PICでMicroBridgeをやってみた

今回は、@yishiiさんが公開されている、PIC24FJ64GB002用のMicroBridgeソ

記事を読む

no image

Arduino + USBホストシールド で ADK を試す(その2)

前回「Arduino + USBホストシールド で ADK を試す(その1)」では、Androidで

記事を読む

Arduinoで温湿度計

Arduinoで温湿度計

秋月電子の温湿度モジュールを使って、温湿度計を作ってみました。 以前「パソコンで温度計」と言うもの

記事を読む

Arduino + STTS751

パソコンで温度計

ありきたりのPC温度計ですが、なんとなく作りたくなったので作ってみる。 コントローラーは手軽な

記事を読む

no image

AndroidにPS2キーボードを繋いでみた

@yishiiさんの素のAndroid端末を外部のキーにより操作する実験と言う記事を参考に、Ardu

記事を読む

no image

Android Open Accessory開発時のWiFiデバッグ

Android Open Accessory開発時のデバッグは、ADBをWiFiで接続しろと、USB

記事を読む

Androidで気圧高度計

androidで気圧・高度計(LPS331AP使用)

Androidと大気圧センサー(LPS331AP)をイヤフォンジャックで繋いで気圧と高度、ついで

記事を読む

thermometer overlay

パソコンで温度計 #4

前回までに作ったPC温度計のログデータを、計測と同時に撮影した映像にオーバーレイ表示(スーパーイ

記事を読む

SDFormatter

Raspbianの起動SDカードを再利用

一度、Raspbianのイメージを書き込んだSDカードは、フォーマットが違う為にWindowsでは利

記事を読む

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

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

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

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

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

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

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

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

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

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

PAGE TOP ↑