title.png


第1回 Arduinoへの理解を深める

 前回通販で注文した「初心者スタータキット」の到着を待つ間、Arduino UNO R3と、搭載されているMCU(Micro Controller Unit)、ATmega328について、理解を深めてみようと思います。

8ビットRISC MCU

 元々は、Atmelという会社のMCUでしたが、会社ごと買収されて、現在は違う会社になっていたはずです。まずは、データシートを検索してみます。

  検索:別ウインドウが開いて検索します

 とりあえず、データシートをインターネットで見つけました。ざっとした特徴は以下の様に読み取りました。

 データシートには、プログラマモデル(レジスタセット)やメモリマップが載っていなかったので、その辺りは不明。インストラクションセットのサマリ(一覧表)が載っていたので、そこから類推すると、

 アセンブラでプログラムするつもりはなく、Cを使うので、一部不明なままでも特に実害ないと思われます。このMCUが得意/不得意とする処理がどういうものなのか?どの程度のことができるのか?ざっくり掴むことが目的です。

 汎用レジスタが32本ということは、オペコードの内5ビットはレジスタフィールドだということです。基本的な演算命令は、以下の様に2レジスタの指定が必要です。

  ADD Rd, Rr …… Rd ← Rd+Rr (Add two Registers without Carry)

 このような命令の場合、オペコードの内10ビット=5ビット×2は、2つのレジスタを指定するためのレジスタフィールドに割り当たってしまいます。しかしながら、この命令の実行サイクル数は1クロックです。10ビット以上のオペコードを1サイクルでフェッチできるということは、少なくとも、フェッチバスは16ビット以上のバンド幅のはずです。
 と言って、このクラスのMCUで、16ビットを超えて24ビットとか32ビット幅のフェッチバスを持っているとは考え難いので、おそらく、命令長は16ビットの固定長が基本になり、16ビットフェッチバスから1クロックでフェッチしているのでしょう。それが1MIPS/1MHzの処理能力を支えている模様。

C言語

 ATmega328の姿がおぼろげに見えたところで、今度は、Arduinoのホームページから、Arduinoの理解を深めてみます。
 トップページから、「RESOURCES ⇒ REFERENCE」と進むと、「Language Reference(言語仕様)」に到達します。まずは、データタイプ(intのサイズ、大切✨)から確認しておきましょう。

  int : 整数型。Arduino UNOでは16ビット、DueとSAMDベースのボードでは32ビット

 筆者が購入したのはUNOですので、16ビットですね。longはMCUによらず32ビット。

 floatも使えるようですね、サイズは32ビット。記載が無いのでわかりませんが、IEEEの32ビット単精度フォーマットでしょうか?ボードが届いたら確認してみましょう。

 さらに精度の高いdoubleもありますが、「Language Reference」によると、UNOを含め、ATmega搭載の機体ではdoubleの実装はfloatと全く同じだと書いてあります。Arduino Dueという機体では、64ビットの倍精度がインプリされている模様。まあ、floatがあれば十分。

 ああ、太古の昔を思い出しました。FM-7(8ビット、6809 @4MHz)でC言語を動かしていたころを。intは16ビットだったし、確か、ギリギリfloatが実装されていたような……。データタイプの仕様はArduinoと似てますね。6809だと、汎用レジスタという概念はなくて、アキュムレータが2つしかなかったし、1命令辺り数クロックかけて実行していた時代ですので、今回のATmegaの方が10数倍高速になっていると思われます。

  6809 @4MHz ⇒ ATmega328 @16MHz
    動作周波数が×4倍速
    サイクル当たりの実行命令数が×2〜4倍(?、6809の記憶が定かではない……)

 比べる相手が数10年前のパソコンでは、意味がないですね……、スミマセン。

 何にせよ、久々にOSの呪縛から逃れて、「すべてのCPUタイムは僕のもの!」という環境が楽しみです(1^−^)b。誰にも(OSやら他の並列実行中アプリ等々)気兼ねせずに、ゴリゴリコーディングしていきたいと思いますっ。

Arduino UNOの回路図

 Arduino UNO本体の回路図も確認しておきましょう。Arduinoのホームページトップから、「RESOURCES ⇒ PRODUCTS」と進み、「UNO」をクリックします。そのページから、更に、「DOCUMENTATION」 ⇒ 「SCHEMATICS」と辿ると、回路図にたどり着きます。
 USBと電源周りがごちゃっとしていて難しいですが、ATmega周りは、クロック、リセット、電源周りが接続されて、必要な端子がそのままボードの端子に引き出されているだけのシンプルな作りです。ROM/RAM等のメモリはオンチップなので、「Arduinoボード」と言いながらも、ほぼ、ATmegaの端子が生で引き出されているだけという感じです。
 外から5Vの電源がもらえて、USBが要らない用途だとしたら、この回路図からUSBチップ(ATmega16U2-MU)と電源回路が消え去りますので、残るのはCPU(ATmega328P-PU)のみですよ。

 ブレッドボードで全体の動きを確認できたら、基板を起こし、面実装タイプのATmegaを買って実装したら、すぐ商業用(量産用)に転換できてしまう感じですね。

 そういう状況ですので、CPUオンチップの周辺回路(シリアル、AD変換器、EEPROM等)の仕様について知りたいなら、ATmega328のデータシートにアクセスすればOKです。

まとめ

 インターネット上で集められた情報から、推測を含めた考察になっていますので、「正確なところ」を知りたい方は、その筋の文献等を参照ください。
 今回の目的は、「どの程度の物なのか?」ざっくり理解することでしたので、以上の考察程度で目的は果たせたと考えています。

 Amazonから「今日届きます」メールが届きました。次回は到着後、セットアップです。


btn_arduino.png

btn_prev.png btn_next.png

home