アセンブリ言語 - Yamagata...

12
アセンブリ言語 CPU の基本動作と組み込みシステムのソフト開発 1.目的 本実験では,1チップマイクロコンピュータのプログラムをアセンブリ言語により作成 し,動作させる。これを通して,CPU の動作を理解すると同時に,「組み込みシステム」の ソフトウェア開発の一端に触れる。 2.解説 2-1 CPU の動作を理解しよう コンピュータを基本から理解する第1歩は,最 も重要な構成要素である CPU (Central Process- ing Unit ,中央処理装置)の動作を理解すること である。それには,CPU の動作に直接対応してい るアセンブリ言語 1 でプログラムを作り,CPU を動 かしてみることが役に立つ。 2-2 組み込みシステムの理解 コンピュータは様々な形で,我々の身の回りのモノにも組み込まれて使われている。この 「組み込み用途のコンピュータ」のプログラムの開発に触れることが,この実験の第二の目 的である。組み込み用途(エンベデッド,embedded )という「つぶしの効く」分野の基礎を 身に付けることだけでなく,ハードウェアとソフトウェアの両面でCPU の動作を理解するこ とが,学生諸君の自信につながることを期待している。 2-3 1 チップマイクロコンピュータ プログラム開発の対象となる CPU として,この実験では,マイクロチップテクノロジー社の 「PIC 」と呼ばれる1チップマイクロコンピュータ を用いる。PIC は小型,安価な「部品の感 覚で使用できるコンピュータ」であり,開発環境も個人で購入できる。このため,教育やな ど様々な用途のため導入されている。PIC を使えば,プリント基板の設計,個々の部品の購 入,組み立て,プログラム開発,動作検証から完成まで,全ての過程を個人で進められる。 実用的なパーソナルコンピュータの周辺機器の作製も可能である。 2-41チップマイクロコンピュータの概要と PIC コンピュータの基本的構成要素は,制御や演算を行うCPU ,プログラムやデータを格納す るメモリ,入出力(I/O )部などのユニットである。メモリには読み出し専用 の ROM ,自由 1)パーソナルコンピュータの世界では,搭載されるCPU の高機能化とメモリ容量の増加が進んだ結果,高レ ベル言語による大きなプログラムの開発が一般的になった。しかし,機器制御や通信用途など,アセンブリ 言語によるプログラム開発が必要になる場面は残っている。また,仮にコンパイラの性能がさらに向上し て,どのようなプログラムでも高レベル言語で記述できるようになったとしても,アセンブリ言語は教育用 言語としての存在意義を保ち続けると考えられる。 2)PIC は Peripheral Interface Controller の略。組み込み専用に,CPU ,メモリ,入出力用回路(IO)を集 積化し,1つの LSI チップにコンピュータとしての機能を持たせた製品群。これらの製品は「1チップマイ クロコンピュータ」あるいは「1チップマイクロコントローラ」(日本国内では略して「1チップマイコン」) などと呼ばれている。 3)電源の供給が無くてもデータを保持できる(不揮発性)。データ書き込みされた状態で工場出荷され,新た なデータ書き込みが不可能なものもあるが,データ書き直しが可能な製品も多い。書き込みに時間がかかり高 い電圧を必要とする,紫外線照射など特殊な方法でデータを消去する,電気的に消去・書き込みを行うがブ ロック単位で行わなければならないなど,様々な理由で自由なデータ書き直しができないものがROMである。 図1 PIC は部品として様々な製品に組み込ま れている。小さなものは 8ピンのパッ ケージで供給される。

Transcript of アセンブリ言語 - Yamagata...

Page 1: アセンブリ言語 - Yamagata Uea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...図1は実験に使用するPIC16F84の簡略化された内部構成である。最大の特徴は,プログ

アセンブリ言語CPUの基本動作と組み込みシステムのソフト開発

1.目的 本実験では,1チップマイクロコンピュータのプログラムをアセンブリ言語により作成し,動作させる。これを通して,CPUの動作を理解すると同時に,「組み込みシステム」のソフトウェア開発の一端に触れる。

2.解説2-1 CPU の動作を理解しよう コンピュータを基本から理解する第1歩は,最も重要な構成要素であるCPU(Central Process-ing Unit,中央処理装置)の動作を理解することである。それには,CPUの動作に直接対応しているアセンブリ言語1でプログラムを作り,CPUを動かしてみることが役に立つ。

2-2 組み込みシステムの理解コンピュータは様々な形で,我々の身の回りのモノにも組み込まれて使われている。この

「組み込み用途のコンピュータ」のプログラムの開発に触れることが,この実験の第二の目的である。組み込み用途(エンベデッド,embedded)という「つぶしの効く」分野の基礎を身に付けることだけでなく,ハードウェアとソフトウェアの両面でCPUの動作を理解することが,学生諸君の自信につながることを期待している。

2-3 1 チップマイクロコンピュータ

プログラム開発の対象となるCPUとして,この実験では,マイクロチップテクノロジー社の

「PIC」と呼ばれる1チップマイクロコンピュータ2を用いる。PICは小型,安価な「部品の感

覚で使用できるコンピュータ」であり,開発環境も個人で購入できる。このため,教育やな

ど様々な用途のため導入されている。PICを使えば,プリント基板の設計,個々の部品の購

入,組み立て,プログラム開発,動作検証から完成まで,全ての過程を個人で進められる。

実用的なパーソナルコンピュータの周辺機器の作製も可能である。

2-4 1チップマイクロコンピュータの概要と PIC コンピュータの基本的構成要素は,制御や演算を行うCPU,プログラムやデータを格納す

るメモリ,入出力(I/O)部などのユニットである。メモリには読み出し専用3のROM,自由

1)パーソナルコンピュータの世界では,搭載されるCPUの高機能化とメモリ容量の増加が進んだ結果,高レベル言語による大きなプログラムの開発が一般的になった。しかし,機器制御や通信用途など,アセンブリ言語によるプログラム開発が必要になる場面は残っている。また,仮にコンパイラの性能がさらに向上して,どのようなプログラムでも高レベル言語で記述できるようになったとしても,アセンブリ言語は教育用言語としての存在意義を保ち続けると考えられる。

