マイコン (Arduino/ATmega328p) 中級者を名乗るのに要る技能 [要出典]
この記事は?
記事のコンセプト的にはこちらのパクりリスペクトです。
人によって「初級者」「中級者」の区分は様々ですが、僕のなかでの「マイコンだいぶ分かってきたらこんな感じかな?」というイメージを示します。
「Arduino ライブラリなどを使い、裏方はほぼブラックボックスのまま開発やってきたけど、もうちょっとマイコンに詳しくなりたい」という方の助けになればと思います。
ただ、STM32 などのより高機能なマイコンだと、Arduino IDE よりずっと高機能な IDE (Cube IDE) などに頼ることがほとんど (だと思う) なので、高機能なマイコンだと実は後述 1 と 2 の技能が要ることはあんまり無いかもしれん・・・。
1. レジスタを直接操作してマイコンの機能を制御できる
例えば、Arduino で以下のようなプログラムは・・・
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
レジスタ直操作で以下のようになります。
DDRB |= 0b00100000;
PORTB |= 0b00100000;
Arduino ライブラリの内部では、最終的には上のようなレジスタ操作をやってくれています。
レジスタ直操作だと、中間にコードが無い分早く処理をすることができます。一方で、見ての通りコードがややとっつきにくいです。
また、Arduino ライブラリでサポートしていないような機能を用いる場合は、レジスタ操作は必須になります。(例えば、タイマ割り込みは標準の Arduino ライブラリには実装されていません。)
2. マイコンのデータシートをある程度読める
上の DDRB
や PORTB
などのレジスタ。この情報は、以下のデータシートから確認できます。
マイコンの機能を操作したいとき、個人ブログなどよりも確実に信頼できる情報元 (= 公式リファレンス、ここではデータシート) を読める方が玄人です。
3. 割り込みを制御・活用できる
割り込みとは、ある条件が成立したとき、メイン (進行中) の処理を一時停止し、所定の処理を直ちに開始する動作です。
タイマ割り込み : 一定時間 (クロック数) が経過した、または経過する毎に割り込みを起こすものを意味します
一定時間処理を止める、いわゆる sleep
命令でも同様の動作は実現できます。しかし sleep
中は他の動作を何もできません。単純な実装ではそう問題になりませんが、複雑な実装では非効率で問題になってきます。
ピン割り込み : あるピンの入力が所定の変化 (立ち上がり/下がり) をしたときに割り込みを起こすものを意味します
ポーリング (無限ループで入力の変化を確認する) でも同様の動作は実現できます。しかしメインループ内の処理量によっては、状態の確認周期が遅くなり、状態が変化してから動作するまでに遅れが生じることがあります。
以上から、複雑な実装だったり、リアルタイム性が求められたりする場合には、割り込みの活用が必要不可欠になると言えます。
4. タイマ割り込みのクロックの計算ができる
タイマ割り込みは、以下のような信号の流れを通って割り込みを起こします。(AVR に限らず、恐らく多くのマイコンが同様の形です。)
クロックが 8MHz で、分周を 1/8、カウンタを 1000 とした場合、割り込みは 1kHz で発生します。つまり、1ms 毎に指定の処理が呼び出されることになります。
計算自体ただの割り算なので、そう難しくありません。
ただ、分周は自由な数字を設定できるわけでなく、ATmega 328p だと 1, 8, 64, 256, 1024 から選ぶ形になっています (マイコンによっては自由に設定できることも)。また、カウンタの最大はカウンタの bit 数 (8bit なら最大 255、16bit なら最大 65535) によって決まります。
なので、数値決めには少し工夫が要ります。
タイマ割り込み分周やカウント値設定、ピン割り込み発生条件設定、そしてそれら割り込みの有効/無効設定、これらもやはりレジスタで設定します。
ところで上級者レベルは?
このさらに上というと、アセンブラ言語が分かる、コンパイラの内部が分かる、リンカとかリンカスクリプトとかが分かる、というレベルでしょうか?
正直、(よほど尖った使い方を要しない限りは) データシート読めるレベルでマイコン有識者と言えるんじゃないかと思っています。
おわり
「マイコンのハードウェア的なこと (特にレジスタとクロック計算) を理解していて、割り込みとかを使いこなせるなら中級」だと思います。
Discussion