Hi-Speed Serial TX Library for AVR Series

超高速かつ送信専用のシリアルライブラリを作ってみた。ATtiny85でも921600bps以上で送信できるぞ。(/・ω・)/

16MHzの場合で最低38400bpsから最高8000000bps(8MHz)までの対応だ。但し、921600bpsを超える速度についてはオシロで波形確認しただけで実際に受信可能かどうかは試していない。

余ってるピンがあれば送信できるので受信は出来なくても利用価値はあるだろう。

ちなみに、コードの実行サイクル数でクロックを作っているため割り込み禁止状態で送信を行うことには注意してほしい。16MHzでの割り込み禁止時間は次の通り。921600bps以上の可能な限り早い速度がお勧め。

最大で0.5クロックのタイミングずれが発生するのでどれくらいの誤差になるか計算してみた。クロック自体の誤差は考慮していないが最高速度では20%程度の誤差となるようだ。

【サンプル・スケッチ】

【修正履歴】
2020-07-19
ストップビット処理を全AVRシリーズ共通コードに変更。

2020-07-10
インラインアセンブラの入出力パラメタの使い方が但しなかったので修正。

2020-06-24
write()処理内で割り込み禁止前に割り込み許可状態を保存&復旧するよう改良。

2020-04-30
参照していたAVR用高速GPIOライブラリの変更に伴う修正とスタートビット出力を1サイクル命令に変更。

2020-04-27
全AVRシリーズに共通なコードに改良。改良しなくても良かったんだけど、なんとなく...

2020-04-24
稀に信号が反転してしまうことがあったので修正。FT232Hを受信相手に8Mbpsまで通信できることを確認。ついでに最近投稿したAVR用高速GPIOライブラリを利用しポート指定方法を変更してみた。

2020-04-23
計算上は誤差18%なので無理かなと思っていたのだがFTDIのFT232Hを受信相手に6Mbpsまでの送信が可能なことを確認。相性が良かっただけ?

2020-04-20
コンパイル・ミスを防ぐため、使用する全てのレジスタを明示。

2020-04-18
2サイクルでビット処理できるよう改良してみた。この改良により16MHzでは最大8000000bpsとなる。これ以上は絶対無理。

2020-04-17
命令のサイクル数を勘違いしていたがC言語での修正は困難であったためインライン・アセンブラで書き直してみた。しかし、インライン・アセンブラの書き方って特殊過ぎてわかりづらい...

2020-04-16
ファイル名、クラス名を変更。

2020-04-15
誤差補正処理が特定の速度で誤補正するのを修正。

2020-04-14
誤差が0.5クロック以内に収まるように補正処理を追加。誤差データも0.5クロックで計算しなおした。

【ライブラリ】

【参照ライブラリ】
AVR用高速GPIOライブラリ