■ BASCOM-AVR (DEMO) の使用方法 ■

ハードウェア タイマーの使用方法
 
 ハードウェア タイマーの動作設定は、複雑でたくさんあり、チップによる違いなどもあるため、詳細はマニュアルを熟読する必要がありますが、ここでは、基本動作とBASCOM-AVRでの設定方法を記載します。

 ハードウェア タイマーの動作には、AVRの動作クロックや、それに関わるヒューズ・ビットの設定が重要です。
 下記「ブロック図」と「クロック信号系統図」を参考に、クロック信号の流れを把握しておいて下さい。
 

ブロック図


クロック信号 系統図

CKSEL・SUT 表

 不明な点は、「掲示板」をご利用下さい。

 ● BASCOM-AVRでは、ハードウェア タイマーの動作を、大きく3つに分けています。
 
 
1. TIMERモード

 
 ・タイマーの計数クロックに、AVRの動作クロックを使用します。
 
 ・プリスケーラ(前段分周器)で、AVRの動作クロックを、1/1、1/8、1/64、1/256、1/1024 (一例)に
  分周してから使用することもできます。
 
 ・設定された任意の時間周期(周波数)で、OCnx端子(OC0A,OC0B,OC1A,OC1Bなど)にパルスを
  発生させたり、割り込みを発生させることができます。

 
2. COUNTERモード
 
 ・タイマーの計数クロックに、外部からの信号を使用します。(T0・T1 端子など)
 
 ・外部からのクロックは、立ち上がりエッジ または 立ち下がりエッジでのカウントを選択できます。
 
 ・外部のクロックにより、任意の時間周期(周波数)で、OCnx端子(OC0A,OC0B,OC1A,OC1Bなど)に
  パルスを発生させたり、割り込みを発生させることができます。
 
 ・外部信号が変化した間隔の、周期(時間)測定や、一定時間内のパルス数を計測できます。

 
3. PWMモード (Pulse Width Modulation)
 
 ・上記2つの動作に、比較器 (Output Compare Register) の操作を加えて、出力パルスの周波数、
  パルス幅、位相を制御することができます。

 
○ この大きく分けた3つの動作に、キャプチャー動作が加わります。
 
 ・キャプチャー動作は、ICP(Input Capture Pin)端子 または アナログ比較器が搭載されている
  チップで使用できます。
 
 ・この機能は、多くのチップで、16ビットTimer1に用意されています。
 
 ・動作の概略は、ICP端子 または アナログ比較器の状態変化で、タイマーの計数値がキャプチャー
  レジスタ(ICRn)にコピーされ、状態変化の時間測定やタイマーの動作設定値に利用できます。


● タイマー 0 (8ビット仕様についての解説)
● タイマー 1 (16ビット仕様についての解説)
● タイマー 2 (8ビット仕様についての解説)


 ● タイマー 0 (8ビット仕様についての解説)
 

 
1. TIMERモード (タイマー 0)

書式例 Config Timer0 = Timer , Prescale = 1 , Clear Timer = 1 , Compare A = Toggle
       @        A        B        C

@ Config Timer0 = Timer
 
 ・タイマー0をTIMERモードに設定します。
 ・この記述だけでは、タイマーはまだ何も動作しません。
 ・また、[= Timer] と [= Counter] は名目上の書式のため、どちらを書いても動作に違いが出ません
  ので注意して下さい。

A Prescale = 1|8|64|256|1024
 
 ・タイマー0の計数に使用するAVRの動作クロックを、プリスケーラ(前段分周器)で分周する値を
  設定します。 (1は分周なしです)
 ・一部のチップでは、1|8|32|64|128|256|1024 の設定が可能です。
 ・この書式により、タイマー0が動作開始しますので、必ず記述が必要です。
 ・事実上この書式が、TIMERモードとCOUNTERモードを識別します。

これ以降は、タイマー0に比較器 [OCR0x] を搭載しているチップにのみ有効な書式です。
 
B Clear Timer = 0|1
 
 ・比較器A [OCR0A] を使用する場合で、TIMER0 [TCNT0] と比較器A [OCR0A] が一致した時に、
  TIMER0 [TCNT0] を、$00にクリアするかしないかの選択です。
0 − オーバーフロー動作。  TIMER0 [TCNT0] をクリアしない。 (デフォルト)
 (TIMER0 [TCNT0] は、$00〜$FF を繰り返します)
1 − 比較一致 CTC動作。  TIMER0 [TCNT0] をクリアする。
 (TIMER0 [TCNT0] は、$00〜OCR0A値 を繰り返します)

C Compare (A)(B) = Clear | Set | Toggle | Disconnect
 
 ・比較出力 [OC0x] ピンを使用し、タイマー動作をポートピンへ出力する場合に記述します。
 ・このピンを使用する場合は、「Config Port」命令で [OC0x] のポートピンを出力に設定して下さい。
Compare =  比較器が1つのチップの場合。
Compare A =  比較器Aを設定します。
Compare B =  比較器Bを設定します。
Clear  一致発生で、[OC0x] ピンをL(0)にします。
Set  一致発生で、[OC0x] ピンをH(1)にします。
Toggle  一致発生で、[OC0x] ピンを反転します。 分周パルス出力。
Disconnect  [OC0x] ピンを使用しません。 [OC0x] ピンは通常のポート。 (デフォルト)


(プログラム例)
 
 ・ATtiny45のクロックに12.8MHz Xtalを使用し、タイマー0でPB0 [OC0A] ピンから50Hzを出力します。
  (1) クロック12.8MHzを、プリスケーラで1/1024分周します。 12,800,000Hz ÷ 1024 = 12,500Hz
  (2) 比較器A [OCR0A] を使用し、1/250分周します。 12,500Hz ÷ (50Hz × 2) = 125カウント - 1
 
$regfile = "ATtiny45.DAT" ' AVRデバイスを"ATtiny45"に設定。
$crystal = 12800000 ' クロック周波数を12.8MHzに設定。
Config Portb = Output ' PORT B を出力に設定。
Config Timer0 = Timer , Prescale = 1024 , Clear Timer = 1 , Compare A = Toggle
Ocr0a = 124 ' 12,500Hz ÷ (50Hz × 2) = 125カウント-1
End ' プログラムの終了。

 
2. COUNTERモード (タイマー 0)

