ATtiny1614に時計用水晶発振子をつなぐ
同じ14ピンでもATtiny1604(やtiny804、tiny404
などのtinyAVR0系統)は時計用水晶発振回路を持っ
ていません。
32kHzの発振回路は内蔵してるのですが、時計と
して使うには精度が不十分です。
マイコン自身では発振できないので、精度の良い
クロックが欲しい時は別置きの発振器から外部
クロックを突っ込むしかありません。
対して、tinyAVR1シリーズになると、時計用の
水晶を発振できる発振回路を搭載しています。
精度の良いクロックがあれば、時計や周波数カウンタが
作れます。
ATtiny1614を使って、その動作を確かめてみました。
・32.768KHz水晶発振回路の始動方法。
データシートにはややこしいことが
書いてあるけど、リセット起動なら
簡単に始動。
・発振周波数の確認方法。
発振させた32.768kHzは直接取り出せない。
イベントシステムを使ってRTCのオーバー
フロー信号をイベント出力0(ポートPA2)に
出して周波数を確認。(1/2の16.384kHz)
・発振安定タイミング確認のためポート出力。
・PITの動作確認のため1024Hzをソフトで出力。
こんな回路です。
PA2を周波数カウンタ読むと16.38418kHzだったんで、
「+11PPMほど」の周波数でした。
制御スケッチ。 Arduino IDE環境です。
// ATtiny1614 (14pin)
// 32.768kHz水晶の発振を確認
/***** RTC,PIT busy待ち *****/
// 両方とも0になるのを待つ
void rtcbusy(void) {
while((RTC.STATUS & 0x0F) || // RTC busy ?
(RTC.PITSTATUS & 1)); // PIT busy ?
}
/***** SETUP *****/
void setup() {
cli(); // 割込禁止
PORTA.DIR = 0b11111110;
// |||||||+---- PA0 10pin UPDI
// ||||||+----- PA1 11pin loopでHに
// |||||+------ PA2 12pin EVOUT0(16384Hz)
// ||||+------- PA3 13pin PITパルス(1024Hz)
// |||+-------- PA4 2pin 発振安定でH
// ||+--------- PA5 3pin
// |+---------- PA6 4pin
// +----------- PA7 5pin
PORTB.DIR = 0b00000011;
// |||+---- PB0 9pin out
// ||+----- PB1 8pin out
// |+------ PB2 7pin TOSC2 32.768kHz
// +------- PB3 6pin TOSC1 XTAL
// 32.768kHz XTAL
// _PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, 0x00); // XTALオフ
// while(CLKCTRL.MCLKSTATUS & (1 << 6)); // XOSC32KSの0を待つ
// リセット起動なら↑の手順は不要 いきなりオン↓でOK
_PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, 0b00000001); // 発振イネーブル
// || ||+-- ENABLE
// || |+--- RUNSTBY
// || +---- SEL
// ++------ CSUT 1kサイクル
// CSUT 01で16kサイクル、10で32k、11で64kサイクルの起動時間待ち
// RTC,PIT
rtcbusy(); // RTC,PIT ビジー待ち
RTC.CLKSEL = 0b00000010;
// ++---- XOSC32K 32.768kHzHz
RTC.CTRLA = 0b00000001;
// ||||| +---- RTCEN RTC周辺機能許可
// |++++------- CLK_RTC 1/1 →32.768kHz
// +----------- RUNSTBY
RTC.PER = 2 - 1; // 1/2 →16.384kHz
RTC.PITCTRLA = 0b00011001;
// |||| +-- PITEN PIT有効
// ++++----- PERIOD 32768Hz/16 →2048Hz
// RTCのオーバーフローをPA2(EVOUT0)に出力 16.384kHz
PORTMUX.CTRLA = 0b00000001; // PA2ポートをEVOUT0に
EVSYS.ASYNCCH1 = 0x08; // ch1入力:RTC_OVF
EVSYS.ASYNCUSER8 = 0x04; // ch1出力:EVOUT0(PA2:12pin) 出力
sei(); // 割込有効
}
/***** LOOP *****/
void loop() {
PORTA.OUTSET = (1 << 1); // PA1(11pin)をHにしてloopに来たことを通知
// RTC安定待ち
while(!(CLKCTRL.MCLKSTATUS & (1 << 6))); // XOSC32KSの1を待つ【1】
PORTA.OUTSET = (1 << 4); // PA4(2pin)をHに
while(1){
if(RTC.PITINTFLAGS & 1){ // PIT 2048Hz
RTC.PITINTFLAGS = 1;
PORTA.OUTTGL = (1 << 3); // PA3:13pinトグル (1024Hz)
}
}
}
とりあえず32.768kHzの発振ができるようになりました。
このクロックを使って何をするかは・・・これから考えます。
※発振タイミングのオシロ波形
電源オンから発振開始まで
(安定待ち=16kサイクルで)
発振安定から波形出力まで
実験用手組み基板
※ATtiny1614のタイマ・カウンタ、ちょっと不便なところが
あります。
周波数カウンタを作ろうとすると・・・
・16bitのタイマBで周波数計測機能があるんだけど、オーバーフローの
検出ができないんで、カウント数を上げられない。
・タイマBのクロック入力はタイマAからイベントリンク機能で引っ張って
来なくちゃならない。
・カウントクロックが無いと、キャプチャパルスを認識してく
れない。
・タイマDは周波数カウントに使える機能があるんだけど、
12bit(4095カウント)。
※注
リストの【1】の部分、XOSC32KS(発振安定)のチェックは、
32kHzクロックをどこかのモジュールが使い初めてからしか
チェックできない。使い始める前は「0」になっている。
※注意
・2025年10月6日:ATtiny1614につないだ32kHz水晶発振子、隣のピンの影響を受けるみたい










































最近のコメント