2025年8月16日土曜日

GreenPAK:I2Cでone shotの待ち時間を書き換える

AtomからCounterの書き換えを実験している図

自分へのメモです。

市販のいろいろ超低消費電流タイマーICなんてのがあるんですが、ちょっと用途に即していなくて、「探すより作った方が早いんでは……しかし、超低消費電流は無理」と思っていたのですが……GreenPAKで試して見たら、デバッガー画面に0.5uAぐらいの数値が表示されているではありませんか! これなら専用ICに勝てないまでも電池の自己消費には勝てる!

ということで何度目かの挑戦です。

やりたい動作は、

  • 起動時にはHIGHのままでマイコンに電源を供給する(でないと何もできない)
  • あるビットをHIGHにすると、x秒後に制御ピンをLOWにした後、y秒後にHIGHにする。
  • xとyはI2Cで書き換え可能だけど、電源入れ直すと初期化される
という処理です。

Grid Alignmentが欲しい

TP2が制御入力、TP13が制御出力。

SetとResetタイマーはワンショットで、設定した秒数後にLOWになります。そのあとにもう1個ずつワンショットを入れて、前段のダウンエッジから短いパルスを作ります。

そのあとにLUTを4つも使っているのは教科書に出ているSET優先RSフリップフロップです。ルネサスさんがD-FF x 2で作れるRSフリップフロップってのを公開していて試したんですが、なんか動いてくれず……それでNAND x 4で作りました。

動きました。半日かかりましたけどもね……。

で、次に、I2C制御です。初期設定のままだとGreenPAKさんは0x08がI2Cアドレスとのことで、そこにレジスタアドレスと値を書き込んでやれば、OKです。

レジスタアドレスはどこかのドキュメントに出ているんでしょうか……探しても見つからなかったので、

  • NVM Viewerを開く
  • 目的のCounterを選ぶとそれに関する設定ビットが青で表示される

  • 青の幅の広いところをクリックする

  • 値が表示される。counter dataには7が入っているので、0xA6-0xA5がソレではないだろうかとあたりをつけてcounter dataに65535を入力してApplyボタン

  • 変わったビットが緑色になる。0xA6-0xA5を見るとちゃんと全部1になっているのでこれだ!

……という方法で調べました。

もっと良い方法(=楽な方法)があるんじゃないか?と思って探したんですが見つからず。たぶん、これをTwitter(X)に貼ると「ここ見ると一瞬だぜ」って方法を教えてもらえるんですよね……。

I2Cでの書き換えはごく単純に8bitずつ書き換えます。今回は止まっている時に書き込みますが、動いている時だと順番や状態に気を付けましょう。

    Wire.beginTransmission(GREENPAK_ADDR);
    Wire.write(REG_ADDR);
    Wire.write(value);
    Wire.endTransmission();

これだけですよこれだけ(CV:竹村健一)。

消費電流はDMMでの計測で2-4uAぐらいでした。

以下、うっかりへのメモです。

  • DIP基板のピン番号はデバッガ画面のTPボタンを押して出てくるヤツ。設定画面のPIN xxを信じて「動かねえ」とか言っちゃダメ。以前Lチカやったときはたまたま一致しているピンだったんですかね。
  • 上記TPボタンを押すとVDDもVDDもTP1って表示されるんですけども、実際にはTP1とTP14に電源を供給しないと動いてくれませんでした。設定の問題なのかしら。
  • PORはレベル(HIGH)、よくあるリセット回路みたいなパルスではないので気を付ける。