書式例 Config Timer0 = Counter , Edge = Rising , Clear Timer = 1 , Compare A = Toggle
       @          A       B        C

@ Config Timer0 = Counter
 
 ・タイマー0をCOUNTERモードに設定します。
 ・この記述だけでは、タイマー0はまだ何も動作しません。
 ・また、[= Counter] と [= Timer] は名目上の書式のため、どちらを書いても動作に違いが出ません
  ので注意して下さい。

A Edge = Rising | Falling
 
 ・タイマー0の計数に使用する外部クロックの、エッジ方向を選択します。
Rising  外部クロックの、立ち上がりエッジでカウント。
Falling  外部クロックの、立ち下がりエッジでカウント。
 ・この書式により、タイマー0が動作開始しますので、必ず記述が必要です。
 ・事実上この書式が、COUNTERモードとTIMERモードを識別します。

これ以降は、タイマー0に比較器 [OCR0x] を搭載しているチップにのみ有効な書式です。
 
B C は、「1. TIMERモード」と同じです。


(プログラム例)
 
 ・ATtiny2313を使用し、PD4 [T0] ピンから入力したパルスを、1/100してPB2 [OC0A] ピンから
  出力します。
 
$regfile = "ATtiny2313.DAT" ' AVRデバイスを"ATtiny2313"に設定。
$crystal = 8000000 ' クロック周波数を8MHzに設定。
Config Portd.4 = Input ' [T0] ピンを入力に設定。
Config Portb.2 = Output ' パルスの出力ポート[OC0A] を出力に設定。
Config Timer0 = Counter , Edge = Rising , Clear Timer = 1 , Compare A = Toggle
Ocr0a = 49 ' 100 ÷ 2 = 50カウント - 1
End ' プログラムの終了。

 
3. PWMモード (Pulse Width Modulation) (タイマー 0)

書式例
 Config Timer0 = Pwm , Prescale = 1 , Clear Timer = 1 , Compare A Pwm = Clear Down
       @        A       B           C

PWMモードは、タイマー0に比較器 [OCR0x] を搭載しているチップにのみ有効な書式です。
 
@ Config Timer0 = Pwm
 
 ・タイマー0をPWMモードに設定します。
 ・この記述だけでは、タイマーはまだ何も動作しません。

A-1 Prescale = 1|8|64|256|1024
 
 ・タイマー0の計数に使用するAVRの動作クロックを、プリスケーラ(前段分周器)で分周する値を
  設定します。 (1は分周なしです)
 ・一部のチップでは、1|8|32|64|128|256|1024 の設定が可能です。
 
A-2 Edge = Rising | Falling
 
 ・タイマー0の計数に、外部クロックを使用する場合はこちらを記述し、エッジ方向を選択します。
Rising  外部クロックの、立ち上がりエッジでカウント。
Falling  外部クロックの、立ち下がりエッジでカウント。
 
 ○ 「Prescale =」 と 「Edge =」 のどちらかの書式により、タイマー0が動作開始しますので、
   必ず記述が必要です。

B Clear Timer = 0|1
 
 ・この記述は、PWMモードにおいて、タイマーのクリア動作と使い方が変わります。
0 − 位相基準PWMモード。 (Phase Correct PWM Mode)
1 − 高速PWMモード。 (Fast PWM Mode)

C Compare (A)(B) Pwm = Clear Up | Clear Down | Disconnect
 
 ・比較出力 [OC0x] ピンを使用し、タイマー動作をポートピンへ出力する場合に記述します。
 ・このピンを使用する場合は、「Config Port」命令で [OC0x] のポートピンを出力に設定して下さい。
Compare Pwm =  比較器が1つのチップの場合。
Compare A Pwm =  比較器Aを設定します。
Compare B Pwm =  比較器Bを設定します。
Clear Up  上昇計数時の一致発生でL(0)、下降計数時の一致発生でH(1)にします。
 高速PWMモードでは、比較一致発生でL(0)、BOTTOMでH(1)。
Clear Down  上昇計数時一致発生でH(1)、下降計数時一致発生でL(0)にします。
 高速PWMモードでは、比較一致発生でH(1)、BOTTOMでL(0)。
Disconnect  [OC0x] ピンを使用しません。 [OC0x] ピンは通常のポート。 (デフォルト)

 ・比較器A [OCR0A] を周波数調整(分周器)に使用する場合は、下記の書式にして下さい。
  ([WGM02] = 1 の、位相基準PWM動作と高速PWM動作)
 
  Compare A = Clear | Set | Toggle | Disconnect
 
Clear  一致発生で、[OC0A] ピンをL(0)にします。
Set  一致発生で、[OC0A] ピンをH(1)にします。
Toggle  一致発生で、[OC0A] ピンを反転します。 分周パルス出力。
Disconnect  [OC0A] ピンを使用しません。 [OC0A] ピンは通常のポート。 (デフォルト)


(プログラム例)
 
 ・ATtiny2313のクロックに8MHzを使用し、タイマー0で周波数1KHzのパルス幅を、8μS〜992μSに
  変化させて、PD5 [OC0B] ピンから出力します。
  (1) クロック8MHzを、プリスケーラで1/64分周します。 8,000,000Hz ÷ 64 = 125,000Hz
  (2) 比較器A [OCR0A] を使用し、1/125分周します。 125,000Hz ÷ 1,000Hz = 125カウント - 1
  (3) 比較器B [OCR0B] を使用し、パルス幅を0〜123の値で、8μS〜992μSに変化させます。
 
