USI Serial Library for ATtiny85

最近使うことがあまり無くなってきたATtiny85だが使い始めたときはまだ何も知らなくてシリアル通信にはSoftwareSerialを使ってきた。それなりに使えていたと思うのだが割り込み禁止期間が長くて割り込みを使う他のライブラリとの相性が悪いという問題があったという記憶がある。

今までUSIでI2C/SPIなどのライブラリーを作ったりしてきたがUSIでシリアル通信も出来るんだってのを久しぶりに思い出し作ってみたのだが結論から言うとこれは使えるぞって感じ。

タイミング的には厳しいはずなのに割り込みを邪魔するコードさえなければ300 – 230400bpsまで当たり前のように動作してしまう8ピンしかないATtiny85ってなんなんだって感動を覚えるレベルだ。但し、他の割り込みを利用するライブラリと併用した場合はせいぜい57600bps以下程度が限界とも思う。

実装は下記AVR307を参考にTIMER0を利用している。なのでTIMER0を利用するライブラリや機能との併用はできないことに注意してほしい。

AVR307 : USI部を使用する半二重UART

半二重という点が気になる人もいると思われるが、一般的には何らかのプロトコルによるピンポン方式での通信となるだろうからあまり問題にはならないとは思う。たぶん...

受信はstartbitの1.5bit時間後からデータ8bitを連続取り込みしstop-bitは無視。送信は[startbit+data-low4bit]と[data-high4bit+stopbit]の2度に分けて5bitずつ送信する仕様だ。

受信は割り込みによるバッファリング(32バイト)を行い、送信は1バイトずつ処理している。割り込みに時間がかかるようだと使い物にならないので割り込み処理が可能な限りシンプルになるように工夫している。

【115200bpsでの受信タイミング検証】

【サンプル・スケッチ(エコーバック)】

【修正履歴】
2020-06-23
ピン変化から割り込み処理開始まで約2usほどかかっていてなんでこんなに遅いんだろう?と不思議に思っていたが、同一製品の他のストックで試してみたらデートシート通り約0.6us前後ほどで開始できることが確認できた。どうやら個体差というよりも壊れかけのMPUで試験していたみたい...ということで再度タイミング調整し直してみた。(-_-;)

2020-04-13
デバックコードが入ったままだったので除去。

2020-04-12
送信有効かつ最下位ビットがゼロのデータを受信すると受信完了時に送信ピンにグリッチが発生する点を修正。

2020-04-08
確実な初期設定のための変更、送信だけのときの不具合修正、受信時のスタートビット検出遅延設定値を割り込み遅延に対する余裕度を高める方向で微調整してみた。

【ライブラリ】