第7回 LED 点灯回路の実用プログラミング

■7.1 追加仕様
 Step 6 に提示したプログラムの仕様には重大な欠点がある.
 仕様通りに作成されたプログラムでは,SW を押すと LED は点滅ではなく点灯しているように見える(ただし,シミュレータではその動作が非常に遅いために点滅して見える).

 これは,LED の点滅周波数が高すぎるための残像現象によるものである.そこで,人間の目に合わせて点滅周波数を低くすることを考える.
 このような目的に良く利用される仕組が インターバルタイマ(interval timer)である.

 また,アナログ SW の入力には,一般にノイズ除去のため フィルタ(filter)が設定される.

 以上をふまえ,LED 点灯回路に以下の仕様を追加し実用に耐えうるプログラムとする.

◆7.1.1 追加仕様
LED <点滅周期:200 ms>
 50 ms(20 Hz;4 MHz のクロックで設定できる最低に近い周波数)のインターバルタイマを設定し,割り込み処理ルーチンにて変数 counter のカウントアップ(もしくはダウン)を行う.
 倍の周期(100 ms)での counter の値が奇数か偶数か(すなわち,さらに倍の周期 200 ms)により各 LED の点灯状態を決定する.
SW <1 kHz のフィルタ>
 1 ms の時間待ちを行う.
 
■7.2 インターバルタイマ処理
 インターバルタイマは PIC の内蔵モジュールであるタイマ0 割り込み処理を利用して実行する.そのため,まず,TMR0 レジスタの初期値(命令クロック数)を決定する必要がある.
 設計方法は【2.5.2 TMR0 レジスタの初期値の設計】を参照すること.

 TMR0 レジスタの初期値は,割り込み処理実行毎に設定する必要があるため,定数として宣言しておくと便利である.

 以下に,4 MHz のクロックを実装した PIC マイコンシステムにおいて,10 ms のインターバルタイマを設定した例を示す.

ソースコード 内 容
;***********************************************************
;       training program for PIC16F84A
;       step7ex.asm, H. OSADA, Nov. 2004
;***********************************************************
;
;=================================================
;  definitions
;=================================================
;- hardware -----------------------------------
        LIST    P=PIC16F84A
        #INCLUDE "P16F84A.INC"
;
        __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
;
;- constant label -----------------------------
INTERVAL        EQU     0D9H    ;10ms main interval timer
;
;- file register ------------------------------
        CBLOCK  0CH
            W_temp              ;Wreg temp register
            STATUS_temp         ;STATUS temp register
        ENDC
;
;=================================================
;  run start
;=================================================
;- reset start --------------------------------
        ORG     0
        GOTO    INIT
;
;- interrupt start ----------------------------
        ORG     4
        GOTO    ISR
;
;- initialize ---------------------------------
INIT
        BSF     STATUS,RP0      ;set Bank1
        MOVLW   087H            ;prescale 256
        MOVWF   OPTION_REG
        BCF     STATUS,RP0      ;set Bank0
;
;TIMER0 start --------------------------
        MOVLW   INTERVAL        ;TIMER0 interval counter preset
        MOVWF   TMR0
        BSF     INTCON,T0IE     ;TIMER0 enabled
        BSF     INTCON,GIE      ;all interrupt enabled
;
;=================================================
;  main routine
;=================================================
MAIN
        GOTO    MAIN
;
;=================================================
;  interrupt service routine
;=================================================
ISR
;- save resisters -----------------------------
PUSH
        MOVWF   W_temp
        SWAPF   STATUS,W
        MOVWF   STATUS_temp
;
;- mode check ---------------------------------
        BTFSC   INTCON,T0IF
        GOTO    ISR_TIM0
        GOTO    POP
;
;----------------------------------------------
; TIMER0 interrupt operation
;----------------------------------------------
ISR_TIM0
        BCF     INTCON,T0IF     ;interrupu flag clear
        MOVLW   INTERVAL        ;TIMER0 counter preset
        MOVWF   TMR0
;
;** procedure
;
;
;- restore resisters and return to main -------
POP
        SWAPF   STATUS_temp,W
        MOVWF   STATUS
        SWAPF   W_temp,F
        SWAPF   W_temp,W
        RETFIE
;
;=================================================
;  subroutine
;=================================================
;** procedure
;
;***********************************************************
        END
■プログラムタイトル
 タイトル
 ファイル名 作者 日付等    



◇各種定義

■ハードウェア定義
 プロセッサの種類を指定
 インクルードファイルの設定

 コンフィグビットの設定
 
■定数ラベル定義
 TMR0 初期値宣言

■変数レジスタ定義
 0CH 番地より定数領域確保
 (0CH)Wreg の一時保存用
 (0DH)STATUS の一時保存用
 定数領域確保終了
 
◇実行開始


 リセット番地の指定
 (必ず 0 番地)
 初期化処理へジャンプ

 割り込み番地の設定
 (必ず 4 番地)
 割り込み処理へジャンプ
 
