SSブログ
English Version

PIC24FJ64GAでのソフトシリアル通信実験 [PIC]

 電子工作し易いDIPタイプのPIC24FJ64GA が秋月電子さんで330円(2015/06/04時点)で販売していて気軽に16BIT CPUをいじれる環境になっています。
 C コンパイラもフリー版は最適化レベルは低いものの統合開発環境と共にマイクロチップ社のHomePageから入手できます^^

 私が持っている PICkit2 も書込み対応しているので少しいじってみました。
 最初はPICkit2 からの電源供給ではうまく書き込めず、外部電源を使っていたのですが、電源につけた電解コンデンサを取り外したところ、PICkit2からの電源供給でも書き込みできるようになりました。

 手始めにソフトウェアによるシリアル通信をわざわざアセンブラで作ってみました(何のために?w)
 可能な限り短いコードでの実現を考えた結果、下記のように送信処理が13ワードまでになりました^^
 これ以上の diet は困難と思います(出力信号にヒゲが出てもいいならビット出力部分を1ワード減らせる。またrepeat数が16または17の倍数ならrepeatの次の命令をnopではなくローテート命令にする等のウルトラCも考えられるが・・)

 ポイントとしてはスタートビット/ストップビットもデータと同じループでまわして1ビット分のウェイト処理を共有することです。
 レジスタ長がもっと長かったらループ終了判定条件もレジスタ内のビットを利用できたんですけどね。
 SERI_OUT_0、SERI_OUT_1はそれぞれシリアル用の O/I ビットに0,1を出力するマクロです。
 BitClkはシリアル通信1bit時間に実行できるサイクル数です。

; Putchar : send 1byte with serial
;  W0 <- send data
;  W1 is internal use

Putchar:
    bset    W0,#8       ; set stop bit
    sl      W0,W0       ; LSB is start bit
    mov     #10,W1      ; set bit counter
0:
    btss    W0,#0       ; 1(1)
    SERI_OUT_0          ; 1(2)
    btsc    W0,#0       ; 1(3)
    SERI_OUT_1          ; 1(4)
    repeat  #(BitClk - 10)   ; 1(5)
    nop                 ; BitClk - 9(BitClk-4) adjust loop time to 1bit time
    rrc     W0,W0       ; 1(BitClk-3)
    dec     W1,W1       ; 1(BitClk-2)
    bra     NZ,0b       ; 2(BitClk)
    return

※repeatを直値でも設定できるのはうれしい(でも設定値+1が実行回数なので注意)

 下図は1bitシリアル通信で'A'を受信して'A'をエコーバックしている波形です。
 紫色が PIC のシリアルビットの信号で黄色が対向側の受信信号(Rx)です。
 ストップビットの中央時点で受信が完了し、即、送信処理をしているので厳密に言うと 0.5bit 分オーバーラップしていますが相手側にはTxとRx信号が分離されて接続されるので問題ありません^^

'A'エコーバック波形


[ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(0)  トラックバック(1) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 1