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

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

関連記事

no image

PIC24FJ64GB002でADKを試す(その2)

 前回「PIC24FJ64GB002でADKを試す(その1)」では回路の説明までしたので、

記事を読む

no image

AndroidでSoftModemを試してみた

今回、ここで言うSoftModemとは、携帯電話のオーディオ端子(イヤホン・マイク端子)を利用し

記事を読む

raspi-pin-header

そうだ、Raspberry Pi用にピンヘッダーのオス・メス変換アダプタを作ろう

  Raspberry PiのI/O端子は、ピンヘッダーとなっていて、電極が出っ張ってる

記事を読む

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

ArduinoでSDカード

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

記事を読む

Androidで温度計

Androidで温度計(STTS751使用)

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

記事を読む

no image

米粒AVR(ATtiny10)

通称「米粒AVR」で知られるTiny10を使ってみたくて、秋月の通販で買ってみました。 超小型

記事を読む

米粒AVR リモコン

米粒AVRでリモコン送信機

米粒AVR(tiny10)を使った赤外線リモコン送信機を作ってみました。 これで送信できるのは

記事を読む

秋月電子 キャラクタLCD

秋月の小型キャラクタLCD

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

記事を読む

no image

Atmel Studio 6

米粒AVR(ATtiny10)の開発を行う為に、Atmel Studio 6.0をインストールし

記事を読む

no image

オシロスコープを手に入れた

ついにオシロスコープを買っちゃいました。 と言っても、DSO QUADと言うポータブルタイプの

記事を読む

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

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

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

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

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

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

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

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

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

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

PAGE TOP ↑