Arduino IDE でATtiny1604 のタイマー割り込みのマルチタスクを試し,ダイナミック駆動の32x16LEDマトリックスの表示に使ってみました。

32x16LEDマトリックスの表示をATtiny1604 のタイマー割り込みで試してみた
Arduino IDE でATtiny1604 のタイマー割り込みのマルチタスクを試してみた


以下はATtiny1604でタイマー割り込みを使う際の設定など,自分なりのメモです。
(図表の一部はATtiny1604のdatasheetから転載・改編しています)



1.タイマー割り込みで使った設定や関数
 今回,タイマーはTCB0 (Timer/Counter Type B の0 )を使っています。

タイマーの設定

void setup() { 
 ・・・・・・
// カウンターの最大値の設定 (例:500カウントx4usで2mS間隔で割り込む)
 TCB0.CCMP = 500;
//カウントモードの設定 (例:タイマー割り込みモード)
 TCB0.CTRLB = (TCB0_CTRLB & 0b10101000) + 0b00000000;
//クロックソースと周期を設定してカウントスタート
 TCB0.CTRLA = (TCB0_CTRLA & 0b11111000) + 0b00000101;
//割り込みの許可
 TCB0.INTCTRL = 1;  
}


割り込みサービスルーチン (ISR, Interrupt Service Routine) を作る

ISR(TCB0_INT_vect) {
// 割り込みで動かすプログラムを書く
 ・・・・・・
//割り込みフラグのクリア
 TCB0.INTFLAGS = 1;
}




2.タイマー・カウンターTCB0の設定内容

1) タイマーモードの設定
 TCB0のタイマーをCTRLBレジスタの設定で定期的割り込みモードにする。
Pin出力は上位4bitで無効にしておき,下位3bitでモード設定を行う。

//実際の設定値
TCB0.CTRLB=0b00100000;





2) 割り込みの間隔の設定
 TCB0のタイマーの時間設定は以下の流れで設定する。

(1) システムクロック
 Arduino IDE のボード設定でシステムクロック(20MHzか16MHz)を選んでおく。




 システムクロックからペリフェラル用のクロック (CLK_PER)が生成される。






(2) TCB0では3種類のクロックソースから1つを選択する
 選択はTCB0のCTRLAレジスタの設定で行う。

 1. CLK_PER (高速用)
 2. CLK_PER/2 (中速用)
 3.TCA0のクロック,TCA_CLK (低速用)





CTRLAレジスタで,クロックソースにCLKTCAを選び,TCB0をスタートさせる。

//実際の設定値
TCB0.CTRLA=0b00000101;



* Bit2:1のCLKSELの表は多分誤植だと思います。0x3設定では動きません。
  RUNSTDBYの説明文の中の記述とも合わないので,0x2と0x3にしています。


3.実際の定期的な割り込み動作の確認


1)システムクロック:16MHz
 レジェンドArduino互換?のクロック

システムクロック:16MHz →  ペリフェラルクロック 2.66MHz
クロックソースCLKTCA:250kHz  ( 1クロックは4uS)
カウント設定値:500 (500*4uS で2mS間隔で割り込み)





2)システムクロック:20MHz
 公式な最速クロック値

システムクロック:20MHz →  ペリフェラルクロック 3.3MHz
クロックソースCLKTCA:312.5kHz  (1クロックは3.2uS)
カウント設定値:500 (500*3.2uS で1.6mS間隔で割り込み)





AVRマイコンでタイマー割り込み系のページを見ると,16MHzのシステムクロックが使われているのが多いですね。

やはりArduino間での互換性が考えられているのでしょう。

以上のように最も遅いクロックソースでもミリ秒程度の繰り返し精度はあるようですので,私のようなLED表示程度なら十分ですね。

ま,精度が求められる分野の用途ではもっと速いクロックを使ってそれなりに検証しながらの実装になるのでしょうから。