PIC10FでソフトUART

PIC10F2xxの使い道として、PIC10F222のA/DコンバータでA/D変換した値をUARTで送信する使い方を考えてみました。ターゲットはアナログジョイスティックで、実験用に値をA/D変換してPCに送りつける使い方です。で、まずその準備としてPIC10F200でソフトウェアUARTを作ってみました。(送信だけなので正確にはUARTではないですが・・・)

これで1200bpsで文字を送信してくれます。なお、真ん中あたりに71回の無駄なループがありますが、これで送信速度(1bitの時間)を調整しています。調整はオシロスコープを見ながら現物あわせです。現物あわせですから、コンパイラのバージョンが変わると速度が合わなくなってしまう可能性もあります。TMR0を使ってきちんとタイミングを取る方法で作りかけたのですが、サイズが大きくなるのでやめました。

作成途中ではまったのは、以下の点です。

  1. 1ビットの時間が安定しないと思ったら、ウォッチドッグタイマが動いていた。
    MPLABのメニューのConfigure設定で禁止していると思ったら、禁止できていなかったです。やはりソース内に記述してしまうのが安心です。記述方法はHITECH-Cのマニュアル(PDFファイル)内に記載があります。
  2. OSCCALの値が破損していた。
    リセット解除するたびに1ビットの時間が 大きくばらつくので、やはり使い物にならないかと思ってあきらめかけたのですが、よく考えるとクロックの周波数自体は1%の精度が保証されているので精度としては十分なはずです。何が起きているのかと思ったら、ROMの最終番地に書かれているMOVLW命令が破損していました。つまり、リセット解除時の不定なWレジスタの値がOSCCALレジスタに書かれていたわけです。PicKit2のToolsメニューの中に、OSCCALの値を復活させる機能があるので、それで復旧したところ綺麗に直りました。

・・・・が、これだけで10F200の256バイトのROMのうち167バイト(65%)、16バイトのRAMのうち10バイトを使ってしまいます。10F222ならもう少し大きくなるとはいえ、数値を文字列に変換することなどを考えると苦しそうです。数値をバイナリで送るとかであれば何とか使えるかもしれません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)