免責事項

注意、免責事項について
・高電圧、大電流その他高エネルギを扱う実験を行う際にはくれぐれも安全に配慮し、細心の注意を払って行うようにしてください。
・当ブログの記事を参考にして発生した損害についてFEL研究室はいかなる責任も負えませんでご了承ください。
・当ブログに掲示している画像、動画及び文書の著作権は放棄しておりませんので、転載等の際はご一報していただくようにお願いします。
・何かありましたらkkt_322[at]yahoo.co.jp([at]を@に変えてください)までご連絡ください。

2016年2月21日日曜日

~AVRマイコン開発記~ 第三章:アセンブラ読解②

こんばんは。KKTです。テスト期間中なので少し引き気味で記事を書いております。時が流れるのは速いものでもうこのテストが終われば今年度も終わりです。こんな感じで時が流れるのに無意味に反発して時間を浪費している(=記事を執筆している)感覚は、エスカレータに乗った時逆方向に歩いて静止する遊びの感覚に似ている気がします。エスカレータで思い出したのですが冬場防寒着とエスカレータの段の横の壁(段と一緒に動かない)を絶妙にこすり合わせることで連続的に近い形で静電気を発生させ刺激を得るという遊びを最近考案しました。
三連続ですがAVRの記事の続きです。前回のアセンブラの解説の続きを書きます。 



5    LDI R16, 0x00
6    OUT PORTB, R16
たぶんここからですね。5行目はもうお分かりの通り汎用レジスタR16に0x00を代入しています。6行目は何やらPORTBというI/Oレジスタに値を書き込んでいますがPORTBというのはチップのI/O端子のHIGH/LOWをコントロールするレジスタで0でLOW、1でHIGHを出力します。前回の下手くそなDDRBの図と同様下位ビットから順番にピンが割り当てられていてそれぞれのピンを制御できます。ここでは0x00を書き込んでいますので全ピンLOWになります。ちなみにDDRBレジスタに0を書き込んで入力にしたピンをPORTBで1を書き込むと内部プルアップが有効になります。


7    main:
プログラムはジャンプ系の命令が無ければ上から順番に実行されていくので次は7行目となります。main関数の始まりです。


8          RCALL delay
RCALLというのは「サブルーチン呼び出し」の命令です。サブルーチンというのは特定の処理を行うひとかたまりの命令郡のようなものです。呼び出して、その処理が終わると呼び出した箇所に戻ってきます。特定の処理をひとかたまりで呼び出せるようにしておくと後からその処理をもう一度行いたい時に簡単にできたり、プログラムが読みやすくなったりします。ここではdelayというラベル名のサブルーチンを呼び出しています。


15    delay:
ここからdelayラベルで呼び出される命令群が始まります。


16        LDI R16, 25
汎用レジスタR16に25を代入します。


17    dly2:
新たなラベルdly2を作りました。上から順番に事項されるのでこれが実行されます。


18        LDI R17,50
汎用レジスタR17に50を代入します。


19    dly1:
また新たなラベルdly2を作ります。


20        LDI R18,234
版用レジスタR18に234を代入します。


21        dly0:
ラベルを作りました。


22        NOP
NOPという命令は何もしないという命令です。ここでは待ち時間を作るために1クロックの間何もさせていません。


23        DEC R18
DECという命令はデクリメントでR18レジスタから1引きます。


24        BRNE dly0
BRNEは「不一致で分岐」です。直前の演算結果が0でなければ分岐します。分岐先は命令の直後に書いた「dly0」です。直前の演算結果というのはDEC R18ですね。つまりR18から順番に1引いていって0にならないうちは分岐して1引くを繰り返しますが0になると次の行に進みます。つまりdly0は234回繰り返されることになります。


25        DEC R17
同様R17から1引きます。


26        BRNE dly1
R17が0でないうちはdly1に分岐します。


27        DEC R16
R16から1引きます。


28        BRNE dly2
R16が0でないうちはdly2に分岐します。


29        RET
RETという命令は「サブルーチンから復帰」です。
復帰するので先ほどRCALLで呼び出した場所に戻ります。


9          LDI R16, 0xFF
10        OUT PORTB, R16
なので9行目に戻ります。汎用レジスタR16に0xFFを代入して、PORTBに書き込みます。この処理でマイコンチップの全出力ピンがHIGHになるのでLEDが点灯します。


11        RCALL delay
もう一度delayサブルーチンを呼び出します。