$regfile = "ATtiny2313.DAT" ' AVRデバイスを"ATtiny2313"に設定。
$crystal = 8000000 ' クロック周波数を8MHzに設定。
Config Portd.5 = Output ' パルスの出力ポート[OC0B] を出力に設定。
Config Timer0 = Pwm , Prescale = 64 , Clear Timer = 1 , Compare B Pwm = Clear Up
Set Tccr0b.wgm02 ' 高速PWMモード。 (TOP = OCR0A)
Ocr0a = 124 ' 125,000Hz ÷ 1,000Hz = 125カウント-1
Ocr0b = 0 ' パルス幅。(初期値) 1カウントは8μS。
Dim Pw As Byte ' パルス幅用の変数を宣言。
' '
Do ' 繰り返し。
For Pw = 0 To 123 ' パルス幅を8μS〜992μSまで広げる。
Ocr0b = Pw ' パルス幅を設定。
Waitms 20 ' 待ち時間。
Next Pw '
Loop '
End ' プログラムの終了。

 
タイマー0 の数値設定方法
 
 ○ タイマー0に数値を入れる または 取り出す場合。
  ・T = Timer0  変数Tに、TIMER0 [TCNT0] の値を読み込みます。
  ・Timer0 = 128  TIMER0 [TCNT0] に数値を設定します。
  ・[TIMER0] と [TCNT0] は、同じ扱いです。

 ○ 比較器に数値を入れる場合。
  1.比較器が1つのチップ
   ・COMPARE0 = 128 比較器 [OCR0] に数値を設定します。
   ・[COMPARE0] , [OCR0] は、同じ扱いです。
  2.比較器がA , B 2つのチップ
   ・OCR0A = 128 比較器A [OCR0A] に数値を設定します。
   ・[OCR0A] , [COMPARE0A] , [PWM0A] は、同じ扱いです。 (新バージョンから)
   ・OCR0B = 128 比較器B [OCR0B] に数値を設定します。
   ・[OCR0B] , [COMPARE0B] , [PWM0B] は、同じ扱いです。 (新バージョンから)

 ○ 比較器の設定値 変更タイミング。
   タイマーの動作中に、周波数やパルス幅を変えるため、比較器の設定値を変更する場合は、
   比較器が更新されるタイミングに注意が必要です。
   ・オーバーフロー割り込みや、比較一致割り込みで変更する。
   ・比較器 [OCR0x] の更新が、BOTTOMで行われるタイマーモードを使用する。
    (更新が、設定時TOPで行われるモードでは、比較ミスが起きる場合があります)

 
新しい動作モードの設定方法 (タイマー 0)
 
 BASCOM-AVRは、新しいチップに追加された、新たなタイマーモードに追従していません。
 基本仕様は、AT90Sクラスのものですから、これ以降のモードを使用する場合には工夫が必要です。
 
○ ATtiny2313 ・ ATmega88 の設定例。
WGM02 WGM01 WGM00 動作モード TIMER0
[TCNT0]
TOP値
比較器
[OCR0x]
の更新
オーバーフロー
割込要求フラグ
[TOV0]
0 0 0 標準動作 $FF 設定時 MAX
0 0 1 8ビット位相基準PWM動作 $FF TOP BOTTOM
0 1 0 比較一致 CTC動作 OCR0A 設定時 MAX
0 1 1 8ビット高速PWM動作 $FF BOTTOM MAX
1 0 0 --- --- --- ---
1 0 1 位相基準PWM動作 OCR0A TOP BOTTOM
1 1 0 --- --- --- ---
1 1 1 高速PWM動作 OCR0A BOTTOM TOP
MAX
 = $FF

 BOTTOM
 = $00
 
[WGM02] ビットは、SET命令でレジスタに直接設定します。
Config Timer 命令 WGM02 WGM01 WGM00
Config Timer0 = Timer
Config Timer0 = Counter
--- 0 0
Config Timer0 = Pwm --- 0 1
Clear Timer = 0 --- 0 ---
Clear Timer = 1 --- 1 ---
レジスタに直接設定      
Reset TCCR0B.WGM02 0 --- ---
Set TCCR0B.WGM02 1 --- ---

 
 ○動作モードの解説
 
 ・標準動作
  0〜255の範囲でTimer0を動作させ、OCR0A・OCR0Bの設定値により、OC0A・OC0B(タイマー出力)に
  パルス幅を調整した波形を出力できます。
  また、OCF0A・OCF0Bにより割り込みを発生できます。
 
 ・比較一致 CTC動作
  Timer0(TCNT0)がOCR0Aの設定値と等しくなった時に、Timer0(TCNT0)をクリア(00)にします。
  これにより、Timer0での任意の分周値が設定でき、標準動作と同じく波形出力もできます。
 
 ・8ビット高速PWM動作
  0〜255の範囲でTimer0を動作させ、OCR0A・OCR0Bの設定値により、OC0A・OC0B(タイマー出力)に
  PWM(パルス幅変調)波形を出力できます。
  また、OCF0A・OCF0Bにより割り込みを発生できます。
 
 ・高速PWM動作
  OCR0Aの設定値を搬送波(キャリア)周波数に設定し、OC0B(タイマー出力)にPWM(パルス幅変調)
  波形を出力できます。
  また、OCF0A・OCF0Bにより割り込みを発生できます。
  CTC動作との違いは、比較器の設定値が「TCNT0」のBOTTOM(00)の時に更新されるので、波形に
  傷が付かないことです。
 
 ・8ビット位相基準PWM動作
  0〜255・255〜0の範囲でTimer0を動作させ、OCR0A・OCR0Bの設定値により、OC0A・OC0B
  (タイマー出力)にPWM(パルス幅変調)波形を出力します。
  また、OCF0A・OCF0Bにより割り込みを発生できます。
 
 ・位相基準PWM動作
  OCR0Aの設定値を搬送波(キャリア)周波数に設定し、0〜OCR0A・OCR0A〜0の範囲でTimer0を
  動作させ、OC0B(タイマー出力)にPWM(パルス幅変調)波形を出力します。
  また、OCF0A・OCF0Bにより割り込みを発生できます。



 ● タイマー 1 (16ビット仕様についての解説)
 

 
1. TIMERモード (タイマー 1)

書式例 Config Timer1 = Timer , Prescale = 1 , Clear Timer = 1 , Compare A = Toggle
       @        A        B        C

@ Config Timer1 = Timer
 
 ・タイマー1をTIMERモードに設定します。
 ・この記述だけでは、タイマーはまだ何も動作しません。
 ・また、[= Timer] と [= Counter] は名目上の書式のため、どちらを書いても動作に違いが出ません
  ので注意して下さい。

A Prescale = 1|8|64|256|1024
 
 ・タイマー1の計数に使用するAVRの動作クロックを、プリスケーラ(前段分周器)で分周する値を
  設定します。 (1は分周なしです)
 ・この書式により、タイマー1が動作開始しますので、必ず記述が必要です。
 ・事実上この書式が、TIMERモードとCOUNTERモードを識別します。

