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

ゆっくりしていってみる2018年06月13日

このところ仕事が色々大変だったり、仕事以外でもアレコレあったりしたので、ここらでちょっとゆっくりしてみたいと思います。

というわけで

ゆっ くりチップで遊んでみます。

ゴチャゴチャゆっくり

なんかごっちゃりしていますが、PCのターミナルとR8Cマイコンをつなぎ、R8Cマイコンからゆっくりチップにしゃべらせる構成になっています。
具体的にはこんな感じです。

R8CでPCとゆっくりチップの仲介

ゆっくりチップに対してローマ字風のコマンドを送ることで発声できます。
R8Cのソフトでは、受信割り込みでキューに入ったデータをメインループで横流ししています。

構造化アセンブラと当方オリジナルのマクロライブラリで記述していますので見慣れない感じだとは思いますが、だいたい理解していただけるのではないかと。
R8Cで仲介しなくてもPCのターミナルとゆっくりチップで直にやりとりもできるのですが(USB<->UART変換は必要)、次段への布石とい うことで。

さて

ゆっくりチップとのUARTによる通信にはいくつかのお約束があり、主なところはだいたい以下の通りです。

  1. ボーレートを認識してもらうため、最初に"?"を送信
  2. コマンドの最後にはキャリッジリターンをつける
  3. ">"が返ってくるまで次のコマンド送信は控える

ちなみに、発声中に次のコマンドを送ると"*"が返ってきます。

なので、その辺りの処理を実装すると、後の処理が楽になります。

$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で次段の別のメソッド処理に投げることができるため、非常にシンプルな記述が可能に なっています。

という、投げっぱなしな感じで今回はここまでです。


コメント

コメントをどうぞ

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

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

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

コメント:

トラックバック

このエントリのトラックバックURL: http://trident.asablo.jp/blog/2018/06/13/8893155/tb