dポイントプレゼントキャンペーン実施中!

PICマイコン 割り込みの実行時間について、教えてください。
PICマイコン初心者です。
いろんな方々のプログラム例を参照させてもらっています。

PIC18F1320 を使って、外部割り込みを試していますが、トリガー信号の立ち上が入るタイミングで、割り込み処理を行いますが、トリガー信号から、割り込み動作Hが立ち上がりのが、遅くて困っております。トリガー信号から、遅れが少なくなる方法を教えてください。下記に現在のプログラ C言語を示します。

・ポートRB1の外部割込 立ち上がりトリガー。
・ポートRB0、RB2の状態をbstatに入れてIF文で、出力RB6 Hを出力したい。

・トリガー立ち上がりから、約2usecも遅れてRB6がHに。遅延を出来るだけ少なくしたい。
・ if (bstat==0)時で約2usec、if (bstat==3)時で約4usecと差が出るのも、改善したい。


#pragma code high_vector=0x8 //高位レベル割り込み
void high_interrupt (void){
_asm
GOTO high_isr
_endasm
}
#pragma code //デフォルトコードセクションに戻る

#pragma interrupt high_isr //割り込み処理関数宣言

void high_isr (void){


INTCON3bits.INT1IE=0; //外部割込みINT1の禁止
// INTCONbits.PEIE=0; //低位割り込み禁止
INTCONbits.GIE=0; //全割り込み禁止

INTCON3bits.INT1IF=0; //INT1の割り込みフラグをリセット

if (bstat==0){
LATBbits.LATB6=1; //
Delay1TCY();//wait
Delay1TCY();//wait
Delay1TCY();//wait
LATBbits.LATB6=0; //
Delay1TCY();//wait
Delay1TCY();//wait
Delay1TCY();//wait
}

else if(bstat==1){
LATBbits.LATB6=1; //
Delay1TCY();//wait
Delay1TCY();//wait
LATBbits.LATB6=0; //
Delay1TCY();//wait
Delay1TCY();//wait
}

else if(bstat==2){
LATBbits.LATB6=1; //
Delay1TCY();//wait
LATBbits.LATB6=0; //
Delay1TCY();//wait
}

else if(bstat==3){
LATBbits.LATB6=1; //
Delay1TCY();//wait
LATBbits.LATB6=0; //
Delay1TCY();//wait
}

INTCON3bits.INT1IE=1; //外部割込みINT1の許可
// INTCONbits.PEIE=1; //低位割り込み許可
INTCONbits.GIE=1; //全割り込み許可

}

// メインプログラム

void main (void){

TRISB = 0b00000111; // RB0/1/2:input
TRISA = 0xFF; // ALL A input
//PORTB = 0;
PORTA = 1;

bstat= ((PORTBbits.RB0+0)+(PORTBbits.RB2*2));// RB0とRB2の状態を読み込み

OpenRB1INT(PORTB_CHANGE_INT_ON & //ポートRB1の外部割込みオン
RISING_EDGE_INT & //立上りエッジでオン
PORTB_PULLUPS_OFF //Bポートの抵抗プルアップOFF
);

RCONbits.IPEN=1; //割り込み優先順位制御ON(0:優先順位制御OFF)
INTCON3bits.INT1IP=1; //INT1の割り込みを高順位割り込みにセット
INTCON3bits.INT1IE=1; //INT1の割り込みを許可
INTCON2bits.INTEDG1=1; //立上がりエッジでオン

// INTCONbits.PEIE=1; //低位割り込み許可
INTCONbits.GIE=1; //全割り込み許可

while (1)

PIC関係サイトを探しても、割り込みでの遅れ時間については、ヒントがありませんでした。
相当な遅れは、あきらめるしかないのでしょうか?
ご存知の方、アドバイスをお願い致します。

A 回答 (1件)

動作クロック等もわからないので、遅延時間の妥当性は何とも言えません。


ソースを見る限り、特に問題無さそうですが・・・
簡単な処理なのでアセンブラで書かれれば如何?

if文は後になるほど遅延するのは仕方ないですが、こんな場合はswitch文を使いましょう。
組込では、if文に比べてswitch文の方が高速処理なのは通説です。
アセンブルしたソースを眺めてみればわかります。
    • good
    • 0
この回答へのお礼

 こんばんは。早速のご回答、ありがとうございました。
使用PIC:PIC18F1320 周波数40MHZ(実行10MHZ)です。
質問したプログラムで、トリガー信号から、1.5usecで、出力開始されています。

switch文にトライしましたが、うまく、コンパイルしません。

下記のGOTOの部分をswitch~caseで、ポートRB0、RB2の状態をbstatの状態で、割り込みパターンを
出力させたいと思っていますが、コンパイルできないで困っています。
switch文設定ができていないと考えています。
間違いがあれば、アドバイスをお願い致します。

void high_interrupt (void){
_asm
GOTO high_isr
_endasm
}


 ADコンバータ使用なら、アナログ電圧設定で、複数波形が作成可能だが、非同期のため
使えないので、残念ですが、うまくいかないですね。

良い参考サイトでもあれば、あわせてご紹介をお願い致します。
よろしく、お願い致します。

お礼日時:2013/10/24 23:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!