시리얼 통신제어 방법

1. 시리얼 통신이란?


2. 퍼스널컴퓨터와의 접속

미니DSUB
커넥터

25핀
DSUB

신호 명칭

간단한 사용법

1

8

CD(Data Carrier Detect)

입력, 사용하지 않는다

2

3

RD(Receive Data)

입력, 상대방 TD에 접속

3

2

TD(Transmit Data)

출력, 상대방 RD에 접속

4

20

DTR(Data Terminal Ready)

출력, 사용하지 않는다

5

7

SG(Signal Ground)

그라운드, 상대방 SG에 접속

6

6

DSR(Data Set Ready)

입력, 사용하지 않는다

7

4

RTS(Request to Send)

출력, 상대방 CTS와 접속

8

5

CTS(Clear to Send)

입력, 상대방 RTS와 접속

9

22

RI(Ring Indicate)

입력, 사용하지 않는다


3. 시리얼 통신 제어 프로그램의 구성


4. 변수, 정수의 정의

BaudRate

PulseWidth

Counter

prescale

TMR0(BITTMR)

width

300bps

3333.33usec

8333

64(5)

130(7E)

3328usec

1200

833.33

2083

16(3)

130(7E)

832

2400

416.67

1041

8(2)

128(80)

409

4800

208.33

521

4(1)

124(84)

198

9600

104.17

260

2(0)

122(86)

99

프로그램 리스트상은 아래와 같이 되어 있다.
 

;
;BAUDRATE: boud rate 300 to 9600 at 10MHz clock.
;  5=300bps  3=1200bps  2=2400bps  1=4800bps  0=9600bps
;
BAUDRATE  SET    0        ;여기에 프리스케일러값을 지정한다
BITTMR       SET    086H   ;TMR0에 설정하는 값으로 위의 표에 나타낸 값을 지정한다
BITTMR1     SET    050H    ;스타트 비트일 때의 약 1.5비트분의 값


(2) 기타 변수
기타 범용으로 사용하는 변수와, 플래그류는 다음과 같이 정의되어 있다.
 

;*************************************
; Define constant module
;*************************************
#DEFINE     TXBUSY      RESULT,0     ;sending
#DEFINE     RXBUSY      RESULT,2     ;receiving
#DEFINE     RECV          RESULT,3     ;receive end
#DEFINE     ERROR        RESULT,4     ;error bit

;**** Define Variables *****
RESULT      EQU           0CH              ;current status
WREG         EQU           0DH              ;wreg save area
SREG          EQU           0EH              ;status reg save area
BITCNT       EQU           0FH               ;send bit counter
EXTRA        EQU           10H               ;stop bit flag
TXREG        EQU           11H              ;send data buffer
RXREG       EQU           12H               ;receive data buffer
CNT2          EQU           13H               ;counter for delay


5. 인터럽트 처리 프로그램


