2023.04.22
    
TCCR1AレジスタとTCCR1Bレジスタを設定する
TCCR1Aレジスタ
| b7 | 
            b6 | 
            b5 | 
            b4 | 
            b3 | 
            b2 | 
            b1 | 
            b0 | 
          
| COM1A1 | COM1A0 | 
            COM1B1 | 
            COM1B0 | - | 
            - | 
            WGM11 | 
            WGM10 | 
          
TCCR1Bレジスタ
      
| b7 | 
            b6 | 
            b5 | 
            b4 | 
            b3 | 
            b2 | 
            b1 | 
            b0 | 
          
| ICNC1 | ICES1 | 
            - | 
            WGM13 | 
            WGM12 | 
            CS12 | CS11 | 
            CS10 | 
          
COM1A1からCOM1B0はすべて0にする  Normal Port Operation
        他のモードはデータシート参照
        WGM13,WGM12,WGM11,WGM10は0,1,0,0とセットしてCTCモード(Clear Time on
        Compare match mode)にする
プリスケーラとは分周、例えば8だったらクロックが8倍になる。
        ArduinoUnoは16MHzのクロックで動いているので,プリスケーラが8なら1/16MHz * 8 秒 =
        0.5μ秒となる。
      
| CS12 | 
            CS11 | 
            CS10 | 
            クロックの選択 | 
          
| 0 | 
            0 | 
            0 | 
            No Clock(Timer/Counter stopped) | 
| 0 | 
            0 | 
            1 | 
            内部クロック プリスケーラなし   1/16MHz=0.0625μ秒 | 
          
| 0 | 
            1 | 
            0 | 
            内部クロック プリスケーラ 8 1/16MHz*8=0.5μ秒 | 
| 0 | 
            1 | 
            1 | 
            内部クロック プリスケーラ 64 1/16MHz*64=4μ秒 | 
| 1 | 
            0 | 
            0 | 
            内部クロック プリスケーラ 256 1/16MHz*256=16μ秒 | 
| 1 | 
            0 | 
            1 | 
            内部クロック プリスケーラ 1024 1/16MHz*256=64μ秒 | 
| 1 | 
            1 | 
            0 | 
            外部クロック(端子T1,ネガティブエッジ) | 
          
| 1 | 
            1 | 
            1 | 
            外部クロック(端子T1,ポジティブエッジ) | 
 OCR1Aには周期をセットする。このレジスタは16bit 0から65535まで設定可能
         0.5 秒ごとに割込を入れる場合、0.5秒=500000μ秒 なので
          プリスケーラを256、周期16μにするとちょうど割り切れる。
         500000/16=31250
          をセットする(もしかして0から始まるから31249にするのかもしれないが、
         誤差ということで)
      
 これは最初からISR関数という名前で用意されている 
          ISR(TIMER1_COMPA_vect){ 
           //処理を記述 ;
      
  } 
      
 TIMSK1 (Timer/Counter Interrupt Mask Register)の OCIE1AをONにする
      
TIMSK1レジスタ
      
| b7 | 
            b6 | 
            b5 | 
            b4 | 
            b3 | 
            b2 | 
            b1 | 
            b0 | 
          
| - | 
            - | 
            ICIE1 | 
            - | 
            - | 
            OCIE1B | OCIE1A | 
            TOIE1 | 
          
 ICIE1: Timer/Counter1, Input Capture Interrupt Enable 
         OCIE1A: Timer1, Output Compare A Match Interrupt Enable
         OCIE1B: Timer/Counter1, Output Compare B Match Interrupt
        Enable
         TOIE1: Timer/Counter1, Overflow Interrupt Enable
      
      
プログラム例
      
| void setup() { TCCR1A=0; TCCR1B=0; TCCR1B |= (1<<WGM12) |(1<<CS12) ; //CTCmode, Prescaler 256 OCR1A=31250-1; TIMSK1 |= (1<<OCIE1A); } ISR(TIMER1_COMPA_vect){ // タイマー割込処理の関数 //ここでタイマー割込のときの処理をする } void loop{ //通常の処理 }  | 
          
      
      
 詳しくはデータシート参照
         概要配下の通り
      
 TCCR2AのWG21に1を入れてCTC moddeにして
         TCCR2BのCS??にプリスケーラ(分周)を設定
          コンペアレジスタはOCR2A  だが8bit  なので 
        最大255までしか設定できない
         TIMSK2のOCIE2AをON(1)にして割込許可、始動
          
          割込関数は
      
  ISR (TIMER2_COMPA_vect) {
            //処理を記述;
           }