B Clear Timer = 0|1
 
 ・比較器A [OCR1A] または キャプチャーレジスタ [ICR1] を使用する場合で、TIMER1 [TCNT1] と
  比較器A または キャプチャーレジスタが一致した時に、TIMER1 [TCNT1] を、$0000にクリアするか
  しないかの選択です。
0 − オーバーフロー動作。  TIMER1 [TCNT1] をクリアしない。 (デフォルト)
 (TIMER1 [TCNT1] は、$0000〜$FFFF を繰り返します)
1 − 比較一致 CTC動作。  TIMER1 [TCNT1] をクリアする。
 (TIMER1 [TCNT1] は、$0000〜OCR1A(ICR1)値を繰り返します)

C Compare (A)(B)(C) = Clear | Set | Toggle | Disconnect
 
 ・比較出力 [OC1x] ピンを使用し、タイマー動作をポートピンへ出力する場合に記述します。
 ・このピンを使用する場合は、「Config Port」命令で [OC1x] のポートピンを出力に設定して下さい。
Compare A =  比較器Aを設定します。
Compare B =  比較器Bを設定します。
Clear  一致発生で、[OC1x] ピンをL(0)にします。
Set  一致発生で、[OC1x] ピンをH(1)にします。
Toggle  一致発生で、[OC1x] ピンを反転します。 分周パルス出力。
Disconnect  [OC1x] ピンを使用しません。 [OC1x] ピンは通常のポート。 (デフォルト)


(プログラム例)
 
 ・ATtiny2313のクロックに12.8MHz Xtalを使用し、タイマー1で1秒間隔の割り込みを発生します。
  (1) クロック12.8MHzを、プリスケーラで1/1024分周します。 12,800,000Hz ÷ 1024 = 12,500Hz
  (2) 比較器A [OCR1A] を使用し、1/12500分周します。 12,500Hz ÷ 12,500 = 1Hz
 
$regfile = "ATtiny2313.DAT" ' AVRデバイスを"ATtiny2313"に設定。
$crystal = 12800000 ' クロック周波数を12.8MHzに設定。
Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1
Compare1a = 12499 ' 12,500カウント - 1
On Compare1a Tint1 ' 比較一致割り込みルーチンのラベルを設定。
Enable Compare1a ' TIMER1比較一致割り込みを許可。
Enable Interrupts ' すべての割り込みを許可。
Do ' 繰り返し処理。
Loop ' メインルーチンの処理。
'
Tint1: ' TIMER1比較一致割り込み処理ルーチン。
' ' 時刻カウントルーチンなど。
Return ' 割り込み処理ルーチンの終了。
End ' プログラムの終了。

 
2. COUNTERモード (タイマー 1)

書式例 Config Timer1 = Counter , Edge = Rising , Clear Timer = 1 , Compare A = Toggle
       @          A       B        C

@ Config Timer1 = Counter
 
 ・タイマー1をCOUNTERモードに設定します。
 ・この記述だけでは、タイマー1はまだ何も動作しません。
 ・また、[= Counter] と [= Timer] は名目上の書式のため、どちらを書いても動作に違いが出ません
  ので注意して下さい。

A Edge = Rising | Falling
 
 ・タイマー1の計数に使用する外部クロックの、エッジ方向を選択します。
Rising  外部クロックの、立ち上がりエッジでカウント。
Falling  外部クロックの、立ち下がりエッジでカウント。
 ・この書式により、タイマー1が動作開始しますので、必ず記述が必要です。
 ・事実上この書式が、COUNTERモードとTIMERモードを識別します。

B C は、「1. TIMERモード」と同じです。


(プログラム例)
 
 ・ATtiny2313を使用し、PD5 [T1] ピンから入力したパルスが、100個になるたびに割り込みを
  発生します。
 
$regfile = "ATtiny2313.DAT" ' AVRデバイスを"ATtiny2313"に設定。
$crystal = 8000000 ' クロック周波数を8MHzに設定。
Config Portd.5 = Input ' [T1] ピンを入力に設定。
Config Timer1 = Counter , Edge = Rising , Clear Timer = 1
Compare1a = 99 ' 100カウント - 1
On Compare1a Tint1 ' 比較一致割り込みルーチンのラベルを設定。
Enable Compare1a ' TIMER1比較一致割り込みを許可。
Enable Interrupts ' すべての割り込みを許可。
Do ' 繰り返し処理。
Loop ' メインルーチンの処理。
'
Tint1: ' TIMER1比較一致割り込み処理ルーチン。
' ' パルスが100個になった処理ルーチン。
Return ' 割り込み処理ルーチンの終了。
End ' プログラムの終了。

 
3. PWMモード (Pulse Width Modulation) (タイマー 1)

書式例
 Config Timer1 = Pwm , Prescale = 1 , Pwm = 10 , Clear Timer = 1 , Compare A Pwm = Clear Down
       @        A      D      B        C

@ Config Timer1 = Pwm
 
 ・タイマー1をPWMモードに設定します。
 ・この記述だけでは、タイマーはまだ何も動作しません。

A-1 Prescale = 1|8|64|256|1024
 
 ・タイマー1の計数に使用するAVRの動作クロックを、プリスケーラ(前段分周器)で分周する値を
  設定します。 (1は分周なしです)
 
A-2 Edge = Rising | Falling
 
 ・タイマー1の計数に、外部クロックを使用する場合はこちらを記述し、エッジ方向を選択します。
Rising  外部クロックの、立ち上がりエッジでカウント。
Falling  外部クロックの、立ち下がりエッジでカウント。
 
 ○ 「Prescale =」 と 「Edge =」 のどちらかの書式により、タイマー1が動作開始しますので、
   必ず記述が必要です。

D Pwm = 8|9|10
 
 ・タイマー1の計数範囲を、標準の16ビットから、8ビット、9ビット、10ビットに変更することができます。
8 − 8ビットの範囲。 ($0000〜$00FF)
9 − 9ビットの範囲。 ($0000〜$01FF)
10 − 10ビットの範囲。 ($0000〜$03FF)

B Clear Timer = 0|1
 
 ・この記述は、PWMモードにおいて、タイマーのクリア動作と使い方が変わります。
0 − 位相基準PWMモード。 (Phase Correct PWM Mode)
1 − 高速PWMモード。 (Fast PWM Mode)