2)PICは Peripheral Interface Controllerの略。組み込み専用に,CPU,メモリ,入出力用回路(IO)を集積化し,1つのLSIチップにコンピュータとしての機能を持たせた製品群。これらの製品は「1チップマイクロコンピュータ」あるいは「1チップマイクロコントローラ」(日本国内では略して「1チップマイコン」)などと呼ばれている。

3)電源の供給が無くてもデータを保持できる(不揮発性)。データ書き込みされた状態で工場出荷され,新たなデータ書き込みが不可能なものもあるが,データ書き直しが可能な製品も多い。書き込みに時間がかかり高い電圧を必要とする,紫外線照射など特殊な方法でデータを消去する,電気的に消去・書き込みを行うがブロック単位で行わなければならないなど,様々な理由で自由なデータ書き直しができないものがROMである。

図1 PICは部品として様々な製品に組み込まれている。小さなものは8 ピンのパッケージで供給される。

Page 2: アセンブリ言語 - Yamagata Uea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...図1は実験に使用するPIC16F84の簡略化された内部構成である。最大の特徴は,プログ

な読み出しと書き込みが可能なRAMが存在する。これらのユニットを共通のデータの通り道であるバスを介して接続したのがコンピュータの基本的構成である。 1チップマイクロコンピュータは,これらの構造をすべて1つのLSIに集積化したものである。このような特徴を持つ製品は早くから市場に出回っており,各種の製品に組み込まれていた。1チップマイクロコンピュータの採用は,様々な製品の小型化や機能の向上,低コスト化に寄与してきた。1チップマイクロコンピュータが,個人も含めた小規模ユーザにも利用されるようになっ

たのは,マイクロチップテクノロジー社がPICを市場に投入してからである。PICは,簡素な構造を持ちピン数の少ない小型パッケージが特徴である。また,マイクロチップ社が安価な開発環境を供給したことも個人ユーザに受け入れられる要因となった。PICは用途に応じて多くの種類が揃えられている。その中では,内部にEEPROM1やフラッシュメモリ2などの,ユーザによるプログラム書き込みと電気的な消去が可能なROMを搭載した製品の人気が高い。

2-5  ワンチップマイクロコンピュータのソフト開発1チップマイクロコンピュータもコンピュータであるから,内部のプログラム用メモリに

格納したプログラムによって機能する。このプログラムの開発は,パーソナルコンピュータやワークステーションなどの汎用コンピュータを用いて行う・。

 典型的な組み込み用途における1チップマイコンのソフト開発の流れは,①プログラムの入力,編集②コンパイル,リンク③動作検証④プログラムの書き込み⑤実機での検証という段階から成る。この5つの段階は順番に進むわけではなく,前の段階に戻ることが繰り返される。①から④までの作業は,汎用コンピュータを用いて行われるが,最終的な動作検証は1チップマイコン組み込まれる装置を使って行う必要がある。そこで次のような方法が取られている。ICE:一般的に使われるのが,インサーキットエミュレータ(In Circuit Emulator,ICE,「アイス」と発音

される)と呼ばれる製品である。パーソナルコンピュータに接続された本体から1チップマイコンの入出力ピン

と同じ配置のピンを持つケーブルが延びている。これを組み込みシステムの基板上の1チップマイコンの替わり

にソケットに挿入する。ICEは開発されるボード側から見ると,あたかもソケットに1チップマイコンが挿入さ

れているかのように働く。これをエミュレーションという。

ISP:開発用基板の上にプログラム書き込み用の回路を搭載し, CPUを取り外すこと無しにプログラム書き直し

を行うようにする。このようにすると,システムを稼動させた状態でのプログラムが可能になる。これをIn

System Programming (ISP)と呼んでいる。

 この実験では,簡易型の書き込み機能を備えた実験基板を使ってISPによりプログラムを作成し動作させる。

1)EEPROM:Electrically Erasable PROM,電気的にデータ消去可能な PROM( Programmable ROM )

2)フラッシュメモリ:データ消去をブロック毎に消去可能な EEPROM。全部のデータを消去する必要が無いのでデータ書き換えが高速。

3)このように,最終的にプログラムが動く環境とソフトを開発する環境が異なるものをクロス開発と呼ぶ。実際にプログラムが動く環境はメモリの容量は小さく,キーボートやディスプレイなどの入出力装置も備えられていない。しかし,プログラム開発を行うためには,プログラムの入力と編集,コンパイルや動作チェックなどの様々なソフトウェアを使う。これらのソフトウェアを動かすためには十分なメモリとハードディスクなどの外部記憶装置を搭載し,キーボードやディスプレイなどの入力装置も備えたコンピュータが必要だからである。そこで,開発作業は,目的とする環境とは異なるコンピュータの上で行われるのである。

Page 3: アセンブリ言語 - Yamagata Uea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...図1は実験に使用するPIC16F84の簡略化された内部構成である。最大の特徴は,プログ

2-6 アセンブリ言語によるプログラム開発1チップマイクロコンピュータのプログラム開発は,アセンブリ言語を用いて行われるこ

とが多い。アセンブリ言語とは,メインメモリから読み出されCPUの動作を直接指示する「機械語」を,簡潔な文字列(ニーモニック)で表したものである。アセンブリ言語の命令語は基本的には機械語と1対1に対応する。しかし,擬似命令やマクロ命令 1など,機械語と対応しない命令を備え,ラベルも使用できるため,機械語だけを用いるのに比べ,プログラムの理解と開発は容易である。アセンブリ言語を用いれば,プログラムメモリの容量の点でも実行速度の点でも最も高い

効率が得られる。1チップマイクロコンピュータではプログラムに使用できるメモリ容量に制限があり,プログラムの実行速度にも高速性が求められる。これが,1チップマイクロコンピュータのプログラム開発にアセンブリ言語が使われる最大の理由である。2

PIC のアーキテクチャ 図1は実験に使用するPIC16F84の簡略化された内部構成である。最大の特徴は,プログラメモリとデータメモリが分離したハーバード・アーキテクチャを採用していることである。内部のユニットの概要は以下の通りである。●プログラムメモリ(ROM):電気的な消去と書き込みが可能なフラッシュメモリで,1ワード14bit×1024ワード(000-3FF番地)で構成される。

