Skip to content

CCL_LUT

askn37 edited this page Sep 22, 2026 · 6 revisions

CCL注文論理回路応用例

独立プリスケーラー

4分周/8分周 - 偶数 LUT

単独の CCL ひとつで、4分周、または 8分周の 分周器を作ることができる。 これは EVSYS 経由で TCBn 他のクロック元にすることができ、同目的での TCAn 占有を避けることができる。

偶数 LUT を使用する場合は、自分自身の出力を帰還入力に選ぶ。

CCL_TRUTH0    = CCL_TRUTH_0_bm;
CCL_LUT0CTRLB = CCL_INSEL0_FEEDBACK_gc; /* <- CCL0_OUT 帰還入力 */
CCL_LUT0CTRLA = CCL_ENABLE_bm           /* 4または8分周出力 */
              | CCL_OUTEN_bm            /* 任意:CCL0_OUT -> PA3 */

          /* クロック元 選択 */
              | CCL_CLKSRC_CLKPER_gc    /* CLK_PER : 既定値 */
           // | CCL_CLKSRC_IN2_gc       /* CLK_INSEL2 */
           // | CCL_CLKSRC_OSCHF_gc     /* CLK_24M/20M/16M */
           // | CCL_CLKSRC_OSC32K_gc    /* CLK_32K */
           // | CCL_CLKSRC_OSC1K_gc     /* CLK_1K */

          /* 逐次制御器選択 */
              | CCL_FILTSEL_SYNCH_gc;   /* 2クロック遅延=4分周 */
           // | CCL_FILTSEL_FILTER_gc;  /* 4クロック遅延=8分周 */

CCL_CTRLA = CCL_ENABLE_bm;
  • CLKSRC_OSCHF は、CLKPER に分周器を通す前の、生の高周波発振器出力そのままなので、24 MHz、20 MHz、16 MHz のいずれになるかは、実装品種と FUSE設定に依存する。
  • CLKSRC_IN2 で任意のクロック元を与えることができる。CCL_LUTnCTRLC で外部ピンや 事象入力を指示する。
  • tinyAVR 系の CCL0_OUT は PIN_PA4 になる。

4分周/8分周 - 奇数 LUT

奇数 LUT の場合は、直接自身の帰還入力を得ることができないので、EVSYS 経由で受け取る。つまり EVSYS_CHn をひとつ消費する。

EVSYS_CHANNEL0 = EVSYS_CHANNEL0_CCL_LUT1_gc;  /* AVR-DU以降は EVSYS_CHANNEL_CCL_LUT1_gc と書く */
EVSYS_USERCCLLUT1A = EVSYS_USER_CHANNEL0_gc;

CCL_TRUTH1    = CCL_TRUTH_0_bm;
CCL_LUT1CTRLB = CCL_INSEL0_EVENTA_gc;   /* <- CCL1_OUT 帰還入力:EVSYS経由 */
CCL_LUT1CTRLA = CCL_ENABLE_bm           /* 4または8分周出力 */
              | CCL_OUTEN_bm            /* 任意:CCL1_OUT -> PC3 */

          /* クロック元 選択 */
              | CCL_CLKSRC_CLKPER_gc    /* CLK_PER : 既定値 */
           // | CCL_CLKSRC_IN2_gc       /* CLK_INSEL2 */
           // | CCL_CLKSRC_OSCHF_gc     /* CLK_24M/20M/16M */
           // | CCL_CLKSRC_OSC32K_gc    /* CLK_32K */
           // | CCL_CLKSRC_OSC1K_gc     /* CLK_1K */

          /* 逐次制御器選択 */
           // | CCL_FILTSEL_SYNCH_gc;   /* 4分周 */
              | CCL_FILTSEL_FILTER_gc;  /* 8分周 */

CCL_CTRLA = CCL_ENABLE_bm;
  • 奇数 LUT の FEEDBACK 入力は、2個ペアとなる相方の偶数 LUT の出力に対応するため、ここでは使えない。
  • AVR-DU以降は EVSYS_CHANNELn への引数名が変更された。Macro_API の糖衣構文は、AVR-DA/DB/DD でもこの新しい引数の使用を許す。(前方互換)
  • tinyAVR 系の CCL1_OUT は PIN_PA7 になる。

12分周/16分周

ふたつの CCLペア を連結すると、12分周 または 16分周 を得ることができる。

/* 必ず偶数 LUT/CCL */
CCL_TRUTH0    = CCL_TRUTH_0_bm;
CCL_LUT0CTRLB = CCL_INSEL0_LINK_gc;     /* <- CCL1_OUT */
CCL_LUT0CTRLA = CCL_ENABLE_bm           /* 4または8分周出力 */
              | CCL_OUTEN_bm            /* 任意:CCL0_OUT -> PA3 */
              | CCL_FILTSEL_SYNCH_gc;   /* 2クロック遅延 */
           // | CCL_FILTSEL_FILTER_gc;  /* 4クロック遅延 */

