第11週  割り込みを使ってモータ駆動                                                            

山歩きを趣味にしております。いろいろ山仲間がいますが、なかで、パソコン通信を通じてつきあってる山の仲間は、ちょっと、いえ、とってもヘン。ほとんどゴロツキみたいなのばかりです。教養がウリの山とんぼは掃きだめに鶴の孤独感を味わっています。
でも中でお一人、還暦過ぎてなおかくしゃく、背筋はピンとして声には張りがあり、ウェアのセンスも若々しくまた話しぶりは穏やか、密かに私が人生の師匠と仰いでいる大先輩がいらっしゃいます。

この師匠、お酒が大好きで、どこそこのあの銘柄はどうの、どこぞのその銘柄はこうのと、ウンチク語らせたらじつに話題豊富で話のとどまるところを知らず、まさに酒を愛してやまない人生の豊かさと膨らみを感じさせます。
でもその師匠、そのウンチク語りながらも、あまりに酒を愛するがためか、酒ディスカウントで買ってきた得体の知れない銘柄だろうがお通夜で貰ったメジャー酒造会社の評判芳しくない2合瓶だろうが「おいちい、おいちい」と片っ端から呑んでしまいます。
せめて語るウンチクの半分でもいいから選り好みしてくださいよ、師匠!(^^;

私はといえば、酒の味などわかりませんので、酒ディスカウントで買ってきた得体の知れない銘柄だろうがお通夜で貰ったメジャー酒造会社の評判芳しくない2合瓶だろうが「おいちい、おいちい」と片っ端から呑んでしまいます。あれ?



 割り込みを使ってモータ駆動

前々週、前週とステッピングモータ駆動回路を作りましたが、ともにもっぱらモータ駆動にかかりきりというプログラムでした。
専用機能IC代替ということでそれはそれで良かったのですが、せっかくのPICですからついでにいろいろやりたいですね。
となると、モータ駆動にかかりきりといかないですからパルス発生からのタイミングにきっちり合わせてきれいな波形を作るにはどうしても割り込みが必要、ということで今週はPICの割り込み処理に挑戦です。



Bポートのみ使用。






■外部入力割り込み
1.ポートBのRB0をパルス入力としてこれで割り込みをかける。
   そのためには
     INTCONレジスタ bit4(INTE)=1 RB0/INT割り込み許可
                bit7(GIE)=1  割り込み発生許可
  この割り込みの方法には入力としてRB0に限定される。
2.割り込みがかかると4番地に飛ぶ。だから4番地からGOTOで割り込み処理を書いた番地にさらに飛ぶようにする。
3.割り込みから飛んだ先でレジスタ待避しなければならない。
INTCONレジスタ bit7から (初期0000000X)    
GIE bit7 グローバル割り込みイネーブル 1:許可
EE1E bit6 EEライト完了割り込みイネーブル 1:許可
T0IE bit5 TMR0オーバーフロー割り込みイネーブル 1:許可
INTE bit4 RB0/INT割り込みイネーブル 1:許可
RBIE bit3 RBポート変化割り込みイネーブル 1:許可
T0IF bit2 TMR0オーバーフロー割り込みフラグ
INTF bit1 RB0/INT割り込みフラグ
RBIF bit0 Bポート変化割り込フラグ
と、これだけ頭に入れておけばあとは見よう見まね。



プログラムとしてはむだにタイマルーチン(LOOP1)を巡っている間に、パルス発生からの信号で割り込みかけて波形発生処理するという簡単な実験用です。基本的には割り込みのところが変わっただけで今までのプログラムとほぼ同じです。
;PMM8713ステッピングモータコントローラ代替(割り込みを使う)
;*********************************************
        LIST        P=PIC16F84    ;

        INCLUDE     "P16f84.inc"  ;標準ヘッダ定義ファイル
        __CONFIG    _HS_OSC & _PWRTE_ON & _WDT_OFF
;*********************************
CNT     EQU     0CH             ;出力パターン用カウンタ
TIMCNT  EQU     0DH             ;タイマ用カウンタ
WTEMP   EQU     0EH             ;Wレジスタ待避
STTEMP  EQU     0FH             ;STATUSレジスタ待避
;***********************
;  メインルーチン
;***********************
        ORG     0               ;Reset Start
        GOTO    MAIN
        ORG     04H
        GOTO    INTR
        
MAIN                            ;Initialize        
        BSF     STATUS,RP0      ;バンク1へ切替
        BCF     INTCON,GIE      ;割り込み禁止
        CLRF    TRISA           ;ポートAを出力モードに設定
        MOVLW   B'00000001'     ;
        MOVWF   TRISB           ;ポートB bit0入力
        BCF     STATUS,RP0      ;バンク0に戻す
        
        MOVLW   B'00000000'     ;初期出力(実際は使用しない)
        MOVWF   PORTA
        MOVLW   B'10010000'     ;初期出力
        MOVWF   PORTB
        MOVLW   0H              ;COUNTER初期出力
        MOVWF   CNT
        
        BSF     INTCON,INTE     ;RB0/INT割り込み発生許可
                                ;RB0のエッジ設定はリセット値(立ち上がり)で可
        BSF     INTCON,GIE      ;割り込み許可

LOOP1        
        CALL    TIM       ;時間待ちを繰り返していてその間に割り込みがあったら
        CALL    TIM       ;その処理をする
        CALL    TIM

        GOTO    LOOP1
        

        
;*********************************************************
;割り込み処理
INTR                            
        MOVWF   WTEMP           ;レジスタ待避
        SWAPF   STATUS,W
        MOVWF   STTEMP
;    ◎Zフラグが影響しないようにMOVFではなしにSWAPFを使用するんだと
FWD                             ;正転カウント処理
        MOVF    CNT,W
        SUBLW   07H
        BTFSC   STATUS,2
        GOTO    SET0            ;カウンタ値 7 なら 0 に
        INCF    CNT,F
        GOTO    INCED
SET0    MOVLW   0H
        MOVWF   CNT
INCED   

PATTERN
        MOVF    CNT,W
        CALL    TABLE
        MOVWF   PORTB

        SWAPF   STTEMP,W        ;レジスタ復帰
        MOVWF   STATUS
        SWAPF   WTEMP,F
        SWAPF   WTEMP,W
        BCF     INTCON,INTF     ;INTF割り込みフラグリセット
        RETFIE

TABLE
        ADDWF   PCL,F           ;Wに波形パターンを載せてリターンするテーブル処理
        RETLW   B'10010000'
        RETLW   B'00010000'
        RETLW   B'00110000'
        RETLW   B'00100000'
        RETLW   B'01100000'
        RETLW   B'01000000'
        RETLW   B'11000000'
        RETLW   B'10000000'

;*********************************************************
;サブルーチン
TIM                             ;0.4mSECタイマ
        MOVLW   0F9H
        MOVWF   TIMCNT
TIMLP   DECFSZ  TIMCNT,F
        GOTO    TIMLP
        RETURN

        END


■結果

先週と同等の結果でした。
実用でのこのケースでは当然割り込み処理となるはずですから、ちょっと重要事項といったところですか。



ここでは外部割り込み(RB0/INTピン)を」使いましたが、ほかにもタイマ0オーバーフロー割り込み、ポートB変化割り込み、それとEEPROMライト完了割り込みがあるみたいです。最後のはよくわかりませんが、タイマ0割り込みは使いみちが多いようなのでいずれやってみる必要がありそうです。





■今週のなるほど

レジスタ待避でZフラグ変化を避けるためのSWAP使用は、とても自分で思いつくようなテクニックではないですから、定石として覚えておくしかない文字通りのなるほどです。