田舎の組み込みプログラマーがわざわざ趣味でも色々開発してみようとあがく様を綴るブログです。
DMM.makeのクリエイターズマーケットに出品しています。
ゆっくりしていってみる ― 2018年06月13日
このところ仕事が色々大変だったり、仕事以外でもアレコレあったりしたので、ここらでちょっとゆっくりしてみたいと思います。
というわけで
ゆっ くりチップで遊んでみます。
なんかごっちゃりしていますが、PCのターミナルとR8Cマイコンをつなぎ、R8Cマイコンからゆっくりチップにしゃべらせる構成になっています。
具体的にはこんな感じです。
ゆっくりチップに対してローマ字風のコマンドを送ることで発声できます。
R8Cのソフトでは、受信割り込みでキューに入ったデータをメインループで横流ししています。
構造化アセンブラと当方オリジナルのマクロライブラリで記述していますので見慣れない感じだとは思いますが、だいたい理解していただけるのではないかと。
R8Cで仲介しなくてもPCのターミナルとゆっくりチップで直にやりとりもできるのですが(USB<->UART変換は必要)、次段への布石とい うことで。
さて
ゆっくりチップとのUARTによる通信にはいくつかのお約束があり、主なところはだいたい以下の通りです。
- ボーレートを認識してもらうため、最初に"?"を送信
- コマンドの最後にはキャリッジリターンをつける
- ">"が返ってくるまで次のコマンド送信は控える
ちなみに、発声中に次のコマンドを送ると"*"が返ってきます。
なので、その辺りの処理を実装すると、後の処理が楽になります。
$LOOP
; PC→ゆっくり
PROC$_CALL S0R$_GET ; 受信データ取得(→R0L)
for S == OFF
PROC$_CALL$_B YUKKURI_UART$_PUT, R0L
PROC$_CALL S0R$_GET ; 受信データ取得(→R0L)
next
; ゆっくり→PC
PROC$_CALL S2R$_GET ; 受信データ取得(→R0L)
for S == OFF
PROC$_CALL$_B YUKKURI_UART$_GET, R0L
PROC$_CALL S2R$_GET ; 受信データ取得(→R0L)
next
$END
;==========================================================
PART$ YUKKURI_UART
;----------------------------------------------------------
; メモリ確保
QUEUE$_B$_ALLOC yukkuri_send_queue, 128 ; 送信キュー確保
send_char: .blkb 1
;==========================================================
; コンディション定義
CONDITION$_DEFINE S_ENABLE ; [送信可能]
; ステータス定義
STATE$_DEFINE YUKKURI_BUSY ; ビジー<[]
STATE$_DEFINE YUKKURI_READY ; 送信受け付け<[送信可能]
;-----------------------------------
; ビジー<[]
;-----------------------------------
STATE$ YUKKURI_BUSY, 0
_GET
if [ PARAMETER ].b == '>'
TRANS YUKKURI_READY
endif
_END
;=======================================
;[送信可能]
;=======================================
CONDITION$ S_ENABLE
_PUT
QUEUE$_GET yukkuri_send_queue, [send_char]
for C ; キューデータあり
PROC$_CALL$_B S2T$_PUT, [send_char]
if [ send_char ] == 0dh
TRANS YUKKURI_BUSY
endif
QUEUE$_GET yukkuri_send_queue, [send_char]
next
_END
;-----------------------------------
; 送信受け付け<[送信可能]
;-----------------------------------
STATE$ YUKKURI_READY, S_ENABLE
REDIRECT _PUT
_END
_PUT
; 代替えキャラを元のコードに
R0L = [ PARAMETER ].b
if R0L == '!'
R0L = 27h
elif R0L == '$'
R0L = 0dh
endif
QUEUE$_PUT yukkuri_send_queue, R0L
THROW ; 後は STATE に投げる
_GET
PROC$_CALL$_B S0T$_PUT, [PARAMETER].b
THROW ; 後は STATE に投げる
_INIT
QUEUE$_INIT yukkuri_send_queue
PROC$_CALL$_B S2T$_PUT, "'?'" ; ゆっくりチップに同期コマンドを送る
;----------------------------------------------------------
_END
;==========================================================
といった感じです。
PART$というのは状態遷移処理を内蔵したオブジェクト的な物で、指定したメソッドをアクティブなSTATE$で処理するのが基本です。
メソッドの探査順はPART$→STATE$(アクティブ)→CONDITION$(アクティブ)となっており、対応メソッド処理が見つかった時点で打ち
切りますが、THROWで次段に投げることができ、REDIRECTで次段の別のメソッド処理に投げることができるため、非常にシンプルな記述が可能に
なっています。
という、投げっぱなしな感じで今回はここまでです。
最近のコメント