12        LDI R16,0x00
13        OUT PORTB,R16
全出力ピンをLOWにしてLEDを消灯させます。


14        RJMP main
RJMPは相対分岐といって指定した箇所に無条件でジャンプします。mainというラベルにジャンプしているのでまた7行目に戻って上記の動作を延々と繰り返します。




以上で大体の流れは理解できた方もいると思います。Delayの部分では三重ループになっており最初R18の値を引いていき0になったらR17から1を引いてからR18を234にセットしなおしてまた234回ループ。さらにそれを繰り返してR17も0になるとようやくR16から1を引いて……R16が0になるまで繰り返します。全ループ回数は292500回で、デフォルトのクロックが1.2MHzで周期833nsです。ループ内でNOPとDECでそれぞれ1クロック、条件分岐で1クロック使うので単純計算で730msです。これにさらに途中のdly1とかの分もあるので実際はもう少し長くなります。


ほとんど僕のメモ的なモノなのでわかりにくくても僕が分かれば大丈夫なんですね。
それでは、今日はこの辺で。

2016年2月13日土曜日

~AVRマイコン開発記~ 第二章:アセンブラ読解①

こんばんは。KKTです。今回もAVR関係の記事です。カラフルなケーブルや虹色のフラットケーブルを見てると思い出すのがこれ
そう水引です。靴紐の上位互換みたいな奴ですが、僕も結い方を調べて編んでみることにしました。
 こんな感じになります。
思った以上に綺麗にできなくて驚いてきます。線の色が汚いからなのかなと思いカラフルなのでもやってみます。
 いい線いってる感じはありますがまだイマイチですね。

さらに、勘の良い方はこれを何かに付けるところまで想像できるかと思います。
 菓子折りならぬ素子折りの完成です。もう少し高価な
 素子にすることで渡された人も大喜びです。僕だったら水引そっちのけで素子貰ったことに大喜びすると思います。

一応試してみる方のために参考ページです。
http://mizuhiki.jp/mizuhikiasobi/

感想としては何回も編むことで水引の編み方を覚えられたので嬉しかったことと、水引を編むより素子に水引をうまく装着するのが難しかったことですかね。


さて雑談はこれくらいにして本題いきますよ。まず前回のLチカのアセンブラの読解からいきます。前書いたコードはよりわかりづらくなるレベルのコメントと改行のおかげで読みづらいことこの上ないので少し構成を変えます。

1    .INCLUDE "tn13def.inc"

2    setup:
3    LDI R16, 0xFF
4    OUT DDRB, R16
5    LDI R16, 0x00
6    OUT PORTB, R16

7    main:
8          RCALL delay
9          LDI R16, 0xFF
10        OUT PORTB, R16
11        RCALL delay
12        LDI R16,0x00
13        OUT PORTB,R16
14        Rjmp main

15    delay:
16        LDI R16, 25
17    dly2:
18        LDI R17,50
19    dly1:
20        LDI R18,234
21        dly0:
22        NOP
23        DEC R18
24        BRNE dly0
25        DEC R17
26        BRNE dly1 
27        DEC R16
28        BRNE dly2
29        RET


行番号を追加して不要なコメント削除しました。
一行目から僕だけが分かるレベルの解説をしてきたいと思います。





1    .INCLUDE "tn13def.inc"

最初にドット(.)が付く行は命令ではなく表記やレジスタについての定義で直接プログラムに関わってくるものではありません。.INCLUDEは含む的な意味なので、ここではtn13def.incというファイルをプログラム内で読み込め、といった感じでしょうか。ちなみにこのtn13def.incというファイルはATtiny13A用のインクルードファイルで中身を見ますと各種レジスタの名前とビット位置などがズララーッと書き連ねられています。暇な人は一読あれ。


2    setup:

2行目からプログラム本体が始まります。割り込み処理とかを除けば電源を投入してからプログラムは上から順番に読まれていくのでまず最初に2行めが実行されます。コロン(:)が後ろに付いている文はラベルと言ってその後に書かれる幾つかの命令をまとめて(関数と呼ぶ)その名前を付けています。付ける名前はなんでも良いです。ここでは電源投入してから各種設定を行うので”setup”という名前にしました。始まりは2行目で明確ですが終わりはどこかと言うと

15    delay:

までで次のラベルまでですね。 ではこのsetupと名付けた関数の動作を見ていきます。


3    LDI R16, 0xFF