●データメモリ(RAM):8bit幅のメモリで,2つのページで構成され,切り替えて使う。ページ0:00-0B番地の12ワードがシステムメモリ,0C-4F番地の68ワードが汎用のデータメモリ。ページ1:80-8B番地の12ワードがシステムメモリ。PICのデータシートでは,ファイル・レジスタと呼ばれている。

●I/Oポート:データメモリの05番地,06番地が入出力ポートに対応している。入出力ポートの8bitは全て,入力か出力かをbit毎に設定できる。設定は85番地と86番地のメモリに書き込むことで行う。

●ワーキングレジスタ:ワーキングレジスタ(Wレジスタ)はデータメモリとは独立していて,データの一時的格納に使われる。また算術論理演算回路(ALU)の演算結果はWレジスタに格納される。

●プログラムカウンタとスタック:プログラムカウンタ(PC)はCPUが次に読み込む命令語のアドレスを指定する。PIC16F84では13bit幅のレジスタであり,下位8bitは,データメモリのシステム領域で読み書きできる。

サブルーチンや割り込み処理のために8レベルの深さのスタックが用意されている。

命令レジスタ

命令デコーダ 制御回路

フラグレジスタ

ファイル・レジスタ

演算ユニット

プログラムカウンタ

プログラムメモリ14bit×1024語

ワーキングレジスタ

00 INDIRECT ADDR01 TMR002 PCL03 STATUS04 FSR05 PORTA06 PORTB0708 EEDATA09 EEADR0A PCLATH0B INTCON0C ワークメモリ

4F

80 INDIRECT ADDR81 OPTION82 PCL83 STATUS84 FSR85 TRISA86 TRISB8788 EECON189 EECON28A PCLATH8B INTCON

000001

3FF

EEPROM

発振回路

リセット

ポー

トA

ポー

トB

命令レジスタ命令レジスタ

命令デコーダ命令デコーダ 制御回路制御回路

フラグレジスタフラグレジスタ

ファイル・レジスタ

演算ユニット

プログラムカウンタプログラムカウンタ

プログラムメモリ14bit×1024語

ワーキングレジスタ

ワーキングレジスタ

00 INDIRECT ADDR01 TMR002 PCL03 STATUS04 FSR05 PORTA06 PORTB0708 EEDATA09 EEADR0A PCLATH0B INTCON0C ワークメモリ

4F

80 INDIRECT ADDR81 OPTION82 PCL83 STATUS84 FSR85 TRISA86 TRISB8788 EECON189 EECON28A PCLATH8B INTCON

00 INDIRECT ADDR01 TMR002 PCL03 STATUS04 FSR05 PORTA06 PORTB0708 EEDATA09 EEADR0A PCLATH0B INTCON0C ワークメモリ

4F

80 INDIRECT ADDR81 OPTION82 PCL83 STATUS84 FSR85 TRISA86 TRISB8788 EECON189 EECON28A PCLATH8B INTCON

000001

3FF

EEPROM

000001

3FF

EEPROM

発振回路発振回路

リセットリセット

ポー

トA

ポー

トA

ポー

トB

ポー

トB

図1 PIC16F84 の内部構成

1)擬似命令:CPU の機械語ではなく,アセンブラに対する命令 マクロ命令:複数のアセンブリ言語の文をまとめて1つの命令文として定義して,使えるようにしたもの。アセンブラはマクロ命令を元の文に展開してから機械語に変換する。

2)C言語などによるプログラム開発環境も提供されている。

Page 4: アセンブリ言語 - Yamagata Uea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...図1は実験に使用するPIC16F84の簡略化された内部構成である。最大の特徴は,プログ

3.操作

 実験の操作では,以下の注意を守ること。

レジスタの概要[資料p.39]

 データメモリはファイル・レジスタとも呼ばれ,特定の番地のメモリを,特定の機能を持った「レジスタ」と

して使っている。

00番地:インダイレクトアドレスレジスタINDIRECT ADDR。この番地に対してアクセス(読み書き)すると,

ファイルセレクトレジスタで指定される番地に対する読み書きとなる。

01番地:タイマレジスタTMR0。内蔵されたリアルタイムクロックカウンタの値を読み書きするためのもの。

02番地:プログラムカウンタPCL。プログラムカウンタの下位8bitの読み書きができる。

03番地:ステータスレジスタSTATUS。CPUの動作モードの制御や,実行後の状態を表すフラグビットで構成さ

れる。本実験で関連するのは,データメモリのページ切り替えの下位ビットb5である。

04番地:ファイルセレクトレジスタFSR。インダイレクトアドレスを使用する場合の番地の格納に使う。

05番地:入出力ポートA PORTA。入出力の設定は85番地TRISAレジスタを使用。

06番地:入出力ポートB PORTB。入出力の設定は86番地TRISBレジスタを使用。

0A番地:上位PCレジスタPCLATH。プログラム中からプログラムカウンタの上位bitを変更する場合に使用する。

3-1 使用機器の確認 実験班のメンバー全員で,実験に使用する機器とソフトウェアの確認をする。不足している場合は直ちに指導担当者に申し出ること。機器:●実験基板FIRST PIC Kit(㈱マイクロアプリケーションラボラトリー)PIC16F84(マイクロチップテクノロジー社)を基板上に搭載,PIC書き込み回路内蔵

●ACアダプター 9V 0.3A●シリアル接続ケーブル Dサブ9ピンストレート●パーソナルコンピュータ OS:Windows98使用ソフトウェア:●エディタ Windows98に標準で装備されているテキストエディタ「メモ帳」(MicroSoft社) スタートメニューから,「/プログラム/アクセサリ/メモ帳」で起動する。1 このように,操作とその結果の記録(ログ)を取っておくことは,ハード,ソフトウェアを問わず有益である。操作に慣れるまでは,詳細を記録しておくと良い。ログは,その操作を再現できることを意識して取る。異常な動作を経験した場合は,その時点でのコンピュータの動作環境(同時に起動されているプログラムなど)も記録しておく。