6. 송신 처리 프로그램

  1. 우선, 송신 요구가 CALL되면 PUTCHAR 처리로 TXBUSY 플래그를 세트하여 송신중으로 하며, 계속해서 스타트 비트를 송신하여 타이머를 1비트분의 시간에 세트한 다음, 스타트시키고나서 인터럽트 대기로 한다(TXSTART).
  2. 타이머가 count up하여 끼어들면 TXNEXT 처리로 분기하여 데이터의 송신을 1비트마다 한다. 그 비트마다 타이머를 세트하여 인터럽트를 기다린다.
  3. 최후의 데이터 송신후에는 stop bit의 송신(STOPBIT)으로 분기하여 1비트분의 스톱비트를 출력한다.
  4. 다음 인터럽트로 모두 종료하고 DONE로 분기하여 인터럽트를 금지로 하고 종료한다.
     

    ;************************************
    ; Transmission process module
    ;************************************
    ;송신 개시 처리
    PUTCHAR
                   BSF          TXBUSY               ;송신중 플래그를 세트
                   MOVLW    8                          ;송신 데이터 비트수를 8로 하고
                   MOVWF    BITCNT                 ;비트 카운터에 세트
                   MOVLW    1                          ;스톱비트수를 1로 하고
                   MOVWF    EXTRA                  ;카운터에 세트
                   CALL        TXSTART              ;스타트 비트 송신
                   BCF          INTCON,T0IF         ;인터럽트 플래그 클리어
                   BSF          INTCON,T0IE         ;타이머 인터럽트 허가
                   RETFIE
    ;**** 스타트 비트 송신처리 ****
    TXSTART
                   CLRF        TMR0                    ;타이머 세트
                   BSF          STATUS,RP0          ;page 1
                   CLRWDT
                   MOVLW     BAUDRATE            ;프리스케일러 세트
                   MOVWF     OPTION_REG
                   BCF           STATUS,RP0         ;page 0
                   BCF           PORTA,3               ;스타트 비트 세트
                   MOVLW     BITTMR                 ;타이머값 꺼냄
                   MOVWF     TMR0                    ;타이머 스타트
                   RETURN
    ;****** 데이터 비트의 송신처리 *****
    TXNEXT
                   MOVLW      BITTMR                 ;타이머 재 스타트
                   MOVWF      TMR0
                   MOVF         BITCNT                 ;전체 비트 종료인가?
                   BTFSC        STATUS,Z
                   GOTO         STOPBIT               ;종료시 스톱비트 송신으로
    NEXTTXBIT
                   DECF          BITCNT,F              ;비트 카운터-1
                   BSF            STATUS,C             ;데이터 비트를 시프트
                   RRF            TXREG                  ;
                   BTFSS        STATUS,C             ;데이터 비트의 0, 1에 의해
                                                                 ;RA3에 0, 1을 출력
                   BCF            PORTA,3               ;0 out
                   BTFSC        STATUS,C
                   BSF            PORTA,3                ;1 out
                   GOTO         RESTORE               ;return
    ;**** 스톱비트 송신처리 ****
    STOPBIT
                   MOVF         EXTRA,W                ;스톱비트 송신이 끝났는가?
                   BTFSC        STATUS,Z               ;
                   GOTO         DONE                     ;송신끝 종료로
                   DECF          EXTRA,F                 ;스톱비트 카운터-1
                   BSF            PORTA,3                 ;스톱비트 출력
                   GOTO         RESTORE                ;return
    ;*** 전체 데이터 송신완료, 종료처리 ****
    DONE
                   BCF            INTCON,T0IE            ;타이머 인터럽트 금지
                   BCF            TXBUSY                  ;송신중 플래그 클리어
                   GOTO         RESTORE                ;return

 

 7. 수신 처리 프로그램

  1. 먼저 수신 요구가 있으면 GETCHAR로 스타트 비트의 수신준비 처리를 실행한다. 이것에는 타이머를 풀카운트 하나 바로 전에 인터럽트 대기로 한다.
  2. 스타트 비트 입력에 의해 타이머의 인터럽트가 들어가면 STARTBIT로 분기하여 10μs 기다린 후, 다시 한번 데이터를 입력하여 스타트 비트임을 확인한다.
    만일 그렇지 않았다면 노이즈에 의한 오류 인터럽트로 간주하고 아무것도 하지 않으며, 다음 스타트 비트 대기로 하고 리턴한다(NOISE). 확실히 스타트 비트였다면 수신중 플래그(RXBUSY)를 세트하고, 타이머에 1.5비트폭분의 타이머값을 세트하며 인터럽트 대기로 한다.
  3. 다음부터의 인터럽트는 데이터 비트로서 데이터 수신(RXNEXT)으로 분기한다.
    여기서는 1비트분 폭의 시간에 타이머를 리턴하고 순차 데이터 비트의 수신으로 RXREG에 저장해 간다(NEXTRXBIT). 최후의 데이터 비트의 다음은 stop bit의 수신일 것이므로 그것을 확인한다. 만일 스톱비트가 아니면 오류로 ERROR 플래그를 세트하고 종료한다. 종료시에는 수신중 플래그(RXBUY)를 클리어한다. 또한 정상으로 데이터를 수신할 수 있었을 때에는 데이터 수신 플래그(RECV)를 세트한다.

     

    ;*************************************
    ; Receiving process module
    ;*************************************
    GETCHAR
                  BSF             RECV                ;데이터 수신 플래그 클리어
                  MOVLW       9                       ;데이터 비트수를 8로하고
                  MOVWF       BITCNT              ;비트 카운터에 세트
                  CLRF           RXREG              ;데이터 버퍼 클리어
                  BCF             ERROR              ;에러 플래그 클리어
    ;**** 스타트 비트 수신 준비처리 ****
                  CLRF           TMR0                 ;타이머를 초기 세트
                  BSF             STATUS,RP0       ;page 1
                  CLRWDT                               ;clear WDT
                  MOVLW       038H                   ;watchdog timer 모드
                  MOVWF       OPTION_REG      ;로 prescaler를 1로 세트
                  BCF             STATUS,RP0       ;page 0
                  MOVLW       OFFH                  ;타이머를 FF로 세트
                  MOVWF       TMR0                  ;타이머 스타트
                  BCF             INTCON,T0IF        ;타이머 인터럽트 플래그 클리어
                  BSF             INTCON,T0IE        ;타이머 인터럽트 허가
                  RETFIE                                   ;인터럽트 대기로

    ;**** 스타트 비트 인터럽트 처리 ****
    STARTBIT
                  CLRWDT                                 ;
                  CALL           TIME10                 ;10μs 대기
                  BTFSC         PORTA,4              ;재 읽기 스타트 비트인가?
                  GOTO          NOISE                  ;다를 때
                  BSF             RXBUSY               ;수신중 플래그 ON
    ;데이터 수신준비
                  CLRF           TMR0                    ;타이머 재차 세트
                  BSF             STATUS,RP0         ;page 1
                  MOVLW       BAUDRATE            ;프리스케일러 세트
                  MOVWF       OPTION_REG
                  BCF             STATUS,RP0          ;page 0
                  MOVLW       BITTMR1                ;1.5비트폭의 시간으로 세트
                  MOVWF       TMR0                     ;타이머 스타트
                  GOTO          RESTORE               ;return
    ;*** 스타트 비트가 아닐 때의 처리 ****
    NOISE
                  MOVLW       OFFH                     ;타이머 재차 세트
                  MOVWF       TMR0
                  GOTO          RESTORE               ;return
    ;**** 데이터 비트 수신처리 ****
    RXNEXT
                  BSF             STATUS,RP0            ;page 1
                  CLRWDT                                     ;타이머 재차 세트
                  MOVLW        BAUDRATE
                  MOVWF        OPTION_REG
                  BCF              STATUS, RP0          ;page 0
                  MOVLW        BITTMR                   ;1비트폭의 시간으로 세트
                  MOVWF        TMR0                      ;타이머 재차 스타트
                  DECFSZ        BITCNT,F                ;비트 카운터-1, 종료인가?
                  GOTO           NEXTRXBIT             ;다음 데이터 수신으로
    ;*** 스톱비트 수신처리 ***
                  BTFSS           PORTA,4                ;데이터 입력하고 스톱비트 확인?
                  BSF               ERROR                   ;스톱비트가 아닐 때 에러
                  BCF               INTCON,T0IE           ;인터럽트 금지
                  BCF               RXBUSY                 ;수신중 플래그 리셋
                  BCF               RECV                     ;데이터 수신 플래그 세트
    ;
    ;**** 인터럽트 병렬처리를 실행할 때는 여기에 수신 완료시의 처리를 ***
    ;       추가하고, 처리 실행후 인터럽트 처리로 돌아간다.
    ;             CALL             RECEIVEPROCESS
                  GOTO            RESTORE

    ;**** 데이터 비트 수신처리 ***
    NEXTRXBIT
                  BCF               STATUS,C               ;데이터의 0, 1에 의해 RXREG
                  BTFSC           PORTA,4                  ;에 0, 1을 세트한다
                  BSF               STATUS,C                ;1 case
                  RRF               RXREG,F                  ;set data to RXREG
                  GOTO            RESTORE
    ;***** 10μs 지연 타이머 *****
    TIME10                                                        ;10μs
                  MOVLW         7H
                  MOVWF         CNT2
    T_LP2     DECFSZ         CNT2,F                     ;2+3*7-1=22
                  GOTO            T_LP2
                  RETURN                                         ;22+1=23

     


    다음 화면         목차 화면