楽天市場
[無料でホームページを作成] [通報・削除依頼]

続続PIC10F322 ソフトシリアル一考察

続続ソフトシリアルインターフェイス (2013.11.21 一部修正)(2014.05.20加筆修正)

ソフトシリアル一考察で紹介したソフトシリアルインターフェースのルーチンを見直しました。

<特徴>
.前回ご紹介のものより、更に使用するレジスタの数を減らし、(使用レジスタは1個のみ)プログラムステップ数を短縮しました。(送信21+受信16 → 送信20+受信13=33)

弐.前回の受信プログラムでは連続受信時にデータを取りこぼす欠陥があり、これを修正しました。

ここで示す例はPIC10F322、動作クロック8MHz、受信ポートRX=PORTA,3、送信ポートTX=PORTA,2
通信条件:9600ボー、パリティなし、ストップビット1、フロー制御なしのものです。

(2014.03.08加筆)---------------------------------

ボーレートやクロックの変更に対応するための修正

xtal      EQU    4000000  ;Hz
baud    EQU    19200    ;bps

などと定義し、bwait2のldiの行を赤文字のように変更してください。
低ボーレートの場合、((xtal/.4)/baud-.15)/.8 の値が256より大きくなる条件は設定できません。
(bwait2のサブルーチンを作り直す必要があります。)

bwait:                                                      ; wait 1 bit
                  call              bwait2                 ; 1 us total:1+49+49=99 us
bwait2:                                                    ; wait 1/2bit and Set Carry=1
                  movlw          .256-((xtal/.4)/baud-.15)/.8    ; 0.5 us
                  addlw           0x01                   ; 0.5 us
                  btfss            STATUS,Z             ; 0.5 us
                  goto             $-2                      ; 1 us
                  retlw            0x80                   ; 1 us total:0.5+(0.5+0.5+1)*24-0.5+1=49 us

-------------------------------------------------------------------------------


サブルーチン bwait/bwait2 を呼び出すと、Wレジスタに0x80が書き込まれて返って来ます。このとき、CフラグとZフラグもセットされますので、bwait/bwait2を100us/500usのディレイとして使用する場合は注意が必要です。

 

<ソースコード>

#define TX 2 ;PIC TX Data output pin (i.e. 2 = RA2)
#define RX 3 ;PIC RX Data input pin (i.e. 3 = RA3)
#define Direct_TX ;RS-232C TX Direct Connection (MAX232を使用しない)
#define Direct_RX ;RS-232C RX Direct Connection (MAX232を使用しない)

                  cblock       0x7F
                  rxd                                   ;RS-232C データ入出力バッファ
                  endc

                  org            XXXX

                  clrf             ANSELA             ; digital I/O
                  bcf             TRISA,TX           ; set TX Port

; ********************************************************************
;
;                 RS-232C 1バイト送信(20ワード)
;
;                 Wに値をセットして呼び出す (戻り値:W=0x80,Carry=1,Zero=1)
;
; ********************************************************************

                   movwf         rxd                  ;rxd=W

        #ifdef  Direct_TX
                   bcf              PORTA,TX
                   bsf              PORTA,TX         ;Send START bit:TX=1
                   call              bwait               ;Wait 1bit and Set Carry=1
                   rrf               rxd,f                ;Bit Output
                   btfss            STATUS,C         ;rxd_0=B'ABCDEFGH'
                   bsf              PORTA,TX         ;rxd_1=B'1ABCDEFG'>1
                   btfsc            STATUS,C         ;rxd_2=B'01ABCDEF'>1
                   bcf              PORTA,TX         ;rxd_8=B'00000001'=1
                   call              bwait               ;Wait 1bit
                   bcf               STATUS,C         ;Carry=0
                   decfsz          rxd,W               ;Send 8bits?
                   goto             $-8                  ;loop
                   bcf               PORTA,TX         ;Send STOP bit:TX=0
        #else
                   bsf               PORTA,TX  
                   bcf               PORTA,TX         ;Send START bit:TX=0
                   call               bwait               ;Wait 1bit and Set Carry=1
                   rrf                rxd,f                ;Bit Output
                   btfss             STATUS,C         ;rxd_0=B'ABCDEFGH'
                   bcf               PORTA,TX          ;rxd_1=B'1ABCDEFG'>1
                   btfsc             STATUS,C          ;rxd_2=B'01ABCDEF'>1
                   bsf               PORTA,TX          ;rxd_8=B'00000001'=1
                   call               bwait                ;Wait 1bit
                   bcf               STATUS,C           ;Carry=0
                   decfsz           rxd,W                ;Send 8bits?
                   goto              $-8                   ;loop
                   bsf                PORTA,TX          ;Send STOP bit:TX=1
        #endif

bwait:                                                      ; wait 1 bit
                  call              bwait2                 ; 1 us total:1+49+49=99 us
bwait2:                                                    ; wait 1/2bit and Set Carry=1
                  movlw          .256-.24             ; 0.5 us
                  addlw           0x01                  ; 0.5 us
                  btfss            STATUS,Z            ; 0.5 us
                  goto             $-2                     ; 1 us
                  retlw            0x80                   ; 1 us total:0.5+(0.5+0.5+1)*24-0.5+1=49 us



; ********************************************************************
;
;                  RS-232C 1バイト受信(13ワード)
;
;                  戻り値 W,rxd
;
; ********************************************************************

rs1rx:
        #ifdef  Direct_RX
                    btfss           PORTA,RX
        #else
                    btfsc           PORTA,RX
        #endif
                    goto            $-1                       ; wait Start bit
r1rx11:
                    call             bwait2                   ; wait 1/2 bit and W=B'10000000'
                    movwf         rxd                       ; rxd = B'10000000'

                    call             bwait                     ; wait 1 bit and set Carry=1
        #ifdef  Direct_RX                                  ; set Carry
                    btfsc           PORTA,RX
        #else
                    btfss           PORTA,RX
        #endif
                    bcf              STATUS,C
                    rrf               rxd,f                     ; get bit data
                    skpc                                        ; Carry=1 skip
                    goto            $-5                        ; Carry=0 loop
                    call              bwait                    ; wait 1 bit
                    movf            rxd,w                    ; return in w
                    return