・動作確認は実験班のメンバー全員で行う

・役割を交代しながら実験操作を進める

パーソナルコンピュータの操作,プログラムリストの読み上げ(プログラムの入力操作を行う者が

キーボード操作に不慣れな場合),実験基板のスイッチ操作,記録など,役割を分担する。この役割

は適当に交代し,1人だけが長時間連続して同じ役割を続けることがないように気をつける。

・実験に関わる操作と,その結果は全て記録する。

記録するのは,キーボードやマウスにより入力するコマンド,その結果生じたPICの動作,PCのモ

ニタに表示されるメッセージなどである。特に,予期した動作が得られなかった場合やエラーメッ

セージが出力された場合は,細かく記録しておくと,原因の究明に役に立つ1。基本的には全員がノー

トを用意して概要をメモし,詳細は,記録係に記録してもらうと良い。

Page 5: アセンブリ言語 - Yamagata Uea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...図1は実験に使用するPIC16F84の簡略化された内部構成である。最大の特徴は,プログ

●アセンブラ MPASM(マイクロチップテクノロジー社)●プログラム書き込み用ソフト(プログラマー)

FirstPICProgrammer(㈱マイクロアプリケーションラボラトリー)資料:●㈱マイクロアプリケーションラボラトリー 小川晃:FIRST PICk ガイドブック

実験の課題は,この技術資料に記載された実習に基づいている。対応するページを[資料p.××]のよう

に記載する。

3-2 実験課題(1)LEDを点灯させる[資料p.50]エディタを起動し,アセンブリ言語プログラムを記述したテキストファイルを作成する。

i)エディタの起動とプログラムの入力:OSの操作画面のプログラム起動メニューから,「/

プログラム/アクセサリ/メモ帳」を選択して「メモ帳」を起動する。テキスト編集用のウィ

ンドウが開くので,この中に以下のリスト1のプログラム(LEDを点灯させるプログラム[資

料p.50])を入力する。プログラムの入力の方法は[資料p.55]を参照せよ。プログラムの1つの文は1行に記述する。1行はTabキーで区切って,[ラベル領域] [Tabキー] [プログラム領域] [Tabキー] [;コメント領域] [Retキー]

のように3つの領域で構成する。(アセンブラは,行の“;”の後の部分はコメントと解釈し,機械語には変換しない。) 課題(1)のプログラムではラベル領域とメモ書き領域には何も記述しない。

ii)プログラム・ソースコードの保存:プログラムを入力し終わったら,ファイル名を指定して保存する。まず,ファイルメニューから「保存」を起動すると,ファイル保存のウインドウが開くので,以下の設定をする。

・“ファイル名(N): ”の欄にファイル名を入力するファイル名の拡張子は.ASMとし,LED1.ASM

のように,実験課題の内容や課題番号と対応付けたものにする。

・“ファイルの種類(T): ”の欄で“全てのファイル”を選択する保存ファイルの設定が終わったら,“保存

(S)”のボタンをクリックする。

iii)プログラムを機械語に変換:作成したアセンブリ言語のソースコードをアセンブラに

より機械語に変換する。MPASMのアイコンをクリックして起動する。・MPASMのウインドウの最上部に“Source File Name”の欄に,変換したいアセンブリ言語ソースコードのファイル名を入力

・ウインドウの右上にある“Generated Files”チェックボックスで,“ErrorFile”,“List File”にチェックマーク“?”を入れておく・MPASMウインドウの下部に配置された“Assemble”ボタンをクリックすることで機械語へ

の変換(アセンブル)が開始される。

iv)出力ファイルの確認:アセンブラは,“ファイル名.ASM”というファイル名のソースコー

LIST P=16C84CLRF 6BSF 3,5CLRF H’86’BCF 3,5BSF 6,0NOPEND

リスト1 LED点灯プログラム

ラベル領域

・・・・ ・・・・ ;・・・ Tab Tab

プログラム領域

メモ書き領域

Ret

図2 プログラムの行の構成

Page 6: アセンブリ言語 - Yamagata Uea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...図1は実験に使用するPIC16F84の簡略化された内部構成である。最大の特徴は,プログ

ドファイルを処理すると,①“ファイル名.HEX”,②“ファイル名.LST”(プリンタ出力用ファイル),③“ファイル名.ERR”(エラー情報出力ファイル)という3つのファイルを生成する。“メモ帳”により,3つのファイルの内容を確認せよ。

・ファイル名.HEX:機械語プログラム。機械語はプログラム用のメモリに格納され,CPUの動作を直接指示するbit列の並びである。これを16進で表示できるように,.HEX拡張子をファイル名につけてある。

・ファイル名.LST:プリンタ出力用ファイル。アセンブリ言語プログラムと機械語プログラムの両方に様々な情報を加えたものである。ワードプロセッサで読み取って書式を整えて保管用の読みやすい印刷資料(ハードコピー)が得られる。

・ファイル名.ERR:エラー情報出力ファイル。アセンブル段階でエラーがあった場合のエラーのあった行とそのエラーの内容,警告(ワーニング)が書かれている。

v )機械語プログラムの P I C への書き込み:プログラマ(書き込み用プログラム)FirstPICkProgrammerを起動し,完成したプログラムを実験基板上のPICに書き込む。

・FirstPICkProgrammerを起動。FirstPICkProgrammerのアイコンをクリックする。・COMポートの確認:FirstPICkProgrammerウインドウの最下部の表示が“COM2”になっている場合,ウインドウ上部の“COM”をクリックして基板接続ポートを“COM1”に切り替える。・PICタイプの切り替え:“PIC Select”オプションボタンで,16F84を選択する。・ファイル選択:“File Open”ボタンをクリックし,作成した機械語ファイル(ファイル名.HEX)を選択する。ファイルの読み込みが終了すると最終アドレスの表示(“LAST”)が変化する。

・動作モードスイッチの確認:プログラム書き込みの際は実験基板上の動作モード選択スイッチをSTEP側に倒しておくと,書き込みエラーが少なくなる。

