LoginSignup
1
1

More than 3 years have passed since last update.

Arduino UNOが全く分からないのでVirtuarduino KASOUNOを作りながら理解していく話【未完成ながら随時更新】

Last updated at Posted at 2019-10-24

-1. 未完成なのに公開している理由

Qiitaでは下書きが最大10個しか作れないのですが、それがほとんど埋まってしまったからです。ごめんなさい。

0. 執筆の理由

マイコン出来れば、(幸せが)舞い込んで来るかなと思ったから
かねてから僕はアセンブリ言語や機械語やコンピュータアーキテクチャに対する苦手意識があった。
マイコンを使った工作も一度やって投げ出してしまった。
当初使ったマイコンはRaspberry Piだった。これを参考書を読みながら、c言語とpythonだけで書いて、なんとか動かした。

易しい参考書は
「とりあえずこう書いてみよう」
「とりあえずこうつないでみよう」
が中心だった。
「どうしてそう書くと動くのか」がわからず、フラストレーションがたまった。
かといって、別の難しい参考書でマイコン工作の理屈を学ぼうとすると
「古文書かよ!」ってくらい難解で、到底理解できるものではなかった。
耐えきれずに逃げるようになった。

こうして僕は、納得がいかないと前に進めない己の性格を恨んだ。
「ある程度習得したものがないと、理解するのは難しい」
そして
「まずはとりあえず手を動かさないと、習得できない」
のはわかっているのに
「納得できないと手が動かない」
のだから厄介だ。

僕の葛藤を論理的に整理すると次の通り。

「理解するために習得」
「習得するために実践」
「実践するために理解」

僕の中では、集合V{理解, 習得, 行動}が、演算「v1 するために v2」に対して閉じているのだ。
image.png
図0.1 参入障壁の円環

きっと「易しい参考書」は図0.2のように習得を終点となるようにこの円環をこじ開けていて、
「難しい参考書は」図0.3のように実践が終点となるようにこじ開けているのだろう。

image.png
図0.2 円環のこじ開け方その1

image.png
図0.3 円環のこじ開け方その2

僕は、2つの内どちらも選択できなかった。そこで、「理解」と「実践」を同時にできないか考えた。
つまり、「何故できるか」「どんな理屈が背景にあるのか」を一歩一歩理解しながら、実際に動かして実践してみる。
そして、「理解と実践を同時にやる」最も確実な方法は、「理解しながらでないとできない方法で実践すること」である。マイコン工作なら、そのマイコンのアセンブラを作り、ソフトウェア上に仮想マイコンを作ってみるのが最適だろう。
そこで今回、Arduino UNO を仮想化した仮想マイコン Virtuarduino KASOUNO を作っていくことにする。

本記事は、次の講義を受けた際のノートでもある。
機械語レベルでマイコンを扱う講義 [1]

1. 対象読者・環境

  • 機械語が苦手だが、アルゴリズムを考えること自体は楽しいと感じる人。
  • ATmega328Pを持つArduinoと、ブレッドボードをつないでLチカ程度のことが(解説書を読みながら)できる人

2. 機械語の種類

ATmega328PはAVRマイコンであり、これを持つArduinoはマイコンボードである。
AVRマイコンは、AVRの機械語(AVRのCPUに対して命令するための機械語)で動くマイクロコンピュータのことである。
AVRの他のCPUとしてはMIPS、x86_64などが有り、それぞれに独自の機械語が存在する。(たぶん)
AVRのアーキテクチャは、非ノイマン型である。[0]というのも、プログラムを書いておくメモリとデータを覚えておくメモリが分かれている。

3. どうして「言う通り」にすると、マイコン工作ができるの?

マイコン工作をしていると、
「とりあえず言われた通りにプログラムを作る」
「とりあえず言われた通りに回路を組み立てる」
になってしまいがちだ。
プログラムに関しては仮想マイコンを作りながら理解していけるが、
回路の組み立てについてはそうもいかない。そのため、第3章では、回路を組むときの理屈を簡単に解説する。

3-1 とても簡単な例

まず、小学校の理科でやるような簡単な回路を図3.1.1に示す。

image.png
図3.1.1 とても簡単な回路

図3.1.1は直流電池と豆電球をつないで、豆電球を光らせる回路である。素子を水色、高い電流の流れる導線(H)を赤色、低い電流の流れる導線(L)を黒色で示している。
ここで、図3.1.2のように、間にマイコンを入れてみる。

image.png
図3.1.2 マイコンを挿入した回路。

紫の導線は「HまたはLの導線」である。IN,OUTとかかれた、4つの端子を持つ長方形がマイコンを表現している。マイコンの内部に導線を書き加えて、図3.1.2の回路を図3.1.1と同じように動作させることを考えよう。
その場合、マイコンは図3.1.3のようにする。
image.png

図3.1.3 マイコンの例

図3.1.3のマイコンを図3.1.2に当てはめ、各導線を比較すると、図3.1.1と同じものになったことが分かる。
図3.1.1は電池とLEDが直接つながれており、図3.1.3と図3.1.2では、図3.1.2で電池に直接つながっている端子(H)が図3.1.3のマイコン内部でOUT端子とつながり、図3.1.2でOUT端子がLEDとつながっているので、やはり電池とLEDがつながっている。

図3.1.3のマイコンは「HがOUTとつながっている」(OUT=H)と説明することができる。これを与えるのがマイコンにおけるプログラミングである。
図3.1.2を作るのが回路設計、図3.1.3を作るのがプログラミングである。マイコン工作とはこの両方をつじつまが合うように行う行為のことである。

3-2. INに応じてOUTを変える

では次に、「スイッチがONのときLEDが消灯し、スイッチがOFFのときLEDが点灯する」マイコンを作ろう。
これは先ほどの例とは違い、マイコン内部に単純に導線をつなぐだけではできない。
図3.1.4のように、スイッチのON/OFFで分けて答えれば正解だ。
image.png
図3.4 マイコンの例2

このように、マイコンは「INに応じてOUTを変える」ことができるのである。
プログラミング経験者は「マイコンとは電気信号を引数(IN)、戻り値(OUT)とする関数のようなものだ」と考えてもよい。
実際、今回のマイコンをcの関数っぽく書くと次のようになる。

マイコン
function micom(my_switch)
{
    ON=H; OFF=L;
    if(my_switch==ON)
        OUT=OFF;
    else
        OUT=ON;
    return OUT;
}

3-3. 「節電監視カメラ」を作ることを考えよう

マイコンが「INに応じてOUTを変える」素子であることは前節まででご理解いただいた。
では、その特性を活かした工作の例を考えてみよう。
まず、表3.3.1のようなものが用意できたとしよう。

表3.3.1 材料

名称 特徴
普通(可視光線)のカメラ 電流がHの時だけ録画
赤外線カメラ 電流がHの時だけ録画。
赤外線なので夜間もはっきり写る
人感センサ 人が近づいてきたとき電流をH。
それ以外L
時計 昼間はH、夜はL

これらとマイコンを組み合わせて、「昼夜問わず、人が近づいてきたときだけ録画する監視カメラ」を作ってみよう。(IN端子、OUT端子は1個ずつとはいっていない)

