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

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

続続続ソフトシリアルインターフェース (2014.05.20全面修正)

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

続続ソフトシリアルインターフェースのソースではレジスタの使用個数を1として、受送信で33ワード必要でしたが、
今回の方法ではレジスタを1つ追加することにより、受送信で30ワードまでサイズを小さくできます。

今回のルーチンが続続ソフトシリアルインターフェースのものに比べて勝るということではなく、
使用目的により使い分けできる利点を強調したいと思います。

AVRのアプリケーションノート AVR305: Half Duplex Compact Software UART を参考にしました。



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




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



<ソースコード> 
xtal        EQU    8000000  ;Hz
baud      EQU    9600       ;bps

#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        0x7E
             cn                         ;RS-232C ビットカウンター
             rxd                        ;RS-232C データ入出力バッファ
             endc


             org             XXXX

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



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

PUTC:

   #ifdef Direct_TX
                 bcf             LATA,TX
   #else
                 bsf             LATA,TX
   #endif
                 movwf        rxd                    ; rxd=w
                 call             bitout+3             ; start bit
                 movwf        cn                      ; cn=9, Carry=1
                 rrf              rxd,f                  ; set Carry
                 call             bitout                 ; wait 1bit and Carry=1
                 decfsz         cn,f                    ; send 9bits?
                 goto            $-3                    ; loop

bitout:
        #ifdef  Direct_TX
                 btfsc            STATUS,C           ; Bit Output
                 bcf              LATA,TX
                 btfss            STATUS,C
                 bsf              LATA,TX
        #else
                 btfsc            STATUS,C            ; Bit Output
                 bsf              LATA,TX
                 btfss            STATUS,C
                 bcf              LATA,TX
        #endif

bwait:                                                      ; wait 1 bit
                  call              bwait2
bwait2:                                                    ; wait 1/2bit and Set Carry=1
                  movlw          .256-((xtal/.4)/baud-.15)/.8
                  addlw           0x01
                  btfss            STATUS,Z
                  goto             $-2
                  retlw            0x09



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

GETC:

#ifdef Direct_RX
                    btfss            PORTA,RX
#else
                    btfsc            PORTA,RX
#endif
                    goto             $-1                       ; wait Start bit

                    call              bwait2                   ; wait 1/2 bit and W=9
                    movwf          cn                         ; cn=9
                    rrf                rxd,f                     ; get bit data
                    call               bwait                    ; wait 1 bit and set Carry=1

#ifdef Direct_RX
                    btfsc             PORTA,RX
#else
                    btfss              PORTA,RX
#endif

                    bcf                 STATUS,C

                    decfsz            cn,f                      ; cn=0?
                    goto               $-5                       ; loop
                    movf              rxd,w                   ; return in w
                    return