コンピュータ系実験Ⅲ 「ワンチップマイコンの応用」 第2週目 実験内容 LED点灯回路の制御プログラムの作成 MPLABを用いたノートPC上でのシミュレーション 実験書16ページ、図10の回路を用いて実機動作 (課題3のみ) PICのアセンブリ言語でのプログラミング ここで少し先週の復習 アセンブリ言語とは? こういう感じのものです。 ORG BSF CLRF BCF CLRF MOVLW MOVWF ・・・・ 0 STATUS,RP0 TRISB STATUS,RP0 PORTB 55H PORTB アセンブリ言語とは? プロセッサが解釈可能な言語(機械語)を人 間が理解可能な形にした低水準言語 ⇔高水準言語,高級言語 ex)C言語, Java ニーモニックともいう プロセッサごとに定義された命令を用いる プロセッサによって言語仕様が異なる Ex) PICとPentiumでは全く異なる命令 PICでは35種類の命令を使用する(実験書45~ 49ページ) 機械語とは? プロセッサが解釈可能な言語 ディジタル回路では0と1で表現される 下記の0と1の羅列がプロセッサでのなんら かの動作を示す 11000000000100 00000010001100 11000000010001 00011100001100 ・・・ 機械語とアセンブリ言語 機械語を人間が理解可能な形にしたもの 命令を見れば大体の動作の予想がつく 機械語 11000000000100 00000010001100 11000000010001 00011100001100 ・・・ アセンブリ言語 MOVLW 04H MOVWF 0CH MOVLW 11H ADDWF 0CH,W ・・・ 用語① アセンブル:アセンブリ言語で書かれたプログ ラムを機械語に変換すること アセンブラ:アセンブリ言語を機械語に変換す るプログラム アセンブリ言語 MOVLW 04H MOVWF 0CH MOVLW 11H ADDWF 0CH,W アセンブル 機械語 11000000000100 00000010001100 11000000010001 00011100001100 用語② アセンブリ言語の動作を示す部分をオペコー ド、引数を示す部分をオペランドという ADDWF 0CH,W オペコード オペランド アセンブリ言語の特徴 メモリやレジスタなど、計算資源を直接扱う C言語のような変数は存在しない C言語などのように変数に対してコンパイラがメ モリを割り当てたり、計算に使用するレジスタを決 めてくれたりはしない プロセッサの構造(レジスタの数や用途など) を知らないとプログラミングできない 一般に高級言語で書いたプログラムよりも高 速に動作する PIC(PIC16F84)上の資源 PIC上でプログラミングする際に使用する資 源は以下の通りである(実験書7~8ページ) プログラムメモリ:プログラムを格納するメモリ レジスタファイル:動作設定やデータ格納用メモリ STATUSレジスタ ポートの入出力設定、入出力 汎用レジスタ など Wレジスタ(Working Register): 演算する際に一時保存用に使用するレジスタ PICの構造 プログラムメモリ (EEPROM) 演算処理部 メモリ (レジスタ ファイル) 入 出 力 ポ ー ト PICの構造 プログラム メモリ プログラム カウンタ 命令 レジスタ レジスタ ファイル MUX W レジスタ ALU 入 出 力 ポ ー ト RA0~RA7 RB0~RB7 PICの構造 プログラム メモリ プログラム カウンタ 命令 レジスタ レジスタ ファイル MUX W レジスタ ALU データバス 入 出 力 ポ ー ト RA0~RA7 RB0~RB7 PICの構造 プログラム メモリ プログラム カウンタ プログラムバス 命令 レジスタ レジスタ ファイル MUX W レジスタ ALU 入 出 力 ポ ー ト RA0~RA7 RB0~RB7 PICの構造 プログラム メモリ プログラム カウンタ 命令 レジスタ レジスタ ファイル MUX Wレジスタ ALU プログラムメモ リのアドレスを 生成するカウ ンタ 入 出 力 ポ ー ト RA0~RA7 RB0~RB7 PICの構造 プログラムアドレス プログラム メモリ プログラム カウンタ 命令 レジスタ レジスタ ファイル MUX Wレジスタ ALU 入 出 力 ポ ー ト RA0~RA7 RB0~RB7 プログラムバスを通って、 命令が読み出される PICの構造 プログラム メモリ プログラム カウンタ 命令 レジスタ レジスタ ファイル MUX Wレジスタ ALU 入 出 力 ポ ー ト RA0~RA7 RB0~RB7 命令に従って、 ALUで処理が行われたり、 レジスタファイルの内容が 読み出されたりする PICの構造 プログラム メモリ プログラム カウンタ 命令 レジスタ レジスタ ファイル MUX Wレジスタ ALU 入 出 力 ポ ー ト RA0~RA7 RB0~RB7 命令に従って、 ALUで処理が行われたり、 レジスタファイルの内容が 読み出されたりする PICの構造 プログラム メモリ プログラム カウンタ 命令 レジスタ レジスタ ファイル MUX Wレジスタ ALU 入 出 力 ポ ー ト RA0~RA7 RB0~RB7 プログラムメモリ 0番地 1番地 2番地 3番地 4番地 BSF CLRF BCF CLRF MOVLW ・・・ PIC16F84Aではプ ログラムメモリを 1024ワード分搭載 1000命令程度まで のプログラムを書 き込み可能 プログラムカウンタ で指定された番地 の命令が読み出さ れる ・・・・・・・・・・・・ プログラム メモリ 1023番地 プログラム カウンタ プログラムメモリ 0番地 1番地 2番地 3番地 4番地 BSF CLRF BCF CLRF MOVLW ・・・ PIC16F84Aではプ ログラムメモリを 1024ワード分搭載 1000命令程度まで のプログラムを書 き込み可能 プログラムカウンタ で指定された番地 の命令が読み出さ れる ・・・・・・・・・・・・ プログラム メモリ 1023番地 プログラム カウンタ 0 プログラムメモリ 0番地 1番地 2番地 3番地 4番地 BSF CLRF BCF CLRF MOVLW ・・・ プログラムカウ ンタの値は自動 的に+1され、次 の番地を指す ・・・・・・・・・・・・ プログラム メモリ 1023番地 プログラム カウンタ 1 プログラムメモリ 0番地 1番地 2番地 3番地 4番地 BSF CLRF BCF CLRF MOVLW ・・・ プログラムカウ ンタの値は自動 的に+1され、次 の番地を指す ・・・・・・・・・・・・ プログラム メモリ 1023番地 プログラム カウンタ 2 プログラムメモリ 0番地 1番地 2番地 3番地 4番地 BSF CLRF BCF CLRF MOVLW ・・・ プログラムカウ ンタの値は自動 的に+1され、次 の番地を指す ・・・・・・・・・・・・ プログラム メモリ 1023番地 プログラム カウンタ 3 プログラムメモリ 0番地 1番地 2番地 3番地 4番地 BSF CLRF BCF CLRF MOVLW ・・・ プログラムカウ ンタの値は自動 的に+1され、次 の番地を指す ジャンプ命令は プログラムカウ ンタの値を書き 換えることで実 現される ・・・・・・・・・・・・ プログラム メモリ 1023番地 プログラム カウンタ 4 レジスタファイル 0B番地 0C番地 0D番地 4E番地 4F番地 ・・・ 0番地 1番地 2番地 ・・・ レジスタファイルも プログラムメモリと 同様に、アドレスを 指定することで、 データの読み書き ができる 読み出し、書き込み のいずれであるか は命令によって決 定される 実験書13ページ参 照 ・・・ レジスタファイル PICの動作設定 0B番地 0C番地 0D番地 ステータス 外部との入出力 4E番地 4F番地 ・・・ 0番地 1番地 2番地 ・・・ 0番地から0B番地 まではSpecial Function Register (SFR)と呼ばれ、 用途が決まってい る ・・・ 0D番地 4E番地 4F番地 ・・・ 0C番地から4F番地 0番地 1番地 までは汎用レジスタ 2番地 であり、プログラム 実行中の一時デー タなどの保存に使用 0B番地 する 0C番地 ・・・ ・・・ レジスタファイル PICでのプログラミング Wレジスタにレジスタファイ ルの値を読み出す(または 直値をロード) その値とレジスタファイルの 値(または直値)で演算 レジスタ ファイル Wレジスタ ALU:Arithmetic Logic Unit 各種演算をするブロック ALU 例) 04H 11H 04Hを0CH番地にロードし、 その値と11Hを加算する レジスタ ファイル プログラム MOVLW 04H MOVWF 0CH MOVLW 11H ADDWF 0CH,W 04H Wレジスタ 04H 15H 11H ALU 15H 04H 11H 実験手順 1. サンプルプログラム1(19ページ)を21ページの操作に従って 動かしてみる 1. 2. 3. 4. 5. 6. 7. 8. 先週、追加課題で動かしている人はやらなくてOK サンプルプログラム2(23ページ)を動かし、23ページの表を 埋める→ TAのチェック サンプルプログラム2を参考に、課題1を解く→ TAのチェック サンプルプログラム3(26ページ)を動かしてみる サンプルプログラム3を参考に、課題2を解く→ TAのチェック サンプルプログラム4(29ページ)を動かしてみる サンプルプログラム4を参考に、課題3を解く → TAのチェック 課題3を先週作成したボード(16ページ図10)で動かす → TAのチェック サンプルプログラムについて① サンプルプログラムの最初の辺りの行はPIC の動作設定や初期化のコード (最初の3行はファイルの読み込み等) ここがプログラムの ORG 0 0番地であることを示す MAIN BSF STATUS,RP0 この3行で CLRF TRISB PORTBの BCF STATUS,RP0 入出力を設定 CLRF PORTB PORTBの初期化 サンプルプログラムについて② プログラム中のTRISBはレジスタファイル中 のSFRのTRISBレジスタのこと PORTBの入出力の設定を行う これに関しては翌週解説 サンプルプログラムについて③ プログラム中のPORTBはレジスタファイル中 のSFRのPORTBのこと PICのRB0~RB7(実験書5ページ図2参照)に対 応する 例)PORTBを出力に設定した状態でPORTBの 値を11110000とすると、RB0~RB3には0が出力 され、RB4~RB7には1が出力される 今回の回路だと、1が出力されたRB4~RB7に 接続されたLEDが点灯する 初期化部分で初出の命令 BSF (Bit Set File register) BCF (Bit Clear File register) CLRF (CLeaR File register) PICの命令③ ビット操作命令 -BSF BSF (Bit Set File register) ファイルレジスタの指定したビット(0オリジン)を1 にする 例) BSF 0CH, 4 0CH番地の値の4ビット目を1にする 0CHに00000000が格納されていたとすると 00010000となる 指定可能なビットは0~7 PICの命令③ ビット操作命令 -BCF BCF (Bit Clear File register) ファイルレジスタの指定したビットを0にする 例) BCF 0CH, 4 0CH番地の値の4ビット目を0にする 0CHに11111111が格納されていたとすると11101111と なる 指定可能なビットは0~7 BSF, BCF以外にもビット判定(指定したビット が0か1か)をして、分岐する命令も存在する PICの命令④ 初期化命令 -CLRF CLRF (CLeaR File register) 指定したファイルレジスタの値を0にする 例)CLRF 0CH → 0CH番地の値が00H(00000000)になる CLRF以外にもWレジスタを初期化する命令 などが存在する サンプルプログラムについて④ サンプルプログラム3ではループ(繰り返し) を伴うコードが書かれている LOOP RLF DECFSZ GOTO MOVF 0CH, F 0DH LOOP 0CH, W サンプルプログラム3で初出の命令 RLF (Rotate Left File register through carry) DECFSZ (DECrement File register, Skip of Zero) GOTO PICの命令⑥ シフト命令 RLF (Rotate Left File register through carry) ファイルレジスタの内容を1bit左シフトする 7bit目はCarry(桁上がり)にシフトされる Carryの実体はSTATUSレジスタのCarryビット 当然、逆方向のシフト命令も存在する 7 6 5 4 3 2 1 0 C 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 PICの命令⑤ 条件分岐命令 DECFSZ (DECrement File register, Skip of Zero) 指定したファイルレジスタの値から1を引いて(デ クリメント)、その結果が0ならば次の命令をス キップする(1つ後の命令を実行する) 0でないならば、次の命令を実行する DECFSZ以外にもビット判定命令などで同様 の動作をする命令も存在する PICの命令⑦ ジャンプ命令 GOTO 指定した番地(プログラムアドレス)に無条件分岐 する 例) GOTO LOOP → LOOP(ラベル)に分岐する 分岐できる範囲は000H~7FFHの間 DECFSZの例 0DH番地に3が格納されているとする 下図では矢印で示した命令を実行しているも のとする 0DH番地の値 LOOP RLF DECFSZ GOTO MOVF 0CH, F 0DH LOOP 0CH, W 0 1 3 2 サンプルプログラムについて⑤ サンプルプログラム4の最初 GPR_1 EQU 0CH GPR_2 EQU 0DH GPR_3 EQU 0EH は、“0CHという値にGPR_1という別名を付けますよ” という意味(GPR_2, GPR_3も同様) 上記の場合、以下のコードは同じ意味を持つ MOVWF GPR_1 MOVWF 0CH サンプルプログラム4で初出の命令 CALL (CALL subroutine) COMF (COMplement File register) NOP (No OPeration) RETURN (RETURN from subroutine) PICの命令⑧ サブルーチンコール CALL (CALL subroutine) 指定したサブルーチンにジャンプする GOTO命令と異なる点はRETURN命令と組み合わせる ことで、サブルーチンの呼び元に戻ることができる点 例) CALL TIMER → TIMERというサブルーチンに飛ぶ このTIMERはラベルであるが、直接サブルーチンのプロ グラムアドレスを数値で指定することも可能 例) CALL 0FFH → 0FFH番地から始まるサブルーチンに飛ぶ PICの命令⑧ サブルーチンコール RETURN (RETURN from subroutine) CALLで呼び出されたサブルーチンから、CALL の呼び出し元に戻る(CALL命令の次の命令に飛 ぶ) PICの命令⑨ ビット反転命令 COMF (COMplement File register) 正確にはFile registerの値の(1の)補数 (Complement)をとる命令 実行すると、指定したFile registerの値のビットが 全て反転する 例) 0CH番地に11110000が格納されているとする COMF 0CH とすると、0CH番地の値は00001111になる PICの命令⑩ 何もしない命令 NOP (No OPeration) その名の通り、何もしない命令 今回のように時間を計る場合など、用途は様々 サンプルプログラムについて⑥ サンプルプログラム4の流れを以下に示す メインルーチン MAIN ・・・ ;===================== MOVLW 55H LOOP MOVWF PORTB CALL TIMER COMF PORTB, W ・・・・ タイマサブルーチン ・・・ TIMER ・・・ RETURN 実験書45~49ページの見方 命令とその意味 ADDWF : ADD W and F(Wレジスタとファイルレジスタの加算) 書式 : ADDWF 動作 : W ← W + f (d = 0(W)) f ← W + f (d = 1(F)) f, d アセンブリ言語で 記述する際の書式 W : Wレジスタ f : ファイルレジスタ(7bit:00h~7Fh) d : 結果の格納先(0(W) or 1(F)) PIC内部の動作 この命令を実行したことによって 影響するフラグ : C, DC, Z 影響を受けるステータスレジスタのビット マシン語 : 00 0111 dfff ffff マシン語に変換した際のビット列 例 : MOVLW 44H ・・・・ ; Wレジスタに44hを書き込む プログラム例 プログラミング時の注意事項 Wレジスタの値に入っている値を把握する アルファベットで始まるアドレス、値には0を付ける AH → 0AH CH → 0CH 扱っている値がアドレスなのか数値なのか認識する こと アセンブル時にエラーが出た場合は、TAを呼ぶ前 にエラーコードを読み、自分で原因追求をしてみる こと(実験書25ページ) プログラム中にコメント以外で全角文字(全角スペー スも含む)を入れないこと 作業中の注意 実験中は立ち歩かないこと 立ち歩く用件がある場合はTAに伝えてから PICライタに関して PICライタを取り外すときは必ずPICライタの 電源を落としてからにすること Windowsがブルースクリーンになって、落ちるこ とがあります MPLABも落としておくと、より安全です
© Copyright 2024 ExpyDoc