第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使用は、とても自分で思いつくようなテクニックではないですから、定石として覚えておくしかない文字通りのなるほどです。