一定の時間間隔で何かを行いたい場合、内部の 8bitおよび16bit タイマ/カウンタを使用する方法を学ぶ。
   8bitのタイマ/カウンタ TIMER0・2 を使うと 最長 125ns×1024×255   = 32.64 ms
 16bitのタイマ/カウンタ TIMER1  を使うと 最長 125ns×1024×65535= 8.39 s
間隔が作れる。


○ タイマ・カウンタ
  タイマの動作モードには,「ノーマル・モード」,「CTCモード」,「PWMモード」がある。

 ノーマル・モード1

  カウンタは初期値からカウントアップし,
   8bitの Timer0, Timer2 ではカウンタの最大値は &FF で,
   16bitのTimer1           ではカウンタの最大値は &FFFF で,
  その次のカウントアップでカウンタはオーバーフローし,カウンタの値はゼロになりカウントを継続する

  この,オーバーフロー時に割り込みを発生させると, 「カウンタの初期値 ~ オーバーフロー」 までの時間が得られる。

 ノーマル・モード2

  カウンタはゼロからカウントアップし,比較Aあるいは比較Bレジスタの値と一致したときに割り込みを発生させ
  「ゼロ ~ 比較値」 までの時間を得る。OCxA, OCxB端子に比較出力(動作は選択)を出すことができる。
  注:カウンタは自動的にはクリアされない。


 CTC(Clear timer on compare match )モード

  カウンタはゼロからカウントアップし,比較Aレジスタの値と一致したときに割り込みを発生させカウント値がクリアされ,
  カウントを継続する。 「ゼロ ~ 比較値」 までの時間を得ることができる。
  OCxA端子に比較出力(動作は選択)を出すことができる。
  カウンタの最大値は比較Aレジスタの値で,カウンタは自動的にクリアされる。

 PWM(パルス幅変調)モード:(詳しくは次回)

  高速PWM:カウンタをカウントアップだけのノコギリ波動作をさせ比較Aあるいは比較Bレジスタの値
         との比較値で出力状態を変化させる
  位相標準PWM:カウンタをゼロからカウントアップし,最大値(Timer0,2では&FF, Timer1では&FF, &1FF, &3FF)までカウントすると
         ゼロになるまでカウントダウン。これを繰り返す。カウンタの値と比較Aあるいは比較Bレジスタの値との比較で
         出力状態を変化させる。



○  カウンタ/タイマ割り込み (マニュアルP40)

 8ビット(TIMER0)(TIMER2)と16ビット(TIMER1)の3種類のタイマ・カウン タがある。
 それぞれ独立に内部クロック(1,8,64,256,1024の分周が可能)と外部入力のカウントができる。

授業ではまず,TIMER0を使おう

○ TIMER0のオー バーフロー割り込みを使う  (マニュアルP64-67)

 オーバーフローは、例えば8Bitのカウンターがカウントアップして行き、0b11111111 の次のクロック入力で
 0b100000000 となるべきところ8Bitなので最上位(9ビット目)はオーバーフローして溢れた桁になる。その時
 カウンターの値は 0b00000000 になる。
 オーバーフローの使い方の1つは
  ・ カウンターに初期値を入れる。low($0100 - 初期値)が、オーバーフローまでにカウントする値。
  ・ そこからカウントアップを始め、オーバーフローで割り込み処理をする。
  ・ 一定周波数の入力(例えばプリスケールされたクロック)の場合、low($0100 - 初期値)の値は
    オーバーフローするまでの時間となる。