3-3-1. 回路設計

まず、何をIN端子とつなぎ、何をOUT端子とつなぐべきか考えよう。
考え方としては「マイコンが制御できるものをOUT端子、そうでないものをIN端子」につなぐ。マイコンが電気信号をOUT端子に送り、これによって他の機器が制御されるのだから、この考え方は妥当だ。(マイコンの制御の根拠が、IN端子から来る電気信号である、と考えてもよい)
今回の場合、2種類のカメラをOUT端子につなぎ、人感センサや時計をIN端子につなげばよさそうだ。図3.3.1.1のようになる。

image.png

図3.3.1.1 節電監視カメラの回路図

3-3-2. プログラミング

人感センサが人の接近を捉えたとき、IN端子1がHになる。
そして可視光カメラに録画させるにはOUT端子1をHにする。止めるにはL。
従って、昼間に関しては「IN端子1がHのとき、OUT端子1をHにする」というプログラムを書けばよい。
同様に夜間は「IN端子1がHのとき、OUT端子2をHにする」としよう。
そして、昼間、夜間の判断についてはIN端子2を使えばよい。
これらを組み合わせ、次のような感じのプログラムを書けばよい。(あくまでも意味を捉えてほしい。最初の5行を飛ばし、英語だと思って読めばわかると思う。
また実際にはどの言語を使うかによって書き方が変わる。)

マイコンに書き込むプログラム
someone_is_comming=(IN[1]==H);
it_is_night=(IN[2]==L);
camera=&OUT;
kashiko=1;
sekigai=2;

if(someone_is_comming)
    if(it_is_night) *camera+sekigai=H;
    else *camera+kashiko=H;
else
{
    *camera+sekigai=L;
    *camera+kashiko=L;
}       

3-4. 省略記法の準備

3-5節では回路図の省略記法を解説する。電気回路を設計するうえで非常に頻繁に使われるので避けて通れない道だ。(その割にはこれを丁寧に解説しているサイトや記事があまりにも少ない・・・)
その上で、「電位」という概念をご理解いただく必要がある。ここではそれを説明する。
必要に応じて回路図3.1.1をみながら読んでほしい。簡単な回路で説明するので、電池、豆電球、導線、電圧計を用意して実践してみるのもよい。

まず、電池の電圧を5Vとしよう。(別に何Vとしてもよいが。)
赤線と黒線をまたぐように電圧計をつなぐと、5Vと表示されるはずだ。(図3.4.1)

image.png

図3.4.1 電圧計を接続した回路1

では次に、赤線同士、黒線同士を電圧計つなぐとどうなるだろう。正解は、「どちらも0Vと表示される」である。(図3.4.2)

image.png

図3.4.2 電圧計を接続した回路2,3

これらの結果から考えてみよう。電圧計の両端が同じ色(赤線同士、黒線同士)の時、電圧計は「0V」といい、
電圧計の両端が異なる色(赤線と黒線)の時、電圧計は「5V」といった。
それなら、「5V」というのは、「赤線と黒線の間に存在する」と考えるのが妥当ではないだろうか。
実は、電圧とは「電位の差」なのである。電位の意味はまだ分からなくてよい。すぐに解説する。黒線を「電位0」、赤線を「電位5」ととりあえずおいてみよう。
電圧計は、「両端の電圧を測る」ものであった。電圧=「電位の差」を当てはめよう。
電圧計は「両端の電位の差を測る」ものとなる。
ここで、もう一度図3.4.1と図3.4.2を見てみよう。
図3.4.1で、電圧計の両端は赤線(電位5)と黒線(電位0)となっている。
それなら電位の差は5-0=5だ。これが「電圧」と呼ばれ、5Vと表示されたのだ。
図3.4.2では赤線同士では電位の差が5-5=0だから0V、黒線同士では0-0=0Vだ。

これでご理解いただけたなら3-5節へ進んでよい。
ここからはさらに電位の正体に迫る。
結論から言うと、電位とは「回路という名の滑り台」の高さのことである。
まず回路を「正電荷専用の滑り台」と考えてみる。
正電荷とは、回路の中にいる(ことになっている)、プラスの電気を帯びた粒子である。
にわかに信じがたいかもしれないが、正電荷にとっては図3.1.1のような回路は、図3.4.3のようになっているのだ。
image.png
図3.4.3 回路という滑り台

電池は、滑り台の階段(実はエスカレータ!)の役割を担っていて、豆電球は滑り降りて楽しむための坂の役割を担っている。このとき滑り台の摩擦で正電荷のお尻が焼けて火花を散らす。これが豆電球の光の正体だ。
豆電球をモータに置き換えて考えた場合、滑り台を滑る正電荷がローラを回し、これによってモータが回る。
また「電池が切れて豆電球がつかない」という状態は「エスカレータが動かなくなった」ということに例えられる。
こういった正電荷の動きのことを我々は「電流」と呼んでいる。

赤線の電位が5Vであるとは、滑り台の赤線が高さ5mであることに例えられる。
黒線も同様に考える。高さ0mに例えられる。
そして、電圧計は、両端の高さの差を測っていると考えることができる。

最後に蛇足すると、滑り台でお尻が焼けているのも、ローラ付き滑り台を回しているのも、実は正電荷ではなく「電子」という負電荷である。しかも電子は電流と反対向きに動く。これは科学者たちが電子よりも先に電流を発見してしまったために生じた厄介ごとである。
彼らは、電流がどっちの向きに流れているかわからなかったため、2分の1の確率に懸けて
「正電荷が+極から-極へ流れている」と考えることにしてしまった。これが見事に外れたのである。とりあえず、「本当は電流の向きと電子の動く向きは逆。本当は正電荷ではなくその逆の負電荷が動いている。逆が2つあって逆の逆になったからなんか辻褄があっているし、気にしなくてよい」というのを頭のどこかにおいておくだけでよいだろう。

3-5. 省略記法

 3-4節で、電圧とは電位の差であるという事実を確認した。黒線が電位0Vで、赤線が正の電位であるとしよう。電位0Vのことを回路ではGNDという。GNDとは地面という意味で、「電気的な高さが0であるところ」ということを表す。(GNDについて「電気を地球に逃がす」とか「感電防止」とか「地球も導体」とか習った人はそれらを忘れてほしい。電気を地球に逃がすことで感電防止につながるというのは「アース」や「接地」のこと。混同されるが半分くらい別物だし、マイコン工作の範囲では別物と考えるべきだ。)
 ところで回路図ははしょられることがある。それぞれの線の電位さえわかれば、あとはわざわざ「つながっている」ことを示すのは面倒だと考えるらしい。
そこで、電位0V(GND)のとこをはしょってみる。図3.3.1.1のような回路図は図3.5.1のようにまずはしょられる。

image.png

図3.5.1 はしょられた節電監視カメラの回路図

