1 平成 30 年度版
ロボティクスコース実験Ⅰ
組込みプログラミングⅠ, Ⅱ
1.スケジュール
日付 内容 4/16 - コンピュータの機械語(ニーモニック)と MPLAB(プログラム開発環境)の使い方 - 実験1の予備実験 4/23 - 実験1の予備実験のまとめ - 実験1の計画書の作成とチェック 5/2 - 実験1の実施とレポート作成 ※月曜授業 5/7 - 実験1のレポートのチェック➡提出1 - 実験2の予備実験 5/14 - 実験2の予備実験のまとめ - 実験2の計画書の作成とチェック 5/21 - 実験2の実施とレポート作成 (➡5/28 提出2) ※実験2を終えた方は4.5の追加課題を行って下さい2.目的
(1)コンピュータの基礎的な構成と各部の働きを理解する. (2)コンピュータの機械語(ニューモニック)と,コンピュータがプログラムを実行する仕組みを理 解する. (3)データ転送命令と演算命令の働きを理解し,使い方を修得する. (4)分岐命令の働きを理解し,使い方を修得する.3.PIC マイコンの構成
3.1 概要PIC マイコン(以降 PIC と呼ぶ)の中にはコンピュータに必要な演算回路と制御回路(CPU),メモリ(RAM, ROM),入出力(I/O)などが全て収められており,ROM に書き込まれたプログラムによって動作する.PIC は命令の長さが一定である RISC 構造のコンピュータであり,プログラムを格納するメモリとデータを格 納するメモリが分離されたハーバード・アーキテクチャに基づいて構成されている.
PIC のプログラムを開発するためには種々の方法があるが,代表的なツールとして,開発に必要な全て の機能をまとめた統合開発環境ソフトウエア MPLAB がメーカーから無償で提供されている.
2 ピン名 ピン番号 働き 接続先 VDD 20 電源 3V VSS 8,19 グランド 0V 1 リセット 押しボタンスイッチ OSC1 9 OSC2 10 RB0 21 RB1 22 RB2 23 RB3 24 RB4 25 RB5 26 RB6 27 RB7 28 RC0 11 RC1 12 RC2 13 RC3 14 RC4 15 RC5 16 RC6 17 RC7 18 外部振動 子 セラロック 入力ポート 出力ポート DIPスイッチ、または押しボタ ンスイッチ LEDまたは圧電スピーカー MCLR 3.2 アーキテクチャとピン配置 (1) PIC の内部構成 図1 PIC の内部構成 (2)ピン配置 実験で使用する PIC16F876A は図2に示すように28本のピンを持っている.なお,実験ではこれら の中から表1に示すピンを使用する. 表1 実験で使用するピン 図2 PIC16F876A のピン配置 PIC の内部構成を図1に示す. この図はコンピュータアーキテ クチャのテキストで用いられて いるモデルコンピュータの構成 と基本的に同じであるが,入出力 ポート,マルチプレクサ,Status レジスタ等が追加されているの で注意すること.
3 3.3 PIC の仕様 仕様の主な項目を表2に示す. 表2 PIC16F876A の仕様 動作周波数 DC~20MHz プログラムメモリ(ワード(14bit)) 8K データメモリ(バイト) 368 割り込み 13 入出力ポート PORTA,PORTB,PORTC タイマー 3 10bit A/D モジュール 5 入力チャンネル 命令セット 35 命令
4.実験
4.1 実験の手順 次の手順で実験を進める. (S1) 準備(実現方法の基本的な考え方をまとめる) (S2) アルゴリズムとフローチャートの作成 (S3) プログラムの作成(コーディングとシミュレーション及びデバグ) (S4) 回路図の作成 (S5) 配線 (S6) プログラムをダウンロードし,実験項目及び結果のまとめに示された内容を実施して結果をレポ ートにまとめる.4 4.2 使用部品とブレッドボードの使い方 (1)使用部品 表3 部品表 使用部品 個数 外形 備考 番号 PIC16F876A 1 セラロック 1 中央の端子を GND に接続 CSTLS4M00G53-B0 DIP スイッチ 1 KSD82 LED モジュール 1 文字側がアノード(陽極) OSX10201-R 押しボタンスイッチ (タクトスイッチ) 2 押した時に導通する端子をテスターで確 認すること 集合抵抗 1kΩ 1 印字面を手前に向けて左側が共通端子 RKC8BD102J ブレッドボード 1 BB-102 ワイヤー 必要数 電池ボックス 1 アルカリ電池 2 抵抗器 4.7kΩ 2 圧電スピーカ 1 PKM13EPYH4000-A0 (2)ブレッドボードの使い方 図3 ブレッドボード ブレッドボードの左端の 2 列と右端の 2 列は,図3中の縦線で示す ように各列の穴同士が接続されている.これらの列は赤を電源(+3 V),青をGND(0V)に使用する. 横に並んでいる5個の穴同士(横線で示す)は互いに接続されてい る.右側の横に並んだ5個の穴も同様である. ICは中央をまたぐように片側を図のeの列,反対側をfの列に挿入 する.残りの部品は配線がし易いようによく考えて適宜配置するこ と.
5 4.3 実験1 (注)予備実験はレポートに書かなくてもよい.. 4.3.1 予備実験 (1)内容 PORTB(06h)から入力したデータに定数 k(=5)を足した結果を PORTC(07h)に出力するプログラムを作成 し,シミュレータでその動作を確認する. (2)手順 実験の手順に従って作業を進める.但し,(S4)と(S5)は省略する.MPLAB の使い方については,本実 験のサポート HP(http://esato.net/ex/robo/)の資料を参考にする. (S1)準備(実現方法の基本的な考え方をまとめる) データ転送命令を使用して,データメモリの一部である入力ポートからデータを入力する.次に算術 演算(加算)命令を使用して,W レジスタに格納したデータに定数(05h)を足す. (S2)アルゴリズムとフローチャートの作成 図4 予備実験のフローチャート (S3)プログラムの作成(コーディングとシミュレーション及びデバグ) リスト1 実験1 予備実験のソースリスト ;実験1 予備実験のプログラム INCLUDE P16F876A.INC LIST P=PIC16F876A
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF
;ラベルの定義と初期設定 PORTB EQU 06H
6 ORG 00H ;パワーオンリセット GOTO MAIN ORG 04H ;割り込みベクタ GOTO MAIN ;メインルーチン
MAIN BSF STATUS,RP0 ;BANK1 にする MOVLW 0FFH ;入力モード MOVWF TRISB ;PORTB を設定 MOVLW 00H ;出力モード MOVWF TRISC ;PORTC を設定 BCF OPTION_REG,7 ;RB PULL UP 有効 BCF STATUS,RP0 ;BANK0 にする
MOVF PORTB,0 ;PORTB から W レジスタに入力 ADDLW 05H ;W レジスタに 05H を足す MOVWF PORTC ;W レジスタの値を RORTC に出力 SLEEP ;停止 END (S6)動作の確認 表4 シミュレータ(ウォッチダイアログ)における動作確認結果 (ⅰ)PORTB に 53h(01010011b)を設定した場合 実行前の値 実行後の値 PORTB 53h PORTC W レジスタ Status レジスタ (ⅱ)PORTB に 0FEh(11111110b)を設定した場合 実行前の値 実行後の値 PORTB 0FEh PORTC W レジスタ Status レジスタ
7 (ⅲ)PORTB に 00h を設定した場合 実行前の値 実行後の値 PORTB 00h PORTC W レジスタ Status レジスタ (ⅳ)PORTB に 0FFh(11111111b)を設定した場合 実行前の値 実行後の値 PORTB 0FFh PORTC W レジスタ Status レジスタ 4.3.2 本実験 (1)内容 PORTB(06h)から入力したデータに定数 k(=5)を足した結果を PORTC(07h)に出力するプログラムを作成 し,実験回路(図5)においてその動作を確認する. 図5 実験1の回路
8 (2)手順 実験の手順に従って作業を進める.(S6)のプログラムのダウンロードについては,本実験のサポート HP(http://esato.net/ex/)の資料(PIC ライターの使い方)を参考にする. (3)実験の項目及び結果のまとめ 次の4通りの場合について実験を行い,予備実験で行ったシミュレーションの結果と比較する. (ⅰ)PORTB に 53h(01010011b)を設定した場合 (ⅱ)PORTB に 0FEh(11111110b)を設定した場合 (ⅲ)PORTB に 00h を設定した場合 (ⅳ)PORTB に 0FFh(11111111b)を設定した場合 (4)考察 4通りの値を入力した時のZフラグとCフラグの値が,シミュレーション結果のようになる理由を考 察せよ. 4.4 実験2 4.4.1 予備実験 (1)内容 PORTC のビット 0 に接続した圧電スピーカーから 1kHz の音を出すプログラムを作成する. (2)手順 (S1)準備 図5に示すように,1kHz の信号を出力するためには,PORTC のビット 0 を 1kHz の波形の半周期ごとに 1と0を変化させればよい. 図5 PORTC の波形 このために PORTC のビット 0 に1を出力した後カウンタ用のデータメモリ(COUNT)に繰り返し回数(N: 後で求める)を設定し,条件分岐命令と無条件分岐命令を使ってカウンタ用のデータメモリが0になるま で1ずつ減らして行く.0になったら再びカウンタ用のデータメモリに繰り返し回数を設定し,今度は PORTC のビット0に0を出力した後,同様に分岐命令を使ってカウンタ用のデータメモリが0になるまで 1ずつ減らして行く.この動作を繰り返す.
9 (S2)アルゴリズムとフローチャートの作成 準備に示した基本的な考え方に基づいてアルゴリズムを作成し,フローチャートで表す. 図6 予備実験のフローチャート 次に繰り返し回数を求める. <繰り返し回数の計算> 命令の実行時間のもとになるクロックの周期を求める.クロックは 4MHz であるから,周期は次のよう に求まる. クロック周波数(fc):4MHz クロック周期(Tc):1/4MHz=0.25μsec 繰り返しは条件分岐命令と無条件分岐命令を組み合わせる.条件分岐(ゼロ分岐)命令(DECFSZ)と 無条件分岐命令(GOTO)の実行時間は次のように求まる.各命令の実行には、4 クロック×(サイクル数) の時間が必要であり,そのサイクル数については 23 ページの表 A.1 を参考にすること. 条件分岐命令(DECFSZ)の実行時間:0.25μsec×4 クロック×1 サイクル=1μsec 無条件分岐命令(GOTO)の実行時間:0.25μsec×4 クロック×2 サイクル=2μsec 従って,繰り返し 1 回分の命令の実行時間は次のようになる. 2 命令の実行時間の合計:1μsec+2μsec=3μsec 1kHz 波形の周期の半分(0.5msec)の間 PORTC のビット 0 を 1 にし,残りの半分を 0 にするために必要 な繰り返し回数は次のように求まる. 1kHz の波形の周期:1/1kHz=1msec 2 個の命令を繰り返す回数:N=(1msec/2)/3μsec≒167=A7h (S3)プログラムの作成(コーディングとシミュレーション及びデバク) フローチャートに基づいてプログラムを作成する.
10 リスト2 実験2 予備実験のソースリスト ; 予備実験のプログラム ;--- PIC の設定--- INCLUDE P16F876A.INC LIST P=PIC16F876A
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF ;--- ラベルの定義と初期設定--- PORTC EQU 07h COUNT EQU 20h ORG 00h ;パワーオンリセット GOTO MAIN ORG 04h ;割り込みベクタ GOTO MAIN ;--- メインルーチン--- MAIN BSF STATUS,RP0 ;BANK1 にする
MOVLW 00h ;出力モード MOVWF TRISC ;PORTC を設定 BCF STATUS,RP0 ;BANK0 にする
LOOP1 MOVLW 0A7h ;COUNT に初期値を設定 MOVWF COUNT
BSF PORTC,0 ;PORTC のビット 0 をセット(1)
LOOP2 DECFSZ COUNT,1 ;COUNT を 1 減らした結果が 0 なら次の命令をスキップ GOTO LOOP2 ;LOOP2 に戻る
MOVLW 0A7h ;COUNT に初期値を設定 MOVWF COUNT
BCF PORTC,0 ;PORTC のビット 0 をクリア(0)
LOOP3 DECFSZ COUNT,1 ;COUNT を 1 減らした結果が 0 なら次の命令をスキップ GOTO LOOP3 ;LOOP3 に戻る
GOTO LOOP1 ;LOOP1 に戻る END
11 (S4)回路図の作成 図7 予備実験の回路図 回路図が完成したら,(S5)と(S6)を適宜進める. (3)実験項目及び結果のまとめ (ⅰ)出力波形をオシロスコープで観測し,波形を記録する. (ⅱ)波形の周期から周波数を求める.小数点以下2桁まで求めること. 4.4.2 本実験 (1)内容 (2)手順 先ず実験の手順(S1)から(S4)までの実験計画書を作成して指導教員に確認して貰うこと.確認後許可 を得てから実験計画書に基づいて(S5)と(S6)を実行する. (注)回路図は図 7 を参考にすること (3)実験項目及び結果のまとめ (ⅰ)2kHz と3kHz の出力波形をオシロスコープで観測し, 記録する. (ⅱ)各々の波形の周期から周波数を求める.なお,周波数は小数点以下 2 桁まで求めること. 予備実験を参考にして,PORTB のビット 0 に接続した DIP スイッチを ON にした時に PORTC のビット 0 に接続したスピーカーから 3kHz の音を出し,DIP スイッチを OFF にした時に 2kHz の音を出すプ ログラムを作成せよ.
12 (4)考察 2kHz と3kHz の各々の出力波形から求めた周波数と目標の周波数(2kHz または3kHz)との差を 求め,差が生じる理由を考察せよ. 4.5 追加課題 ※実験2を終えた方は行って下さい 4.5.1 目的 ・命令の実行時間を理解し,プログラムの実行に要する時間を計算できる ・コンピュータが割り込みを処理する仕組みを理解し,割り込みの使い方を修得する 4.5.2 予備実験 (1)内容 PORTB のビット 0 に接続された押しボタンスイッチを押すと(押したときに 1,押さないときに 0 と する),8 個の LED の表示が 00h にクリアされるプログラムを次の A と B の 2 通りの方法で作成せよ. 但し,表示は 3 秒間に1ずつカウントアップすること.また,8 個の LED は PORTC に接続すること. <方法 A 割り込みを用いない方法> プログラム中でスイッチが押されているか否かを判定し,押されている時に表示をクリアする. なお表示は,0FFh から更に1だけカウントアップすると自動的に 00h に戻る. <方法 B 割り込みを用いる方法> スイッチが押されたときに割り込みが発生し,割り込み処理の中で表示をクリアする. なお表示は, 0FFh から更に1だけカウントアップすると自動的に 00h に戻る. (2)方法 A の手順 (S1)準備(実現方法の基本的な考え方をまとめる) プログラムの先頭で PORTB のビット0の値が 0 なら PORTC を 00h 戻し(クリアするという),そうでな いならそのままにして次に進む.ついで 3 秒間待った後,PORTC の内容を1だけ増加してから元に戻るよ うにすればよい. (S2)アルゴリズムとフローチャートの作成 準備に示した基本的な考え方に基づいてアルゴリズムを作成しフローチャートで表す.
13 図8 押しボタンスイッチを押すと表示がクリアされるカウンタプログラムのフローチャート (S3)プログラムの作成(コーディングとシミュレーション及びデバグ) フローチャートに基づいて,判断をビット判定分岐命令に置き換え,PORTC に1を加算する処理を定数 設定命令とレジスタにデータメモリの内容を加算する命令の組み合わせに,そして元に戻る動作を無条 件分岐命令に置き換えるとプログラムは次のようになる. リスト3 追加課題 予備実験 方法Aのソースリスト ; 予備実験のプログラム(割り込みを用いない方法) ;--- PIC の設定--- INCLUDE P16F876A.INC LIST P=PIC16F876A
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF ;---ラベルの定義と初期設定--- PORTB EQU 06h PORTC EQU 07h COUNT1 EQU 20h ;タイマー用カウンタ COUNT2 EQU 21h ; 〃 COUNT3 EQU 22h ; 〃 ORG 00h ;パワーオンリセット GOTO MAIN ORG 04h ;割り込みベクタ GOTO MAIN ; ---メインルーチン---
14 MAIN BSF STATUS,RP0 ;BANK1 にする
MOVLW 00h ;出力モード MOVWF TRISC ;PORTC を設定 MOVLW 0FFh ;入力モード MOVWF TRISB ;PORTB を設定 BSF OPTION_REG,7 ;RB PULLUP 無効 BCF STATUS,RP0 ;BANK0 にする CLRF PORTC ;PORTC クリア LOOP BTFSC PORTB,0 ;押しボタンスイッチチェック CLRF PORTC ;押されているなら PORTC をクリア ;---3 秒タイマープログラム---
MOVLW 0Eh ;COUNT1 に初期値設定 MOVWF COUNT1
LOOP1 MOVLW 0FFh ;COUNT2 に初期値を設定 MOVWF COUNT2
LOOP2 MOVLW 0FFh ;COUNT3 に初期値設定 MOVWF COUNT3
LOOP3 DECFSZ COUNT3,1 GOTO LOOP3 DECFSZ COUNT2,1 GOTO LOOP2 DECFSZ COUNT1,1 GOTO LOOP1 ;---カウントアッププログラム--- MOVLW 01h ;PORTC を1だけカウントアップ ADDWF PORTC,1 GOTO LOOP ;先頭に戻る END (S4)回路図の作成 図9に示すように部品を接続する.このとき LED モジュールの極性に注意すること(部品表参照).
15 図9 予備実験の回路図 回路図が完成したら(S5)と(S6)を適宜進める. (3)方法 A の実験項目及び結果のまとめ 次の 5 通りの場合について,表示が正しくクリアされた回数を求めてグラフを作成する. (ⅰ)押しボタンを 1 秒間押した後 10 秒間離す操作を10回繰り返した時にクリアされた回数 (ⅱ) 〃 2 秒間 〃 (ⅲ) 〃 3 秒間 〃 (ⅳ) 〃 4 秒間 〃 (ⅴ) 〃 5 秒間 〃 (4)方法 B の手順 (S1)準備(実現方法の基本的な考え方をまとめる) 割り込み処理はメインプログラムと独立しているため,メインプログラムでは3秒間待った後に1だ けカウントアップする動作だけを繰り返す.一方割り込み処理プログラムでは PORTC をクリアする(0 にする)処理のみを実行する. (S2)アルゴリズムとフローチャートの作成 準備に示した基本的な考え方に基づいてアルゴリズムを作成しフローチャートで表す. プログラムのフローチャートは次のようになる.
16 開始 PORTC←00h 3秒タイマー プログラム PORTC←PORTC+1 割り込み 戻り (a)メインプログラム (b)割り込み処理プログラム 図 10 割り込み処理を用いたプログラムのフローチャート (S3)プログラムの作成(コーディングとシミュレーション及びデバグ) 先ず図 10(a)のフローチャートに基づいてメインプログラムを作成する.メインプログラムでは各種の 設定を行った後,PORTC を0にクリアする.次に3秒経ってから W レジスタに1を格納し,W レジスタと PORTC で加算した結果を PORTC に戻す.これによって PORTC の内容が1増加する.最後に無条件分岐命令 を使用してメインプログラム中のタイマープログラム部分に戻る. 次に図 10(b)のフローチャートに基づいて割り込み処理プログラムを作成する.割り込み処理プログラ ムでは,先ず指定したビットを0にする命令を用いて,割り込みが発生したことを示す割り込みフラグ (アドレス 0Bh のデータメモリのビット1)を0にする.これは割り込みが発生すると割り込みフラグ が1になり,そのまま実行を続けると割り込み処理プログラムから戻った時に,再び割り込み処理プロ グラムが呼び出されてしまうことを防ぐためである.この後で PORTC の内容を0にする.その後割り込 み処理から戻る命令を使ってメインプログラムに戻る.プログラムは次のようになる. リスト4 追加実験 方法 B 予備実験のソースリスト ; 予備実験のプログラム(割り込みを用いる方法) ;--- PIC の設定--- INCLUDE P16F876A.INC LIST P=PIC16F876A
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF ;--- ラベルの定義と初期設定--- PORTB EQU 06h PORTC EQU 07h COUNT1 EQU 20h COUNT2 EQU 21h COUNT3 EQU 22h
17 ORG 00h ;パワーオンリセット GOTO MAIN ;---割り込み処理プログラム--- ORG 04h ;割り込みベクタ BCF 0Bh,1 ;割り込みフラグをクリア CLRF PORTC ;PORTC をクリア MOVLW 01H MOVWF COUNT1 ;3 秒タイマー用カウンタリセット MOVWF COUNT2 ; 〃 MOVWF COUNT3 ; 〃 RETFIE ; ---メインルーチン--- MAIN BSF STATUS,RP0 ;BANK1 にする
MOVLW 00h ;出力モード MOVWF TRISC ;PORTC を設定 MOVLW 0FFh ;入力モード MOVWF TRISB ;PORTB を設定 BSF OPTION_REG,7 ;RB PULLUP 無効 BSF OPTION_REG,6 ;割り込みの設定(立ち上がりエッジ) BCF STATUS,RP0 ;BANK0 にする MOVLW 90h ;割り込み設定 MOVWF 0Bh CLRF PORTC ;PORTC をクリア ;---3 秒タイマープログラム---
LOOP MOVLW 0Eh ;COUNT1 に初期値設定 MOVWF COUNT1
LOOP1 MOVLW 0FFh ;COUNT2 に初期値を設定 MOVWF COUNT2
LOOP2 MOVLW 0FFh ;COUNT3 に初期値設定 MOVWF COUNT3
LOOP3 DECFSZ COUNT3,1 GOTO LOOP3 DECFSZ COUNT2,1 GOTO LOOP2 DECFSZ COUNT1,1 GOTO LOOP1 ;---カウントアッププログラム---
18 MOVLW 01h ;PORTC を1だけカウントアップ ADDWF PORTC,1 GOTO LOOP ;先頭に戻る END 次いで(S5)と(S6)を適宜進める.なお,回路図は割り込みを用いない場合と同様である. (5)実験項目及び結果のまとめ 次の 5 通りの場合について,表示が正しくクリアされた回数を求めてグラフを作成する. (ⅰ)押しボタンを 1 秒間押した後 10 秒間離す操作を10回繰り返した時にクリアされた回数 (ⅱ) 〃 2 秒間 〃 (ⅲ) 〃 3 秒間 〃 (ⅳ) 〃 4 秒間 〃 (ⅴ) 〃 5 秒間 〃 4.5.3 本実験 (1)内容 (2)手順 先ず実験の手順(S1)から(S4)までの実験計画書を作成して指導教員に確認して貰うこと.確認後許可 を得てから実験計画書に基づいて(S5)と(S6)を実行する. PORTB のビット 0 に接続された押しボタンスイッチを押すたびに(押したときに 1,押さないときに 0 とする),8 個の LED の表示がカウントアップからカウントダウンへまたはカウントダウンからカウントア ップへ切り替わるプログラムを次の 2 通りの方法で作成せよ.但し,カウントは 3 秒間に1回ずつ行うこ と.また 8 個の LED は PORTC に接続すること. <方法 A 割り込みを用いない方法> プログラム中でスイッチが押されているか否かを判定し,押されている時にカウントの向きを切り替え る. <方法 B 割り込みを用いる方法> スイッチが押された時に割り込みが発生し,割り込み処理の中でカウントの向きを切り替える. なお表示は,0FFh から更に1だけカウントアップすると自動的に 00h に戻る.また3秒のタイマーは予備
19 (3)実験項目及び結果のまとめ 割り込みを用いた場合と用いない場合について,下記の 5 通りの場合について実験を行なった結果を グラフにまとめる. (ⅰ)押しボタンを 1 秒間押した後 10 秒間離す操作を10回繰り返した時,加算と減算が切り替え られた回数 (ⅱ) 〃 2 秒間 〃 (ⅲ) 〃 3 秒間 〃 (ⅳ) 〃 4 秒間 〃 (ⅴ) 〃 5 秒間 〃 (4)考察 (ⅰ)「割り込みを用いない方法」の実験結果に基づいて,押しボタンを押す時間を変えたときに加 算と減算が切り替えられる回数が変化する理由について考察せよ. (ⅱ)「割り込みを用いる方法」について,(ⅰ)と同様に変化する理由を考察せよ.
参考文献
[1]角山正博,佐藤栄一:コンピュータの基礎,青山社,2013. [2]後閑哲也:PIC マイコンではじめる作って遊べるロボット工作,技術評論社,2004. [3]PIC16F87X データシート,マイクロチップ・テクノロジ・ジャパン(株). http://ww1.microchip.com/downloads/jp/DeviceDoc/30292A_JP.pdf [4]MPLAB® ICD 2 インサーキットデバッガユーザーズガイド,マイクロチップ・テクノロジ・ジャパ ン(株). http://www.microchip.jp/docs/DS51331A_JP.pdf [5]福本聡,岩崎一彦,コンピュータアーキテクチャ,昭晃堂,2005.20
付録
付録1 PIC のメモリマップとレジスタ
(1)メモリマップ
プログラムメモリとデータメモリには予め用途が割り当てられているアドレスがある.アドレスと用 途の関係を図 A.1 のメモリマップに示す. プログラムメモリはアドレス 0000h から 1FFFh(h は 16 進数であることを示す)までの 8k ワードある. このうちの 0000h にはリセットが発生した時に実行される命令が格納される.これをリセットベクタと いう.また 0004h には割り込みが発生した時に実行される命令が格納され,これを割り込みベクタとい う.ユーザプログラムはアドレス 0005h 以降に格納する. データメモリはバンクと呼ばれる 3 つの部分に分かれており,128 バイトのバンクが 2 個と 112 バイト のバンクが 1 個ある.データメモリは,アドレスの先頭部分をシステムで使用するため,バンク 0 は 20h から,バンク 1 は A0h から,またバンク 2 は 110h からユーザが使用できる. プログラムメモリ0000h リセットベクタ 00h INDF 80h INDF 100h INDF 01h 81h OPTION
02h
0004h 割込みベクタ 03h STATUS 83h STATUS 103h STATUS
0005h 04h 84h
05h PORTA 85h TRISA 06h PORTB 86h TRISB 07h PORTC 87h TRISC
03FFh 0Bh INTCON 8Bh INTCON 10Bh INTCON
20h ユーザ A0h ユーザ 110h ユーザ エリア エリア エリア 07FFh 16Fh 7Fh FFh 1FFFh バンク0 バンク1 バンク2 ユーザプログラム データメモリ 図 A.1 プログラムメモリとデータメモリのメモリマップ
(2)特殊機能レジスタ(SFR)
PIC には特殊機能レジスタ(Special Function Register)と呼ばれるいくつかのレジスタがあり,これ らはデータメモリの先頭部分に置かれている.この実験では,次の 3 個の特殊機能レジスタを使用する. (ⅰ)STATUS レジスタ
21 バンク 0 バンク1 バンク2 名称 STATUS STATUS STATUS アドレス 03h 83h 103h
STATUS レジスタの各ビットの機能を次の表に示す.
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 IRP RP1 RP0 ^TO ^PD Z DC C
ここでは,STATUS レジスタの Bit6,Bit5,及び Bit2 と Bit0 を使用する.
Bit6 と Bit5 はバンクを切り替える時に使用し,下の表に示す値に設定してバンクを切り替える. Bit6 Bit5 バンク 0 0 バンク 0 0 1 バンク1 1 0 バンク2 Bit2 と Bit0 はフラグレジスタである.詳細はコンピュータアークテクチャのテキスト中のフラグレジスタを 参照すること.なお,Bit1 の DC フラグは使用しない. Bit2 Bit0 Z C ゼロフラグ キャリフラグ (ⅱ)PORTB及びPORTCレジスタ PORTB と PORTC は入力または出力に使用するデータメモリである.下の表に示すように,2 つのポート レジスタはバンク0に割り当てられている. バンク 0 名称 PORTB PORTC アドレス 06h 07h 各ポートレジスタ(ポートと呼ぶ)のビットはそれぞれ RB0~RB7 及び RC0~RC7 の各ピンに対応して いる.入力モードの場合には,ポートから入力することによって該当するピンの状態(1か0)を知る 事ができる.出力モードの場合には,ポートのビットを1または0にすることによって該当するピンの 出力を1または0に設定することができる. なお,入力モードにするか出力モードにするかは,次に説明するTRISB及びTRISCレジスタ で指定する.
22 (ⅲ)TRISB及びTRISCレジスタ 各レジスタはバンク1に割り当てられている. バンク 1 名称 TRISB TRISC アドレス 86h 87h 各ビットはそれぞれのポートに対応する IC ピンの入出力モードを設定する.各ビットの値とピンのモー ド(入出力)の対応は以下のようになっている. ビットの値 モード 0 出力モード 1 入力モード なお,使わないポートは安全のために1をセットしておくこと. (ⅳ)INTCON レジスタ どのバンクからも同じ INTCONレジスタにアクセスできる.このレジスタは8ビットで構成され、割 込み制御のために使用する.各ビットは以下のようになっている.
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 GIE EEIE TOIE INTE RBIE TOIF INTF RBIF この実験で使用する INTCON レジスタの各ビットの機能を次の表に示す. ビット 名称 機能 Bit7 GIE グローバル割込みイネーブルビット 1=全てのマスクされていない割込み発生を許可する 0=全ての割込み発生を禁止する Bit4 INTE RB0/INT 割込みイネーブルビット 1=RB0/INT 割込みを許可する 0=RB0/INT 割込みを禁止する Bit1 INTF RB0/INT 割込みフラグビット 1=RB0/INT 割込みが発生した(ソフトウェアでクリア要) 0=RB0/INT 割込みが発生していない
付録2 PIC の命令
8 ビット PIC マイコンは 35 個の命令を持っている.ここでは,コンピュータアーキテクチャの授業で 説明する 32 個の命令を使ってプログラムを作成する.命令の一覧を次の表に示す.23 表 A.1 PIC の命令 グ ル ープ サブグループ ニ ュ ー モ ニ ック 働き フラグ サイク ル数 デ | タ 転 送 命 令 なし MOVLW k CLRW CLRF f BCF f,b BSF f,b MOVF f,d MOVWF f 定数k→W 0→W 0→f fのbビット目を0にクリアする fのbビット目を1にセットする d=0 ならf→W,d=1 なら f→f W→f Z Z Z 1 1 1 1 1 1 1 演 算 命 令 算術演算命 令 ADDLW k ADDWF f,d INCF f,d SUBLW k SUBWF f,d DECF f,d 定数k+W→W d=0 なら W+f→W,d=1 なら W+ f→f d=0 なら f+1→W ,d=1 なら f+1→f 定数 k-W→W d=0 なら f-W→W,d=1 なら f-W→f d=0 なら f-1→W,d=1 なら f-1→f C,DC,Z C,DC,Z Z C,DC,Z C,DC,Z Z 1 1 1 1 1 1 論理演算命 令 ANDLW k ANDWF f,d IORLW k IORWF f,d COMF f,d XORLW k XORWF f,d 定数 k AND W→W d=0 なら W AND f→W ,d=1 なら W AND f→f 定数 k OR W→W d=0 なら W OR f→W ,d=1 なら W OR f→f d=0 なら
f
→W ,d=1 ならf
→f 定数 k W →W d=0 なら W f→W,d=1 なら W f→W Z Z Z Z Z Z Z 1 1 1 1 1 1 1 ローテイト 演算命令 RLF f,d RRF f,d d=0 ならfの1ビット左シフト→W, d=1 ならfの1ビット左シフト→f d=0 ならfの1ビット右シフト→W, d=1 ならfの1ビット右シフト→f C C 1 1 分 岐 命 令 無条件分岐 命令 GOTO k 定数k番地へ分岐 2 条件分岐命 令 INCFSZ f,d DECFSZ f,d BTFSC f,b BTFSS f,b INCF と同じ処理,結果が 0 なら次の命令をスキップ DECF と同じ処理,結果が0なら次の命令をスキップ f の b ビット目が 0 なら次の命令をスキップ f の b ビット目が1なら次の命令をスキップ 1(2) 2(2) 1(2) 1(2)24 擬似命令 内 容 __CONFIG コンフィギュレーションビットの設定 INCLUDE 他のソースファイルの読み込み LIST 使用するPICの型名を指定 ORG プログラム開始番地の指定 EQU アドレスに名前をつける END ソースコードの終わりの宣言 サブルーチ ン命令 CALL k アドレス k のサブルーチンに分岐 2 RETURN サブルーチンから元のプログラムに戻る. 2 割り込み命 令 RETURNFIE 割り込みを許可して戻る. 2 制 御 命 令 なし NOP SLEEP 何も処理しない. CPU が動作を停止し,低電力モードに入る. 1 (注 1) オペランドのfはデータメモリのアドレス,d は格納先の指定(0:W レジスタ,1:データメ モリ),b はビット位置(0~7),k はリテラル(定数データ)を表す. (注 2)フラグ欄に C, DC, Z などの記載があるものは,その命令の実行によって,STATUS レジスタ内の 対応するフラグが影響を受けることを示す.詳しくはコンピュータアーキテクチャのテキスト を参照すること.なお,ここでは DC フラグを使用しない. (注 3)サイクル数は命令の実行時間を表す.1 サイクルは 4 クロック周期である. PIC には,この表の命令の他に次の 3 個の命令がある. (ⅰ)RETURNLW (ⅱ)SWAP (ⅲ)CLRWDT ここで用いた命令のグループはコンピュータアーキテクチャのテキストに従っており,マイクロチッ プ・テクノロジ・ジャパン(株)のグループの分け方と異なっているので注意すること.
付録3 アセンブリプログラムの作り方
アセンブリプログラムは擬似命令,ニューモニック,ラベル,及びコメントを用いて記述する. 擬似命令には次の表に示す 6 種類があり,PIC の設定やアセンブラに対する指示を行う. 表 A.2 擬似命令 CONFIG の先頭に_(アンダーバー)を 2 個続け ること(間にスペースを入れない.全角では ないので注意)25 ニューモニックは表 A.1 に示す PIC の命令である.ラベルはデータメモリやプログラムメモリのアド レスにつける名前であり,ラベルを設定することによって,直接アドレスを指定する代わりに名前を使 うことが出来る.ラベルの書き方を次に示す. コメントは,人間がプログラムを理解し易くするための情報であり,アセンブラでは無視される.コ メントの書き方を次に示す. アセンブリプログラムの例を示す.リスト A.1は入力ポートのデータを出力ポートに出す PIC のアセ ンブリプログラムである. リスト A.1 入力ポートのデータを出力ポートに出力するプログラム (1) (2) (3) ;PIC の設定 INCLUDE P16F876A.INC LIST P=PIC16F876A
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF
;ラベルの定義と初期設定 PORTB EQU 06h ORG 00h ;パワーオンリセット GOTO MAIN ORG 04h ;割り込みベクタ GOTO MAIN ;メインルーチン
MAIN BSF STATUS,RP0 ;BANK1 にする MOVLW 0FFh ;入力モード MOVWF TRISB ;PORTB を設定 MOVLW 00h ;出力モード MOVWF TRISC ;PORTC を設定 BCF OPTION_REG,7 ;RB PULL UP 有効 BCF STATUS,RP0 ;BANK0 にする MOVF PORTB,0 ;入力ポートの値を W レジスタに格納 MOVWF (07h) ;Wレジスタの値をアドレス 07h(出力ポート C)に出力 SLEEP ;停止 END ;プログラムの終了 コメントは;で始める.行のどこから始まっても良い. ラベルは行の先頭からはじめる.1 個以上の空白または TAB を記入してからニューモニックを書く.
26 プログラムは大きく分けて,(1)PIC の設定,(2)ラベルの定義と初期設定,及び(3)メインルー チンの3つの部分からなっている. (1)PIC の設定 「;PIC の設定」と書かれた部分は