반응형

이번에는 PC와 TY52 보드간에 통신을 해 볼 차례이다. PC와 직렬 통신을 하게 되면, 단순히 키보드를 눌러서 TY52 보드에 있는 LED를 켜고 끌 수 있고, 키보드로 서보 모터를 좌우로 돌리게 할 수 있다. 또한 직렬 통신은 디버깅 도구로도 사용하는데, TY52 보드를 기반으로 어떤 자작품을 만들 때, 한 번에 꼭 성공한다는 보장은 없다. 이 때 직렬통신을 사용하면 TY52 보드에 어떤 데이터가 들어 있는지 PC에서 하이퍼 터미널(통신 프로그램)을 이용하여 눈으로 직접 확인이 가능하다.

 

8051 강좌에는 C 언어로 짜여진 직렬 통신 소스가 있는데, 여기서는 어셈블리어로 통신 소스를 만들어 보자. 아래는 timy 님이 8051 강좌란에 올려주신 어셈 소스인데, 약간 수정을 하였다. 아래의 소스를 실행시키고 하이퍼터미널 창을 띄우고 키보드 자판을 누르면 누른 값에 1을 더한 값이 출력된다.

 

하이퍼터미널 사용법은 기본 도구들 게시판에 설명되어 있습니다.

 

 

 

;--------------------------------------------------

;

;         PC와 TY52 보드간의 직렬 통신 소스

;

;--------------------------------------------------

 

          ORG         0000H
          JMP          START

          ORG         0035H

 

START:

           

          MOV         SP, #50        ; 스택 포인터 설정
          CALL         SERIAL9600  ; 직렬 통신 설정

 

REP:

          CALL           RXDATA     ; RXDATA로 분기
          ADD             A, #1         ; A 레지스터에 1을 더함
          CALL           TXDATA     ; TXDATA로 분기
          JMP            REP           ; REP로 점프하기 때문에 계속 순환되면서 직렬통신을 하게 된다.

 

;=====================================================================

 

SERIAL9600:                              ; 직렬 통신 설정 (직렬 통신을 하기 위해 설정해 주어야 할 것들)

          

            CLR        ET1                 ; 직렬통신은 타이머1을 사용하는데 처음엔 타이머1을 사용불가로 설정
            MOV       TMOD, #25H
            MOV       SCON, #52H    ; SERIAL MODE 1, REN=1, TI=1, RI=0
            MOV       PCON, #80H    ; PCON.7=SMOD=1
            MOV       TH1, #243        ; TH1 = 243으로 설정하면 통신속도는 9600 이 된다.
            SETB      TR1                 ; 타이머1 시작
            RET                               ; 복귀

 

;=====================================================================

 

TXDATA:                            ; MCU -> PC로 데이터 전송
            JNB        TI, $         ; SCON 레지스터의 TI 비트가 1 상태가 아니면 제자리에서 맴돌다가 TI=1이 되면 아래의 코드 수행
            CLR        TI             ; TI비트를 0으로 초기화 해 둠.
            MOV       SBUF, A   ; A 레지스터에 저장된 데이터를 시리얼 버퍼로 이동
            RET

 

;=====================================================================

 

RXDATA:                            ; MCU <- PC (MCU의 입장에서 보면 수신하는 동작)

            JNB         RI, $        ; RI = 0 이면 1이 될 때까지 기다림, PC에서 키보드를 누르면 RI값이 1로 변한다.

                                          ; JNB(Jump if direct Bit is not set 비트가 0이면 자기 주소로 계속 점프, 즉 제자리에서 무한루프)
            MOV        A, SBUF   ; A <- SBUF, 수신된 1바이트를 A 레지스터에 저장
            CLR         RI            ; 수신한 값을 A 레지스터에 저장했으므로 다음 데이터를 수신하기 위해 RI 비트를 0으로 해 놓음
            RET                        ; CALL 명령으로 여기까지 왔으므로 다시 복귀함, RET(RETURN)

 

;=====================================================================

 

           END                        ; 소스의 끝을 알리는 코드

 

 

 

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

 

설명이 빠진 부분이 있는데, 후에 추가하도록 하겠습니다. (스택포인터 등등...아직 이해가 안되서^^;)

 

소스와 헥사 파일을 첨부하였습니다.^^

반응형

+ Recent posts