• 追加された行はこの色です。
  • 削除された行はこの色です。
閲覧総計:&counter(today);  (本日:&counter(yesterday);  昨日:&counter(yesterday);)~
 *インターバルタイマ(Timer1割込み利用 16F1827 XC8) [#w888d47] [#p2c0e8e6]
 *インターバルタイマ(Timer1割込み利用 16F1827 XC8) #w888d47 #p2c0e8e6 [#dd91b14b]
 
 16bitタイマーのTimer1の「割り込み」機能の使い方を確認する目的で、
 Timer1割り込み機能でLEDを1秒間隔で点滅させるプログラムを作成した。
 【ポイント】
 1.Timer1は16bitなので細かくかつ長時間の時間制御が可能
 Timer1は16bitなので、最大で1/65536回のカウント設定ができるので細かい時間
 制御が可能。また、Time0より8倍の長時間制御が可能。
 制御が可能。また、タイマ0より8倍の長時間制御が可能。
 2.タイマーカウント数の設定法(1回〜65535回)
 例:62500回カウントしたい場合は
   TMR1H = (-62500 >> 8);
   TMR1L = (-62500 & 0x00ff);
 と-62500(マイナス表記)で記述する。
 理由:Timer1は「アップカウンタ」の為、62500回カウントさせたい時は
 65536(FFFF)-62500=3036で、3036を設定する事になる。
 65536(FFFF)-62500=3036.000で、3036を設定する事になる。
 しかし-62500と記述しても同意である為、視認性の良い-62500と記述する事
 とする。
 【ハマりポイント】
 ・Timer1の場合はTimer0と異なり、
   INTCONbits.PEIE = 1; //周辺装置割り込みを許可
   INTCONbits.GIE = 1; //全体割込み許可
 の2つの設定を行わなければ割り込み機能が稼働しなかった。 2014/1/4
 の2つの設定を行わなければ割り込み機能が稼働しなかった。 2014/1/4←...
 
 |&attachref(1827led点灯画像.jpg,zoom,200x300,button){新しい写真添付};|&attachref(16F1827ピン配置.JPG,zoom,200x250,button){新しい写真添付};|
 
  /* 割り込み機能、Timer1(16bit)の操作法の確認
   * インターバルタイマー(TMR1割込み利用) 発光ダイオード(LED)を1秒間隔で点滅
   * PIC16F1827
   * XC8 v1.20
   * LED:RA1,RA2
   */
  #include <xc.h>
  
  #pragma config FOSC = INTOSC, WDTE = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
  #pragma config PLLEN = OFF, STVREN = OFF, LVP = OFF
  
  //グローバル変数の定義
  unsigned char cnt; //1秒作成の4回カウンタ
  
  int main(void) {
      //PICの初期設定
      PORTA = 0b00000000; //PORTAの中身をぴかぴかにする
      PORTA = 0b10101010; //PORTAの中身をぴかぴかにする
      TRISA = 0b00000000; //PORTA全てを0:出力に設定
      ANSELA = 0b00000000; //AN0-AN4は全て0:デジタルI/Oとする
      ANSELA = 0b00000000; //AN0-AN4は全て0:デジタル1/Oとする
      OSCCON = 0b01110000; //PLL:OFF, 内部クロック8MHzで駆動
  
      //TMR1割り込みの初期設定
      //250ms=0.125us(8MHz)*4*プリスケーラー8*62500カウント
      T1CON = 0b00110001; //クロック ソースFosc/4, プリスケーラー8, TMR1ON
      //TMR1カウント値設定 62500回(アップカウンター)Maxは65536回
      TMR1H = (-62500 >> 8);
      TMR1L = (-62500 & 0x00ff);
      PIE1bits.TMR1IE = 1; //Timer1割り込み許可
      INTCONbits.PEIE = 1; //周辺装置割り込みを許可(Timer1の場合必要)
      INTCONbits.GIE = 1; //全体割込み許可
  
      //メイン処理
      LATAbits.LATA2 = 1; //RA2:パワーオンを示すLED点灯
      cnt = 0; //4回カウンター値クリア
      while(1) {
          //点滅間隔1秒(1000msec = 250msec * 4回)
          if (cnt == 4) {
              LATAbits.LATA1 = ~LATAbits.LATA1; //LED(RA1)点灯⇔消灯反転
              cnt = 0; //4回カウンタ値クリア
          }
      }
  }
  
  static void interrupt isr(void) { //割り込み関数
      if(PIR1bits.TMR1IF == 1) {  //割込み種がTimer1割込みの場合
          PIR1bits.TMR1IF = 0; //Timer1割り込みフラグクリアー
          //TMR1カウント値設定 65536回(アップカウンター)Maxは1/65536回
          TMR1H = (-62500 >> 8);
          TMR1H = (-62600 >> 8);
          TMR1L = (-62500 & 0x00ff);
  
          cnt++; //4回カウンター カウントアップ
      }
  }
  
 ★この情報は役に立ちましたか?
 #vote(はい[1],普通[30],いいえ[3324])
 #vote(はい[1],Local[30],いいえ[3324])
 - 年始早々PICとは...うーん --  &new{2014-01-10 (火) 23:39:44};
 - PICはお正月にするもんじゃない -- [[きむしけ]] &new{2014-02-10 (火) 01:48:02}
 - PICはお正月にするもんじゃない -- [[mikroCおたく]] &new{2014-02-10 (火) 01:48:02}
 - agree -- [[きむしょんいる]] &new{2014-02-09 (月) 01:58:02}
 - agree -- [[きむしょんいる]] &new{2014-02-09 (月) 01:58:02}- agree -- [[きむしょんいる]] PICはお正月にするもんじゃないPICはお正月にするもんじゃないPICはお正月にするもんじゃないPICはお正月にするもんじゃないPICはお正月にするもんじゃないPICはお正月にするもんじゃないPICはお正月にするもんじゃないPICはお正月にするもんじゃない
 
 #comment_nospam