関数内でも命令は上から順番に実行されるのでまず3行目が実行されます。LDIというのは命令の1つで
LDI Rd,k 
と書きます。Rdはレジスタ、kは定数です。意味は「レジスタRdに定数kを代入せよ」となります。ここではR16というレジスタに0xFFを代入しています。R16という汎用レジスタは8ビットの値を保存できる変数のようなものでATtiny13AにはR0~R31まで32個の汎用レジスタが使用できます。また、定数kの書き方ですが”0xFF”と書くと「16進数でFF」を表します。「2進数で11111111」なら”0b11111111”で「10進数で255」ならそのまま”255”です。8ビットレジスタの様子を以下の図に示します。
 Rdというレジスタに0xFFを代入した様子です。8ビットなので0と1を保存できるメモリが8個あって(1と書いてある箱)7ビット目、6ビット目というふうにそれぞれに値が代入されています。


4    OUT DDRB, R16

OUTというのはこれまた命令で
OUT P,Rd
と書くと「PというI/OレジスタにレジスタRdの値を出力せよ」となります。I/OレジスタというのはAVRマイコンの入力/出力を管理するレジスタです。ATtiny13AにはI/Oピンが6本あります。この6本それぞれの状態がDDRBというレジスタの0~5ビット目までに格納されています。DDRBというレジスタも汎用レジスタ同様8ビットなので、0~7ビットまで0と1を格納できるメモリがあるのですがATtiny13Aでは6個しか使わないので上から2つはマイコン側に差し押さえられていていじっても無効になっています。DDRBレジスタについての図を以下に示します。
上から2つのビットは差し押さえられているので常に0です。ですので0xFFを代入しても0x3Fにしかなりません。DDRBレジスタの各ビットごとに割り当てられているマイコンのピン番号も記載してみました。0ビット目は5番ピンを入力にするか出力にするか、1ビット目は6番ピンを入力にするか出力にするかという感じで設定できます。便利ですよね。で、今回はDDRBに0xFFを出力したので6ピン全てのI/Oポートは出力として設定されたわけです。


とまぁこんな感じで解説(メモ)していくのですが疲れたので続きはまた次回ということで。

それでは、今日はこの辺で。

2016年2月10日水曜日

~AVRマイコン開発記~ 第一章:導入~動作確認

こんばんは。今朝注文していたAVRマイコンが届きました。嬉しかったです。今日は結構長くなる予定なので冒頭で油売っている場合ではありません。余談ですがPCのメモリ16GBにしちゃいました。決して僕に悪意があるわけではありませんが、今回の記事は参考にできそうな部分があるように見えたとしてもそれは錯覚です。真似して何かモノを壊されたりしても(ここの読者の方なら予備をたくさん買っているので特に問題ないかと思われますが)残念なので、参考にする場合はくれぐれも自己責任、自分の判断でよろしくお願いします。ちなみに僕は大事な場面ではマージンを甘く見すぎてよく失敗しますがこういうお遊び工作では何故かマージンを見すぎてしまうようで必要数×5~10くらいは買ってしまうことが多いです。

用意したモノ
・ArduinoUNO(僕が用意したのは互換ボードでした^^)
・PC(Win環境でやります)
・ブレッドボーヨ
・書き込みたいAtmelの適当なマイコン(僕が用意したのはATtiny13A)←やすかったからです。
・LED、抵抗等の部品

まず、ArduinoUNOにはArduinoUNOをAVRライタとして使えるようにするファームウェアを書き込んでおきます。ArduinoISPという名前でArduinoIDEからファイル→スケッチの例→11.ArduinoISP→ArduinoISPをクリックしてやると長いコードが表示されます。
取り敢えず何も考えず(いつものこと笑)書き込んでおきます。あとついでに
 赤線で強調してあるCOM3というところ。この数字は人によって違うのですが後から必要になるのでメモしておきましょう。

ArduinoIDEはこれ以降使わないので閉じてもらって結構です。


続いて、開発環境を入れてきます。初めに言っておきますが何故か我が家のPCでは統合開発環境から直接AVRマイコンを焼けなかったので統合開発環境はコンパイルやデバッグのみをさせて、書き込みは別のソフトウェアを使用します。

初めに統合開発環境AVR Studio 4を入れます。こちらに共立さんの分かりやすい導入ページがあるので見たら分かります。めんどくさい人は
から飛んで「AVR Studio 4.19 (build 730)」を探して左のCDのマークみたいなのを押して必要事項を入力してAtmel社からのメールを待つだけです。メール内にダウンロードリンクがあるのでダウンロード、インストールするだけです。