/* ひとつ次の LUT/CCL */
CCL_TRUTH1    = CCL_TRUTH_1_bm;
CCL_LUT1CTRLB = CCL_INSEL0_FEEDBACK_gc; /* <- CCL0_OUT */
CCL_LUT1CTRLA = CCL_ENABLE_bm           /* 12または16分周出力 */
              | CCL_OUTEN_bm            /* 任意:CCL1_OUT -> PC3 */
              | CCL_FILTSEL_FILTER_gc;  /* 4クロック遅延=4分週 */

CCL_CTRLA = CCL_ENABLE_bm;
CCLn CCLn+1 n+1,OUT Period
SYNCH SYNCH 8
SYNCH FILTER 12
FILTER SYNCH 12
FILTER FILTER 16
  • 12分周が得られるのは、2+4遅延クロックの加算×2倍になるため。
  • 8分周は CCL ひとつで実現できるため、この組み合わせを使う価値はない。
  • この組み合わせはLINK(1つ大きいCCLnの出力)を使うので、ふたつの CCLn は連続していなければならない。
  • クロック元を変更する場合は両方に同じクロック元を与えるのが解りやすい。片方だけ変更すると両方の周波数の掛け合わせで、結果は複雑になる。

32分周/64分周

ひとつの EVSYS_CHn と、一組の CCLペア を連結すると、32分周 または 64分周 を得ることができる。

EVSYS_CHANNEL1 = EVSYS_CHANNEL0_CCL_LUT1_gc;
EVSYS_USERCCLLUT1A = EVSYS_USER_CHANNEL1_gc;

/* 必ず偶数 LUT/CCL */
CCL_TRUTH0    = CCL_TRUTH_0_bm;
CCL_LUT0CTRLC = CCL_INSEL2_LINK_gc;     /* <- CCL1_OUT */
CCL_LUT0CTRLB = CCL_INSEL0_FEEDBACK_gc; /* <- CCL0_OUT 帰還入力 */
CCL_LUT0CTRLA = CCL_ENABLE_bm           /* 32または64分周出力 */
              | CCL_OUTEN_bm            /* 任意:CCL0_OUT -> PA3 */
              | CCL_CLKSRC_IN2_gc       /* CLK_IN2 */
              | CCL_FILTSEL_FILTER_gc;

/* ひとつ次の LUT/CCL */
CCL_TRUTH1    = CCL_TRUTH_0_bm;
CCL_LUT1CTRLB = CCL_INSEL0_EVENTA_gc;   /* <- CCL0_OUT:EVSYS経由 */
CCL_LUT1CTRLA = CCL_ENABLE_bm           /* 4または8分周出力 */
              | CCL_OUTEN_bm            /* 任意:CCL1_OUT -> PC3 */
              | CCL_FILTSEL_SYNCH_gc;   /* CCL0=32分周 */
           // | CCL_FILTSEL_FILTER_gc;  /* CCL0=64分周 */

CCL_CTRLA = CCL_ENABLE_bm;
CCLn CCLn+1 n,OUT Period
SYNCH SYNCH 16
SYNCH FILTER 32
FILTER SYNCH 32
FILTER FILTER 64
  • 16分周は、前の組み合わせに比べ EVSYS_CH を消費するので不利。
  • この組み合わせはLINKを使うので、ふたつの CCL の並びには制限がある。
  • クロック元を変更する場合は CCLn+1 側のみ設定する。

さらに CCLを多段で追加することにより分周比を 4または 8倍ずつ増やせるが、他の用途との兼ね合いになるだろう。

初出:SpenceKonde/AVR-Guidance (2020/12/05)
追記:クロック元の変更について/AVR-DU以降の修正点

RSラッチ回路

偶数番の CCL_LUTn は、自身の帰還入力を使うと単体で RSラッチ回路(フリップフロップ)を仕立てることができる。SPDT 配線のトグル/スライド/シーソー/マイクロスイッチ、あるいは 2個のモーメンタリースイッチを、"セット"入力と "リセット"入力(以下の例ではEVENTAとEVENTB)に与えることで、チャタリングを完全に廃した レベル出力に変換できる。これは高速動作かつ高信頼性を要求される場合のスイッチ入力では定番の手法だ。

  • INSELn_FEEDBACK は、奇数番の CCL_LUTn では 偶数番の CCLn_OUT を参照する。そのため次例では 偶数番の CCL_LUTn を必要とする。奇数番の CCL_LUTn を使う場合は、独立プリスケーラー でも記述したように、EVSYS_CHn をひとつ消費して帰還入力としなければならない。
  • フリップフロップでは通常 "セットとリセットが共に 1" の条件は禁止されるが、CCL_LUT では任意の出力状態をそれに与えることができる。ここでは禁止条件を "プリセット" 動作するように構成している。
  • タクティカルスイッチのような オルタネートスイッチの場合(かつリリースエッジ検出が選択できない、例えば押した/押したまま/離したの個別判定の必要がある場合)チャタリングを廃するには時定数回路を付加するしかないので、自ずと低速動作かつ低信頼性となる。しかもこれを外部回路ではなく MPU内部で作業完結させるには 何らかのタイマー遅延が必須となるので、余分なリソース消費が課せられる。
