PIC24FJ64GAでのソフトシリアル通信実験(その2) [PIC]
PIC24FJ64GAでのソフトシリアル通信の続きです。
1bitシリアル通信では1bitのI/Oだけを使ってシリアル送受信するため、input(受信)とoutput(送信)を切換えながらシリアル送受信する必要があります。
前回、送信処理が13ワードまでダイエットできたと書きましたが、1bitシリアル通信の場合は上記のin/outの切替が必要なため送信処理の最初と最後にそれぞれoutput設定とinput設定をするためのTRISレジスタの変更が必要となるので実質的には2ワード追加になり15ワードでの処理になります(1bitシリアル通信ではない場合は実質的にも13ワードです)。
そこで少しダイエットした改良版が下記です。
あれ、前回とまったく同じじゃん?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)です。
更に・・・・
ループ終了条件もW0レジスタのみで実現し、11ワードまでdiet!!
さすがにこれが限界かも・・
[ 前へ ] 連載記事 [ 次へ ]
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
[ 前へ ] 連載記事 [ 次へ ]
コメント 0