PIC12F675 GPIO port change interrupt 処理のループと対策(備忘録)

PIC 12F675の割り込み処理がうまく動作しないので調べてみました。

GPIO port change interrupt 処理がループしている模様です。
割り込み処理を一旦抜けるものの再度割り込み処理に入る。これを永遠に繰り返します。

開発環境 : MPLAB X IDE v3.51、Microchip MPLAB XC8 C Compiler (Free Mode) V1.40、ICD3です。

■結果
GPIO port change interrupt の割り込み処理内でGPIOレジスタに何らかのアクセスを すると、割り込み処理ループの現象は無くなりました。

調査


■発生時のソース

※下記ソースは現象確認の為のもので、この現象に気づいた時のものではありません。

GP5がport change 監視の対象ピン(外部からパルス信号を与える)
GP1はオシロによるデバック目的の出力ピン(今回のレポートでは使用していません)
GP4はCLKOUTとして、クロックを監視(目的は割り込み処理内での現象把握の為)

/*
 * GPIO割り込みテスト
 * Created on 2017/02/11, 8:17
 */

// CONFIG
#pragma config FOSC = INTRCCLK  // Oscillator Selection bits (INTOSC oscillator: CLKOUT function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-Up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON       // GP3/MCLR pin function select (GP3/MCLR pin function is MCLR)
#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
#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)


#include <xc.h>

char time_count;

void interrupt intservice() {
    INTCONbits.GIE = 0;
    if (INTCONbits.GPIE && INTCONbits.GPIF) {
        INTCONbits.GPIF = 0;

        if (time_count++ > 10) {
            INTCON = 0x00;
            SLEEP();
        }

        //asm("MOVF GPIO,W");
    }
    INTCONbits.GIE = 1;
}

void main(void) {
    GPIO = 0x00;
    ANSEL = 0x00;
    CMCON = 0X07; //Comparator Off (Lowest power) CM2:CM0 = 111
    TRISIO = 0b00100000; //GPIO5:input
    GPIO = 0x00; //GPIOクリア
    INTCON = 0x00; //割り込み不許可
    OPTION_REG = 0x00;
    IOC = 0x00;
    PIE1 = 0x00;
    ADCON0 = 0x00;

    GPIObits.GP1 = 0;
    GPIObits.GP2 = 0;
    INTCON = 0x88;  //Enables all unmasked interrupts;
                    //Enables the GPIO port change interrupt
    IOC = 0b00100000; //IOC5 : enable an interrupt-on-change

    time_count = 0;
    while (1) {
        asm("MOVF GPIO,W");
        //asm("MOVWF GPIO");
    }

    return;
}


■発生時のオシロ波形

※CH1(黄) GP5がport change 監視の対象ピン(外部からパルス信号を与える)
※CH2(青) GP1はオシロによるデバック目的の出力ピン(今回のレポートでは使用していません)
※CH3(紫) GP4はCLKOUTとして、クロックを監視(目的は割り込み処理内での現象把握の為)
PIC12F675 GPIO port change interrupt 処理のループと対策(備忘録)
(1)CH1(黄) GP5入力端子にパルスが入り、信号レベルが変化すると、
(2)interrupt intservice()に制御が移る。
(3)intservice()内で、time_count++により割り込み回数をカウントし、
(4)一定回数(10回)を超えると、SLEEPさせる。(注1)
(5)SLEEPより、内部クロックが停止しCH3(紫) GP4のCLKOUT波形は停止する。これによりSLEEPを通過したことを確認した。

※注1:GP1にパルスを出す方法では、GP1へのアクセスそのものがこの現象を妨げる要因になるので、SLEEPを使用し内部クロックを停止する事により、ポイント通過を確認しました。


■現象要約
一度の割り込みであるにもかかわらず、連続して10回以上の割り込みが発生する。
time_countを100回カウントしても同様。


発生要素


(1)mainのループ、この場合while(1)内でGPIOレジスタにアクセスし、かつ
(2)interrupt intservice()内で、GPIOレジスタにアクセスしていない場合
に発生する。

対策


interrupt intservice()内で、asm("MOVF GPIO,W"); によりGPIOに空アクセスする。
main()内でGPIOへのアクセス制限はかけられない為。


感想


■この対策に気づいた理由は、

PIC12F675 GPIO port change interrupt 処理のループと対策(備忘録)
出典:MICROCHIP社のPIC12F629/675 Data Sheet

↓上図の拡大
PIC12F675 GPIO port change interrupt 処理のループと対策(備忘録)

入力はすでに安定しているにもかかわらず、Interrupt-on-Changeが発生するということは、上図右下の2つのDフリップフロップよるchange検出回路が動作していない、すなわち、RD PORTが出ていない。
よって、GPIOを空読みしたらいいのでは。
これで解決しましたが、このRD PORTは単にポートを読む時だけではなさそうです。mainでのwhile(1)よる空ループではGPIOのリードをしなくても、changeを検出しています。

■さらに詳細は
その後、色々試みましたが良く判りませんでした。





スポンサーサイト
お知らせ
■注意:Google Chrome以外のブラウザでは動作しない事もあります。
お好みに応じて
画像だけの表示でいいよ
やっぱり全部表示して
背景は黒がいいな
背景を元に戻して
サブジャンル
メモリアルマップ
My Favorite Photo
検索フォーム
プロフィール

otsu.usiwakamaru

Author:otsu.usiwakamaru
五条の橋でひらりひらりと欄干を飛び渡る牛若丸のように、興の向くまま電子回路にプログラミングに写真にと飛び回っています。

プロフィール詳細

カレンダー
05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
キーワード
クリックしたキーワードの記事のみ表示します。

ダンサー ミニー ミッキー デイジー ドナルド グーフィー  キャラクター 3D 試み MFP 電池 ティンカーベル デザイン クラリス 全天球 パークテーマ チップデール プルート IXY キャスト マレフィセント スクルージ ダッフィー スモールプラネット SPOT 改造 

最新記事
月別アーカイブ
全記事表示リンク

全ての記事を表示する

おすすめプログ(新着記事)
リンク


にほんブログ村
カテゴリ
橋 (1)
PIC (1)
カウンタ
訪問者数(UU)

アクセス数

現在の閲覧者数

tael no013用