• 締切済み

PIC24F C言語プログラミングについて

PIC24Fについて こんにちわ PIC24Fの勉強をしています。 使っているPICはPIC24FJ64GA002で、コンパイラは MPLAB IDE,C30 です。 現在LEDを2つ使って、異なるタイミングで点滅させるプログラムを作りたいと思っています。 参考書に載っていたプログラムを参考にして、1つのLEDを点滅させることはできました。 下にそのプログラムを書きます。 #include "p24FJ64GA002.h" /// コンフィギュレーション ビットの設定 _CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & BKBUG_OFF & COE_OFF & ICS_PGx1& FWDTEN_OFF ) /// 8MHz*PLL4=32MHz (Full Speed) _CONFIG2( IESO_OFF & FNOSC_FRCPLL & FCKSM_CSDCMD & OSCIOFNC_OFF & IOL1WAY_OFF & I2C1SEL_PRI & POSCMOD_NONE) int main(void) { CLKDIV = 0; // クロックの分周1:1に設定 AD1PCFG = 0xFFFF; // ポートA全ディジタルに指定 /// ポートの入出力モード設定 TRISB = 0; // ポートB を出力に設定 /// タイマ1の設定 FOSC=16MHz,プリスケーラ 1:256, 200msec=5Hz PR1 = 12500-1; // 16000000/5/256=12500 T1CON = 0b1000000000110000; /// メイン ループ while(1) { if(IFS0bits.T1IF) // タイマ割り込みチェック { IFS0bits.T1IF = 0; // 割り込みフラグクリア /// LEDの反転制御 LATBbits.LATB15 = !LATBbits.LATB15; } } } 2つの点滅のタイミングをずらすために、またさらにPRレジスタ(PR2)を付け加え、適当な値にします。 すると、割り込みフラグT2IFビットがセットされると思います。 そこでさらにもう一つif文をつけ、同様の書式で異なるピンにLATを割り振ってやれば異なるタイミングで割り込みが起きるというやり方でやろうと思っています。(まずこれで正しいのかどうかもわかりませんが・・・。) ですがそれ以降がよくわかりません。 まず if文の中に入っている(IFS0bits.T1IF)とはどういう意味を持っているのでしょうか? C言語にも疎く、if文に=や不等号などの条件が入っていないものを見るのも初めてです。 この他、○○bits.○○ というような書き方が手持ちの参考書に頻出している上に、まだ読んでいる途中ですので何とも言えませんが、どこにも詳しく書いてありません。 LATBbits.LATB15 = !LATBbits.LATB15 くらいならなんとなく想像はつきますが書式もいまいちわかりません また、 同様にif文を使ってやる場合、IFSxレジスタは何を使えばいいのでしょうか? 割り込みベクタテーブル表を見ると、使っているタイマ1の割り込みフラグがIFS0<3>となっていましたので、PR2によりセットされたT2IFと合わせて if(IFS0bits.T2IF)~ と適当に入力してみましたが、シミュレータでもうまくいきません。 分かりづらい文章かと思いますが、よろしくお願いします。

みんなの回答

回答No.2

