digitale bottega cresc blog. ATtiny2313 1命令の実行速度は?

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ATtiny2313 1命令の実行速度は?

本記事は自分の備忘のために書いているため,随所に間違い等があるかと思います。やさしく指摘していただければうれしいです。

さて,今回の目標であるオルゴールは圧電ブザーを使う。

圧電ブザーの仕組みは村田製作所社の「発音の仕組み | 圧電発音部品」にわかりやすく載っていた。つまり勝手に簡単に解釈すると電圧をオンオフしてあげれば圧電振動板とやらが振動して音がでる。ということかな。んで,与える電圧の周期を変更すると音階が変わる。と。

んで,圧電ブザーには自励式と他励式というのがあるらしい。自励式は内部に発振回路まで入っていて電圧を加えると一定周期のパルスが発振され音が出る。ただし,当然一定周期なので音階が作れるわけじゃない。というわけで,今回使うのは当然自励式。使用するブザーは当然?秋月電子通商で2個100円というお安いリーズナブルな価格で売っているSPL-SPT08。ただし,この部品のデータシートは外形図しか出ていなく周波数特性がよくわからん。

というわけで,まずは圧電ブザーがどのくらいの帯域で鳴ってくれるのかを調べるために音程は関係なく一定周期のパルスを発振できるようなプログラムを書くことに決めた!がその前に……。

注:ここまでがこの記事の前書き,下からが本筋。前書きが長いのは冒頭に書いたように備忘のためで,思考の流れを書いておきたいからなので,もしかして,読んでる人がいたとしてくだらないことが書いてあっても怒んないで。

一定周期のパルス発振プログラムの前に,まずは一番プリミティブなところ果たしてこのATtiny2313は1命令をどのくらいの速さで実行するのか?命令実行のタイミングは2313のデータシート(AVR.jp様のデータシートとAtmel社からダウンロードしたdoc2543.pdfの両方を参考にしている。日本語訳,ページ,図番はAVR.jp様のものを使用)をみるとP.7図6に命令の取得と実行の並列動作ということで命令取得と実行がそれぞれ1clkCPUで行われるという図が載っている。つまり1命令は1clkCPUで実行される。

では,1clkCPUはどのくらいの速さだ?ATtiny2313は校正付き内蔵RC発振器(以下内蔵発振器)があるので外付けで発振回路はなくてもOK。もちろん外付けの方が精度はいいのだろうけど,目標がフリスクケースだから当然内蔵を使う。データシートではP.14の図11にクロック生成の図がでている。内蔵発振器の出力はクロック多重器を通りAVRクロック制御回路でclkCPUなどのクロックを生成している。clkCPUとclkI/O,clkFLASHがそれぞれ分かれているということは,異なる周期のクロックがあると予想されるけど,どれがいくつかはあまり詳しく読んでいないのでよくわからない。まあ,clkCPUがわかればいいので今は気にしない。

そのclkCPUだが,内蔵発振器が4MHzと8MHzで,クロック多重器が分周有り無しのパターンがあるらしい。正確にはさらにクロック前置分周器(データシートP.18参照) を変更することで分周値は変えられるらしいけど,今はFUSEの操作で容易に変更できるものだけを確認する。組み合わせると下の表のようになる。

表.クロック組み合わせ

 

内蔵発振器(CKSEL)

分周値(CKDIV8)

clkCPU

1

4MHz(0010)

8(0)

500kHz

2(defaut)

8MHz(0100)

8(0)

1MHz

3

4MHz(0010)

1(1)

4MHz

4

8MHz(0100)

1(1)

8MHz

それぞれ試してみようジャン。本当はC言語で書いていきたいところだけど,コンパイルして余計な命令がくっついちゃうといやなのと,ビットをオンオフさせるだけの超絶簡単ソースだからアセンブラで書いた。

/*
 * _001asm.asm
 *  1命令の時間を見る
 *
 *  Created: 2011/10/10 1:25:42
 *   Author: tom
 */ 

 .include "tn2313def.inc"

	ldi	R16, 0b00010000
	out	DDRB, R16	// PORTB4を出力に設定
	ldi	R17, 0b00000000

	out	PORTB, R16	// PORTB4を1に
	out	PORTB, R17	// PORTB4を0に
	out	PORTB, R16
	out	PORTB, R17

これを書き込んでATtiny2313への電源を一度切って再度投入時の波形をSingleでトリガしてやれば1命令の速度を見て確認できそう。あとはFUSE Bitをちょこまかいじくってその波形を確認する。

結果は下記の表。速い周期の波形が方形波状から崩れてきているのはオシロのせいか?もっと帯域が広いオシロでもみてみたい。が,今はあまり重要ではないのでよし。当たり前だがほぼ上の表のclkCPUの値となっている。

clkCPU 結果画像(クリックで拡大)
500kHz 4M8DIV.png
1MHz 8M8DIV.png
4MHz 8M0DIV.png
8MHz 8M0DIV.png

これで終了と思っていたらひとつ疑問ができてしまった。この実験結果だが上のプログラムだから電源入れて一回だけオンオフオンオフと出力される予定だったのだが,今見たらオシロのトリガがAutoになっていた。つまりこの波形が繰り返し出力されているらしい。確認してみたのが下の画像。時間レンジを長くしてしまっているのでオンオフは見えないけどY軸方向に出ているのがそう。これを見ると2ms強の周期で繰り返されているらしい。なぜだ?わからないけど,今はそっとしておく。誰か偉い人教えてください!

2ms.png

theme : 電子工作
genre : 趣味・実用

tag : AVR, ATtiny2313

comment

Secre

No title

空のプログラムエリアを1周して最初に戻るからですね。
望まないならプログラムの最後に無限ループを付けます。

Re: No title

> 空のプログラムエリアを1周して最初に戻るからですね。
> 望まないならプログラムの最後に無限ループを付けます。

どなたか存じませんが、ありがとうございます!
やはり1周して最初に戻るんですね。納得です。
今、忙しくて手を付けられないでいるのですが、
また続きをやりたいと思っています。どうぞ、いろいろご教示ください。
プロフィール

cresc1973

Author:cresc1973
1973年生まれ。茨城県高萩市出身。千葉県柏市在住。ミニが好き。合唱が好き。こんぴゅ~たが好き。

最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
blog counter
online counter
現在の閲覧者数:
ブログ内検索
RSSフィード
リンク
ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。