/* CCL_LUT0 で RSラッチ回路 を構成する */
/* Qut TRUTH  _ 1 5 4 _ _   _ _ */
/*     2:FDB  0 0 1 1 1 0   0 1 */
/* RST 1:EVB  0 0 0 0 1 1   1 1 */
/* SET 0:EVA  0 1 1 0 0 0   1 1 */
CCL_TRUTH0 = CCL_TRUTH_1_bm
           | CCL_TRUTH_5_bm
           | CCL_TRUTH_4_bm;

CCL_LUT0CTRLC = CCL_INSEL2_FEEDBACK_gc;
CCL_LUT0CTRLB = CCL_INSEL1_EVENTB_gc          /* 任意の入力 */
              | CCL_INSEL0_EVENTA_gc;         /* 任意の入力 */
CCL_LUT0CTRLA = CCL_ENABLE_bm | CCL_OUTEN_bm; /* -> PIN_PA3 */

CCL_CTRLA = CCL_ENABLE_bm;

ゲーテッド Dラッチ回路

"イネーブル" が 真の間だけ、"データ" を "Q-out" 出力に "透過" させる。"イネーブル" が 偽の時は "Q-out" を 真偽何れか一方に固定させるだけなら、帰還入力は不要である。ここでは "イネーブル" が 偽の間は、"Q-out" 出力 を変化させず、以前の状態を維持させるために、帰還入力でラッチ回路を構成する。

  • "イネーブル" はレベル入力。以下は 偶数 CCL_LUTn での構成。
/* CCL_LUT0 で Dラッチ回路 を構成する */
/* Qut  TRUTH  _ 4  _ 6  _ _  3 7 */
/*      2:FDB  0 1  0 1  0 1  0 1 */
/* DATA 1:EVB  0 0  1 1  0 0  1 1 */
/* EN   0:EVA  0 0  0 0  1 1  1 1 */
CCL_TRUTH0 = CCL_TRUTH_3_bm
           | CCL_TRUTH_4_bm
           | CCL_TRUTH_6_bm
           | CCL_TRUTH_7_bm;

CCL_LUT0CTRLC = CCL_INSEL2_FEEDBACK_gc;
CCL_LUT0CTRLB = CCL_INSEL1_EVENTB_gc          /* 任意のデータ入力 */
              | CCL_INSEL0_EVENTA_gc;         /* 任意のイネーブル入力 */
CCL_LUT0CTRLA = CCL_ENABLE_bm | CCL_OUTEN_bm; /* -> PIN_PA3 */

CCL_CTRLA = CCL_ENABLE_bm;

ゲーテッド Tラッチ回路

"トグル" が偽の間は "クロック" を "Q-out" 出力に "透過" させ、"トグルが" 真の間は "クロック" を "反転" させて "Q-out" 出力に通す。"トグル" が レベル入力なら 帰還入力は必要ないが、"トグル" を エッジ入力とした場合は、トグル状態を記憶するために、帰還入力でラッチ回路を構成する。

  • エッジ上昇端毎にレベル出力を反転してるわけなので、"CLOCK == FEEDBACK" とすれば、これは 2分周プリスケーラーである。
/* CCL_LUT0 で Tラッチ回路 を構成する */
/* Qut    TRUTH  _ 4  _ 6  1 _  3 _ */
/*        2:FDB  0 1  0 1  0 1  0 1 */
/* CLOCK  1:EVB  0 0  1 1  0 0  1 1 */
/* TOGGLE 0:EVA  0 0  0 0  1 1  1 1 */
CCL_TRUTH0 = CCL_TRUTH_1_bm
           | CCL_TRUTH_3_bm
           | CCL_TRUTH_4_bm
           | CCL_TRUTH_6_bm;

CCL_LUT0CTRLC = CCL_INSEL2_FEEDBACK_gc;
CCL_LUT0CTRLB = CCL_INSEL1_EVENTB_gc          /* 任意のクロック入力 */
              | CCL_INSEL0_EVENTA_gc;         /* 任意のトグル入力 */
CCL_LUT0CTRLA = CCL_ENABLE_bm | CCL_OUTEN_bm; /* -> PIN_PA3 */

CCL_CTRLA = CCL_ENABLE_bm;

LINKS

multix.jp/てくにかるむ(休眠中)
Multix Zinnia Product SDK [*AVR]
AVR.JP(日本語訳)
AVR-LIBC(日本語訳)

Clone this wiki locally