
前回 【電子工作】コンパクトなATTINY1614簡易オシロ付きロジックチェッカを作りました(その3)
で一旦完成したこのプロジェクト。
ATTINY1614のファームの不具合を修正するリファクタを行ったのでその報告です。
AIのClaudeのチャット・サポートを貰ってファームを修正しました。
元記事はNoteにまとめています。
【電子工作】「信号みえ太」コンパクトな簡易オシロ付きロジックチェッカの製作(その4 ATTINY1614ファームの不具合修正)
改善要望点
完成後に気づいた不具合点は2点です。
・3接点サムスイッチを操作した時に時々画面が真っ暗になることがある
・長押しで電源OFFですが、なにかのはずみで切れなくなることがある
これらの不具合対策のために、リファクタしないといけないのは下記の3点
と考えました。
この「信号みえ太」の後に、「信号だす蔵」を開発して、不具合が色々と発生し、改善しました。
その経験を信号みえ太にも織り込みたいと考えました。
① スイッチ入力や、LCD更新時にADCを止めて、割り込みが重畳させない
② I2Cのエラー処理が入ってない。リトライとかタイムアウトを入れる
③ それ以外のスリープやWakeUpで処理が不十分なところの改善
今回のリファクタリングで、不具合が改善すると思います。
変更方針
AIにリファクタを依頼すると、下記の変更方針での回答がありました。
① ADC/スイッチ入力/LCD更新の割り込み重畳対策
・V1.2のISR(PORTA_PORT_vect)は内部で_delay_ms(20)を最大2回
(〜40ms)ブロッキング実行していました。
・これがI2C転送中やADC変換中に重なると、I2Cバスが長時間止まって
OLEDがタイムアウト/リセット→画面ブラックアウト、
あるいは長押し判定のタイミングがズレて電源が切れない、
という2つの症状の両方に説明がつきます。
・Arduinoでは、割り込み処理内で複雑な処理を入れていますが、AVR
Studioで開発した「信号だす蔵」では割り込み処理はフラグを立てる
のみで、処理はmain処理側に渡して動作不具合を解決しました。
キー処理は反対にブロッキング処理にして、ボタンを離す時も含めて
チャタリングを排除しました。
② I2Cエラー処理
・Wireライブラリ依存(タイムアウトなし=ハングしうる)をやめ、
だす蔵と同じ直接TWI0レジスタ制御に変更。
・I2C_start/I2C_Writeにタイムアウト(15000カウント)・NACK検出・
BUSERR/ARBLOST検出を追加し、異常時はI2C_Force_Recover()で
バスを強制復旧します。
③ Sleep/WakeUp処理
・こちらは今回は見送りました。実運用で目立った不具合が出ていない
ため、①②の修正で様子を見て、必要になれば着手する予定です。
変更点
具体的な変更点は下記の2点です。(③は今回見送ったため対象外)
① ADC / スイッチ入力 / LCD更新の割り込み重畳対策
実際に変更したのはスイッチ割り込み(ISR)側のみです。
ISRを軽くすることで、ADCともLCD更新とも競合しなくなりました。
・ISR(PORTA_PORT_vect)からブロッキング処理(_delay_ms(20)×最大
2回、合計〜40ms)を完全に撤去
・ISRはswitchPushedフラグを立てるだけの非ブロッキング処理に変更
・チャタリング待ち・長押し判定・長押し後のレンジ変更処理は、新設した process_keys()(メインループから毎周呼び出し)に移動
・readWave()内の早期打ち切りチェック(switchPushed)を、
旧版でhRange 6〜9に漏れていたのを全レンジ(0〜9)に統一
低速レンジ計測中でもボタン操作への反応が遅れなくなります。
② I2Cエラー処理
・通信方式自体はV1.2(実績あり)のWireライブラリのまま変更せず、
Wire.endTransmission()の戻り値でエラー(NACK/バスエラー等)を
検出した場合のみI2C_Recover()でTWI0を再初期化(Wire.end()→
Wire.begin())してバスをリカバリする
・復旧後はOLEDへの疎通確認(ACK確認)まで行い、本当に復旧できたか
を戻り値で返す
・FlushBuffer()は転送異常を検知したらその場で打ち切り、
次周期のリトライに委ねる形にする
改訂履歴
この方針でファームを改定しての動作確認、修正を繰り返しました。
最初のV1.2から最終のV2.0までの改定履歴は、ファーム(スケッチ)
内のコメントに記載しています。
実機確認結果: ・キー操作の安定性向上、長押しでのSleep復帰OK
・500us/divなど高速レンジでの画面更新も高速化を確認
参考のために前と変わりませんが回路図を添付します。
電源はボタン電池から供給されているので、UPDIプログラマーとは
UPDIピンとGNDピンをつないでArduinoからUPDIでプログラムします。
なお、今回のソフトの最新版はGistのこちらにおいてます。
TINY1614_LOGIC_CHECKER_w_osciloscope_V2.0.ino
今回はファーム改定だけなので、これで終了しますね。
次回の記事は何にしましょうかね、乞うご期待!
過去の記事
・【電子工作】「信号みえ太」コンパクトなATTINY1614簡易オシロ付きロジックチェッカの製作(その1 Arduinoで実装)
・【電子工作】「信号みえ太」コンパクトな簡易オシロ付きロジックチェッカの製作(その2 ATTINY1614に移植)
・【電子工作】「信号みえ太」コンパクトな簡易オシロ付きロジックチェッカの製作(その3 ケースに組込み・完成)