私もPIC24FJ64GA002と、PIC24FJ64GA004を使用しております。 さて、LED2個の時間差点滅プログラムのサンプルが、後閑氏の書籍に載っておりましたので、引用しておきます。MPLAB C30です。 *** 引用開始 *** /********************************************** * PIC24F標準基板(PIC24FJ64GA002) * Timer1 : タイマテスト 割り込みでLEDを点滅制御 *  タイマ1=500msec タイマ2=250msec *  スイッチによりCPUの割り込みレベル変更 LED高速点滅停止 ***********************************************/ #include "p24FJ64GA002.h" /// コンフィギュレーション ビットの設定 _CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & BKBUG_OFF & COE_OFF & ICS_PGx1& FWDTEN_OFF ) /// 8MHz*PLL4=32MHz (Full Speed) _CONFIG2( IESO_OFF & FNOSC_FRCPLL & FCKSM_CSDCMD & OSCIOFNC_OFF & IOL1WAY_OFF & I2C1SEL_PRI & POSCMOD_NONE) /************************ * メイン関数 ************************/ int main(void){ CLKDIV = 0; // クロック分周 1:1 AD1PCFG = 0xFFFF; // 全ポートをディジタルに指定 /// ポートの入出力モード設定 TRISB = 0xF0A0; // ポートB RB15-12,7,5 input CNPU2bits.CN23PUE = 1; // CN23 スイッチ用プルアップ /// タイマ1設定 /// 500msec周期  内部クロック,1/256,FOSC=16MHz T1CON = 0b1000000000110000; // PR1 = 31249; // 500msec IPC0bits.T1IP = 5; // 割り込みレベル5に設定 IEC0bits.T1IE = 1; // 割り込み許可 /// タイマ2設定 /// 250msec周期 内部クロック、1/256、FOSC=16MHz T2CON = 0b1000000000110000; PR2 = 15624; // 250msec IPC1bits.T2IP = 3; // 割り込みレベル3 IEC0bits.T2IE = 1; // 割り込み許可 /// メインループ while(1) { /// CPU割り込みレベル設定 if(PORTBbits.RB7) // スイッチの入力チェック SRbits.IPL = 2; // CPUの割り込みレベル2 else SRbits.IPL = 4; // CPUの割り込みレベル4 } } /********************* * タイマ1割り込み処理 **********************/ void __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void){ IFS0bits.T1IF = 0; // 割り込みフラグクリア /// 2個のLEDの反転制御 LATBbits.LATB11 = !LATBbits.LATB11; LATBbits.LATB10 = !LATBbits.LATB10; } /********************** * タイマ2割り込み処理 **********************/ void __attribute__((interrupt, no_auto_psv)) _T2Interrupt(void){ IFS0bits.T2IF = 0; // 割り込みフラグクリア /// 2個のLEDの反転制御 LATBbits.LATB9 = !LATBbits.LATB9; LATBbits.LATB8 = !LATBbits.LATB8; } *** 引用 終わり *** 引用した書籍は、 C言語ではじめる PIC24F活用ガイドブック [大型本] 後閑 哲也 (著) 価格:¥ 3,360 大型本: 472ページ 出版社: 技術評論社 (2007/10/18) ISBN-10: 4774132470 ISBN-13: 978-4774132471 発売日: 2007/10/18 商品の寸法: 23 x 18 x 3.2 cm CDが添付されていて、全てのサンプルプログラムが公開されています。 この書籍はアマゾンなどで入手可能です。 頑張ってくださいね。

全文を見る
すると、全ての回答が全文表示されます。
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