・書き込み:書き込みファイル名を確認した後,“Write”ボタンをクリックする。問題がなければ書き込みは数秒で終了する。

vi)プログラムの実行:ステップモードでプログラムを実行する。・動作モードスイッチの確認:実験基板上の動作モード選択スイッチを“STEP”と表示のある側に倒してあることを確認する。こうしておくと,プログラムの実行は基板上のSTEPボタンを押す度に1命令ずつ実行されていく。

・リセット:実験基板上のRESETボタンを押す。これにより,基板に搭載されているPIC内部のプログラムカウンタはゼロに初期化される。

・プログラムのステップモードでの実行:“STEP”ボタンを押す。1回押すごとにプログラ

ムはプログラムメモリのゼロ番地から順に実行されていく。1回押すごとに実験基板上の

LEDの状態を観測する。“STEP”ボタンは全部で6回押す。

課題(2) アセンブリ言語プログラムを読みやすくする[資料p.62] 課題(1)のプログラムは,一読しても意味がわからず,また,プログラムの実行を停止させる命令も備えていない。そこで,以下のように変更したプログラム(少し解りやすく書き替えたプログラム)を作成する。i)リスト2のアセンブリ言語プログラムを作成し,課題(1)のプログラムとは別のファイル名で保存する。

ii)実験基板の動作モードスイッチを“STEP”側に倒して実行させ,動作を確認する。

Page 7: アセンブリ言語 - Yamagata Uea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...図1は実験に使用するPIC16F84の簡略化された内部構成である。最大の特徴は,プログ

; LED Test Program 02.5.21

LIST P=16C84,R=DECSTATUS EQU 3PG EQU 5PORTB EQU 6TRISB EQU H’86’

CLRF PORTB ;Clear PORTBSF STATUS,PG ;Change page1CLRF TRISB ;TRISB=0 All outputBCF STATUS,PG ;Change page0BSF PORTB,0 ;LED on

LOOP GOTO LOOP ;StopEND

リスト2 LED点灯プログラム(2)(少し解りやすく書き替えたプログラム )

iii)実験基板の動作モードスイッチを“CONT”側に倒してプログラムを実行させる。

課題(3)複数のLEDを同時に点灯[資料p.67]i)リスト3のプログラム(7セグメントLEDに3を表示するプログラム)を作成しステップ

モード実行する。ii)プログラムを7セグメントLEDに“5”を表示するように修正して,ステップモードで実行する。

■EQU命令(Equal,擬似命令)使い方: 文字列 EQU 数字機能: ユーザが指定した文字列と数字を結びつける擬似命令。文字列はPICのアセンブリ命令語や

アセンブラで規定されている単語以外なら自由に決めることができる。使用例: PORT EQU 5 :文字列“PORT”は数字5のことであると定義。以後,アセンブラはプログ

ラム中の文字列“PORT”を数字5に置き換えてから処理する。■ラベル(擬似命令)使い方: 命令文のラベル領域に文字列を記入する,機能: この文字列を,命令文のアドレスとして使用する使用例: LOOP NOP :以降のプログラムで,このNOP命令のアドレスを“LOOP”という文字列で

指定できる。■GOTO(擬似命令)機能: 無条件ジャンプ。プログラムカウンタに指定されたアドレスを格納する。使い方: GOTO アドレス使用例: GOTO ADDR :ラベル“ADDR”を付けられた命令語に分岐する。■$(実行中の命令のアドレス)機能: 現在,実行中の命令のアドレスを示す使用例: GOTO $+2 :1つおいて次の命令に分岐

; 7segLED Test Program 02.5.21

LIST P=16C84,R=DECSTATUS EQU 3PG EQU 5PORTB EQU 6TRISB EQU H’86’

CLRF PORTB ;Clear PORTBBSF STATUS,PG ;Change page1CLRF TRISB ;TRISB=0 All outputBCF STATUS,PG ;Change page0MOVLW B’01001111’MOVWF PORTB ;LED on

LOOP GOTO LOOP ;StopEND

リスト 3 7 セグメント LED に“3”を表示するプログラム

■LIST命令(擬似命令)使い方: 使用するデバイスを指定する。この命令は,アセンブラに対する指令(「擬似命令」

,Directive Language)であり,PICの命令語(Instruction)ではない。■CLRF命令 (Clear File-register )使い方: CLRF アドレス機能: ファイルレジスタを“0”にクリアする使用例: CLRF H・6秩@ 86番地(16進表記)のレジスタをクリア

CLRF 5  5番地のメモリをクリア■BSF命令,BCF命令 (Bit Set File-register、Bit Clear File-register)使い方: BSF アドレス, Bit,BCF アドレス, Bit機能: アドレスで指定されたポートやメモリのBit番目のビットを1にセット(BSF)または0にクリア(BCF)使用例: BSF 5,6:ポートA(5番地)の6番目のビットを1にセット

BCF 6,7:ポートB(6番地)の7番目のビットを0にクリア■NOP命令 (No Operation)使い方: NOP機能: 何もしない(プログラムカウンタが1増加されるだけ)■END命令(擬似命令)使い方: END機能: アセンブラにプログラムの終了を知らせる

Page 8: アセンブリ言語 - Yamagata Uea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...図1は実験に使用するPIC16F84の簡略化された内部構成である。最大の特徴は,プログ

; LED Test Program XX.XX.XX

LIST P=16C84,R=DECSTATUS EQU 3PG EQU 5PORTB EQU 6TRISB EQU H’86’

CLRF PORTB ;Clear PORTBBSF STATUS,PG ;Change page1CLRF TRISB ;TRISB=0 All outputBCF STATUS,PG ;Change page0

LOOP BSF PORTB,0 ;LED0 onBCF PORTB,0 ;LED0 offBSF PORTB,1 ;LED1 onBCF PORTB,1 ;LED1 offBSF PORTB,2 ;LED2 onBCF PORTB,2 ;LED2 offBSF PORTB,3 ;LED3 onBCF PORTB,3 ;LED3 offGOTO LOOP ;LOOP

END

リスト4 4つのLEDを順番に点灯させるプログラム