C Compare (A)(B) Pwm = Clear Up | Clear Down | Disconnect
 
 ・比較出力 [OC1x] ピンを使用し、タイマー動作をポートピンへ出力する場合に記述します。
 ・このピンを使用する場合は、「Config Port」命令で [OC1x] のポートピンを出力に設定して下さい。
Compare A Pwm =  比較器Aを設定します。
Compare B Pwm =  比較器Bを設定します。
Clear Up  上昇計数時の一致発生でL(0)、下降計数時の一致発生でH(1)にします。
 高速PWMモードでは、比較一致発生でL(0)、BOTTOMでH(1)。
Clear Down  上昇計数時一致発生でH(1)、下降計数時一致発生でL(0)にします。
 高速PWMモードでは、比較一致発生でH(1)、BOTTOMでL(0)。
Disconnect  [OC1x] ピンを使用しません。 [OC1x] ピンは通常のポート。 (デフォルト)

 ・比較器A [OCR1A] を周波数調整(分周器)に使用する場合は、下記の書式にして下さい。
  ([WGM13] = 1 の、位相基準PWM動作と高速PWM動作)
 
  Compare A = Clear | Set | Toggle | Disconnect
 
Clear  一致発生で、[OC1A] ピンをL(0)にします。
Set  一致発生で、[OC1A] ピンをH(1)にします。
Toggle  一致発生で、[OC1A] ピンを反転します。 分周パルス出力。
Disconnect  [OC1A] ピンを使用しません。 [OC1A] ピンは通常のポート。 (デフォルト)


(プログラム例)
 
 ・ATtiny2313のクロックに8MHzを使用し、ラジコン用のサーボモーターを制御します。
    信号周期 = 50Hz (20mS)  パルス範囲 = 1.5mS±0.5mS (1mS〜2mS)  出力ポート PB4
  (1) クロック8MHzを、プリスケーラで1/64分周します。 8,000,000Hz ÷ 64 = 125,000Hz
  (2) 比較器A [OCR1A] を使用し、1/2500分周します。 125,000Hz ÷ 50Hz = 2500カウント - 1
  (3) 比較器B [OCR1B] を使用し、パルス幅を124〜249の値で、1mS〜2mSに変化させます。
 
$regfile = "ATtiny2313.DAT" ' AVRデバイスを"ATtiny2313"に設定。
$crystal = 8000000 ' クロック周波数を8MHzに設定。
Config Portb.4 = Output ' パルスの出力ポート[OC1B] を出力に設定。
Config Timer1 = Pwm , Prescale = 64 , Clear Timer = 1 , Compare B Pwm = Clear Up
Set Tccr1a.wgm11 ' 高速PWMモード。 (TOP = OCR1A)
Set Tccr1b.wgm13 ' 高速PWMモード。 (TOP = OCR1A)
Compare1a = 2499 ' 125,000Hz ÷ 50Hz = 2500カウント - 1
Compare1b = 187 ' パルス幅。(初期値) 1カウントは8μS。
Dim Pw As Byte ' パルス幅用の変数を宣言。
' '
Do ' 繰り返し。
For Pw = 124 To 249 ' パルス幅を1mS〜2mSまで変化させる。
Compare1b = Pw ' パルス幅を設定。
Waitms 10 ' 待ち時間。
Next Pw '
For Pw = 249 To 124 Step -1 ' パルス幅を2mS〜1mSまで変化させる。
Compare1b = Pw ' パルス幅を設定。
Waitms 10 ' 待ち時間。
Next Pw '
Loop '
End ' プログラムの終了。

 
4. キャプチャー動作 (タイマー 1)

書式例 Config Timer1 = Timer , Prescale = 8 , Capture Edge = Rising , Noise Cancel = 1
       @        A        E          F

@ Config Timer1 = Timer
 
 ・タイマー1をTIMERモードに設定します。
 ・この記述だけでは、タイマーはまだ何も動作しません。

A Prescale = 1|8|64|256|1024
 
 ・タイマー1の計数に使用するAVRの動作クロックを、プリスケーラ(前段分周器)で分周する値を
  設定します。 (1は分周なしです)
 ・この書式により、タイマー1が動作開始しますので、必ず記述が必要です。

E Capture Edge = Rising | Falling
 
 ・キャプチャー入力 [ICP] ピン または アナログ比較器の状態変化で、TIMER1 [TCNT1] の
  カウント値を、キャプチャーレジスタ [ICR1] にコピーする際の、信号のエッジ方向を選択します。
Rising  ICP1ピン または アナログ比較器の、立ち上がりエッジでキャプチャー。
Falling  ICP1ピン または アナログ比較器の、立ち下がりエッジでキャプチャー。

F Noise Cancel = 0|1
 
 ・キャプチャー入力 [ICP] ピン または アナログ比較器からの信号に、ノイズ除去機能を加えます。
0 − ノイズ除去機能をオフにします。
1 − ノイズ除去機能をオンにします。

 
タイマー1 の数値設定方法
 
 ○ タイマー1に数値を入れる または 取り出す場合。
  ・T = Timer1  ワード型変数Tに、TIMER1 [TCNT1] の値を読み込みます。
  ・Timer1 = 1234  TIMER1 [TCNT1] に数値を設定します。
  ・[TIMER1] と [TCNT1] は、同じ扱いです。

 ○ 比較器に数値を入れる場合。
  ・Compare1a = 1234 比較器A [OCR1A] に数値を設定します。
  ・[COMPARE1A] , [OCR1A] は、同じ扱いです。
  ・Compare1b = 1234 比較器B [OCR1B] に数値を設定します。
  ・[COMPARE1B] , [OCR1B] は、同じ扱いです。

 ○ キャプチャーレジスターに数値を入れる または 取り出す場合。
  ・C = Capture1  ワード型変数Cに、キャプチャーレジスタ [ICR1] の値を読み込みます。
  ・Capture1 = 1234  キャプチャーレジスタ [ICR1] に数値を設定します。
  ・[CAPTURE1] と [ICR1] は、同じ扱いです。

 ○ 比較器の設定値 変更タイミング。
   タイマーの動作中に、周波数やパルス幅を変えるため、比較器の設定値を変更する場合は、
   比較器が更新されるタイミングに注意が必要です。
   ・オーバーフロー割り込みや、比較一致割り込みで変更する。
   ・比較器 [OCR1x] の更新が、BOTTOMで行われるタイマーモードを使用する。
    (更新が、設定時TOPで行われるモードでは、比較ミスが起きる場合があります)

 