えーと、まず「Cにおける論理値」と構造体、特に「ビットフィールド」をきっちり勉強されるのが良いかと思います。 一応解説すると、 > if文の中に入っている(IFS0bits.T1IF)とは IFS0bits.T1F != 0 と同じ意味を持ちます。 > ○○bits.○○ というような書き方 これは前述の通りビットフィールドのことを理解すればわかります。 PICやMPLABは使ったことがないのでどのレジスタを使うかと言った話には答えられませんが、そこより先に上記の理解を進めたほうがいいかと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • LEDの点灯(C言語,PIC)

    PICを用いてLEDを点滅させます. #INT_RTCC rtcc_pulse() { counter++; if(counter == t){ counter = 0; LED1_ON(); delay_ms(10); } else{ LED1_OFF(); } この関数のtの値を変調させ,OFFの時間を徐々に増やしていき,それを繰り返したいのですが,やり方がわからず困ってます. tはfor(t=52;t<=152;t+=10)のように増やしていきたいです.

  • PIC16F タイマ0使い方

    久しぶりにPICを引っ張り出して触っていたのですが、タイマ割込みの部分がうまくできていないようで、LED(led_green)を1秒で点滅させたいのですが2秒ぐらいの中途半端な点滅をしてしまいます。 内部クロックを4MHzに設定しているので、これをプリスケーラで8分周しTMR0の値を130に設定し、1msごとに割込みが発生する算段なのですが、どこか間違えてますでしょうか? マイコンは PIC16F886 を使用しています。 #include<pic.h> #include<stdio.h> #include <stdlib.h> #include <xc.h> #define _XTAL_FREQ 4000000 // 内部クロック 4MHz // CONFIG1 #pragma config FOSC = INTRC_NOCLKOUT// Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config MCLRE = OFF // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD) #pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled) #pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled) #pragma config BOREN = OFF // Brown Out Reset Selection bits (BOR disabled) #pragma config IESO = OFF // Internal External Switchover bit (Internal/External Switchover mode is disabled) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled) #pragma config LVP = OFF // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming) // CONFIG2 #pragma config BOR4V = BOR40V // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V) #pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write protection off) #define TMR_set 130 // TMR0初期値 #define led_green RB0 #define led_white RC3 volatile unsigned int count = 0; volatile unsigned int cnt = 0; // タイマー割込みの処理 void __interrupt() int_f (void){ // 割り込みハンドラ if(T0IF == 1){ // 1ms count++; cnt++; TMR0=TMR_set; T0IF = 0; // 割り込みフラグをクリア (オーバーフローフラグ) if(count>=1000){ // 1s count=0; led_green = ~led_green; } } } void init(){ OSCCON = 0b01100000; ANSEL = 0b00000000; ANSELH = 0b00000000; TRISA = 0b00000000; TRISB = 0b00000000; TRISC = 0b00000000; PORTA = 0; PORTB = 0; PORTC = 0; GIE = 1; // すべての割り込みを許可 (0:禁止, 1:許可) T0IE = 0; // タイマー割り込みを禁止 (0:禁止, 1:許可) T0CS = 0; // TIMAR0モジュールをタイマーとして使用 (0:通常のタイマーとして使用, 1:T0CK端子に入ってきた入力のカウンタ) PSA = 0; // プリスケーラをTIMER0モジュール用にセット OPTION_REG = 0x02; // プリスケーラ 1:8 TMR0 = TMR_set; T0IE = 1; // タイマー割り込みを許可 (0:禁止, 1:許可) T0IF = 0; // 割り込みフラグをクリア (オーバーフローフラグ) } void main(void){ init(); led_white = 1; while(1){ } return; }

  • PIC タイマー0の使い方

    PIC16F886を触り始めたのですが、タイマー割り込みで苦戦しています。 タイマー割り込みを使ったLEDの点滅の間隔が、自分の思った時間にならないのです。 下に今のプログラムを載せておきます。 私の今の考え方はこうです。 ・内部クロックは4MHzに設定してある ・TMR0のカウントはクロックの1/4らしい→1MHzなので周期は1μsec ・プリスケーラは1:128に設定→128μsecでTMR0がカウントアップ ・TMR0の初期値を61に設定→195回のカウントアップでT0IF=1 ・128μsec*195μsec=2496μsec≒0.025msec←タイマー割り込み ・40回カウントすると1秒 と、1秒ごとにLEDのON,OFFが切り替わるはずだと考えているのですが、書き込んで計測したところ、約0.8秒でon,offを繰り返しています。 私の考え方やプログラムに間違いがあるのでしょうか? もしくはPICがハード的に壊れているのでしょうか?(picに5Vをかけても動かず、mainが実行中に点灯するLED(この時点では点いていない)の端子の両端を指で触ると何故か動き出します。) 以下プログラムです。(注釈などは省いたので見難いかもしれません) #include <stdio.h> #include <stdlib.h> #include <xc.h> #include <pic.h> #pragma config FOSC = INTRC_NOCLKOUT #pragma config WDTE = OFF #pragma config PWRTE = OFF #pragma config MCLRE = OFF #pragma config CP = OFF #pragma config CPD = OFF #pragma config BOREN = ON #pragma config IESO = OFF #pragma config FCMEN = OFF #pragma config LVP = ON void interrupt tc_int(void); volatile unsigned int cnt = 0; volatile unsigned int cnt1 = 0; #define sw RB0 #define led RA0 #define led2 RA1 #define led3 RA2 #define _XTAL_FREQ 4000000 void init(void) //初期設定 { OSCCON=0b01101000; // 内部クロック設定 4MHz TRISA=0b00000000; TRISB=0b00000000; TRISC=0b00000000; ANSEL=0x00; /* 割り込み初期設定 */ GIE = 1; // すべての割り込みを許可 T0IE = 0; // タイマー割り込みを禁止 T0CS = 0; // TIMAR0モジュールをタイマーとして使用 PSA = 0; // プリスケーラをTIMER0モジュール用にセット OPTION_REG |= 0x06; // CPUクロックを128分周 TMR0 = 61; // カウンタ値をリセット T0IE = 1; // タイマー割り込みを許可 T0IF = 0; // 割り込みフラグをクリア } int main(void) { init(); sw=1; led=1; led3=0; cnt1=0; LEDflg=0; while(1) { if(cnt1>=10){ led3=~led3; cnt1=0; } } } void interrupt tc_int(void){ // 割り込みハンドラ if(T0IF == 1){ cnt++; TMR0=61; T0IF = 0; // 割り込みフラグをクリア if(cnt>=40){ cnt=0; cnt1++; led2= ~led2; } } }

  • PIC(12F1822)のプログラミングについて

    お世話になっております。 表記の件です。 PICプログラミング初心者で現在勉強中です。 自分で作成したプログラミングが正常に動作せず、わかる範囲でいろいろ試しましたが解決できなかったので投稿させて頂きます。 【IO】 入力:黄LED、赤LED 出力:ボタン2個 【基本動作】 電源ON→黄LED点灯、赤LED消灯→ボタンA ON→10秒カウント、黄LED点滅、赤LED点灯。 ・カウント中にボタンB ON→最初に戻る ・カウント完了→黄LED消灯、赤LED点滅→ボタンB ON→最初に戻る 以上のプログラムを作成しました。 【問題点】 ボタンA、各LED、10秒カウントは正常に動作しています。しかし、ボタンBで最初に戻る動作がうまく動きません。ボタンBを押しても反応しない時が有ります。ボタンBを普通に押して反応する時もあれば、長めに押さないと反応しない時があります。 配線やボタンを交換しても改善されませんでした。 if文を各点滅間に入れてみましたが改善されませんでした。 点滅が絡まないところに持って行くと正常に動作しました。 プログラムを添付致します。 お手数ですがご教示の程、よろしくお願いいたします。 また、こうした方が全体的によくなる等ございましたらよろしくお願いいたします。 以上、よろしくお願いいたします。

  • PICについての質問です。使用PIC(PIC16F88)

    PICについての質問です。使用PIC(PIC16F88) LEDを0.5秒点灯、0.5秒消灯させるプログラムを書いています。 追加でLEDを駆動するFETが故障してショートモードになったときを考えて、通電監視プログラムを 組み込みましたが、わからないところがあります。 タイマー1を使用して、0.1秒ごとに割り込み、通電検知させて、3秒連続して通電状態の場合はハード的にOFFにするという回路を組み込みました。 0.1秒ごとに割り込みさせて、通電と判断したらカウンターをカウントダウンさせて、0回になったらフラグをたてています。 メインルーチンで フラグチェック処理→0.5秒点灯、0.5秒消灯処理→(はじめに戻る)というフローにより、通電監視フラグを1秒ごとにチェックして、フラグが立ててあれば、強制的にOFFにします。 そのカウンターの設定値ですが、30回にすると3秒後の消灯になりません。いろいろ試した結果23回であれば、最短3秒後以降消灯できるようになりました。 自分で理解したいと思うのですが、なぜこれでうまくいくのかわかりません。 解説書、webも調べましたがわかりません。 どなたか推測でもいいので、教えていただけませんでしょうか?

  • PICプログラミングに対する質問

    PIC16F627Aを使い、160KHzの周波数を外部に出力したいのですが、うまくいきません。 仕様はこのようになっています。 セラロックとして10MHzを使っています。(20MHzを使うことも考えている) 電源は5Vです。 開発環境はMPLAB IDEに CCS社Cコンパイラを使っています。 現在のプログラムはこのようになっています。 //////////////////////////////////////////////////////////////////////// //タイマ0を用いて160KHzの周波数を出力する //3.1μsでタイマ0の割り込み //////////////////////////////////////////////////////////////////////// #include<16f627a.h> #fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP  //コンフィグレーションの設定 #use delay(CLOCK = 10000000)      //発振子の周波数10MHz  //delay_ms()の使用 //定数の定義 #byte  PORTA=0x05 #bytePORTB=x06 #byte TMR0 = 0x01 #bit T0IF = 0x0B.2 //タイマ0割り込み処理 #INT_RTCC //タイマ0の割り込み処理関数の宣言 void rtcc_isr(void) { T0IF=0; //タイマ0の割り込みフラグ TMR0=0xF8; //タイマ0の初期値 PORTA^=0x04; //PORTAの出力反転 } //メイン関数 void main(void){ set_tris_a(0xF8); //出力ポートの設定 set_tris_b(0xF7); //出力ポートの設定 setup_timer_0(RTCC_INTERNAL | RTCC_DIV_1);//プリスケーラを使用しない set_timer0(0x0); //TMR0に0x0を書き込む enable_interrupts(INT_RTCC); //タイマ0の割り込み許可 enable_interrupts(GLOBAL); //グローバルの許可 PORTB = 0x7F; //出力 while(1){ //割り込みを待つ delay_ms(1); //1μs } } ///////////////////////////////////////////////////////////////////// このようなプログラムで160KHzの周波数を出力することは可能でしょうか? もし不足の部分や誤っていることがあったら教えてください。

  • PIC18F14K50でmain処理が動作しない

    PIC18F14K50でmain処理が思うように動作せず困っています。 現在、電圧計を作っていて、割り込みで1msごとにA/D変換をし、その値をLCDに表示させています。 mainの方ではLEDを500msで点滅させるプログラムなのですが、LEDは点灯したまま動きませんでした。 試しに割り込みの中身を抜いたら、しっかり点灯したので原因はこれだと思うのですが、 解決方法がわかりません。 上の方は省略してます void isr(void) // 割り込み関数 { if(INTCONbits.TMR0IF){ // タイマ0割り込み? INTCONbits.TMR0IF=0; // タイマ0割り込みフラグを0にする LCD_int(); // LCD初期化 ConvertADC(); // AD変換開始 while(BusyADC()); // AD変換終了待ち temp = ADRESH; // AD変換結果取得 /////////// 1行目に表示//////////// sprintf(ad1,"Value=%d",temp); LCD_str(ad1); /////////// 2行目に表示//////////// LCD_posyx(1,0); LCD_ROMstr("Test"); } } void main(void) { OSCCON = 0b01010010; // 内部クロック4Mhz TRISB = 0b01100000; LATB = 0; TRISC = 0b00000000; LATC = 0; ANSELH = 0; ANSEL = 0; OpenADC( // ADC初期化 ADC_FOSC_4 & // AD変換クロック指定 ADC_LEFT_JUST & // 左詰め出力 ADC_12_TAD, // チャージ時間 ADC_CH11 & // アナログ入力チャネル ADC_INT_OFF, // 割込みは行わない ADC_REF_VDD_VDD & // 正基準電圧 ADC_REF_VDD_VSS, // 負基準電圧 ADC_0ANA ); // すべてデジタル入力に設定 ANSELHbits.ANS11 = 1; // AN11はアナログ入力に設定 OpenTimer0( TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_4 ); INTCONbits.GIE= 1; while(1){ LED_PIN = 1; Delay10KTCYx(50); LED_PIN = 0; Delay10KTCYx(50); } }

  • C言語でPICのプログラムをしたいんですが。

    PICをC言語でプログラミングしたいと思っているんですがよくわかりません。 PCの画面に「Hello」とか出すことはできるんですが、PICで動作するCがわかりません。 LEDの点灯(点滅でも)やモーターを動作させたりするプログラムを書きたいんですが イマイチ良く分からず最初の定義文の構成とかもPICだとやっぱり違うのかなって 思っているんです。普通のCですら定義文や構成の意味が微妙な感じ何です。 でもCでかけたらカッコいいなって思ってます。 PICのCに関する入門みたいなサイトや文章があったら教えて下さい。 アセンブラやJAVAについても教えていただくとありがたいです。 まぁでもC言語メインでお願いします。

  • picのタイマ1発振開始時間に関して

    マイコン Pic16F1939を使用して回路を組み、タイマ1を外部に取り付けた水晶で 動作させています(pic自体は内部オシレータで8MHzで動作させ、Timer1は正確な 1秒を取得するために使用しています) 使用している水晶は32768Hzの時計用のものです。 タイマ1が0.5秒ごとにオーバーフローするように設定し、割込みの関数で液晶の 点滅処理をおこなっています。 水晶の両端はそれぞれコンデンサが添付画像のような接続でつながっています。 また、関連部分のプログラムの抜き出しは以下のようになっています。 // 割込み処理 static void interrupt isr(void) { if (PIR1bits.TMR1IF) { // 32Khz水晶 割込み Int_Timer1(); } ~ 省略 ~ } // タイマー1割り込み(32khz水晶) : 0.5秒ごと void Int_Timer1(void) { PIR1bits.TMR1IF = 0; // 次の割り込み許可のためクリア // 0.5秒で次の割り込みが発生するように設定 TMR1H = 0b11000000; TMR1L = 0b00000000;     ~ 点滅処理 ~     ~省略~ return; } そして以下の初期設定用関数 InitTimer1()と InitInterrupt()を main()の始めに呼んでいます。 // Timer1 setting 32kHz , external crystal void InitTimer1(void) { T1CONbits.TMR1CS1 = 1; T1CONbits.TMR1CS0 = 0; T1CONbits.T1CKPS1 = 0; T1CONbits.T1CKPS0 = 0; T1CONbits.nT1SYNC = 1; T1CONbits.T1OSCEN = 1; T1CONbits.TMR1ON = 1; } // 割込み初期化 void InitInterrupt(void) { PIE1bits.TMR1IE=1; // enable timer 1 interrupt INTCONbits.PEIE=1; INTCONbits.GIE=1; } 質問なのですが、実際に液晶が点滅するまでに2秒ほどかかっています。 どこかのホームページでタイマ1の水晶の発振が安定するまでに 数msecかかるというような情報が書いてあったので、ずいぶん 遅いなと感じ2つのコンデンサの容量を10pF~200pFくらいのあいだで色々 変更して試しているのですが、2秒より早く点滅開始となることはありませんでした。 これは、上記プログラムの問題なのでしょうか? それとも2秒ほどかかって発振するのは仕方ない(Picの仕様)なのでしょうか? どなたかご存知の方いらっしゃいましたらご回答をお待ちしております。

  • PICマイコン 割り込み実行時間 (遅延時間)

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