免責事項

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

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ポートは出力として設定されたわけです。


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

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

0 件のコメント:

コメントを投稿

何かあればお気軽にどうぞ。