新しい動作モードの設定方法 (タイマー 1)
 
 BASCOM-AVRは、新しいチップに追加された、新たなタイマーモードに追従していません。
 基本仕様は、AT90Sクラスのものですから、これ以降のモードを使用する場合には工夫が必要です。
 
○ ATtiny2313 ・ ATmega88 の設定例。
WGM13 WGM12 WGM11 WGM10 動作モード TIMER1
[TCNT1]
TOP値
比較器
[OCR1x]
の更新
オーバーフロー
割込要求フラグ
[TOV1]
0 0 0 0 標準動作 $FFFF 設定時 MAX
0 0 0 1 8ビット位相基準PWM動作 $00FF TOP BOTTOM
0 0 1 0 9ビット位相基準PWM動作 $01FF TOP BOTTOM
0 0 1 1 10ビット位相基準PWM動作 $03FF TOP BOTTOM
0 1 0 0 比較一致 CTC動作 OCR1A 設定時 MAX
0 1 0 1 8ビット高速PWM動作 $00FF BOTTOM TOP
0 1 1 0 9ビット高速PWM動作 $01FF BOTTOM TOP
0 1 1 1 10ビット高速PWM動作 $03FF BOTTOM TOP
1 0 0 0 位相・周波数基準PWM動作 ICR1 BOTTOM BOTTOM
1 0 0 1 位相・周波数基準PWM動作 OCR1A BOTTOM BOTTOM
1 0 1 0 位相基準PWM動作 ICR1 TOP BOTTOM
1 0 1 1 位相基準PWM動作 OCR1A TOP BOTTOM
1 1 0 0 比較一致 CTC動作 ICR1 設定時 MAX
1 1 0 1 --- --- --- ---
1 1 1 0 高速PWM動作 ICR1 BOTTOM TOP
1 1 1 1 高速PWM動作 OCR1A BOTTOM TOP
 
MAX = $FFFF  BOTTOM = $0000
 
[WGM11] [WGM13] ビットは、SET命令でレジスタに直接設定します。
Config Timer 命令 WGM13 WGM12 WGM11 WGM10
Config Timer1 = Timer
Config Timer1 = Counter
0 0 0 0
Config Timer1 = Pwm 0 0 0 1
Pwm = 8 --- --- 0 1
Pwm = 9 --- --- 1 0
Pwm = 10 --- --- 1 1
Clear Timer = 0 --- 0 --- ---
Clear Timer = 1 --- 1 --- ---
レジスタに直接設定        
Reset TCCR1A.WGM11 --- --- 0 ---
Set TCCR1A.WGM11 --- --- 1 ---
Reset TCCR1B.WGM13 0 --- --- ---
Set TCCR1B.WGM13 1 --- --- ---

 
 ○動作モードの解説
 
 ・標準動作
  0〜65535の範囲でTimer1を動作させ、OCR1A・OCR1Bの設定値により、OC1A・OC1B(タイマー
  出力)にパルス幅を調整した波形を出力できます。
  また、OCF1A・OCF1Bにより割り込みを発生できます。
 
 ・比較一致 CTC動作
  Timer1(TCNT1)がOCR1Aの設定値と等しくなった時に、Timer1(TCNT1)をクリア(0000)にします。
  これにより、Timer1での任意の分周値が設定でき、標準動作と同じく波形出力もできます。
 
 ・8 , 9 , 10 ビット高速PWM動作
  0〜255 , 0〜511 , 0〜1023の範囲でTimer1を動作させ、OCR1A・OCR1Bの設定値により、
  OC1A・OC1B(タイマー出力)にPWM(パルス幅変調)波形を出力できます。
  また、OCF1A・OCF1Bにより割り込みを発生できます。
 
 ・高速PWM動作
  OCR1AまたはICR1の設定値を搬送波(キャリア)周波数に設定し、OC1A・OC1B(タイマー出力)に
  PWM(パルス幅変調)波形を出力できます。
  また、OCF1A・OCF1Bにより割り込みを発生できます。
  CTC動作との違いは、比較器の設定値が「TCNT1」のBOTTOM(0000)の時に更新されるので、
  波形に傷が付かないことです。
 
 ・8 , 9 , 10 ビット位相基準PWM動作
  (0〜255,255〜0),(0〜511,511〜0),(0〜1023,1023〜0)の範囲でTimer1を動作させ、OCR1A・
  OCR1Bの設定値により、OC1A・OC1B(タイマー出力)にPWM(パルス幅変調)波形を出力します。
  また、OCF1A・OCF1Bにより割り込みを発生できます。
 
 ・位相基準PWM動作
  OCR1AまたはICR1の設定値を搬送波(キャリア)周波数に設定し、0〜OCR0A・OCR0A〜0
  (0〜ICR1・ICR1〜0)の範囲でTimer1を動作させ、OC1B(タイマー出力)にPWM(パルス幅変調)
  波形を出力します。
  比較器の設定値は、「TCNT1」のTOP(OCR1AまたはICR1)で更新されます。
  また、OCF1A・OCF1Bにより割り込みを発生できます。
 
 ・位相・周波数基準PWM動作
  基本動作は「位相基準PWM動作」と同じですが、比較器の設定値が「TCNT1」のBOTTOM(0000)の
  時に更新されるので、搬送波(キャリア)周波数の変更に対する出力波形の傷が無くなります。



 ● タイマー 2 (8ビット仕様についての解説)
 

 
1. TIMERモード (タイマー 2)

書式例
Config Timer2 = Timer , Prescale = 1 , Async = On , Clear Timer = 1 , Compare A = Set
       @        A      G       B       C

@ Config Timer2 = Timer
 
 ・タイマー2をTIMERモードに設定します。
 ・この記述だけでは、タイマーはまだ何も動作しません。
 ・また、[= Timer] と [= Counter] は名目上の書式のため、どちらを書いても動作に違いが出ません
  ので注意して下さい。

A Prescale = 1|8|32|64|128|256|1024
 
 ・タイマー2の計数に使用するAVRの動作クロックを、プリスケーラ(前段分周器)で分周する値を
  設定します。 (1は分周なしです)
 ・一部のチップでは、1|8|64|256|1024 の設定です。 (タイマー2に外部クロック入力がある場合)
 ・この書式により、タイマー2が動作開始しますので、必ず記述が必要です。
 ・事実上この書式が、TIMERモードとCOUNTERモードを識別します。