図3.5.1を図3.3.1.1と見比べてほしい。そう。間違い探しだ(どちらも正しいため、「間違い」というのは語弊がある)。違いは1か所だけある。
正解は、一番下の横線が書かれなくなって、代わりに変な記号がついたということだ。省略された横線を共通帰線という。そして追加された変な記号こそ「GND」を表しているのだ。
さらに赤線の正電位もはしょると図3.5.2のようになる。

image.png
図3.5.2 さらにはしょられた節電監視カメラの回路図

もっとはしょると図3.5.3のようになる。

image.png

図3.5.3 さらにさらにはしょられた節電監視カメラの回路図

はしょられた回路図は、次のようにして復元(?)できる。

  1. 同じ記号同士を一つの線で結ぶ
  2. VccとGNDの間に電池を入れて結ぶ

これを図3.5.3に適用したものが図3.5.4である。図3.3.1.1と比較すると、同じものであることが分かる。

image.png
図3.5.4 省略記法とその復元

省略記法は一見複雑でややこしく面倒なルールに見えるかもしれないが、3-6節で大いに役立つ書き方である。

3.6 ブレッドボード

マイコンに限らず電子工作をするときには、しばしば「ブレッドボード」なる物が用いられる。
ブレッドボードとは図3.6.1のようなもののことである。

image.png

図3.6.1 ブレッドボード(引用元:[13])

ブレッドボードでは、素子や導線を指すだけで、簡単に回路が作れてしまう。
そかも、あるきまった一方向に関しては導線が不要だ。
というのも、ブレッドボードでは図3.6.2で緑で示した部分が裏であらかじめつながっているのだ。

image.png

図3.6.2 ブレッドボードに予めある接続(引用元:[13])
この上に図3.5.3の回路を実装すると、図3.6.3のようになる。

image.png
図3.6.3 ブレッドボードで回路を実装する様子

これらの配線を行うとき、図3.3.1.1をみながらだと、不要な部分も書かれているから回路図のどことブレッドボードのどこを対応させる必要があるか考えながらやらなければいけないが、図3.5.3をみながらであれば、VccやGNDの記号の通りに導線を加えるだけでよいため、作業が簡単になる。

3-7. 実際の工作の例

第3章では、3-6節まで、極度に単純化されたマイコンで、極めて単純なマイコン工作を考え、議論していくことで、読者の皆様にはマイコン工作のイメージを掴んでいただいた。
ここでは、実際のArduino UNOを用いた工作の例を見ていこう。
いきなり大量の内容を押し付けるようで恐れ入るが、一つ一つ解説してゆくので安心されたい。

Arduino UNOは図3.7.1のようになっている。

image.png

図3.7.1 Arduino UNO(引用元:14)

またマイコンボードArduino UNOに積まれているマイコンはATmega328pであり、そのピン配置は図3.7.2の通りである。

image.png

図3.7.2 ATmega328pのピン配置([15]にあったものを編集)

ここで、講義サイトにあったトレイニングボードの回路図、および実体配線図、完成見本図を図3.7.3から図3.7.5に引用する。また図3.7.6は講義時間に完成品の実物をお借りし、別アングルで撮影したものである。不器用なもので手が写ってしまったがご了承いただきたい。

image.png
図3.7.3 トレイニングボードの回路図

image.png
図3.7.4 トレイニングボードの実体配線図

image.png
図3.7.5 完成見本図

image.png

図3.7.6 完成見本図(別アングル)

図3.7.6から、エンジ色のボード(「シールド基盤」という)がArduino UNOへ差し込み可能であることが分かる。
そしてシールド基盤の一番端がArduinoのピンと直接つながる。
図3.7.4 より、シールド基盤の一番端はJP(多分ジャンパピンの意味だろう)とかかれたものとなっていることが分かる。
図3.7.1と図3.7.3を比較し、各JPがArduinoのどのピンに対応するのか書き込んでみた。それを図3.7.7に示す。

image.png
図3.7.7 Arduino UNOの各ピンとの対応を示した回路図

また、図3.7.1と図3.7.2を比較し、Arduino UNOとATega328Pのピン対応を調べると図3.7.9の通りと分かった。Arduino Forumに上がっていた図3.7.8がとても参考になる。ATmega328と書かれたほうで、黄土色の背景に白い文字で数字が書かれているものが各ピンに振られているのがおわかりいただけただろうか。これがArduino UNOのピン番号に対応している。

image.png
図3.7.8 Arduino UNOとATmega328Pのピン対応(引用元:[16])

image.png
図3.7.9 Arduino UNOとATmega328Pのピン対応

3-8. 水晶に時間を聞く仕組み

主な参考:[17][18]
「水晶が時間を正確に刻むことができる理由」と「交流の電気を計算するのによく使われる方法」のどちらにも興味がなければ3-8節は読み飛ばしてほしい。
ただ、もしも読者が小中高生で、将来電気について勉強したいのであれば、交流電気の計算は必須事項であるから、読んでおいて損はないだろう。

3-8-1. 水晶はコイル?抵抗?コンデンサ?

Arduino UNOには16MHzの水晶振動子がのっている。水晶振動子とは平たく言えば薄く切った水晶に電極を取り付けたものである。
この水晶振動子をATmega328Pの所定のピンにつなぐと、ATmega328Pは1/16000000=0.0000000625秒に1回のペースでON/OFFを繰り返す電気を得ることができるようになる。これが「クロック」だ。
薄い水晶がどうしてこんなにも小さな時間を正確に知っているのだろう。その答えは、
「水晶に交流電圧を加えると、その周波数によってコイルとして使えたり、コンデンサとして使えたり、抵抗として使えたりするから」である。
もちろんこれだけでは訳が分からないだろうから、後程ゆっくり解説していく。
今は以下の4つを頭にいれておいてほしい。

  • 低周波な交流電圧に対しては、水晶はコイルのように働く
  • ある一定の周波数では、水晶は抵抗として働く
  • 高周波では、水晶はコンデンサとして働く
  • さらに高周波にしていくことで、水晶は「コイル→抵抗→コンデンサ→コイル→抵抗→コンデンサ→...」を繰り返す。

これらの4つのことをグラフにすると、図3.8.1.1のようになる。
インピーダンスと書かれているのはここでは気にしなくてよい。
右に行くほど周波数が高く、上に行くほどコイルっぽく、下に行くほどコンデンサっぽく働く。上下の真ん中では抵抗として働く。

image.png
図3.8.1.1 水晶のコイル性及びコンデンサ性(引用元:[17])

3-8-2. 理論家たちの苦悩と偉業―コイル、コンデンサは抵抗の仲間

3-8-1節で学んだ通り、どういうわけか水晶は電圧の周波数に応じてコイルになったりコンデンサになったりする。しかも、抵抗とは「コイルとコンデンサの中間的な何か」であるということも予想された。
こういうとき、理論家たちは「コイルとコンデンサと抵抗は一つの式で表すことができるはずだ。式のパラメータを変えることで、コイルがコンデンサになったり、コンデンサが抵抗になったりする」と考える。
(完全に余談だが、物理学者たちは「重力」、「電力」、「磁力」、「原子核を作る力(強い力)」、「素粒子の種類を変えて原子核を壊す力(弱い力)」を1つの式で表すことを夢見ている。現在のところ、電力と磁力と弱い力をまとめることに成功しているそうだ。[19])

