#freeze
閲覧総計:&counter();  (本日:&counter(today);  昨日:&counter(yesterday);)

【目次】(項目をクリックすると、そこへ飛べます)
#contents
~
*インターバルタイマ(TMR0割込み利用) [#b9631c91]

割り込み機能とTimer0の操作法の確認の為、基本機能だけのプログラムを作成し、稼働を
確認した。
また、HI-TECH C PRO(Lite mode)の割り込み機能のプログラミングの仕方を確認する為
プログラムを作成し、動作を確認した。  08/08/15

|&attachref(P1010641.JPG,zoom,150x150,button){新しい写真添付};|&attachref(16F886.JPG,zoom,150x150,button){新しい写真添付};|

**MikroCのプログラム [#f619acec]

 /**
 * 割り込み機能、Timer0の操作法の確認
 * インターバルタイマ(TMR0割込み利用) 発光ダイオード(LED)を1秒間隔で点滅
 *
 * RC2: LED
 * PIC16F668 内臓発振器4MHz
 *
 * Device Flags:
 * _INTRC_OSC_NOCLKOUT _WDT_OFF _PWRTE_ON _MCLRE_OFF
 * _CP_OFF _CPD_OFF _BOR_OFF _IESO_ON _FCMEN_ON 
 * _LVP_OFF _DEBUG_ON _BOR21V _WRT_OFF
 *
 * MikroC v8.1.0
 * file name:timer0.c  08/08/15
 */
 
 //グローバル変数の定義
 unsigned int cnt; //200回カウンタ
 
 void
 main(void)
 {
     //PICの初期化
     TRISC = 0b00000000; //PORTC 8個全て0:出力に設定
     OSCCON = 0b01100000; //内蔵発振器 4MHz使用に設定
     // A/D利用PORTの設定 // ANALOG=1, DIGITAL=0 //
     ANSEL = 0b00000000; //AN4-0ピンはデジタルで使用
     ANSELH = 0b00000000; //AN13-8ピンはデジタルで使用
     PORTC = 0b00000000; //PORTCの中身をきれいにする
     //PICの初期化終わり
 
     OPTION_REG = 0b0100; //プリスケーラ値設定0b0100(=32回)
     TMR0 = -160; //TMR0カウント値設定 160回(アップカウンタ)
     INTCON.T0IE = 1; //タイマ割込み許可
     INTCON.GIE = 1; //全体割込み許可
 
     cnt = 0; //200回カウンタ値クリア
 
     while (1)
     {
         //点滅間隔1秒(=5msec * 200回)
         if (cnt == 200)
         {
             PORTC.F2 = ~PORTC.F2; //LED(RC2)点灯⇔消灯反転
             cnt = 0; //200回カウンタ値クリア
         }
     }
 }
 
 void
 interrupt() //割込み関数
 {
     //5msecインターバルタイマ
     if (INTCON.T0IF) //割込み種がTimer0割込みの場合
     {
         INTCON.T0IF = 0; //割込みフラグクリア
         TMR0 = -160; //TMR0カウント値再設定 160回(アップカウンタ)
 
         cnt++; //200回カウンタ カウントアップ
     }
 }

★この情報は役に立ちましたか?
#vote(はい[10],普通[6],いいえ[7])

#comment_nospam

**HI-TECH C PRO(Lite mode)のプログラム [#c985a1d7]

 /**
 * 割り込み機能、Timer0の操作法の確認
 * インターバルタイマ(TMR0割込み利用) 発光ダイオード(LED)を1秒間隔で点滅
 *
 * RC2: LED
 * PIC16F668 内臓発振器4MHz
 *
 * HI-TECH C PRO PIC10/12/16 MCU Family(Lite mode) v9.60
 * MPLAB v8.14
 * file name:timer0.c  08/08/10
 */
 #include <htc.h>
 __CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & UNPROTECT 
 & DUNPROTECT & BORDIS & IESODIS & FCMDIS & LVPDIS & DEBUGEN);
 __CONFIG(BORV21);
 
 //グローバル変数の定義
 unsigned int cnt; //200回カウンタ
 
 void
 main(void)
 {
     //PICの初期化
     TRISC = 0b00000000; //PORTC 8個全て0:出力に設定
     OSCCON = 0b01100000; //内蔵発振器 4MHz使用に設定
     // A/D利用PORTの設定 // ANALOG=1, DIGITAL=0 //
     ANSEL = 0b00000000; //AN4-0ピンはデジタルで使用
     ANSELH = 0b00000000; //AN13-8ピンはデジタルで使用
     PORTC = 0b00000000; //PORTCの中身をきれいにする
     //PICの初期化終わり
         
     OPTION = 0b0100; //プリスケーラ値設定0b0100(=32回)
     TMR0 = -160; //TMR0カウント値設定 160回(アップカウンタ)
     T0IE = 1; //タイマ割込み許可
     GIE = 1; //全体割込み許可
     
     cnt = 0; //200回カウンタ値クリア
     
     while (1)
     {
         //点滅間隔1秒(=5msec * 200回)
         if (cnt == 200)
         {
             PORTC = (~PORTC & 0b00000100); //LED(RC2)点灯⇔消灯反転
             cnt = 0; //200回カウンタ値クリア
         }
     }
 }
 
 void interrupt
 timer0_isr(void) //割込み関数
 {
     //5msecインターバルタイマ
     if (T0IF) //割込み種がTimer0割込みの場合
     {
         T0IF = 0; //割込みフラグクリア
         TMR0 = -160; //TMR0カウント値再設定 160回(アップカウンタ)
 
         cnt++; //200回カウンタ カウントアップ
     }
 }

★この情報は役に立ちましたか?
#vote(はい[10],普通[0],いいえ[2])
- MPLAB IDEでHI-TECH Cを使い、ブレッドボードで同様にやってみましたが、LEDが全く反応しません。割り込みがきていない模様。原因不明です。心当たりありませんか? -- [[turu]] &new{2010-06-13 (日) 21:23:51};
- ちなみにメインルーチンに点灯命令を入れると点灯OK、割り込みルーチンに点灯命令を入れると点灯NGでした。 -- [[turu]] &new{2010-06-13 (日) 21:25:23};
- 色々やっているうちに動きました。MPLABのモードをDebugからReleaseにしたことで動くようになったのかもしれません。お騒がせしました。 -- [[turu]] &new{2010-06-19 (土) 21:07:48};

#comment_nospam