次に書き込みに使用するソフトウェア「AVRdude」を入れます。こちらからダウンロードして同様にインストールするだけです。

以上で書き込む準備が整いました。
取り敢えず定番のLチカをやってみようと思います。チップはATtiny13Aを使ってみます。
AVR Studioを起動してプロジェクトを作っていきます。
New Projectから
プロジェクト名を入力して(フォルダを作るにチェックを入れとくとあとで見やすい)、AssemblerかGCCかを選択します。今回はAssemblerでやってみます。Next>>を押します。
 ここは良くわからないですがデバッガーを選択しろと言っています。動作に影響は無さそうですが取り敢えずAVR Simulator 2にしてみました。横の窓から使いたいデバイスを探してクリックしてFinishでプロジェクトは作成完了です。


 こんな感じの画面になります。
これまた何も考えずに下のソースファイルを上の画面の真ん中の枠内にコピペしてみましょう。



↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

.INCLUDE "tn13def.inc";定義ファイル

setup:;setupというラベル
LDI R16, 0xFF;R16の汎用レジスタに0xFFを代入
OUT DDRB, R16;DDRBにR16の中身を転送、DDRBはポートの状態格納レジスタ
LDI R16, 0x00;R16の汎用レジスタに0x00を代入
OUT PORTB, R16;PORTBにR16レジスタの中身を転送、1ならHIGH、0ならLOW

main:;mainというラベル
RCALL delay;delayという名前のサブルーチンに飛びなさい
LDI R16, 0xFF;R16の汎用レジスタに0xFFを代入
OUT PORTB, R16;DDRBにR16の中身を転送、ポートはHIGHに
RCALL delay;
LDI R16,0x00;
OUT PORTB,R16;DDRBにR16の中身を転送、ポートはLOWに
Rjmp main;mainという名前のラベルに飛びなさい

delay:
LDI R16, 25;
dly2:
LDI R17,50;
dly1:
LDI R18,234;
dly0:

NOP;何もしない
DEC R18;デクリメント

BRNE dly0
;直前の演算結果が0でなければdly0というラベルに飛ぶ
DEC R17
BRNE dly1
DEC R16
BRNE dly2
RET;サブルーチンから復帰


↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

できたら保存して、左上のBuild→Buildを押すかF7キーを押しましょう。これで上で書いたアセンブラが機械語に翻訳されてマイコンに書き込める状態のデータなりました。このデータは先程プロジェクトを作成したファイル内に、プロジェクト名.hexという形式で生成されていますので
 例えばこのフォルダの一個前のフォルダにtemp等適当なフォルダを作りhexファイルをコピーしておきましょう。C\temp等分かりやすいところに置いておくとあとで作業が楽です。
それではそろそろハードを触りたくなってきたのでArudinoUNOと焼きたいマイコンチップの配線でもしましょう。図を書くのがめんどくさいのでATtiny13Aの接続方法のみ以下に示します。

ArduinoUNOデジタル13番ピン→ATtiny13Aの7番ピン
ArduinoUNOデジタル12番ピン→ATtiny13Aの6番ピン
ArduinoUNOデジタル11番ピン→ATtiny13Aの5番ピン
ArduinoUNOデジタル10番ピン→ATtiny13Aの1番ピン
ArduinoUNOのGND→ATtiny13Aの4番ピン
ArduinoUNOの5V→ATtiny13Aの8番ピン

ATtiny13Aに電源を供給しているなら最後の5Vは接続しなくて良いです。
さらに動作確認用のLEDと抵抗をATtiny13Aの1,4,8番ピン以外のどれかに接続しておきます。ちなみにArduinoUNOの基板上のLEDが13ピンに繋がっているため外付けLED無しでも動作確認はできます。LEDつなぐのめんどうくさい人は繋がなくても大丈夫です。
次にコマンドプロンプトを起動します。ArduinoUNOはPCに接続しておきます。
次のコマンドを実行します。

cd C\temp

先ほどのhexファイルがあるディレクトリに移動します。別の場所にhexファイルをコピーした人は自分なりに読み替えてください。そしてhexファイルが存在するディレクトリで次のコマンドを実行します。

avrdude -c avrisp -P COM3 -b 19200 -p t13 -U flash:w:ltica.hex 