設定法
 1.TIMSK0のTOIE0(ビット0)をセットする。TIMER0オーバー フロー割り込み許可
 2.TCCR0BのCS02/CS01/CS00を設定。外部、内部クロックの決定及び内部クロックの分周

      CS02  CS01  CS00

      0    0    0  停止
       0    0    1  ck (CPUクロック)
      0    1    0  ck / 8 
       0    1    1  ck / 64
      1    0    0  ck / 256
       1    0    1  ck / 1024
      1    1    0  外部T0(PD4)の立下り
       1    1    1  外部T0(PD4)の立上り

 3.TCNT0にカウント数を設定。カウン トアップでオーバーフローするまでのカウント数
 4.プログラムメモリ$0020に割り込み処理ルーチンへのrjmp命令を入れる。
  5.seiで全割り込みを許可
 6.割り込み処理ルーチン

    a. 先頭でステータスレジスタSREGをスタックに退避
    b.  処理ルーチン
    c. スタックに退避していたSREGの値を戻す
    d.  reti

 [ 例題 ]  TIMER0のオーバーフロー割り込みを使い、一定周期で”1”と”0”を交互に出力させる。出力信号を、スピーカーに接続することで、一定周波数の音が 出せる。ここでは、スピーカーから1秒おきに”ラ(440Hz)”の音を0.1秒間鳴らし、10秒目に1オクターブ高い”ラ(880Hz)”の 音を0.3秒鳴らす時報を作る。スピーカーのインピーダンスは8Ωであり、3Vで直接駆動すると375mA流れることになる。この電流値はmega88のドラ イブ能力を超 えているし、スピーカーの許容電力も超えていると思われる。そのため、ドライブにはトランジスタ(2SC2120Y,  2SC1213A、または2SC1815)を使用し、電流制限のための抵抗を挿入する。使い方は、黒板で説明。PC5でトランジスタのベース電流 IB を制御する。

    1秒440Hz (0.1秒間), 10秒880Hz(0.3秒間)

    プログラムは T0_OVF.asm

   回路図  


 
原理:Timer0 オーバーフローを使ってスピーカーから音を出す。 (例) TCONT0=246 の場合




○ TIMER0の比較一致A あるいは B 割り込みを使う
  (マニュアルP64-67)

 比較一致割り込みは,例えば8Bitのカウンターが0からカウントアップし,比較Aレジスタの値と一致すると
割り込み信号を出す

設定法
 1.TIMSK0のOCIE0A(ビット1)をセットする。IMER0の比較A一致割り込み許可
            OCIE0B(ビット2)をセットする。IMER0の比較B一致割り込み許可
 2.TCCR0BのCS02/CS01/CS00を設定。外部、内部クロックの決定及び内部クロックの分周

      CS02  CS01  CS00

      0    0    0  停止
       0    0    1  ck (CPUクロック)
      0    1    0  ck / 8 
       0    1    1  ck / 64
      1    0    0  ck / 256
       1    0    1  ck / 1024
      1    1    0  外部T0(PD4)の立下り
       1    1    1  外部T0(PD4)の立上り

 3.OCR0A,  OCR0Bにカウント数比較値を設定。カウン トアップで比較Aあるいは比較Bレジスタの値に一致するまでカウントアップ
 4.プログラムメモリ$000EにTimer0比較A一致割り込み処理ルーチンへのrjmp命令を入れる。
   プログラムメモリ$000FにTimer0比較B一致割り込み処理ルーチンへのrjmp命令を入れる。
  5.seiで全割り込みを許可
 6.割り込み処理ルーチン

    a. 先頭でステータスレジスタSREGをスタックに退避
    b.  処理ルーチン
    c. スタックに退避していたSREGの値を戻す
    d.  reti

 [ 例題 ]  TIMER0の比較A一致割り込みを使い、一定周期で”1”と”0”を交互に出力させる。出力信号を、スピーカーに接続することで、一定周波数の音が 出せる。ここでは、スピーカーから1秒おきに”ラ(440Hz)”の音を0.1秒間鳴らし、10秒目に1オクターブ高い”ラ(880Hz)”の 音を0.3秒鳴らす時報を作る。

    1秒440Hz (0.1秒間), 10秒880Hz(0.3秒間)

    プログラムは T0_CMPA.asm


[ 課題 ]