■初期設定

 レジスタBankを1に設定
 プリスケーラ設定(1/256)

 レジスタ Bank を 0 に戻す
 
 タイマ0 初期設定
 インターバル初期値設定

 タイマ0 割り込み許可
 全割り込み許可
 
■メインルーチン


 (永久ループ)

 
■割り込み処理ルーチン




◇レジスタ格納処理
 Wreg
 STATUS

 
◇割り込み要因判定
 タイマ0であればISR_TIM0へ
 そうでなければPOPへ分岐

 
◇タイマ0 処理



 割り込みフラグクリア 
 TMR0 初期値再設定


ここにインターバルタイマで行う処理を書く


◇レジスタ復帰処理

 STATUS

 Wreg


 
■サブルーチン

ここにサブルーチン処理を書く


◇プログラム終了
 
 
■7.3 入力フィルタ処理
◆7.3.1 信号ノイズ
 マイコンへの入力信号の電圧をオシロスコープで観察すると,例えばロー入力の状態(0 V)であるにも関わらず,付近に雑音源(例えば駆動しているモータ等)があると,図のように非常に細いパルスが現れる場合がある.

 このように本来の信号以外の電圧変化を“信号ノイズ”と呼ぶ(単にノイズと呼ばれることが多い).
 このようなノイズ(スパイク状のノイズであるため,スパイクノイズとも呼ばれる)の発生原因は様々であるが,一般には発振器のような鋭い電圧変化を起こす部品や,モータ等のような電流が切り替わる巻き線を含む部品が近くにある場合,その電圧変化が混入することが多い.

 このようなノイズを除去するには,ハードウェア的な解決策ソフトウェア的な解決策がある.
 前者は“フィルタ”と呼ばれる電子回路を追加する方法であり,汎用的であるがフィルタ回路の設計には豊富な知識と経験が必要とされる.
 一方,後者はそのフィルタ動作をプログラムで実現する方法であり,比較的簡単に実現できるため,その手軽さからマイコン入力部分のノイズ除去にはプログラムによるフィルタ処理(フィルタリング)が多く利用されている.

◆7.3.2 スパイクノイズフィルタ設定例
 スパイクノイズに対するプログラムによるフィルタリングは非常に単純である.

 通常,スパイクノイズはその発生期間が本来の信号に比べて非常に短い(例えば先のオシロスコープの観察例では数us).
 したがって,最初の電圧変化の検出から一定期間後(しかし,,スパイクノイズ発生期間より十分長い期間)にもう一度その電圧を読み込み,論理が異なっていたらノイズと見なしてそのデータを破棄することによって達成できる.

 図は,入力ポート(PORTA の第 3 ビット)の状態を読み込み,その状態を変数 result に格納する場合のフローチャートを示す.
 まず,PORTA の状態を読み込み,変数 PA_temp に格納する.
 その後,1 ms おいて,PORTA の状態を再び読み込み,前回の状態である PA_temp と等しければ,PORTA の状態変化はノイズによるものではないとみなす.

 このような 1 ms のフィルタは時間間隔の逆数をとって 1 kHz のローパスフィルタと呼ばれる.
 すなわち,有効な信号は少なくとも1kHz以下(1 ms 以上)で信号変化するものであり,逆にいうと,1 kHz 以上(1 ms 以下)の信号はノイズと見なすということである.
 ちなみに,9.3.1のスパイクノイズはおよそ 400 kHz(先端部分で考えれば 10 MHz)である.

◆7.3.3 時間待ちタイマ処理
 一定の時間間隔を得る方法として最も単純な方法は,適当な回数のループを作製して時間を経過させる方法である.
 PIC の各命令はそれぞれ決まった“実行サイクル”で動作するため,ループ動作に費やされる時間を精密に計算できる.

 例えば,4 MHz のクロックを実装した場合の 1 実行サイクルは 1 us であるため,1 ms の時間待ちタイマを作成するには,1 ms/1 us=1000 より,1000 サイクルを消費するループを作ればよい.

 なお,時間待ちタイマは,一般的にサブルーチンとして用いられることが多い.

 以下に,4 MHz のクロックを実装した PIC マイコンシステムにおいて,1 ms 時間待ちタイマを設定した例を示す.

;----------------------------------------------
;  1ms timer (1cycle=1us) 1001cycle(inc CALL)
;----------------------------------------------
T1ms
        MOVLW   0F9H            ;1cycle 249
        MOVWF   cnt_1ms         ;1cycle
L_T1ms
        NOP                     ;1cycle
        DECFSZ  cnt_1ms,F       ;1(2atSkip)cycle
        GOTO    L_T1ms          ;2cycle
        RETURN                  ;2+1+1+4*249-1+2=1001cycle
;
 
■課題
 以下に示す内容のプログラムを作成し,その「フローチャート」と「ソースコード」を示しなさい.

プロジェクト名 step07
内容 7.1に記載の仕様を満たすこと
正解例オブジェクトコード step07.hex

 レポートは,下記のWordファイルを使用して作成すること.なるべく簡潔にまとめることが望ましい.
 Form07.docx

 WebClassより期限内に提出すること.