コイル、コンデンサ、抵抗を一つの式で表す方法として、「お化けの世界」が使われた。
『交流の電気は、「私たちの世界」を波打っているというより、「私たちの世界」と「お化けの世界」の間を回転しながら行ったり来たりしている』
と考えたそうだ。
この「お化けの世界」の正式名称は「虚数」という。それに対する「私たちの世界」は「実数」という。
この理論によれば、コイルやコンデンサは「虚数方向にも抵抗値があるような抵抗」なんだそうだ。
交流の電気が実数と虚数の間を回転しているとはどういうことなのか、3-8-4節で説明する。

3-8-3. お化けの世界に入る前に

 遥か昔から人類は、説明のできない不思議な現象を「神の仕業」とか「幽霊か魔法の証拠」などと考えてきた。
 そしてこれは科学者においても例外ではない。
例えば読者の皆様は「世界は11次元だ。我々が世界を4次元に感じるのは、残り7次元の世界が原子よりもはるかに小さいからだ。」というのをどこかで聞いたことがあるかもしれない。これだって数字と理屈で尤もらしくしただけだ。少なくとも現時点では誰も観測したことがない以上は「想像上のお話」に過ぎない。しかしこれを受け入れれば「いろんな素粒子がたった一つのひもで説明できる」らしいのだ。[20]
 大昔の人は「神様がいる、魔法がある、幽霊が出ると仮に納得すれば、今よりもっといろいろなことを説明できるようになる」と考えたわけだが、今の科学者はその神様を「11次元のひも」だったり「虚数」だったりとおいているわけだ。仮にそうおいてとりあえず話を進めているわけだから、私たちがその理論を学びたいのなら、「虚数」がどんなに気持ち悪かろうと、受け入れて前に進むしかないのである。
 とはいえ、やはり実証できない概念(物の在り方)を受け入れるのには抵抗を感じるのもわかる。無根拠かつ十分な論理性・客観性が未確保のまま突っ走って「アタシは知っている」と勘違いするのがどれだけ危険であるかは、今の一部の人文カガク界隈を観察すれば火を見るよりも明らかだ。

 「虚数を使わずに考える」ためには、「虚数を使うとどんなことを考えることができるようになるのか」を理解しなくてはいけない。「墓場に現れた火の玉」を「死んだ人の怨念だ。幽霊だ。だから墓場に限って火の玉が目撃されやすいのだ」と説明する人に反論する場合、「火の玉の正体」と「それが墓場で出やすい理由」の両方について別の説明をしなければならないのはわかるだろう。これこそ「相手の主張をまずは理解する」ということだ。
 3-8-4節からは虚数を使った説明を取り入れる。虚数に納得できない場合は、「虚数を論破する」つもりで読んでほしいし、途中で虚数のすばらしさを見出したのならそれでも良いと思う。

3-8-4. お化けの世界

お化けの世界(虚数)そのものは何ら不思議な存在ではない。私たちの世界(実数)と同じ構造をしている。-1は0より1だけ小さいし、1は0より1だけ大きい。最小の端(?)は-∞で、最大の端(?)は∞だ。
ここでは、虚数と実数を区別するために、虚数の後ろに「j」を付けることにしよう。
例えば虚数の3は$3j$、-5は$-5j$だ。但し±1の場合は、1を省略して$±j$ とかく。
さて、虚数と実数の「つながり」を考えると摩訶不思議なことが起こる。1にjを2回掛け算すると、実数の-1になるという。つまり$j^2=-1$だ。
どう不思議かわかるだろうか。
$(正の数)\times(正の数)=(正の数)$
$(正の数)\times(負の数)=(負の数)$
$(負の数)\times(負の数)=(正の数)$
なので、「同じ数を2回かけて負になるような数」は実数には存在しないのだ。

さて、せっかく実数ではない「虚数」なるものをとりいれたのだから、「虚数」がないとできないことをやってみよう。
$n\times j^2$は$-n$に等しいが、これは実数$n$を、原点を中心に180°回転したものである。(図3.8.4.1)

image.png

図3.8.4.1 実数軸

「$j^2$をかける」とは、「原点を中心に180°回転する」ことであるのなら、

「$j^{\frac{n}{90}}$をかける」と「原点を中心に$n^\circ$回転する」と定義してもよさそうだ。(今までにまったくやったことのない定義なので、既存の何かと矛盾することはない。)
この場合、「$j^1$をかける」とは、「原点を中心に90°回転する」ことである。
そうすると、図3.8.4.2のようになる。

image.png

図3.8.4.2 複素数平面

このように、実数の数直線と垂直に、互いに0を串刺しにするように虚数の数直線が交わることでできる平面を「複素数平面」という。
複素数とは、実数や虚数のことをまとめて言う言葉だ。2,3,5,7,11,13...と続く素数とは関係ない。

複素数平面に複素数$n+mj$を図示すると、図3.8.4.3のようになる。

image.png
図3.8.4.3 複素数n+mj

複素数平面をxy平面に見立てると、複素数$n+mj$は点$(n,m)$に例えられる。(図3.8.4.4)

image.png

図3.8.4.4 点(n,m)

3-8-5. お化けの世界を「回転」する交流電気

交流の電気を、まずは実数だけで考えてみよう。
交流電圧の波を$v=V \cos(360°ft)$と表すことにする。
$f$は周波数、つまり周期は$1/f$だ。$t$は時間だ。
$t=\frac{1}{4} \frac{1}{f}$つまり周期の4分の1としてみると、$v= \cos(90°)$となる。
$t=\frac{1}{2} \frac{1}{f}$つまり周期の2分の1としてみると、$v= \cos(180°)$となる。
$t=\frac{1}{f}$つまり周期1つ分としてみると、$v= \cos(360°)$となる。
そう。 $\cos$の引数に出てくる角度は、波の1周期を円の1周360°に見立てたものである。つまり「周期全体のどの辺か」を角度で表現している。これを「位相」という。

ここで、動画3.8.5.1を見てほしい。xy平面上を円運動する点のx成分を縦方向、時間の流れを横方向にしてグラフを書くと、交流の波形と同じもの(正弦波という)が得られるのである。

image.png
動画3.8.5.1 円運動と正弦波(引用元:[21])

運動する点のx成分をとりだすとは動画3.8.5.2のように、ある1方向の運動(動画では縦方向)だけに注目して、他の方向(横方向)は無視して静止しているものとして扱うことを言う。動画でも、右の図では点が縦方向にのみ移動し、横には一切動いていない。

image.png
動画3.8.5.2 円運動とそのx成分(引用元:[22])

それなら円運動のy成分(もちろんx成分に対して直角だ)を虚数を使って表せば、複素数で円運動を表現できないだろうか。理論家たちはまさにこれをやったのだ。

y方向はx方向に対して90°ずれている。

そのため、虚数も実数に対して90°だけずらしてみよう。
ということで、
$v=V \cos(360°ft)$

