So-net無料ブログ作成
English Version

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

 PIC24FJ64GAでのソフトシリアル通信の続きです。
 1bitシリアル通信では1bitのI/Oだけを使ってシリアル送受信するため、input(受信)とoutput(送信)を切換えながらシリアル送受信する必要があります。

 前回、送信処理が13ワードまでダイエットできたと書きましたが、1bitシリアル通信の場合は上記のin/outの切替が必要なため送信処理の最初と最後にそれぞれoutput設定とinput設定をするためのTRISレジスタの変更が必要となるので実質的には2ワード追加になり15ワードでの処理になります(1bitシリアル通信ではない場合は実質的にも13ワードです)。

 そこで少しダイエットした改良版が下記です。
; 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

 あれ、前回とまったく同じじゃん?w
 仕掛けは SERI_OUT_X にあります。これはシリアルbitに 0/1 を出力するマクロですが、前回の波形を良く見ると実際に相手側に出力される波形(黄色)はPIC出力(紫色)が0の時のみhighレベルで、lowレベルにするためにはPIC側(紫色)は入力モードでも1の出力でもいいことに気が付きます。
 そこで PORT(LAT)レジスタをゼロ(reset後の値のまま)にし、TRIS レジスタで入出力を切換えることでlow/highの出力制御をするようにしました。最後のストップビットで入力モードになるので冒頭で書いた送信処理前後のTRIS設定が不要になり 1bitシリアル通信でも送信処理を13ワードで実現できます^^

 下図は前回と同様に1bitシリアル通信で'A'を受信して'A'をエコーバックしている波形です。
 紫色が PIC のシリアルビットの信号で黄色が対向側の受信信号(Rx)です。

'A'エコーバック波形


 更に・・・・
 ループ終了条件もW0レジスタのみで実現し、11ワードまでdiet!!
 さすがにこれが限界かも・・
; send serial(8bit,non-pari,stop:1)
;  W0 <- send data

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


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

nice! 0

コメント 0

コメントを書く

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

トラックバック 2