課題(4)複数のLEDを順番に点灯[資料p.69]リスト4のプログラム(4つのLEDを順番に

点灯するプログラム)をステップモードで実行させる。

課題(5)LEDを 50msec間隔で点滅させる[資料p.74]

 リスト5のプログラム(50msでLEDをフリッ

カさせるプログラム)を作成しCONTモードで

実行させる。発展課題5-A] リスト5-A[資料p.78]のプログラム

(1s で LED をフリッカさせるプログラム)を作成し

CONTモードで実行させる。

課題(6)LEDを1sec間隔で点滅させる[資料p.79]

 リスト6のプログラム(1sでLEDをフリッ

カさせるプログラム その2[資料p.80])を

作成しCONTモードで実行させる。

■MOVLW 命令 (Move Literal to Working-register)使い方: MOVLW 値機能: ワーキングレジスタに指定した 8ビットの定数(リテラル)を格納使用例: MOVLW H巽1・6進表記のF1をワーキングレジスタにセット■MOVWF 命令(Move Working-register toFile-register)使い方: MOVWF レジスタ機能: ワーキングレジスタの内容を指定し

たファイルレジスタに格納使用例: MOVLW H ’1A’ ワーキングレジス

タの内容を1A番地のメモリに格納

リスト5 50msでLEDをフリッカさせるプログラム

; LED FRICKER Test Program XX.XX.XX

LIST P=16C84,R=DECSTATUS EQU 3PG EQU 5PORTB EQU 6TRISB EQU H’86’COUNTER EQU H’10’

CLRF PORTB ;Clear PORTBSF STATUS,PG ;Change page1CLRF TRISB ;TRISB=0 All outputBCF STATUS,PG ;Change page0

LOOPBSF PORTB,0 ;LED0 ONMOVLW 223MOVWF CONTER

DELAY1 GOTO $+1 GOTO $+1 DECFSZ COUNTER,1 GOTO DELAY1BCF PORTB,0 ;LED OFFMOVLW 223MOVWF COUNTER

DELAY2 GOTO $+1 GOTO $+1 DECFSZ COUNTER,1 GOTO DELAY2

GOTO LOOP

END

リスト 5-A 1sでLEDをフリッカさせるプログラム

; LED FRICKER Test Program 2 XX.XX.XX

LIST P=16C84,R=DECSTATUS EQU 3PG EQU 5PORTB EQU 6TRISB EQU H’86’COUNTER EQU H’10’COUNTER2 EQU H’11’

CLRF PORTB ;Clear PORTBBSF STATUS,PG ;Change page1CLRF TRISB ;TRISB=0 All outputBCF STATUS,PG ;Change page0

LOOPBSF PORTB,0 ;LED0 ONMOVLW 10MOVWF CONTER

DELAY1 MOVLW 223MOVWF COUNTER2

DELAY11 GOTO $+1GOTO $+1DECFSZ COUNTER2,1 GOTO DELAY11DECFSZ COUNTER,1 GOTO DELAY1

BCF PORTB,0 ;LED OFFMOVLW 10MOVWF COUNTER

DELAY2 MOVLW 223MOVWF COUNTER2

DELAY21 GOTO $+1GOTO $+1DECFSZ COUNTER2,1 GOTO DELAY21DECFSZ COUNTER,1 GOTO DELAY2

GOTO LOOP

END

Page 9: アセンブリ言語 - Yamagata Uea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...図1は実験に使用するPIC16F84の簡略化された内部構成である。最大の特徴は,プログ

■DECFSZ命令 (Decrement f, skip if zero)使い方: DECFSZ アドレス, d機能: ファイルレジスタの内容を1減らし,結果をdが0の場合はWレジスタに格納,dが0でな

い場合はそのファイルレジスタに格納。この結果が0の場合,次の命令をスキップし,0でない場合は次の命令を実行する。

使用例: DECFSZ DATA,1GOTO LOOP

“DATA”で指定されるメモリの内容を1減じて,このメモリに格納する。結果が0でない場合は,次の命令(GOTO LOOP)によりラベルLOOPにジャンプする。結果が0になるとこの命令をスキップしてループを抜ける。

■CALL命令,RETURN命令 (Call Subroutine,Return)使い方: CALL アドレス,  RETURN機能: サブルーチンコール。CALL命令の格納されている番地の値に1を加えたものをスタックに

格納し,指定したアドレスの値をPCに格納してサブルーチンに分岐する。分岐先のサブルーチンの中で

RETURN命令を実行すると,格納しておいた番地の値をスタックから取り出してPCに格納することで,呼

び出したプログラムに復帰する。

リスト6 1secでLEDをフリッカさせるプログラム その2

; LED FRICKER Test Program 3 XX.XX.XX

LIST P=16C84,R=DECSTATUS EQU 3PG EQU 5PORTB EQU 6TRISB EQU H’86’COUNTER EQU H’10’COUNTER2 EQU H’11’

CLRF PORTB ;Clear PORTBBSF STATUS,PG ;Change page1CLRF TRISB ;TRISB=0 All outputBCF STATUS,PG ;Change page0

MAINBSF PORTB,0 ;LED0 ONCALL DELAYBCF PORTB,0 ;LED0 OFFCALL DELAYGOTO MAIN

DELAY MOVLW 10MOVWF CONTER

DELAY1 MOVLW 223MOVWF COUNTER2

DELAY11 GOTO $+1 GOTO $+1 DECFSZ COUNTER2,1 GOTO DELAY11DECFSZ COUNTER,1 GOTO DELAY1RETURN

END

リスト6 -A LEDを順次点灯させるプログラム

; LED FRICKER Test Program 2 XX.XX.XX

LIST P=16C84,R=DECSTATUS EQU 3PG EQU 5PORTB EQU 6TRISB EQU H’86’COUNTER EQU H’10’COUNTER2 EQU H’11’

CLRF PORTB ;Clear PORTBBSF STATUS,PG ;Change page1CLRF TRISB ;TRISB=0 All outputBCF STATUS,PG ;Change page0

