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に発振子を
つないだせいで生じる他のポートへのしわ寄せです。
「ポート機能の多重化」ということで、この表が
データシートに出ています。
順番に行きます。
(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つの周波数からしか選べません。
最低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周波数を正確に見る方法、こんなところで
しょうか。
もちろん、周波数カウンタの入力に正確な周波数のパルスを入れ、
その測定値から基準周波数を逆算するということも可能ですが、
直接見てみたいものです。































最近のコメント