4.「割込み」を使ったLEDのダイナミック表示について

 

  第3項で、「割込み」についてだいたい理解していただいたと思いますが、割り込み機能は重要なのでもう1つ紹介します。  ここではタイマ2割込みを使ったLEDのダイナミック表示の方法を解説します。

 

4.1 LEDのダイナミック表示

 LEDには単体のLED、バーLEDや7セグメントLED等種類がありますが、ここでは10連の赤色バーLEDを使ったダイナミック表示を紹介します。  又、表示方法にはスタティック表示とダイナミック表示があり、ダイナミック表示はパルスを与えてPWM制御で明るさをコントロールしています。     ここで紹介する表示のしくみはタイマ2を8.3ms周期で割り込ませ、赤色バーLEDの各素子に200μS間電流を供給するものです。

 

 

 

 

 

 

 

 

 


4.2 コーディング例

では実際の「割込み処理」をコーディング例で説明します。 第3項で、「割込み処理」についての中で、割込み処理は原則すばやく済ませて早く抜け出す必要があると書きましたが、本処理では即時処理が要求されるので、すべて割込み処理の中で割込み禁止状態で処理します。

パルスを作るために200μS待ちが入るので、全CPU時間の約2.4%をこの表示に費やすこととなります。(もっと明るく点灯さするには200μS以上の待ち時間が必要) 又、割込み禁止で実行しますので、約200μS以上、他の割込みが抑止されますので、もっと早い即時処理が要求される割込みが発生する場合は処理ができず問題となります。

 

;******************************************************************

; Interrupt Handler

;******************************************************************

;

        ORG      4

INTPROC

              BCF                     INTCON,GIE                    ;inhibit interrupt

              MOVWF              IWSAVE                          ;save reg's at interrupt

              SWAPF                STATUS,W                        ;

              MOVWF              ISSAVE                             ;

              MOVF                 PCLATH,W                       ;

              MOVWF              IPSAVE                             ;            

              MOVF                 FSR,W                               ;

              MOVWF              IFSAVE                             ;

;

;Decode Interrupt element

              BTFSC                PIR1,TMR1IF                   ;check TMR1 int.flag

              GOTO                  TMR1PROC                      ;

              BTFSC                PIR1,TMR2IF                   ;check TMR2 int.flag

              GOTO                  TMR2PROC                      ;

              GOTO                  PROCE                              ;

;                                                      

;********************************

; 5.5 minutes timer (262 ms interval)

;********************************

TMR1PROC

                                         

                               (省略)   

                                         

;                                        

;********************************

;Bar-LED Dynamic Driver by Timer2 (8.2ms interval)

;********************************                                         

; input(2bytes): DINP18,DINP910

;                                        

四角形吹き出し: 次の割込みの為に割込みフラグをリセットする。TMR2PROC

              BCF                     PIR1,TMR2IF                   ;clear TMR2 flag for next

四角形吹き出し: メインルーチンが設定したDINP18から1番〜8番までの表示情報(1で点灯)を取り込み、ポートBに書き込み、DINP910から9番〜10番までの表示情報を取り込み、余分なビットを削除したあと、ポートAに書き込む。              MOVF                 DINP18,W                        ;get 1-8 level      

              MOVWF              PORTB                              ;display 1-8 level

              MOVLW              0C0H                                 ;get 9-10 level

              ANDWF              DINP910,W                      ;           

              IORWF                PORTA,F                           ;display 9-10 level

四角形吹き出し: 200μSの間、電流を流すために待つ。 この待ち時間を長くする程、たくさん電流がながれLEDは明るく点灯する。              CALL                   ITIM200U                         ;do bright control

              CLRF                   PORTB                              ;clear all data

              BCF                     PORTA,7                           ;

              BCF                     PORTA,6                           ;

四角形吹き出し: LEDに対応したの全ビットをクリアし、電流を止める。              GOTO                  PROCE                              ;

;++++++++++++++++++++++++++++++++    

;  Wait Timer Routine for Bar-LED Display

; ( 8 MHz clock used only )

; 100usec Timer Subroutine at 8 MHz

; 1CYCLE = 0.5 usec -> 200 cycle

;

; 200 usec Timer Subroutine

ITIM200U                                        

              MOVLW              .80                                     ;80 times

              MOVWF              ICNT1                               ;

ILOOP1

              NOP                                                              ;

四角形吹き出し: プログラムループで200μS待ち時間を作る。 このサブルーチンは表示専用とし、メインルーチン等から兼用しないこと。
(基本的に、割込み処理で使用するルーチンは他の処理と兼用してはならない。暴走や永久ループの要因となる。)
              NOP                                                              ;(2+3)*80-1= 399 cycles  

              DECFSZ              ICNT1,F                            ;

              GOTO                  ILOOP1                             ;

              RETURN                                                       ;2+399+2=403 cycles

;                                                                                   ;200 usec.           

;*********************************

PROCE

              MOVF                 IFSAVE,W                         ;restore reg's

              MOVWF              FSR                                   ;

              MOVF                 IPSAVE,W                         ;

              MOVWF              PCLATH                            ;

              SWAPF                ISSAVE,W                         ;

              MOVWF              STATUS                            ;

              SWAPF                IWSAVE,F                         ;

              SWAPF                IWSAVE,W                       ;    

              BSF                     INTCON,GIE                    ;enable interrupt

              RETFIE

;

4.3 後書き

今回はバーLEDのダイナミック表示の説明をしましたが、簡単に実現できることを理解していただけたと思います。 この応用で複数桁の7セグメントLEDのダイナミック表示も実現できます。  ただループで待ち時間を作ると、桁が多くなればなるほどCPU時間を費やすので全体の処理との兼ね合いを考慮する必要があります。