田舎の組み込みプログラマーがわざわざ趣味でも色々開発してみようとあがく様を綴るブログです。
DMM.makeのクリエイターズマーケットに出品しています。

シリアル カンタービレ2018年05月12日

とても昔からあって、今でも便利に使い続けられている技術。
それは俗にシリアルとかターミナルとか呼ばれているやつです。

以前少しだけarduinoをいじってみたんですが、標準でターミナルが実装されいて、コマンドを送ったりデータを表示させたりといったことが簡単にできるのが印象的でした。

そんなわけで

随分以前に写真だけ公開した基板をようやく動かす時が来ました。
実は通電するのも初めてだったりします。

いろいろシリアル基板

そして、まずはシリアル送信を試してみます。

$LOOP
  ; タイミング処理
  btstc SYSTEM_CYCLE  ; 1msec毎にONされる
  if C
    DIVIDING$_ regular_10, 10  ; 10分周
      PROC$_CALL$_B S0T$_PUT, 30h
      PROC$_CALL$_B S0T$_PUT, 31h
      PROC$_CALL$_B S0T$_PUT, 32h
    _$
  endif
$END

; シリアル送信処理
S0T$ 1
  QUEUE$_B$_ALLOC send_queue, 20    ; 送信キュー確保
_ITP  ; 送信終了割り込み(レジスタバンク切り替え)
  QUEUE$_GET send_queue, R0L
  if C
    WRITE$_B R0L
  endif
_PUT
  if [ ti_u0c1 ]  ; 送信バッファ空
    WRITE$_B [PARAMETER].b
  else      ; 送信中
    ; 送信データをキューに入れる(満杯の場合は空くまで待つ)
    QUEUE$_PUT$_WAIT send_queue, [PARAMETER].b
  endif
_INIT
  QUEUE$_INIT send_queue
_END

10msec周期で3バイトのデータを送り続けるだけの簡単なお仕事です。
簡単と言いつつ、送信バッファが空なら直に送信し、そうでなければキューに入れるという小技も使っています。
そして、キューにいれておけば、送信終了割り込みで勝手に持って行ってくれるという寸法です。

結果はこんな感じ。

データを送り続けるだけの簡単なお仕事

狙い通り、10msec周期できっちり送信されていますね。
ちなみに、通信速度設定は9600bpsです。

気分のほうが乗ってきたので

受信もやってみます。

パソコンのターミナルソフトから送ってみて・・・・・・・・・・・・・・・・・・・・・・・・・・受信できません。

一応、受信割り込みは1回かかるのですが、2回目以降は反応なし。
よく見るとフレームエラーが出ていましたが、速度・ストップビット・パリティの設定は間違っていないし、何故?

で、信号をよく見てみると・・・

電圧が低いし

信号は問題無さそうですが、電圧が3V少々ですね。

実は、使っているUSB-シリアル変換モジュールの出力(マイコン側では入力)が3.3V系なんですが、入力は5V対応なので5V電源のマイコンともそのまま接続できるということだったので気にしていませんでした。

しかし、R8C/xMの5V電源時のH入力閾値には届かないようですね。
受信割り込みはかかったので、オーバーシュート分が微妙に届いている感じなんだと思います。

そこでレベル変換です。
変換ICを乗せる程のことでもないので、トランジスタを使いました。

トランジスタでレベル変換

改めて信号を確認してみると、ちゃんと5V付近まで上がっています。

受信電圧が5Vにアップ

ソフトの動作はこちらです。

ソフトでも受信を確認

これでようやく準備が整い、あとはパソコンからコマンドを送って・・・と行きたいのですが、字句解析とかやったことがないので、どうなりますやら。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※投稿には管理者が設定した質問に答える必要があります。

名前:
メールアドレス:
URL:
次の質問に答えてください:
日本標準時子午線の都市名をかたかなで

コメント:

トラックバック

このエントリのトラックバックURL: http://trident.asablo.jp/blog/2018/05/12/8849423/tb