• 追加された行はこの色です。
  • 削除された行はこの色です。
#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])
 #vote(はい[11],普通[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};
 - PICのタイマプログラムは、新しめのソースが見つからなくて困ってた。感謝です。 --  &new{2012-05-14 (月) 00:24:50};
 
 #comment_nospam