$v=V( \cos(360°ft)+\cos(360°ft-90°)j)$
と書き換えた。
実際にやってみてほしい。図3.8.5.3に$\cos x$の波形を示すので、
ノートまたは紙を複素数平面として、
複素数
$\cos 0° + j\cos 270° $
$\cos 30° + j\cos 300° $
$\cos 60° + j\cos 330° $
$\cos 90° + j\cos 0° $
$\cos 120° + j\cos 30° $
$\cos 150° + j\cos 60° $
$\cos 180° + j\cos 90° $
$\cos 210° + j\cos 120° $
$\cos 240° + j\cos 150° $
$\cos 270° + j\cos 180° $
$\cos 300° + j\cos 210° $
$\cos 330° + j\cos 240° $
をすべてこの順番で図示してほしい。

image.png
図3.8.5.3 $\cos x$

(ヒント1:複素数平面は、xy平面に置き換えて考えることも出来る。その場合は、
$\cos 0° + j\cos 270° $は点$(\cos 0°, \cos 270°)$
$\cos 30° + j\cos 300° $は点$(\cos 30°, \cos 300°)$
となる。)
(ヒント2: 図3.8.5.3からは次のようなことが読み取れる。
$\cos 0° =1$
$\cos 30° =0.87$
$\cos 60° =0.5$
$\cos 90° =0$
$\cos 120° =-0.5$
・・・
要は、$\cos 0°$から$\cos 360°$まで、30°刻みでわかる)

答えとしては、図3.8.5.4のように円周上の等間隔の点となる。

image.png
図3.8.5.4 各複素数を複素数平面(またはxy平面)に図示

以上のようにして、波の形だった交流電源が、「実数の世界と虚数の世界を回転している」ものであることがわかった。

また、$n\times(\cos x°+j\cos(x-90)°)$は、
大きさ$n$で、
実数の軸を0° 虚数の軸を90°としたとき向きは$x°$
となる。

3-8-6. 交流の電気が「回転」する理由

3-8-6-1. 交流発電の仕組み

ではなぜ交流の電圧や電流は、私たちの世界とお化けの世界の間で回転しているのだろう。
これは交流の電気が生まれる過程を考えると納得できるだろう。
コンセントから来るような電気は発電所で生まれる。
ほぼすべての発電所では、「理科の実験の逆」をやっている。
例えば電池につなぐとモータが回り、豆電球が光るわけだが、
発電所ではモータを回したり、ソーラーパネルに光を当てたりすることで電気を作っている。
発電所の種類には、水力発電所、火力発電所、風力発電所、原子力発電所などがあるが、これらにおいては「モータを回転させること」で交流電力を得ている。
ようは、「電気を流すとモータが回転するのなら、モータを回転させれば電気が生まれるはずだ」という理屈だ。
このことは参考サイト[23]をみると理解しやすい。
モータの回転の「跡」のようなものが、交流の波形となって現れるわけだ。

3-8-6-2. 磁石と電気の関係

実は磁石の正体は「回転方向の揃った電子(の集団)」である。
(厳密なことを言うと、電子は自転しておらず、「自転っぽい何か」と公転をしている。というのも電子が自転しているとみなすと「720°で一回転」とか「回転速度が光速を超える」などの問題が起こってしまうため、「厳密にいうなら自転とは別のことが起こっている」と考えられるからだ。[24])
また、電子には「近くの別の電子に、自分と「同じあるいは反対の」方向に自転させる」という力がある(交換相互作用[25])。(同じ方向に自転するか、反対の方向に自転するかを決めるのは「波動関数」を含む積分値の符号である[26]ため、「電子同士の距離によって決まる」と言う他ない。)
これはクーロン力といって、電子同士の反発力によって生じるものである[26]。

同じ方向に自転させる力が働く場合、その反発力によって同じ方向に自転する電子が増え、全体の電子の反発力がさらに大きくなり、さらに同じ方向に自転する電子が増え、全体の電子の反発力がさらにさらに大きくなり...を繰り返す。そうしてできるのが磁石だ。磁石とはいわば、「とてもたくさんの電子が全く同じ1つの方向を軸にして自転しているような物体」である。磁石の反発力や吸着力は、電子同士の反発力がとてもたくさん集められ、マクロな日常世界でも簡単に見ることができるくらいにまで大きくなったものである。電子の回転軸こそが磁束(磁力線のようなもの[28])である。
(電子が反時計回りに自転している場合(つまり電流が時計回りに流れている場合)、コンパスは奥をN極、手前をS極として指す[27]。)
したがって、「磁石に導線を近づける」ことをすると、導線内の電子も反発し、これによって電流が流れるのである。当然導線を増やせば、導線の数だけ反発する電子も増え、合計した電流は大きくなる(但し、導線ごとの電流は変わらない)。そこで技術者は、「一つの導線をあたかもたくさんの導線であるかのようにみえるよう工夫して磁石に近づける」ことをしてみた。
その工夫が、「導線をぐるぐる巻く」というものである。これがコイルだ。

3-8-6-3. モータが電気を生む仕組み

コイルに発生する電気の大きさは、「一定時間でどれだけ、コイルにぶつかる磁束(電子の回転軸)が増える(減る)か」によって決まる。これをレンツの法則という。
つまり磁石のどんなに近くにコイルを置いても、磁石とコイルのどちらかを動かさない限り電気は流れない。
動画3.8.6.3.1のように磁石と磁石の間で、コイルを回転させた場合を考えてみよう。
コイルの向きが変わることで、コイルにぶつかる磁束の個数が変化する。
動画から、例えばコイルが磁束に対して平行になれば磁束は少ししかぶつからないし、
垂直になれば多くの磁束とぶつかることが分かる。
動画の青いグラフは、「時間」と「コイルにぶつかる磁束の本数」の関係を表している(裏からぶつかる場合はマイナスとしている)。
動画のピンクのグラフは「時間」と「コイルにぶつかる磁束の本数の変化速度」の関係を表している。これにマイナスをかけると、電気の大きさ(赤色のグラフ)が得られる。確かに交流電気の波形をしている。

image.png
動画3.8.6.3.1 誘導起電力(出典:[29])

3-8-6-4. レンツの法則

何故磁束の本数の変化速度によって、発生する電気の大きさが決まるのか、考えてみよう。
磁束というのは電子の回転軸であり、方位磁針の北の方向に右手の親指を合わせ、グッドサイン👍を作ると、親指以外の指の方向に電流が流れていること[27]が分かる。これを右ネジの法則という。(図3.8.6.4.1)
電子は電流と反対向きに動くので、電子は「親指以外の指と反対方向」に回転している
image.png
図3.8.6.4.1 電流と磁束の方向関係(右ネジの法則)

そして、磁束の方向を左手の人差し指、電流の方向を中指に見立て、親指、人差し指、中指がそれぞれ互いに直角になるようにすると、親指の方向に力が発生することが分かっている。この力をローレンツ力といい、この法則をフレミング左手の法則という。(図3.8.6.4.2)
image.png
図3.8.6.4.2 電流、磁束、ローレンツ力の方向関係(フレミング左手の方向)

