田舎の組み込みプログラマーがわざわざ趣味でも色々開発してみようとあがく様を綴るブログです。
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付近まで上がっています。
ソフトの動作はこちらです。
これでようやく準備が整い、あとはパソコンからコマンドを送って・・・と行きたいのですが、字句解析とかやったことがないので、どうなりますやら。
コメント
トラックバック
このエントリのトラックバックURL: http://trident.asablo.jp/blog/2018/05/12/8849423/tb
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※投稿には管理者が設定した質問に答える必要があります。