赤文字で書いたCOM3は前述の通り人によって違うので自分なりに書きなおしてください。またt13の赤文字はこれは今回しようしているATtiny13Aというマイコンの識別文字的なもので異なるマイコンを使用する場合は変えてください。同じマイコンをご使用ならそのままで結構です。違うマイコンを使用している場合は一度 -p t13 の部分を消してコマンドを打ってみるとそれぞれのマイコンの識別文字一覧みたいなのが出てきますので参考にしてください。そもそもソースコードがATtiny13A用なので他のチップだと動かないことがあります。ファイル名もプロジェクト名に合わせてください。
正常に接続できていれば以下のような画面がでるはずです。
たぶんこんな説明じゃ95割の人が成功しなさそうですが成功したとして話を進めます。
新品のマイコンチップならLEDが2秒周期ほどで点滅すると思います。新品、と言ったのは工場出荷時は内部クロックが1.2MHzなのですがこれはマイコン内部で8分周されているもので本当は9.6MHzなのです。こういった設定もAVRdudeから行うことができますが僕は早速ミスって一個書き込めなくしてしまいました。しかし予備をたくさん買っておいたので困ることはありません。やはり日頃の行いでしょうか。普通の方は予備を買うなり徳を積むなりして壊した時の事を考えるかそもそも壊さないようにするかして対応してください。



とまぁ以上で導入は終了です。成功した人も成功しなかった人も部品の予備が役に立った人もお疲れ様でした。ソースコードの意味が分からなくても、コマンドプロンプトに表示されている英語の意味が分からなくても、何も書かれていないマイコンにプログラムを書き込み動作させることができたというのは素晴らしいことではないでしょうか。次回はソースコードの解説とAVRdudeのもう少し詳し機能を見ていく予定です。

それでは、今日はこの辺で。



メモ:下位ヒューズビット01101010:6a

2016年2月7日日曜日

クォーターブリッジ

お久しぶりです。KKTの方です。最近少し忙しいようであまり工作はできておりません。
というのも、もうすぐテストを控えているというのはあまり関係ありませんが、課題が多かったりレポートを書かなきゃいけなかったりというのも、普段と比べて特に多いということでもないのであまり関係ありませんでした。
作りたいものが非常にたくさんあるのに一向にものが完成しません。なぜでしょうか。取り敢えず、やりたいことを挙げていくと手遅れなほど散らかっている僕の部屋よりも散らかっている頭の中が整理されるに違いないのでやってみましょう。

・IHの水冷化
・PFCの製作
・AVRマイコンを使いたい
・自励式のハーフブリッジインバータ

という感じです。本当に”感じ” だけで申し訳ないです。冒頭で部屋の散らかりより頭の方が散らかっていると書きましたが、このリストのおかげで頭の中の方がまだ整理されてきました。また、低レベルで恐縮ですがハーフブリッジってブリが含まれていて幼稚園~小学生くらいの子供に非常にウケが良いのでは無いかと考察できました。

さてAVRマイコンの開発ですが先日Arduino互換ボードなるものを購入したのでこれを使ってAVRライターみたいに動かして自由にAVRいじってやろうと思いました。ArduinoIDEは簡単にプログラムが書けますが、いまいちマイコン内での処理が命令から想像も付かないのでモヤモヤが残ります。ですのであえてArduinoをAVRライタとして使ってアセンブラでプログラムを書けるような環境を手に入れていきます。

これが先日購入した互換ボードです。純正買わなくてすみません。
 なんとなくLED光らせて遊んだりしてますがこれだけで十分楽しいです。ただ、たった一行のポート制御の命令でも40クロック以上時間使ったりしてるので「こいつ中で何やってんだ」という感想が自然に出てきます。
で、ですね。このモヤモヤ感はどこまで広い範囲で持つべきなのでしょうか。技術者のはしくれとして”仕組みはよくわかんないけど動くしいいや”はできるだけ最初の時だけにするべき、というのが僕の持論です。 しかしこれがどんどん広がって「宇宙どうやってできたか知らないけど生活できてるしいいや」とか「なかたなんで生きてるかわかんないけど記事書くしいいや(注:書いてません)」となってしまうともう自分のやりたいことに集中できませんよね。きっと学問というのはこのように疑問を持つことから始まったのでしょうが僕はあんまり考えるのが得意じゃないので時々おとなしく見て見ぬふりをして楽しむことも大切だと思います。

勘の良い人ならお分かりかと思いますが、と言うと分からなかった人にこんな記事で自分の勘の良し悪しを決めるなと怒られますが、この記事はなかたへの記事書け催促記事です。 長文失礼しました。

では、今日はこの辺で。