2016-04-24 10 views
0

私のプロジェクトではPIC16F84AをプログラムするのにMPLABを使用しています。 RB4-7ビットがボタンに接続されているため、入力として使用されるアセンブリコードがあります。新しい割込み(ボタンが押されたとき)を処理するために、割込みサブルーチンが実装されています。すべてがうまくいきます。ボタンを押すと、指定したサブルーチンが表示されます。しかし、今私がサブルーチンに入っているときに、フラグ(INTCON-RBIF)をクリアしなければならないが、クリアされていないが、INTCONレジスタ内の他のビットをクリアすると正常に動作する。だから何をすべきか?ここで MPLAB、ビットをクリアしようとしても残ります1

は私のコードです:

 ORG  0X00 
     GOTO START 
     ORG  0x04 
     BTFSC INTCON,RBIF 
     GOTO RBX_INT 
START CLRF PORTA 
     MOVLW B'10001000' 
     MOVWF INTCON 
     BSF  STATUS,RP0 
     CLRF TRISA 
     MOVLW B'11110000' 
     MOVWF TRISB 
     MOVLW B'10000111' 
     MOVWF OPTION_REG 
     BCF  STATUS,RP0 
MAIN GOTO MAIN 

そして、これは私のサブルーチンである:あなたがそうでなければ、新たな割り込みが既にながら発生することが、割り込みから復帰する直前にあなたがビットをクリアする必要があり

RBX_INT BCF  INTCON,RBIF 
     MOVLW D'156' 
     CALL DELAY 
     RETFIE 
+1

これが「変更時の割り込み」の場合は、状態を知る必要がなくても実際に**ポートを**読み込む必要があります。そうしないと、割り込みを発生させるロジックは起動し続けます。 –

+0

@RogerRowlandはい、それが問題でした。 – kamal

答えて

0

delayループとRBIFが再びクリアされます。これは、ボタンがバウンスする(https://en.wikipedia.org/wiki/Switch#Contact_bounce)ために発生します。

はまた、データシートの状態:(RB7の:RB4)

入力端子 はPORTBの最後 リードでラッチ古い値と比較されます。 RB7:RB4の "不一致"出力は でOR結合され、RBポート変更を生成します フラグビットRBIF(INTCON <>)による割り込み。

これは、RBIFをクリアしてラッチされた値を更新する前にPORTBを読み取らなければならないことを意味します。

RBX_INT 

    MOVFW PORTB  ;Read PORTB to update the latch. 
    MOVLW D'156' 
    CALL DELAY 
    BCF  INTCON,RBIF ;Clear interrupt flag as close as possible to RETFIE. 
    RETFIE 

また、割り込みサービスルーチンのコンテキストの保存/復元についてもお読みください。この例では、メインループが何もしていないので、割り込みが発生する可能性があるため、重要ではありません。割り込みを終了する前に、使用するすべてのレジスタとリソースを保存してから復元してください。主なコードパス。 PIC16F84Aデータシートで

参照部

6.9

割り込み中のコンテキスト保存

+0

遅延は、すでにバウンス解除効果を処理しています。そして私はすでにあなたが示唆していることをしましたが、うまくいかなかったのです。 – kamal

+0

RBIFをクリアすると、PORTB上のアクティビティがハードウェアで再び設定されます。遅延は、RBIFをクリアする前に実行した場合にのみ役立ちます。 – Unimportant

+1

はい、あなたが言っていることは正しいですが、それは私の問題ではありません。フラグはゼロに設定されていません。私は割り込みをトリガーするために刺激を使用していますが、すべてのステップでビットを表示していますが、RBIFはクリアされません。 – kamal

関連する問題