MAINBSF PORTB,0 ;LED0 ONCALL DELAYBCF PORTB,0 ;LED0 OFBSF PORTB,1 ;LED1 ONCALL DELAYBCF PORTB,1 ;LED1 OFFBSF PORTB,2 ;LED2 ONCALL DELAYBCF PORTB,2 ;LED2 OFFBSF PORTB,3 ;LED3 ONCALL DELAYBCF PORTB,3 ;LED3 OFFGOTO MAIN

DELAY MOVLW 10 ;ディレイMOVWF CONTER

DELAY1 MOVLW 223MOVWF COUNTER2DELAY11 GOTO $+1

GOTO $+1DECFSZ COUNTER2,1

GOTO DELAY11DECFSZ COUNTER,1GOTO DELAY1RETURN

END

■RLF命令,RRF命令 (Rotate Left File-register, Rotate Right File-register)使い方: RLF アドレス,d RRF アドレス,d機能: ファイルレジスタの内容のローテート命令。RLF:左回転,RRF:右回転。結果の値は,d=0

ではWレジスタに,d=1では指定したファイルレジスタに格納する。使い方: RLF DATA,1 “DATA”で指定されるファイルレジスタの内容を左にローテートし,結果を

ファイルレジスタに戻す。■COMF命令 (Complement File-register)使い方: COMF アドレス,d機能: ファイルレジスタの内容の全てのbitの否定を求め,d=0ならWレジスタに,d=1なら,そ

のレジスタに格納。

[発展課題6-A] リスト6-Aのプログラム[資料p.82](LEDを順次点灯させる)を作成しCONTモードで実行させる。

Page 10: アセンブリ言語 - Yamagata Uea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...図1は実験に使用するPIC16F84の簡略化された内部構成である。最大の特徴は,プログ

; LED FRICKER Test Program 3 XX.XX.XX

LIST P=16C84,R=DECSTATUS EQU 3PG EQU 5PORTB EQU 6TRISB EQU H’86’

CLRF PORTB ;Clear PORTBBSF STATUS,PG ;Change page1CLRF TRISB ;TRISB=0 All outputBCF STATUS,PG ;Change page0

BSF STATUS,0 ;CY=0MOVLW 1MOVWF PORTB ;PORTB=1に初期化

LOOP RLF PORTB,1 ;左へ1bitシフトGOTO LOOP

END

リスト 6-B 8 個の LEDを順次点灯するプログラム 

リスト 6-C 8個のLEDを順次点灯するプログラム

; LED FRICKER Test Program 3 XX.XX.XX

LIST P=16C84,R=DECSTATUS EQU 3PG EQU 5PORTB EQU 6TRISB EQU H’86’COUNTER EQU H’10’COUNTER2 EQU H’11’

CLRF PORTB ;Clear PORTBBSF STATUS,PG ;Change page1CLRF TRISB ;TRISB=0 All outputBCF STATUS,PG ;Change page0

MOVLW B’00001111’;表示パターン設定MOVWF PORTB ;PORTB=1

LOOP COMF PORTB,1 ;LED InvertCALL DELAYGOTO LOOP

DELAY MOVLW 10 ;0.1sくらいのMOVWF CONTER ;ディレイが迫力ある

DELAY1 MOVLW 223 ;そうだから,試してMOVWF COUNTER2 ;みてね

DELAY11 GOTO $+1 GOTO $+1DECFSZ COUNTER2,1 GOTO DELAY11DECFSZ COUNTER,1 GOTO DELAY1RETURN

パルスのカウンタを設定 ↓

カウンタの初期値を設定 ↓

ポートを1にする ↓

15 クロック待つ ↓

ポートを0にする ↓

15 クロック待つ ↓

指定回数だけループする

図3 1KHz でブザーを鳴らすプログラムの流れ

課題(7)ブザーを鳴らす[資料p.86] 図3に示すループ処理により一定周期でON/OFF す

る電圧波形を発生し,実験基板上の発音体を鳴らす。

i)リスト7のプログラム(音の発生)を作成する

ii)リセット起動によりブザー音を確認する

iii)発音周波数が約500Hzとなるようにプログラム

を変更し,動作を確認する

課題(8)メロディーを作る[資料p.89]

 異なる周波数の音を組み合わせて簡単なメロディー

を発生させる。

i)リスト8のプログラム(音階の発生)を作成し,動

作を確認する

ii)時間があれば,発展課題8-Aに挑戦する。[発展課題8-A] より複雑なメロディー(例えば図4参照)を奏でるプログラムを作成する。リスト8 を改造しても,新しく作っても良い。課題で学んだ以外の方法を取り入れてもかまわない。また,その他,自分たちの興味のあるプログラムの作成も大いに歓迎する。

[発展課題6-B] リスト6-Bのプログラム[資料p.83](8個のLEDを順次点灯させるプログラム)を作成しSTEPおよびCONTモードで実行させる。[発展課題6-C] [資料p.85]のプログラム(LEDのフリッカ)を作成しSTEPおよびCONTモードで実行させる。

リスト 7 1KHzの音を発生するプログラム

; BUZZER Test Program XX.XX.XX

LIST P=16C84,R=DECSTATUS EQU 3PG EQU 5PORTA EQU 5PORTB EQU 6TRISA EQU H’85’TRISB EQU H’86’LCNT EQU H’10’TCNT EQU H’11’

CLRF PORTB ;Clear PORTBBSF STATUS,PG ;Change page1MOVLW B’0111’ ;Set TRISAMOVWF TRISACLRF TRISB ;TRISB=0 All outputBCF STATUS,PG ;Change page0

MOVLW 200MOVWF LCNT

BZLOOPBSF PORTA,3CALL TDEL1KBCF PORTA,3CALL TDEL1KDECFSZ LCNT,1 GOTO BZLOOP

STOP GOTO STOP

TDEL1KMOVLW 3MOVWF TCNT

TDLY DECFSZ TCNT,1 GOTO TDLYRETURN

END

Page 11: アセンブリ言語 - Yamagata Uea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...図1は実験に使用するPIC16F84の簡略化された内部構成である。最大の特徴は,プログ

図4 メロディーの一例

; TONE Program XX.XX.XXLIST P=16C84,R=DEC