○ TIMER1のオー バーフロー割り込みを使う (マニュアルP82-88)

 1.TIMSK1のTOIE1(ビット0)をセットする。TIMER1オーバー フロー割り込み許可
 2.TCCR1BのCS12/CS11/CS10を設定。外部、内部クロックの決定及び内部クロックの分周

      CS12  CS11  CS10

      0    0    0  停止
       0    0    1  ck (CPUクロック)
      0    1    0  ck / 8 
       0    1    1  ck / 64
      1    0    0  ck / 256
       1    0    1  ck / 1024
      1    1    0  外部T1(PD5)の立下り
       1    1    1  外部T1(PD5)の立上り

 3.TCNT1HおよびTCNT1Lにカウ ント数を設定。カウントアップでオーバーフローするまでのカウント数。
      TCNT1への書き込みはテンポラリレジスタを介して16ビット同時に行う為、TCNT1Hを先に書き込まなければならない

  4.プログラムメモリ$001Aに割り込み処理ルーチンへのrjmp命令を入れる。
 5.seiで全割り込みを許可
  6.割り込み処理ルーチン

    a. 先頭でステータスレジスタSREGをスタックに退避
     b.  処理ルーチン
    c. スタックに退避していたSREGの値を戻す
    d.  reti

○ TIMER1の比較一致A あるいは B 割り込みを使う  (マニュアルP82-88)

 比較一致割り込みは,例えば8Bitのカウンターが0からカウントアップし,比較Aレジスタの値と一致すると
割り込み信号を出す

設定法
 1.TIMSK1のOCIE1A(ビット1)をセットする。IMER0の比較A一致割り込み許可
            OCIE1B(ビット2)をセットする。IMER0の比較B一致割り込み許可
 2.TCCR1BのCS02/CS01/CS00を設定。外部、内部クロックの決定及び内部クロックの分周

      CS02  CS01  CS00

      0    0    0  停止
       0    0    1  ck (CPUクロック)
      0    1    0  ck / 8 
       0    1    1  ck / 64
      1    0    0  ck / 256
       1    0    1  ck / 1024
      1    1    0  外部T0(PD4)の立下り
       1    1    1  外部T0(PD4)の立上り

 3.OCR1AHおよびOCR1ALに比較数を設定。カウントアップで比較レジスタAの値までのカウント数。
      OCR1Aへの書き込みはテンポラリレジスタを介して16ビット同時に行う為、OCR1AHを先に書き込まなければならない
     OCR1BHおよびOCR1BLに比較数を設定。カウントアップで比較レジスタBの値までのカウント数。
      OCR1Bへの書き込みはテンポラリレジスタを介して16ビット同時に行う為、OCR1BHを先に書き込まなければならない
 4.プログラムメモリ$000BにTimer1比較A一致割り込み処理ルーチンへのrjmp命令を入れる。
   プログラムメモリ$000CにTimer1比較B一致割り込み処理ルーチンへのrjmp命令を入れる。
  5.seiで全割り込みを許可
 6.割り込み処理ルーチン

    a. 先頭でステータスレジスタSREGをスタックに退避
    b.  処理ルーチン
    c. スタックに退避していたSREGの値を戻す
    d.  reti

 [ 例題 ]  TIMER1の比較A一致割り込みを使い、1秒の一定周期を作る。mainルーチンでは,1-9秒までは440Hz, 10秒目は880Hzの音をTimer0のオーバーフロー割り込みで”1”と”0”を交互に出力させる。出力信号を、スピーカーに接続することで、一定周 波数の音が 出せる。ここでは、スピーカーから1秒おきに”ラ(440Hz)”の音を0.1秒間鳴らし、10秒目に1オクターブ高い”ラ(880Hz)”の 音を0.3秒鳴らす時報を作る。

    1秒440Hz (0.1秒間), 10秒880Hz(0.3秒間)

    プログラムは T01time.asm


[更にやる気のある人向け課題]