GAsync = Off | On
 
 ・[TOSC1] と [TOSC2] ピンに、外部発振素子(クリスタル等)を接続する場合に記述します。
 ・タイマーの計数クロックに、AVRの動作クロックとは別の周波数が使用できます。 (非同期)
 ・一部のチップに搭載されている、外部非同期クロック入力([TOSC1] ピンへの直接入力)には
  対応していませんので、直接レジスタ([EXCLK] ビット)を設定して下さい。
 ・この書式を記述しない場合は、デフォルトで(Off)になります。
Off − タイマー2の計数クロックに、AVRの動作クロックを使用します。 (デフォルト)
On − タイマー2の計数クロックに、外部発振素子の非同期クロックを使用します。

B Clear Timer = 0|1
 
 ・比較器 [OCR2x] を使用する場合で、TIMER2 [TCNT2] と比較器 [OCR2x] が一致した時に、
  TIMER2 [TCNT2] を、$00にクリアするかしないかの選択です。
0 − オーバーフロー動作。  TIMER2 [TCNT2] をクリアしない。 (デフォルト)
 (TIMER2 [TCNT2] は、$00〜$FF を繰り返します)
1 − 比較一致 CTC動作。  TIMER2 [TCNT2] をクリアする。
 (TIMER2 [TCNT2] は、$00〜OCR2x値 を繰り返します)

C Compare (A)(B) = Clear | Set | Toggle | Disconnect
 
 ・比較出力 [OC2x] ピンを使用し、タイマー動作をポートピンへ出力する場合に記述します。
 ・このピンを使用する場合は、「Config Port」命令で [OC2x] のポートピンを出力に設定して下さい。
Compare =  比較器が1つのチップの場合。
Compare A =  比較器Aを設定します。
Compare B =  比較器Bを設定します。
Clear  一致発生で、[OC2x] ピンをL(0)にします。
Set  一致発生で、[OC2x] ピンをH(1)にします。
Toggle  一致発生で、[OC2x] ピンを反転します。 分周パルス出力。
Disconnect  [OC2x] ピンを使用しません。 [OC2x] ピンは通常のポート。 (デフォルト)


(プログラム例)
 
 ・ATmega8535の、クロックは内蔵RC発振器1MHzで、[TOSC1] と [TOSC2] ピンに32.768KHz Xtalを
  接続し、タイマー2で1秒間隔の割り込みを発生します。
     参考回路 AVRマイコン ATmega88 + 蛍光表示管 LD8035E デジタル時計
  (1) 外部Xtal 32.768KHzを、プリスケーラで1/128分周します。 32,768Hz ÷ 128 = 256Hz
  (2) Timer2は8ビットなので、256カウントでオーバーフロー割り込みを発生させます。 (1/256)
 
$regfile = "m8535.dat" ' AVRデバイスを"ATmega8535"に設定。
$crystal = 1000000 ' クロック周波数を1MHzに設定。
Config Timer2 = Timer , Prescale = 128 , Async = On
On Timer2 Tint2 ' オーバーフロー割込ルーチンのラベルを設定。
Enable Timer2 ' TIMER2オーバーフロー割り込みを許可。
Enable Interrupts ' すべての割り込みを許可。
Do ' 繰り返し処理。
Loop ' メインルーチンの処理。
'
Tint2: ' TIMER2オーバーフロー割り込み処理ルーチン。
' ' 時刻カウントルーチンなど。
Return ' 割り込み処理ルーチンの終了。
End ' プログラムの終了。

 
2. COUNTERモード (タイマー 2)

書式例 Config Timer2 = Counter , Edge = Rising , Clear Timer = 1 , Compare A = Toggle
       @          A       B        C

タイマー2のCOUNTERモードは、タイマー2に外部クロック入力 [T2] ピンを搭載しているチップにのみ
有効な書式です。

 
@ Config Timer2 = Counter
 
 ・タイマー2をCOUNTERモードに設定します。
 ・この記述だけでは、タイマー2はまだ何も動作しません。
 ・また、[= Counter] と [= Timer] は名目上の書式のため、どちらを書いても動作に違いが出ません
  ので注意して下さい。

A Edge = Rising | Falling
 
 ・タイマー2の計数に使用する外部クロックの、エッジ方向を選択します。
Rising  外部クロックの、立ち上がりエッジでカウント。
Falling  外部クロックの、立ち下がりエッジでカウント。
 ・この書式により、タイマー2が動作開始しますので、必ず記述が必要です。
 ・事実上この書式が、COUNTERモードとTIMERモードを識別します。

B C は、「1. TIMERモード」の B C と同じです。

 
3. PWMモード (Pulse Width Modulation) (タイマー 2)

書式例
 Config Timer2 = Pwm , Prescale = 1 , Clear Timer = 1 , Compare A Pwm = Clear Down
       @        A       B           C

@ Config Timer2 = Pwm
 
 ・タイマー2をPWMモードに設定します。
 ・この記述だけでは、タイマーはまだ何も動作しません。

A Prescale = 1|8|32|64|128|256|1024
 
 ・タイマー2の計数に使用するAVRの動作クロックを、プリスケーラ(前段分周器)で分周する値を
  設定します。 (1は分周なしです)
 ・一部のチップでは、1|8|64|256|1024 の設定です。 (タイマー2に外部クロック入力がある場合)
 ・この書式により、タイマー2が動作開始しますので、必ず記述が必要です。

B Clear Timer = 0|1
 
 ・この記述は、PWMモードにおいて、タイマーのクリア動作と使い方が変わります。
0 − 位相基準PWMモード。 (Phase Correct PWM Mode)
1 − 高速PWMモード。 (Fast PWM Mode)

C Compare (A)(B) Pwm = Clear Up | Clear Down | Disconnect
 
 ・比較出力 [OC2x] ピンを使用し、タイマー動作をポートピンへ出力する場合に記述します。
 ・このピンを使用する場合は、「Config Port」命令で [OC2x] のポートピンを出力に設定して下さい。
Compare Pwm =  比較器が1つのチップの場合。
Compare A Pwm =  比較器Aを設定します。
Compare B Pwm =  比較器Bを設定します。
Clear Up  上昇計数時の一致発生でL(0)、下降計数時の一致発生でH(1)にします。
 高速PWMモードでは、比較一致発生でL(0)、BOTTOMでH(1)。
