
ATtiny402で、タイマを使って一定周期の割込みを発生させる。
結果
【条件】
- Arduino IDE
- megaTinyCore
- 割込み周期: 32kHz
- 割込みハンドラで出力ピン(ポートA、ビット2)の状態を反転
【コード】
void setup() {
// ポートAのビット2(5番ピン)を出力に設定
PORTA.DIRSET = PIN2_bm;
// TCA0の設定
takeOverTCA0();
TCA0.SINGLE.CTRLA = TCA_SINGLE_CLKSEL_DIV1_gc | TCA_SINGLE_ENABLE_bm;
TCA0.SINGLE.PER = 625; // 20MHz / 625 = 32kHz
TCA0.SINGLE.INTCTRL = TCA_SINGLE_OVF_bm;
}
void loop() {
}
ISR(TCA0_OVF_vect) {
// ポートAのビット2を反転させる
PORTA.OUTTGL = PIN2_bm;
// 割込み要求フラグの解除
TCA0.SINGLE.INTFLAGS = TCA_SINGLE_OVF_bm;
}
動作状態は上の写真のとおり(32kHz周期で出力を反転させるので、観測される周期はその1/2の16kHz)。
プログラミング
Bingチャット
前回の高速PWMに続いて、今回もBingチャットを使ってコードを作成した。手順としては、条件を与えてコードを書かせ、間違っているところ指摘して修正させるという手順。これを何度も繰り返す。












こんな流れ。
とは言え、これは正解がわかった上で、復習のようにもう一度やったからスムーズな流れになっている。実際には、こっちもわからない状態だから、出てきたコードをデータシートと見比べながら内容をチェックしていくのでぜんぜん違う方向に行くことも少なくない。方向が違っていることに気づいたら、軌道修正を考えるよりもやり直したほうが早い。一からやり直す必要なく、それまでに得た知識を踏まえて最初の条件として設定にすれば良い。ここに行き着くまでに、おそらく、百回以上はチャットを繰り返した。
コードをコンパイルしてエラーが出たら、そのエラメッセージをチャットに突っ込むと修正してくれる(こともある)。
結構大変ではあるけれど、経験のないマイコンをデータシートと首っ引きで自分でコードを書くよりは楽なように思う。やり取りしているうちに自分の理解が進んだら、そこからは自分で書いたほうが早いかもしれない。
出してきたものは間違っていることを前提に精査が必要。したがって、まったくわからないものを作ってもらうのは、良し悪しの判断ができないので、無理。ある程度わかるものを作るときに手助けしてくれるツールという感じ。
一番最初に示した動作コードでは「TCA0.SINGLE.PER = 625;」になっているが、こちらで導き出されている「TCA0.SINGLE.PER = 624;」の方が正しい(0~624で625カウント)。まぁ、ここで1違っても結果に与える影響はほとんどないが(どのみち、クロックの精度の限界もあるし)。
それから、最後のポイントであったtakeOverTCA0();についてはこちら。なかなかこれ気づかずに時間を食ってしまった。
Google Bard
Bardでも試してみたが、使い物にならない。



どこをどう修正したんだか…。
コメント