コンピュータ系実験Ⅲ 「ワンチップマイコンの応用」 第3週目
実験内容 LED点灯回路を用いた割り込みプログラムの作成 第1週で作成した回路(17ページ図11)を使用 Switch Switch
割り込みとは? ある処理を行っている最中に、何らかの要因によってその処理を中断し、別の処理を行うこと ハードウェア割り込み:ハードウェアからの入力等に起因 例)キーボード入力 ソフトウェア割り込み:実行中のプログラムに起因 例)ゼロ除算
割り込み処理の流れ 処理Bに移行 処理Aに戻る 処理A 割込み発生 処理B 処理Aで使用していた 退避したレジスタを元に戻す レジスタを
レジスタを退避しないと・・・① 処理Aの割り込みがかかる直前の状態(Wレジスタやファイルレジスタの内容)が処理Bによって書きつぶされる可能性がある 処理Aに戻った際に、割り込みがかかる直前の状態の続きから処理を再開することができない 逆に言うと、退避する必要があるのは、処理Aと処理Bの両方で使用するレジスタ
レジスタを退避しないと・・・② 今回の実験ではタイマルーチンを利用して、一定間隔でLEDの点灯移動をさせるパターンが2種類ある LED2~LED7まで順番に点灯するパターン(パターン1) LEDが3個ずつ交互に点灯するパターン(パターン2) これらのパターンで同じタイマルーチンを使用する タイマルーチンではレジスタファイルの特定の番地の値をカウントアップすることで時間を計っている 同じLEDを使用するので当然PICの出力(PORT B)も共通
レジスタを退避しないと・・・③ PORT Bを退避しなかった場合、パターン1の点灯パターンが壊れてしまう こうなってしまうかも・・・
レジスタを退避しないと・・・④ タイマルーチンで使用するレジスタを退避しなかった場合、元の状態に戻れなくなる 残り0.1秒で次のLEDに移動
実験手順 第2週のサンプルプログラム4を参考にして課題1を解く → TAによるチェック サンプルプログラム5に足りない部分を追加して、課題3を解く MPLABで動作確認 → TAによるチェック 実機で動作させる → TAによるチェック
課題1:LEDの点滅制御プログラム 第2週のサンプルプログラム4を参考にして、図11の回路に対応した点滅制御プログラムを作成(LEDの個数が変更になります) 入出力ポートの設定 PORTB0、PORT1を入力 PORTB2~PORTB7を出力 LEDの表示パターンの変更 PORTBに出力する値を適切なものに変更 完成したらMPLAB上で動作確認
入出力ポートの設定 右の図はレジスタファイルのSFR(Special Function Register)のみを示したもの Bank0 Bank1 0番地 右の図はレジスタファイルのSFR(Special Function Register)のみを示したもの TRIS Bレジスタの値を変更することでPORT Bの入出力を設定する(実験書12ページ) Indirect Addr Indirect Addr 1番地 TMR0 OPTION 2番地 PCL PCL 3番地 STATUS STATUS 4番地 FSR FSR 5番地 PORT A TRIS A 6番地 PORT B TRIS B 7番地 8番地 EEDATA EECON1 9番地 EEADR EECON2 0A番地 PCLATCH PCLATCH 0B番地 INTCON INTCON
レジスタファイル 0番地から0B番地まではSpecial Function Register(SFR)と呼ばれ、用途が決まっている 0番地 PICの動作設 ステータス 外部との入出力 1番地 2番地 ・・・ ・・・ 0B番地 0C番地 0D番地 ・・・ 4E番地 4F番地
TRIS Bの値の変更① PICのレジスタファイルは図9(13ページ)に示されているように、2つのバンクに分かれている TRIS BはBank1 Bank1の値を変更するにはバンクを切り替えなければならない STATUSレジスタのRP0の値を変更することで切り替える(RP1は0に固定) 0 → Bank0, 1 → Bank1 7bit 6bit 5bit 4bit 3bit 2bit 1bit 0bit IRP RP1 RP0 TO PD Z DC C
TRIS Bの値の変更② TRIS Bの0ビット目はPORT Bの0ビット目の入出力の設定、1ビット目は1ビット目….というように対応している 0 → 出力, 1 → 入力 例)TRIS Bを00001111に設定すると、PORT Bの上位4ビットが出力、下位4ビットが入力になる
プログラム例(実験書12ページ) BSF STATUS, RP0 MOVLW 1CH MOVWF TRISB BCF STATUS, RP0 STATUSレジスタのRP0を1にする → Bank1 PORT Bの設定 → PORTBの2~4ビットを入力、 他のビットを出力にする TRISBに設定値を書き込む STATUSレジスタのRP0を0にする → Bank0 Bank1にして、必要な設定を行った後は、 必ずBank0に戻しておくこと! PORTBなどBank0のレジスタにアクセスできなくなります
課題2:LEDの点灯移動プログラム 第2週の課題3のプログラムを元に図11の回路に対応した点灯移動プログラムを作成 0.2秒間隔でPORTB2→PORTB3→PORTB4→PORTB5……PORTB7→PORTB2 のように点滅するようにする 入出力の設定は課題1と同じにする 完成したらMPLAB上で動作確認
課題3:LEDの割り込みプログラム 図11の回路上で、課題2の点灯処理時にプッシュスイッチを押すと、課題1の処理を3回繰り返すプログラムの作成 サンプルプログラム5の”====”で囲まれた部分を作成(5箇所) プログラムを作成したら、MPLABで動作確認 動作確認後、実機で動作させる
割り込み許可の設定 割り込み許可の設定はSpecial Function RegisterのINTCON( INTerrupt CONtrol)レジスタとOPTION_REGレジスタで行う INTCONレジスタ どのような割り込みを許可するのかを設定 OPTION_REGレジスタ PICの様々な動作の設定用レジスタ 割り込みの動作モードの設定もここで行う
INTCONレジスタ 実験書34ページ図22に課題3の流れが示されている 今回は10010000に設定する(割り込み許可時) 今回はPICのRB0/INTピンに接続されたプッシュスイッチから割り込みをかける(図11の回路図参照) →RB0/INTピンからの割り込みを許可する4ビット目を1にする この設定を有効にする(割り込みを許可する)ために7ビット目を1にする 7ビット目が1の間だけ、PICに対して割り込みをかけることができる
OPTION_REGレジスタ① OPTION_REGレジスタの6ビット目は割り込みをRB0/INTピンの立ち上がりと立ち下がりのどちらでかけるかを設定するビット 0:立ち下がり RB0/INTピンからの入力がH→Lになったときに割り込みがかかるようにする 1:立ち上がり RB0/INTピンからの入力がL→Hになったときに割り込みがかかるようにする 今回は立ち下がりで割り込みをかけるので0にする
OPTION_REGレジスタ② RB0/INT H H→L PIC 5V 今回の回路では・・・ スイッチを押すと、GNDに接続されるのでLになる 今回はこのH→Lに変化した際に割り込みがかかる RB0/INT H H→L PIC GND
課題3:LEDの割り込みプログラム MPLAB上でのシミュレーション 割り込みは メインルーチン中 割り込みサブルーチン中 のそれぞれのタイミングでかける MPLAB上で動作させる際に、割り込みをかけた場合にWレジスタなどがどこに退避されているかを記録する(39ページの表を埋める) どのレジスタの退避をチェックすべきかは各自で決定する(決定後、TAにチェックを受けること)
実験書39ページの表の書き方 退避先の レジスタ の退避後の値 退避先の レジスタ (のアドレス) 退避する レジスタ 退避元 割り込み直前の値 退避先 割り込み前処理完了前の値 割り込み前処理完了後の値 PCL WREG PORTB 退避直前の値 退避先の レジスタ の退避される前の値
課題3:LEDの割り込みプログラム② 回路上での動作の際にも、MPLAB上でのシミュレーション同様、割り込みは メインルーチン中 割り込みサブルーチン中 のそれぞれのタイミングでかける 詳細は実験書を参照
プログラミング時の注意 自由に使用できるレジスタファイルは0CH番地~4F番地まで ただし、タイマルーチンなど、他の処理で使用しているレジスタは使わない 課題3に関しては、プログラム中の空欄を順番に埋めていくのではなく、分かりやすいところからとりかかること 最初から割り込み処理の部分を埋めるのはお勧めしません