電流の方向は電子の動く方向と反対なので、右手を使えば中指が電子の進行方向、親指が電子の受ける力の方向となる。
さて、電子の進行方向を左向き、磁束の方向を前向き(手前から奥)としてみると、電子にかかる力の方向は上向きとなる。
左に進む電子が上向きに力を受けると、電子は時計回りに運動する。・・・①
左向きに進もうとする宇宙船の真上に星があったとき、宇宙船が吸い寄せられ、星の周りを回ることを考えてみればわかりやすいだろう。(動画3.8.6.4.3)

image.png

動画3.8.6.4.3 時計回りの円運動(省略)

しかし、前向き(手前から奥の向き)の磁束は、右ネジの法則より(時計回りの電流つまり)反時計回りで回転する電子の軸であるはずだ・・・②
①と②は反対方向になってしまった。
「(前向きの磁束=)反時計回りに回転する電子が近くに現れたら(②)、コイル内の電子は時計回りに運動する(①)」というのだ。何故だろう。

$ネットではこれの理由を「作用反作用の法則」と説明する意見が散見されるが、これは完全な誤りである。$
$作用反作用の法則[30]では、物体Sが物体Oに作用(力) \overrightarrow{V}を加えた時(これをS. \overrightarrow{V}(O);と書くことにしよう)、$
$次のような反作用\overrightarrow{V_{rev}}が働くとしている。$
$・\overrightarrow{V_{rev}}はOがSに対してするものである。つまりO. \overrightarrow{V_{rev}}(S);$
$・\overrightarrow{V_{rev}}=-\overrightarrow{V}$
$・\overrightarrow{V_{rev}}と\overrightarrow{V}の作用線は一致する$
$そもそもレンツの法則は、作用線の一致を満たしていない。$
$それに、変位電流にローレンツ力が働くと仮定すれば変位電流のローレンツ力が$
$コイルや磁石にかかるローレンツ力の反作用となることが分かっている[31]$

これを説明するには電磁気学を使って動電場における磁気と電気の関係を考えなくてはならず、思いのほか時間がかかる。そこで今回は省略とさせていただく。

3-8-7. インピーダンス

 3-8-5節や3-8-6節で述べた通り、交流の電気は(xy平面内の)「回転」によってつくられる。

具体的には、回転のx成分を取り出すことで、「正弦波」を取り出している。

また古い複素数に$j^{\frac{n}{90}}$をかけて得られる新しい複素数は、

複素数平面上で、古い複素数を(反時計回りに)$n^\circ$だけ回転させたものである。

このことにより、複素数を使えば、正弦波から回転を復元することができるのだった。

すなわち複素数を使わない場合$V \cos(360^\circ ft)$と表されるような正弦波は、

複素数を使って$V \left( \cos(360^\circ ft) + j \sin(360^\circ ft-90^\circ )\right)$と書くことができ、これは「大きさ$V$、角度(位相)$360^\circ ft$の複素数」を意味する。

大きさが変化せず、位相が時間に比例するのだから、確かに回転を表現している。

 

 ところで、コイルやコンデンサの電流と電圧の関係では、「位相が90°ずれる」というのがある。(中学か高校の理科で習っただろう)

複素数を使うと、このことがインピーダンスという、「抵抗のようなもの」に書きこめてしまうのだ。

コンデンサでは交流電圧をかけると、電流の位相が90°進む。

90°進むとは複素数jをかけることと同じだ。

したがって、$(電流)=(電圧)×j×(実数)$

と書くことができるから、

$(インピーダンス)=\dfrac{(電圧)}{(電流)}=\dfrac{(電圧)}{(電圧)×j×(実数)}\propto j^{-1}=-j$

となる。つまり、コンデンサのインピーダンスは「虚部が負、実部が0の複素数」で表すことができるのだ。

同様に考えると、コイルのインピーダンスは「虚部が正、実部が0の複素数」で表すことができる。

図3.8.1.1における「コイル性」「コンデンサ性」というのは虚部の正負と大きさを表しているものである。
抵抗もインピーダンスを考え、「虚部が0、実部が正か負の複素数」ということができる。

また、インピーダンスの実部を抵抗、虚部をリアクタンスという場合がある。

つまり
$(インピーダンス)=(抵抗)+j(リアクタンス)$
だ。コイルのリアクタンスは$360^\circ fL$, コンデンサのリアクタンスは-$\frac{1}{360^\circ fC}$で計算される。$L$はコイルの、$C$はコンデンサの、リアクタンスを決める物理量である。

これらについては参考サイト[32][33]で解説が施されているのでここでは省略する。
 

 この表し方により、コイルとコンデンサがどちらも存在する場合のインピーダンスも計算できるようになる。
例題として、次の回路の合成インピーダンスを求めてみよう。(立式だけでよく、計算はしなくてよい)
image.png
図3.8.7.1 コイル、コンデンサ、抵抗を含む回路
 
 まず、上の$C_0$のインピーダンスは$-j\frac{1}{360^\circ fC_0}$だ。
下の3つの素子の合成インピーダンスは$R_1 + j(360^\circ fL_1 - \frac{1}{360^\circ fC_1})$
上下のインピーダンスを合成すると、
$
\dfrac{1}
{
\frac{1}{-j\frac{1}{360^\circ fC_0}}
+
\frac{1}{R_1 + j(360^\circ fL_1 - \frac{1}{360^\circ fC_1})}
}
$
となる。

3-8-8. インピーダンスと周波数

3-8-7節で求めたインピーダンスは複素数であるから、変形すれば必ず
$(実部)+j(虚部)$
の形で表すことができる。さらに次のように計算すると、この複素数の絶対値(原点からの距離)を求めることができる。
$\sqrt{(実部)^{2}+(虚部)^{2}}$
素子のパラメータ(インダクタンス、抵抗値など)は変えられないものと考えたとき、
唯一の変数は周波数$f$である。
したがって、「インピーダンスの絶対値が周波数の関数になる」ということが起きるのだ。
インピーダンスの絶対値は(抵抗と同じで)電流の流れにくさを表すので、これの逆数をとれば、「周波数ごとに、どれぐらいの電流を流すか」が分かる。
その例が図3.8.8.1である。

image.png
図3.8.8.1 C0=0.001[F], C1=0.1[F], R1=0.01[Ω], L1=1[H]のときの周波数対電流の比特性

このように、各素子のパラメータによっては、特定の周波数(共振周波数)だけ大きな電流が流れるような場合がある。実は、水晶振動子はこれなのだ。水晶は電気的には図3.8.7.1と同じ構造をしているのだそう。
したがって、「いろんな周波数が混じったような電圧」を水晶にかけると、共振周波数の電流だけ大きく流れるようになる。これによって、水晶は時間を正確に刻むことができるのである[34]。これでクロックを取り出せそうではないか。
また、「いろんな周波数が混じったような電圧」というのは、回路にどうしても載ってしまう雑音を増幅して利用するそうだ[35]。

3-8-9. 水晶発振回路

主な参考:[36]
 さて、水晶には「様々な周波数を持つ電圧から、共振周波数の電流(クロックの元)を取り出す」力があることが分かった。

 では、「さまざまな周波数を持つ電圧」というのはどこから来るのだろう。