Clear Down  上昇計数時一致発生でH(1)、下降計数時一致発生でL(0)にします。
 高速PWMモードでは、比較一致発生でH(1)、BOTTOMでL(0)。
Disconnect  [OC2x] ピンを使用しません。 [OC2x] ピンは通常のポート。 (デフォルト)

 ・比較器A [OCR2A] を周波数調整(分周器)に使用する場合は、下記の書式にして下さい。
  ([WGM22] = 1 の、位相基準PWM動作と高速PWM動作)
 
  Compare A = Clear | Set | Toggle | Disconnect
 
Clear  一致発生で、[OC2A] ピンをL(0)にします。
Set  一致発生で、[OC2A] ピンをH(1)にします。
Toggle  一致発生で、[OC2A] ピンを反転します。 分周パルス出力。
Disconnect  [OC2A] ピンを使用しません。 [OC2A] ピンは通常のポート。 (デフォルト)


(プログラム例)
 
 ・タイマー0を参照。

 
タイマー2 の数値設定方法
 
 ○ タイマー2に数値を入れる または 取り出す場合。
  ・T = Timer2  変数Tに、TIMER2 [TCNT2] の値を読み込みます。
  ・Timer2 = 128  TIMER2 [TCNT2] に数値を設定します。
  ・[TIMER2] と [TCNT2] は、同じ扱いです。

 ○ 比較器に数値を入れる場合。
  1.比較器が1つのチップ
   ・COMPARE2 = 128 比較器 [OCR2] に数値を設定します。
   ・[COMPARE2] , [OCR2] は、同じ扱いです。
  2.比較器がA , B 2つのチップ
   ・OCR2A = 128 比較器A [OCR2A] に数値を設定します。
   ・[OCR2A] , [COMPARE2A] , [PWM2A] は、同じ扱いです。 (新バージョンから)
   ・OCR2B = 128 比較器B [OCR2B] に数値を設定します。
   ・[OCR2B] , [COMPARE2B] , [PWM2B] は、同じ扱いです。 (新バージョンから)

 ○ 比較器の設定値 変更タイミング。
   タイマーの動作中に、周波数やパルス幅を変えるため、比較器の設定値を変更する場合は、
   比較器が更新されるタイミングに注意が必要です。
   ・オーバーフロー割り込みや、比較一致割り込みで変更する。
   ・比較器 [OCR2x] の更新が、BOTTOMで行われるタイマーモードを使用する。
    (更新が、設定時TOPで行われるモードでは、比較ミスが起きる場合があります)

 
新しい動作モードの設定方法 (タイマー 2)
 
 BASCOM-AVRは、新しいチップに追加された、新たなタイマーモードに追従していません。
 基本仕様は、AT90Sクラスのものですから、これ以降のモードを使用する場合には工夫が必要です。
 
○ ATtiny2313 ・ ATmega88 の設定例。
WGM22 WGM21 WGM20 動作モード TIMER2
[TCNT2]
TOP値
比較器
[OCR2x]
の更新
オーバーフロー
割込要求フラグ
[TOV2]
0 0 0 標準動作 $FF 設定時 MAX
0 0 1 8ビット位相基準PWM動作 $FF TOP BOTTOM
0 1 0 比較一致 CTC動作 OCR2A 設定時 MAX
0 1 1 8ビット高速PWM動作 $FF BOTTOM MAX
1 0 0 --- --- --- ---
1 0 1 位相基準PWM動作 OCR2A TOP BOTTOM
1 1 0 --- --- --- ---
1 1 1 高速PWM動作 OCR2A BOTTOM TOP
MAX
 = $FF

 BOTTOM
 = $00
 
[WGM22] ビットは、SET命令でレジスタに直接設定します。
Config Timer 命令 WGM22 WGM21 WGM20
Config Timer2 = Timer
Config Timer2 = Counter
--- 0 0
Config Timer2 = Pwm --- 0 1
Clear Timer = 0 --- 0 ---
Clear Timer = 1 --- 1 ---
レジスタに直接設定      
Reset TCCR2B.WGM22 0 --- ---
Set TCCR2B.WGM22 1 --- ---

 
 ○動作モードの解説
 
 ・標準動作
  0〜255の範囲でTimer2を動作させ、OCR2A・OCR2Bの設定値により、OC2A・OC2B(タイマー出力)に
  パルス幅を調整した波形を出力できます。
  また、OCF2A・OCF2Bにより割り込みを発生できます。
 
 ・比較一致 CTC動作
  Timer2(TCNT2)がOCR2Aの設定値と等しくなった時に、Timer2(TCNT2)をクリア(00)にします。
  これにより、Timer2での任意の分周値が設定でき、標準動作と同じく波形出力もできます。
 
 ・8ビット高速PWM動作
  0〜255の範囲でTimer2を動作させ、OCR2A・OCR2Bの設定値により、OC2A・OC2B(タイマー出力)に
  PWM(パルス幅変調)波形を出力できます。
  また、OCF2A・OCF2Bにより割り込みを発生できます。
 
 ・高速PWM動作
  OCR2Aの設定値を搬送波(キャリア)周波数に設定し、OC2B(タイマー出力)にPWM(パルス幅変調)
  波形を出力できます。
  また、OCF2A・OCF2Bにより割り込みを発生できます。
  CTC動作との違いは、比較器の設定値が「TCNT2」のBOTTOM(00)の時に更新されるので、波形に
  傷が付かないことです。
 
 ・8ビット位相基準PWM動作
  0〜255・255〜0の範囲でTimer2を動作させ、OCR2A・OCR2Bの設定値により、OC2A・OC2B
  (タイマー出力)にPWM(パルス幅変調)波形を出力します。
  また、OCF2A・OCF2Bにより割り込みを発生できます。
 
 ・位相基準PWM動作
  OCR2Aの設定値を搬送波(キャリア)周波数に設定し、0〜OCR2A・OCR2A〜0の範囲でTimer2を
  動作させ、OC2B(タイマー出力)にPWM(パルス幅変調)波形を出力します。
  また、OCF2A・OCF2Bにより割り込みを発生できます。





   電子工作の部屋 Top へ 前のページへ戻る