« 献血カード捨てます 70回だった | トップページ | 備忘録:1Hzパルス発生回路 »

2026年1月25日 (日)

ATtiny3224で裸の32bit周波数カウンタ #2

ATtiny3224で裸の32bit周波数カウンタ
この続きのお話し。

32.768kHzの時計用水晶発振子をつないで1秒を作り、
このタイミングを基準に32bitにしたTCBカウンタから
4バイトの値を読んでHz単位の周波数計測値を得ています。
測定精度の要はこの1秒です。

PA2に1Hzのインプットキャプチャパルスを出して
いるので、この周波数(あるいは周期)を計れば
精度がわかります。
しかし、この信号は方形波じゃなくRTCの桁上が
りパルスで、30.52usの幅(1/32768Hz)しかありま
せん。
デューティ比が極端なので、普通の周波数カウンタ
だと読めません。(読めるのもあるでしょうが)

そこで、RTCの精度を見るため、何か良い方法はな
いものかと考えてみました。
  RTCの周波数が分かるデューティ比50%に
  近い方形波
を出力できれば良いわけです。

まず、問題になるのがポートPB2とPB3に発振子を
つないだせいで生じる他のポートへのしわ寄せです。

「ポート機能の多重化」ということで、この表が
データシートに出ています。
3224a

順番に行きます。
(1) 水晶をつないだことで、USART0のRXDとTXD
  が使えなくなる。
(2) 代替としてPA2とPA3にTXD、RXDを持ってくる。
  そうするとUSART1のTXD、RXDがアウトに。
  14ピンのtiny3224にはPC1、PC2が無いので
  USART1は使えなくなる。
  シリアルが2ch欲しければ20ピンのtiny3224を
  選ぼう。
(3) 同様にSPIも使えなくなる。
(4) PB2のイベント出力Bの代替ポートPB7も14ピン
  のには存在しないので使えない。
(5) RXD0の代替ポートPA2はEVOUTAと共用しているが、
  この代替PA7はOK。
このほか、TCA0のパルス出力もWO2がアウト。
WO0、WO1はI2Cと共通なのでアウトに。

14ピンのチップであれこれしようとすると、悩みます。

こんなことを考えながら、RTC周波数パルスの出力方法を
考えます。

<イベントシステムを使ってPITのパルスを出す>
発振周波数はRTC=PITなので、PITの分周パルス
をEVOUTAに出せば周波数がわかります。
ただし、PITから引き出せるのはこの表にあるよう、
8つの周波数からしか選べません。
3224b
    最低4Hzで最高が512Hz。
RTCとPITを初期化した後、EVSYSで出力します。

  EVSYS.CHANNEL3        = 0x0B;  // ch3入力:PIT/64 512Hz
EVSYS.USEREVSYSEVOUTA = 4; // ch3出力:EVOUTA(PA2) 出力

これでRTCの発振が元になった方形波がポートに出てきます。
  ※チャンネル指定が奇数と偶数に分かれるので注意
残念ながら生の32.768kHzやジャスト1Hzは得られません。

<タイマーTCA0を使ってPITのパルスを出す>
PITの出力をTCA0のクロック入力につなぎ、「FRQモード」
にしたTCA0で分周して方形波パルスを得ます。

/***** TCA0を使ってRTC周波数を見る  *****/
// PITで得られる最も高い周波数512HzをTCA0のクロックに
// TCA0をFRQモードにして1/2した周波数をWO0(PB0)に出力
// PIT 512Hz (奇数chへ)
EVSYS.CHANNEL3 = 0x0B; // ch3入力:PIT/64 512Hz
EVSYS.USERTCA0CNTA = 4; // ch3出力:TCA0 カウント入力へ
// タイマー TCA0
TCA0.SINGLE.INTCTRL= 0; // 割り込み禁止
TCA0.SINGLE.CTRLA = 0; // TCA0 停止
TCA0.SINGLE.CTRLD = 0; // TCA0 8bit分割停止 16bitに
TCA0.SINGLE.CTRLB = 0b00010001;
// ||||+++--- WGM FRQモードに
// |||+------ ALUPD
// ||+------- CMP0EN WO0出力(PB0 9pin SCLと重なる)
// |+-------- CMP1EN
// +--------- CMP2EN
TCA0.SINGLE.EVCTRL = 0b00000001;
// |||||||+--- CNTAEI Aカウント許可
// ||||+++---- EVACTA ↑でカウント
// |||+------- CNTBEI Bは停止
// +++-------- EVACTB
//TCA0.SINGLE.CMP0 = 1 - 1; // 256HzがWO0に【A】
TCA0.SINGLE.CMP0 = 256 - 1; // 1HzがWO0に 【B】
TCA0.SINGLE.CTRLA = 1; // TCA0イネーブル

これで、PB0=WO0にジャスト1Hzの方形波が出てきます。

チップの外から、RTC周波数を正確に見る方法、こんなところで
しょうか。
もちろん、周波数カウンタの入力に正確な周波数のパルスを入れ、
その測定値から基準周波数を逆算するということも可能ですが、
直接見てみたいものです。

|

« 献血カード捨てます 70回だった | トップページ | 備忘録:1Hzパルス発生回路 »

ATtiny」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« 献血カード捨てます 70回だった | トップページ | 備忘録:1Hzパルス発生回路 »