実はこれは「ノイズ」を「NOTゲートで増幅することで」利用しているそうだ。
NOTゲートとはもちろん、デジタル回路(論理回路)で出てくる、「入力が高電圧なら定電圧を、入力が定電圧なら高電圧を出力する」という素子だ。
電圧の入出力特性を書くと、図3.8.9.1のようになる。
image.png
図3.8.9.1 NOTゲートの電圧の入出力特性(引用元:[37])

2か所の青いところをみると、確かにV_INとV_OUTの大小関係が逆転している。
そして、その間の赤いところが、「符号は負で、絶対値が大きい」傾きになっていることが分かる。赤の真ん中らへんくらいの大きさの直流電圧(バイアス電圧)を加えることで、図3.8.9.2のように「小さなノイズを増幅」することができるのだ。
image.png
図3.8.9.2 NOTゲートを(反転)増幅回路として利用する例(引用元:[38])

したがって、水晶とNOTゲートを図3.8.9.3のようにつなげば、クロックを取り出せそうだ。

image.png
図3.8.9.3 (おそらく)失敗する例

しかし、これだと「バイアス電圧」が含まれていないので、多分うまくいかない。
また実際の回路では、発振周波数微調整のため、水晶(振動子)の両端にコンデンサを取り付けることが多い。
バイアス電圧については、「帰還抵抗」を付けることで取り出すことができる。
これらのコンデンサ、帰還抵抗を取り付け、ついでにクロック出力も明示したものが図3.8.9.4である。
image.png

図3.8.9.4 クロックを出力する回路

また、図3.8.9.4で示した青い2つの点は、マイコンのXTAL端子2つを表している。(青い点2つより上側が、マイコンにもともと備わっている。)

4. アセンブラを作りながら理解する機械語とアセンブリ言語

4-1. 機械語とアセンブリ言語の関係

マイコンをはじめ、ほとんどすべてのコンピュータは、論理回路の集まりである「CPU」によって「2進数の計算」をすることによって、処理をしている。
論理回路は、今入力されている2進数だけによって出力が決まる「組み合わせ回路」と、
過去の入力も出力に影響してしまうような「順序回路」の2種類に分けられる。
不思議なことではあるが、これらとクロックを複雑につなぎ合わせることによって、実に様々な処理ができるのだ。
例えば、動画[39]の3:06で、「RAM」へsnake.outという「機械語で書かれたスネークゲーム」を書き込み(図4.1)、3:13で「RESET」を押すと、左の方でスネークゲームが実際に動いている(図4.2)のが分かるだろう。ボタンを押した方向に緑のドット列が方向転換し、餌を食べながら成長していくゲームだ。

image.png
図4.1 IOレジスタへ、機械語で書かれたスネークゲームのプログラムをRAMへ書き込んだ様子(引用:[39])

image.png
図4.2 書き込んだゲームのプレイ画面(引用:[39])

RAMというのはRandom Access Memoryのことで、CPUに読み取らせるデータの書き込み口だ。RAMに書き込まれたデータはそれぞれ決められたワイヤに送られ、論理回路を通って演算されることを繰り返す。その結果として、スネークゲームが成立するのだ。

もちろん、RAMに書き込んだ機械語も適当に書かれたものでは決してない。
そのCPUが持つ論理構造によって決まるルールに則って書かれたものである。
このルールが、機械語の「文法」に当たる。文法というからには述語や目的語が存在する。(主語は存在しない場合が多いようだ)
述語や目的語などの「単語」は単なる数字なので、人間にはとても読めない代物だ。
単語に英単語を割り当て、語順その他も少しだけ整えれば、少しはマシになって、人間でもなんとか読める程度の物にはなる。これをアセンブリ言語という。

4-2. アセンブラとは

アセンブリ言語を機械語に変換したり、その逆をやったりしてくれる「翻訳者」のことを「アセンブラ」という。
機械語、アセンブリ言語に関しては単語や文法がごく限られたものであり、また再帰構造もなく、述語ごとに目的語の種類や変数が定められているため、BNF記法を必要としない言語であるといえる。

そのため、文字列置き換えのプログラムを書ける人であれば誰でも作れてしまう。

4-3. AVR(ATmega328P)の機械語の文法

多くの機械語は動詞(命令・オペレータ)が中心となっている。というのも動詞(オペレータ)によって目的語(オペランド)の個数や種類が決まるからだ。
AVRの機械語もその例外ではない。AVRの機械語やアセンブリ言語の仕様は参考サイト[40]または[41]から入手可能だ。

4-4. エクセルアセンブラの開発

AVRではアセンブリ言語もあらかじめ用意されているが、正直わかりにくい。
例えば「ADIW」は「汎用レジスタ対に即値を加算せよ」という命令だ。
これを3、4文字の英字に無理矢理縮めるものだからわかりにくい。
そこで、独自のアセンブリ言語と、それに対応するアセンブラを開発するしてみることにした。
また、「どこに命令、引数、その他が来るか」をはっきりさせたいことや、プルダウンで命令や引数を選択できれば便利であることから、エクセルを使って開発することにした。

4-4-1. 方針

通常のエクセル関数(マクロ不使用)では静的な処理しか行えない。
「ある複数のセルに対して何らかの関係を結ぶ」ことに関しては柔軟に対応できるが、反復処理をさせたり、セルの値を根拠として処理を分岐させるなどのことはできない。
そのため、独自のアセンブリ言語をアセンブリ言語に変換することは容易かもしれないが、機械語への変換や、動作のシミュレーションなどはマクロを使わなければ難しそうである。
そこで、まずは「独自のアセンブリ言語」をAVRオリジナルのアセンブリ言語に変換する機能をマクロなしで実装し、その後余裕があったら機械語への変換や、動作シミュレーションをやろうと思う。

4-4-2. シートの準備

まず、参考pdf[40]の625~627ページから命令の一覧を読み取り、エクセルに貼り付けた。pdfの仕様上、表のままコピーすることができなかったので、pdfを変換するサイトを通してコピーした。その都合上、ところどころ文字化けがある。
image.png
図4.4.1 エクセルに貼り付けた命令セット

「#clock」の列はデータ形式を「文字列」とした。そうしないと、データが勝手に日付に置き換わる。

次に、A列の左に新しい列を挿入し、図4.4.2のようにした。またシートに「命令セット」という名前を付けた
image.png
図4.4.2

新たなシート「入力画面」を作り、参考サイト[42]を参考にして入力画面のD列全体に、命令セットのA列の内容を選択するプルダウンを適用した。(図4.4.3)
image.png
図4.4.3

この後、E列以降を新たなシート「処理」へ移動した。