STATUS EQU 3PG EQU 5PORTA EQU 5PORTB EQU 6TRISA EQU H’85’TRISB EQU H’86’LCNT EQU H’10’TCNT EQU H’11’

CLRF PORTB ;Clear PORTBBSF STATUS,PG ;Change page1MOVLW B’0111’ ;SET TRISAMOVWF TRISACLRF TRISB ;TRISB=0 All outputBCF STATUS,PG ;Change page0

;; MAIN ROUTINETONELOOP

MOVLW B’001’ ;ドの音を出力MOVWF PORTBCALL CTONECALL DELAY

MOVLW B’100’ ;ソの音を出力MOVWF PORTBCALL CTONECALL DELAY

MOVLW B’010’ ;ミの音を出力MOVWF PORTBCALL CTONECALL DELAYMOVLW B’100’ ;ソの音を出力MOVWF PORTBCALL CTONECALL DELAY

GOTO TONELOOPリスト 8 音階を発生するプログラム

CTONE MOVLW 167 ;956us 30instMOVWF LCNT

CTONE1 BSF PORTA3GOTO $+1GOTO $+1GOTO $+1GOTO $+1GOTO $+1GOTO $+1NOPBCF PORTA3GOTO $+1GOTO $+1GOTO $+1GOTO $+1GOTO $+1GOTO $+1DECFSZ LCNT1 GOTO CTONE1RETURN

ETONE MOVLW 167 ;759us 24instMOVWF LCNT

ETONE1 BSF PORTA3GOTO $+1GOTO $+1GOTO $+1GOTO $+1GOTO $+1BCF PORTA3GOTO $+1GOTO $+1GOTO $+1GOTO $+1NOPDECFSZ LCNT1 GOTO ETONE1RETURN

GTONE MOVLW 251 ;637us 20instMOVWF LCNT

GTONE1 BSF PORTA3NOPGOTO $+1GOTO $+1GOTO $+1GOTO $+1BCF PORTA3GOTO $+1GOTO $+1GOTO $+1DECFSZ LCNT1 GOTO GTONE1RETURN

DELAY MOVLW 140MOVWF TCNT

DLY1 GOTO $+1 GOTO $+1DECFSZ TCNT,1GOTO DLY1RETURN

リスト 8 続き

A B C D E F G A B C D E F G A B C

440H

z

493.

88H

z

523.

25H

z

587.

33H

z

659.

26H

z

698.

46H

z

783.

99H

z

880H

z

987.

77H

z

1046

.5H

z

1174

.7H

z

1318

.5H

z

1398

.9H

z

1568

.0H

z

1760

Hz

1975

.5H

z

2093

Hz

A B C D E F G A B C D E F G A B CA B C D E F G A B C D E F G A B C

440H

z

493.

88H

z

523.

25H

z

587.

33H

z

659.

26H

z

698.

46H

z

783.

99H

z

880H

z

987.

77H

z

1046

.5H

z

1174

.7H

z

1318

.5H

z

1398

.9H

z

1568

.0H

z

1760

Hz

1975

.5H

z

2093

Hz

図3 音程と周波数の関係

Page 12: アセンブリ言語 - Yamagata Uea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...図1は実験に使用するPIC16F84の簡略化された内部構成である。最大の特徴は,プログ

4.報告書に含まれるべき内容課題(1)LEDを点灯させる1-1)アセンブリ言語ソースコードの各行について,その働きを説明する文1-2)アセンブリ言語ソースコード中のPICの命令語に対応する機械語(ビット列で)1-3)1回目から6回目までのSTEPスイッチのプッシュに対して観測されたLEDの状態と,PICの内部での動作

を対応付けた説明

課題(2)アセンブリ言語プログラムを読みやすくする2-1)アセンブリ言語ソースコードの各行について,その働きを説明する文2-2)STEPモードで,STEPスイッチのプッシュ毎のLEDの状態と,PICの内部での動作を対応付けた説明2-3)CONTモードでのRESETスイッチのプッシュ時に観察されたLEDの動作

課題(3)複数のLEDを同時に点灯3-1)アセンブリ言語ソースコードの

MOVLW B’01001111’MOVWF PORTB ;LED on

について,その働きを説明する文3-2)STEPモードで,STEPスイッチのプッシュ毎のLEDの状態と,PICの内部での動作を対応付けた説明3-3)“5”を表示するプログラムのアセンブリプログラムのリスト

課題(4)複数のLEDを順番に点灯[資料p.69]4-1)リスト4のプログラムをステップモードで実行した時の,“LOOP”から“GOTO LOOP”までのブロックの,ステップ表示と命令実行を対応付けた説明

課題(5)LEDを 50msec間隔で点滅させる[資料p.74]5-1)リスト5のプログラム(50msで LEDをフリッカさせるプログラム)のCONTモードでの実行結果5-2)LEDのON/OFFの時間はCPUの命令にして何ステップであるかプログラムを基に説明。また,PICのクロック周波数から,その時間を正確に計算せよ。(PICに外部から供給するシステムクロックの4サイクルがPICの命令の1サイクルであることに注意)

課題(6)LEDを 1sec間隔で点滅させる[資料p.79]6-1)リスト6のプログラム(1sでLEDをフリッカさせるプログラム その2)のCONTモードでの実行結果

課題(7)ブザーを鳴らす[資料p.86]7-1)リスト7のプログラム(音の発生)のCONTモード動作での実行結果7-2)発音周波数が約500Hzとなるように変更したプログラムのリスト

課題(8)メロディーを作る[資料p.89]8-1)リスト8のプログラム(音階の発生)の動作の説明と実行結果

[発展課題]は,プログラムの動作の説明と,観察された実行結果について記すこと。発展課題8-Aは,自由にプログラムして良い。

参考文献1)PIC16F84 18ピン フラッシュ/EEPROM 8ビットマイクロコントローラ データシート,マイクロチップ・テクノロジー・ジャパン株式会社2)小川晃:FIRST PICkガイドブック,㈱マイクロアプリケーションラボラトリー(2001)3)後藤哲也:電子工作のためのPIC活用ガイドブック,技術評論社(2000)