次にE1セルに
=VLOOKUP($D1,命令セット!$A$1:$G$132,COLUMN(B$2),FALSE)
と入力し、列方向はGまで、行方向は全体にオートフィルした。
このコードは、命令セットシートのA1~G132(これは、命令セットの全体)の「一番左の列」(つまりA1~A132)の中に、自シートのD1に書かれているものと一致するセルが存在しないか探し、一致した最初の行の、「どこかの列」の内容を返すものである。「どこかの列」というのは列番号で指定される。今回指定されているのはCOLUMN(B2)であり、これはB列の列番号(即ち2)である。
すると、図4.4.4のようにD列での選択に応じてE~G列の同じ行に、その命令の詳細を表示するという仕組みが完成した。
image.png
図4.4.4

4-4-3. オペランド数の判定

「処理」シートの1行目の上に新たな行を追加し、図4.4.3.1のようにする。
image.png
図4.4.3.1

B列を参照するコードを書くと、その命令に必要なオペランドの数を求めることができる。これをやっていこう。

H2セルに次のように入力し、下方向にオートフィルする。
=IF(B2=0,0, IF(COUNTIF(B2,"*,*"), 2, 1))
これはB2セルが0(VLOOKUP関数にて、空白は0に置き換わっている)であればオペランド数0と判断し、
そうでなければIF(COUNTIF(B2,"*,*"), 2, 1)を計算している。
IF(COUNTIF(B2,"*,*"), 2, 1)はB2セルがカンマを持っていればオペランド数2、持っていなければ1と判断している。
オペランド数は高々2であるため、このような単純な方法でオペランド数を判定できる。

以上のことをしたのが図4.4.3.2である。

image.png
図4.4.3.2

図4.4.3.2のH列からは、CLRのオペランド数が1、IJMPが0、ADIWが2であることがわかる。そしてその正当性はB列により明らかだ。

4-4-4. オペランドの種類の判定

第1、第2オペランドの有無や種類を判定するコードを書こう。

有無については、オペランド数の情報からすぐに判断できる。
I列で第1オペランド、J列で第2オペランドの有無を判定するなら、
I2セルには=IF(H2>0,"有","無")
J2セルには=IF(H2>1,"有","無")
と入力し、それぞれ下にオートフィルすればよい。
第1オペランドが存在する場合でその種類(名前?)を調べたい場合は、
同行B列でカンマより左を抽出する処理LEFT(B2,FIND(",",B2)-1)をすればよい。(FINDは、指定した文字が、文字列の何番目に出てくるか調べる関数だ)
しかし、これだと第1オペランドしかない場合はカンマもないためにエラーが起こる。エラーの場合はB2をそのまま返してしまえばよい。したがって、
I2セルは、先ほど示したコードのうち"有"IFERROR(LEFT(B2,FIND(",",B2)-1),B2)
に置き換えてしまえばよい。
J2セルで第2オペランドの種類を調べる場合は、
"有"RIGHT(B2,LEN(B2)-FIND(",",B2))で置き換える。こちらはカンマが必ず存在するため、エラーは起きない。
これらを施すと、図4.4.4.1のようになった。

image.png
図4.4.4.1

n. 注釈など

[0]ハーバードアーキテクチャはノイマン型を修正したものに過ぎず、非ノイマン型とは言わないと考える流儀もある(コメントをいただきました)
[1]http://edu.net.c.dendai.ac.jp/micom/
[2]https://www.microchip.com/webdoc/avrassembler/avrassembler.wb_directives.html#avrassembler.wb_directives.CSEG
[3]https://www.microchip.com/webdoc/avrassembler/avrassembler.wb_directives.html#avrassembler.wb_directives.ORG
[4]http://www.apony.com/elec/avr2/avr2.html
[5]https://books.google.co.jp/books?id=tbfMBQAAQBAJ&pg=PA149&lpg=PA149&dq=int_vectors_size+;&source=bl&ots=7gqbXj6JQ5&sig=ACfU3U3LTfy-gHsdGwW4nMwg1GxvGzhBTw&hl=ja&sa=X&ved=2ahUKEwjnkLK6trTlAhUVNaYKHaB0BKoQ6AEwB3oECAkQAQ#v=onepage&q=int_vectors_size%20%3B&f=false
[6]http://easyelectronics.ru/avr-uchebnyj-kurs-ustanovka-avr-os.html
[7]http://edu.net.c.dendai.ac.jp/micom/2019/8/#2
[8]http://www.cs.shinshu-u.ac.jp/~haeiwa/m-com/instruction.html
[9]https://www.microchip.com/webdoc/avrassembler/avrassembler.wb_directives.html#avrassembler.wb_directives.EQU
[10]https://www.microchip.com/webdoc/avrassembler/avrassembler.wb_directives.html#avrassembler.wb_directives.MACRO
[11]http://www.picfun.com/asm08.html
[12]https://www.microchip.com/webdoc/avrassembler/avrassembler.wb_directives.html#avrassembler.wb_directives.CSEG
[13]https://tool-lab.com/make/pic-basic-6/
[14]http://lecture.nakayasu.com/?p=2382
[15]https://www.universal-solder.ca/product/arduino-uno-basic-bread-board-parts-kit-incl-atmega328p-pu-with-boot-loader/
[16]http://arms22.blog91.fc2.com/blog-entry-503.html
[17]http://nitride.meijo-u.ac.jp/iwaya/ex2/h25/2-4.pdf
[18]https://www.cqpub.co.jp/dwm/contents/0111/dwm011101120.pdf
[19]https://higgstan.com/unified-theory/
[20]http://www2.yukawa.kyoto-u.ac.jp/~shigeki.sugimoto/YITP50.pdf
[21]https://www.watto.nagoya/entry/2016/01/22/003000
[22]http://www.wakariyasui.sakura.ne.jp/p/mech/tann/tannsinn.html
[23]http://www.energia.co.jp/kids/kids-ene/study/qa/elect.html
[24]https://xseek-qm.net/spin.html
[25]http://www.ne.jp/asahi/shiga/home/Lecture/magnet.htm
[26]http://home.sato-gallery.com/education/kouza/jisei_kiso.pdf
[27]右ネジの法則
[28]http://superhealth.jp/?p=1046
[29]http://www.wakariyasui.sakura.ne.jp/p/elec/kouryuu/kouryuu.html
[30]http://www.wakariyasui.sakura.ne.jp/p/mech/tikara/hannsayou.html
[31]https://www.jstage.jst.go.jp/article/pesj/25/4/25_KJ00005894288/_pdf/-char/ja
[32]https://wakariyasui.sakura.ne.jp/p/elec/koukairo/koirukou.html
[33]https://wakariyasui.sakura.ne.jp/p/elec/koukairo/konnkou.html
[34]http://t-shirafuji.jp/lecture_notes/electric_circuits_i_open/Ch07.pdf
[35]https://eman-physics.net/circuit/resonance.html
[36]http://www.nahitech.com/nahitafu/mame/mame1/xtal.html
[37]http://imasaracmosanalog.blog111.fc2.com/blog-category-46.html
[38]http://www.kairo-nyumon.com/analog_basic.html
[39]https://www.youtube.com/watch?v=-z4qFnSLnn4
[40]http://akizukidenshi.com/download/ds/microchip/atmega328.pdf
[41]https://avr.jp/user/DS/PDF/AVRinst.pdf
[42]https://kokodane.com/kihon30.htm

1
1
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1